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, которые являются утилитами командной строки.

https://docs.oracle.com/cd/E36784_01/html

 Строки 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   управление службами

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

https://www.mattzone.com/sol10_apache.html

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

                      Solaris10    http://192.168.1.170/

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 службами и традиционными уровнями выполнения. По этому, следует иметь в виду следующие моменты: