SMF (Service Management Facility)
SMF (Service Management Facility) Эви Немет (ст.139) Solaris Guide 13-16 (ст.7)
Состояние службы может принимать одно из следующих значений:
• online — запуск разрешен, экземпляр службы успешно работает;
• disabled — запуск запрещен; экземпляр службы не запущен;
• degraded — запуск разрешен, но работа происходит с ограниченной функциональностью;
• legacy run — служба работает; некоторые унаследованные (от предыдущих версий системы) службы не подлежат управлению через SMF, однако их работу можно наблюдать стандартными для SMF средствами; это состояние возможно только для унаследованных служб;
• uninitialized — в этом состоянии находятся все службы до того, как их конфигурация будет считана из репозитория;
• maintenance — экземпляр службы аварийно завершился и не может быть запущен заново без вмешательства администратора;
• offline — запуск разрешен, но экземпляр службы еще не запущен или нет возможности его запустить из-за ожидания “неудовлетворенной зависимости” или по другой причине.
В дополнение к текущему состоянию службы, команда svcs -l позволяет узнать местоположение журнала регистрации службы, ее зависимости и другие важные данные
Sun определяет службу как: “средство предоставления приложениям некоторого списка возможностей и других служб, локальных и удаленных”.
Службу можно представлять как аналог демона: веб-сервер, системный регистратор syslogd или даже init.
Любая служба в системе может быть представлена несколькими экземплярами (instances). Службу можно определить как коллекцию других служб. Это свойство позволяет SMF взять на себя роль традиционных уровней выполнения демона init.
Каждый экземпляр службы уникальным образом определяется FMRI-идентификатором (fault management resource identifier — идентификатор управляемого ресурса в системе управления сбоями), имя идентификатора всегда начинается с svc , обратиться к нему можно по полному имени или по сокращенному.
Например, следующие эквивалентные FMRI-идентификаторы ссылаются на службу ssh.
svc:/network/ssh:default (полный)
network/ssh:default (сокращенный)
Служба ssh принадлежит категории network, и данный конкретный FMRI-идентификатор описывает стандартный экземпляр. В SMF определено несколько категорий;
application, device, network, system, platform, site, milestone.
Специальная категория "milestone" инкапсулирует концепцию уровней выполнения. Службы специфичные для конкретной системы принято относить к категории "site". Экземпляр службы в каждый момент времени может находиться в одном из возможных семи состояний. Узнать состояние службы можно с помощью команды svcs.
В выводе команды используется полный FMRI-идентификатор (в отличие от сокращенного), но поскольку существует только один экземпляр этой службы, можно ограничиться лаконичной командой svcs -l <service>.
Если необходимо разрешить или запретить запуск службы при старте системы используется команда svcadm .
Каждая служба имеет свое объявление ( manifest ) – файл в формате XML, содержащий полное описание всех свойств службы или ее экземпляра.
Манифест SMF - это файл XML, который содержит полный набор свойств, связанных с экземпляром службы. (Перезагрузить ---> svcadm restart manifest-import)
Свойства хранятся в файлах и подкаталогах, расположенных в /var/svc/ manifest.
Манифесты не должны редактироваться напрямую для изменения свойств сервиса.
Хранилище конфигурации отправителя является официальным источником информации о конфигурации службы, а хранилище конфигурации отправителя может управляться или запрашиваться только с использованием интерфейсов SMF, которые являются утилитами командной строки.
Строки exec_method в файле манифеста обычно указывают на сценарии, которые запускают или останавливают службы, т.е. во многом подобно тому, как используются сценарии в системе init.d. Например, процесс запуска для демона SSH определяется в файле /var/svc/manifest/ssh.xml следующим образом:
<exec_method
type='method'
name='start'
exec='/lib/svc/method/sshd start'
timeout_seconds='60'/>
Сценарий /lib/svc/method/sshd, на который здесь содержится ссылка, является sh-сценарием, запускающим службу sshd. Файл профиля службы определяет, разрешено ли запускать данный экземпляр или запрещено. Профили хранятся в каталоге /var/svc/profile.
Постоянные данные о конфигурации для служб в действительности хранятся в виде файла SQLite-базы данных /etc/svc/repository.db. Таким образом, необязательно непосредственно модифицировать содержимое XML-файлов. Вместо этого вы можете управлять манифестами и профилями с помощью команды svccfg. Для управления службами, находящимися под контролем демона inetd, используйте команду inetadm. Для получения дополнительной информации о командах svccfg, inetadm и svc.configd обратитесь к соответствующим man-страницам.
# svccfg
svc:> repository /etc/svc/repository-boot
svc:> select cswapache24:default
svc:/network/cswapache24:default> listprop general/enabled
general/enabled boolean true
svc:/network/cswapache24:default> exit
#
svcs -a Показать все сервисы(службы) в том числе отключенные и неполные. Неполные сервисы могут быть дополнительно объяснены с помощью svcs -x <service>.
svcs -d | -D [-Hpv] [-o col[,col ... ]] [-sS col] [<service> ...] Перечисляет службы или экземпляры служб, от которых зависят данные экземпляры служб
svcs -l <service> ... Отображает всю доступную информацию о выбранных сервисах и экземплярах сервисов, с одним атрибутом сервиса, отображаемым для каждой строки. Информация для разных экземпляров разделена пустыми строками.
svcs -x [-v] [<service> ...] svcs -xv Отображает объяснения для состояний сервисов.
svcs -? Отображает расширенное сообщение об использовании, включая спецификаторы столбцов.
Просмотреть по категориям:
# svcs | grep network | less
online 9:16:24 svc:/network/pfil:default
online 9:16:24 svc:/network/tnctl:default
online 9:16:26 svc:/network/loopback:default
.......................................
offline 9:16:25 svc:/network/ssh:default
offline 9:16:26 svc:/network/shares/group:default
maintenance 9:16:29 svc:/network/physical:default
..................................... и т.д
# svcs | grep offline | less
# svcs | grep online | less
# svcs | grep maintenance | less
svcadm -v
svcadm enable [-rst] <service> ... - enable and online service(s)
svcadm disable [-st] <service> ... - disable and offline service(s)
svcadm restart <service> ... - restart specified service(s)
svcadm refresh <service> ... - re-read service configuration
svcadm mark [-It] <state> <service> ... - set maintenance state
svcadm clear <service> ... - clear maintenance state
svcadm milestone [-d] <milestone> - advance to a service milestone
svcs (просмотреть)
............
online 10:48:04 svc:/system/zones:default
............
svcadm disable svc:/system/zones:default (управлять)
To check if the service is online or offline:
# svcs -v ssh
online - 12:23:17 115 svc:/network/ssh:default
Команду svcs можно использовать и для отдельно взятой службы. Например, следующая команда проверяет состояние службы ssh.
# svcs -l svc:/network/ssh:default
fmri svc:/network/ssh:default
name SSH server
enabled true
state offline
next_state none
state_time 22 января 2020 г. 9:16:25 MSK
restarter svc:/system/svc/restarter:default
dependency require_all/none svc:/system/filesystem/local (online)
dependency optional_all/none svc:/system/filesystem/autofs (online)
dependency require_all/none svc:/network/loopback (online)
dependency require_all/none svc:/network/physical (maintenance)
dependency require_all/none svc:/system/cryptosvc (online)
dependency require_all/none svc:/system/utmp (online)
dependency require_all/restart file://localhost/etc/ssh/sshd_config (online)
svcs | grep apache
online 12:57:21 svc:/network/cswapache24:default
svcadm enable apache2
svcadm disable apache2
svcadm restart apache2
svcs | grep apache
svcs -xv
cat /var/svc/log/network-http:apache2.log
cp /etc/apache2/httpd.std.conf /etc/apache2/httpd.conf
(или httpd-std.conf)
svcadm -v enable /network/http:apache2
svcs | grep apache
legacy_run 10:05:29 lrc:/etc/rc3_d/S50apache
(удалить/переименовать)
online 10:05:24 svc:/network/http:apache2
online 12:57:21 svc:/network/cswapache24:default
Обязательно добавить группу и пользователя
# groupadd apache
# useradd -g apache -d /var/apache apache
# svcadm -v enable /network/http:apache2
# svcs -l http
# svcs | grep apache
Возможно надо создать линки на подобие таких:
# ln /etc/opt/csw/init.d/cswapache24 /etc/rc3.d/cswapache24
# ln /etc/opt/csw/init.d/cswapache24 /etc/rc0.d/cswapache24
$ curl -v http://192.168.1.180
> GET / HTTP/1.1
> Host: 192.168.1.180
> User-Agent: curl/7.66.0
> Accept: */*
< Server: Apache/2.0.63 (Unix) DAV/2
<p>You are free to use the image below on an Apache-powered web
server. Thanks for using Apache!</p>
$ ps -ef |grep http
webservd 757 755 0 14:18:40 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 756 755 0 14:18:40 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 760 755 0 14:18:40 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 759 755 0 14:18:40 ? 0:00 /usr/apache2/bin/httpd -k start
webservd 758 755 0 14:18:40 ? 0:00 /usr/apache2/bin/httpd -k start
root 755 1 0 14:18:39 ? 0:00 /usr/apache2/bin/httpd -k start
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i apache24
/usr/sbin/pkgchk -L CSWapache24 # list files
C:\WINDOWS\system32>curl -v http://192.168.1.170
* Rebuilt URL to: http://192.168.1.170/
* Trying 192.168.1.170...
* TCP_NODELAY set
* Connected to 192.168.1.170 (192.168.1.170) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.1.170
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 21 Mar 2020 12:49:07 GMT
< Server: Apache/2.4.41 (Unix)
< Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
< ETag: "2d-432a5e4a73a80"
< Accept-Ranges: bytes
< Content-Length: 45
< Content-Type: text/html
<
<html><body><h1>It works!</h1></body></html>
* Connection #0 to host 192.168.1.170 left intact
Если сервисы запущены через inetd, то управляться должны через inetadm.
# inetadm посмотреть список
# inetadm -l <service> посмотреть инфо. о сервисе
# -e / -d включить/выключить
Usage:
inetadm
inetadm -?
inetadm -p
inetadm -l {FMRI | pattern}...
inetadm -e {FMRI | pattern}...
inetadm -d {FMRI | pattern}...
inetadm -m {FMRI | pattern}... {name=value}...
inetadm -M {name=value}...
FMRI - Fault Managed Resource Identifier
К сожалению или к счастью, система уровней выполнения и init-сценарии из предыдущих версий Solaris не совсем “похоронены”. Некоторые службы (например, те, которые в результатах выполнения команды svcs -а демонстрируют состояние legacy-run) попрежнему опираются на сценарии, хранимые в каталоге /etc/rc.d. Это значит, что возможны коллизии между SMF службами и традиционными уровнями выполнения. По этому, следует иметь в виду следующие моменты:
Службы в состоянии legacy_run были запущены из сценария rc.
Solaris определяет восемь уровней выполнения. Подробнее см. man-страницу для демона init.
Чтобы изменить уровни выполнения, используйте команду init n, где n — новый уровень выполнения. Не пытайтесь использовать механизм SMF для изменения служб, что, по мнению разработчиков Sun, “может вызвать неожиданное поведение”.
Демон init управляется с помощью содержимого файла /etc/inittab (практически как в Linux).