Solaris SMF

Материал из Wiki
Перейти к: навигация, поиск

SMF

Этот документ является компиляцией из нескольких источников. к сожалению, я не помню их все.

Введение

Solaris относится к ветви System V, но отличается от остальных систем наличием специального режима работы, называемого s или S (single) и применяемого для восстановления системы. В большинстве систем System V остальные режимы (0-6) имеют аналогичное назначение, но системы отличаются структурой каталогов системных скриптов (Solaris - /etc/rcN.d, Linux - /etc/rc.d/rcN/, где N – номер режима работы). В системах System V всегда присутствуют программы init и shutdown, а в Solaris еще и reboot, halt, poweroff.

SMF - начальные сведения

В Solaris 10 появилась подсистема Service Management Facility (SMF), связанная с загрузкой системы и управлением работающими в ней службами. Поддерживается общесистемная база данных о взаимосвязях между службами и отдельный процесс отслеживает состояние служб, следовательно, порядок загрузки изменился: управление тем, какие именно службы должны запуститься, полностью передано SMF. Экземпляр (instance, каждый из запущенных с разными файлами настроек процессов) может унаследовать настройки службы в целом или иметь собственные настройки, имеющие более высокий приоритет, чем общие. Каждый экземпляр службы имеет свой идентификатор (FMRI - fault managed resource identifier), имя идентификатора всегда начинается с svc, к экземпляру можно обращаться по полному имени или по сокращенному. Службы, специфичные для конкретной системы, принято относить к категории site. Все службы содержатся в определенном контексте (scope), представляющем собой набор логически связанных служб (в Solaris 10 определен только контекст localhost).

Управление службами

Для вывода всех запущенных служб используется

# svcs STATE STIME FMRI legacy_run 11:28:37 lrc:/etc/rc2_d/S20sysetup legacy_run 11:28:37 lrc:/etc/rc2_d/S47pppd <…> online 11:28:06 svc:/network/physical:nwam online 11:28:08 svc:/system/identity:node online 11:28:10 svc:/system/metainit:default online 11:28:12 svc:/system/filesystem/root:default online 11:28:12 svc:/system/scheduler:default online 11:28:14 svc:/system/boot-archive:default

Для вывода всех служб, включая те, запуск которых запрещен:

# svcs -a STATE STIME FMRI legacy_run 22:58:12 lrc:/etc/rc2_d/S20sysetup legacy_run 22:58:12 lrc:/etc/rc2_d/S47pppd legacy_run 22:58:13 lrc:/etc/rc2_d/S72autoinstall <…> disabled 22:57:44 svc:/network/ipsec/ike:default disabled 22:57:44 svc:/system/nws_ii:default disabled 22:57:44 svc:/system/nws_rdc:default <…> online 22:57:57 svc:/milestone/devices:default online 22:57:57 svc:/milestone/single-user:default online 22:57:58 svc:/network/initial:default </PRE>

Состояния служб

Экземпляр службы в любой момент времени может находиться в одном из семи состояний:

  1. degraded (ослабленное) – запуск разрешен, но работа происходит с ограниченной функциональностью,
  2. disabled (запрещено запускать) – запуск запрещен, экземпляр службы не запущен,
  3. legacy_run (унаследованный) – некоторые унаследованные службы не подлежат управлению через SMF, но их работу можно наблюдать стандартными для SMF средствами,
  4. maintenance (обслуживание) – экземпляр службы аварийно завершился,
  5. offline (не работает) – запуск разрешен, но экземпляр службы еще не запущен или нет возможности его запустить,
  6. online (работает) – запуск разрешен, экземпляр службы работает без проблем,
  7. uninitialized (неинициализирован) – в этом состоянии находятся все службы до считывания конфигурации.

Перевод службы из состояния в состояние осуществляется автоматически. Просмотр служб, находящихся в состоянии maintenance, выполняется командой

svcs –xv

Описание служб

В описании каждой службы указывается, от каких служб и/или файлов она зависит. Типы взаимосвязи (зависимости): 1. require_all – считается удовлетворенной, когда все перечисленные службы находятся в состояниях online или degraded или все указанные файлы присутствуют. 2. require_any – считается удовлетворенной, когда хотя бы одна из перечисленных служб находится в состояниях online или degraded или хотя бы один из указанных файлов присутствует. 3. optional_all – считается удовлетворенной, когда все перечисленные службы находятся в состояниях online или degraded или в состояниях disabled, maintenance, offline, либо не существуют. 4. exclude_all – считается удовлетворенной, когда все перечисленные службы запрещено запускать, либо они находятся в состоянии maintenance, или все указанные службы или файлы отсутствуют.

Для изменения состояния службы используется

  • svcadm (чтобы измененные настройки вступили в силу – svcadm refresh)
  • для изменения настроек– svccfg(и ее подкоманды – listsnap, selectsnap и revertsnap), а для получения информации о свойствах– svcprop.

Каждая служба имеет свое объявление (manifest) – файл в формате XML, содержащий полное описание всех свойств службы или ее экземпляра. Объявления служб хранятся в каталоге /var/svc/manifest. Файлы объявлений не являются источником информации для служб SMF -таким источником является репозиторий. Для импорта информации из файлов объявлений в репозиторий используется команда svccfg import (при перезагрузке это происходит автоматически), а для получения архива XML с постоянными свойствами всех служб - svccfg export. Профиль – это файл XML, содержащий список служб, разрешенных к запуску. После установки или обновления система обращается к профилю generic.xml, который является символической ссылкой на generic_limited_net.xml.

Пример установки стороннего ПО в качестве службы

Для примера - устанавливаю vsftpd в качестве службы.

Установка ПО

gunzip /path/to/file/vsftpd-<ver>-local.gz
  • устнавливаю с помошью менеджера пакетов
pkgadd -d /path/to/file/vsftpd-<ver>-local.gz

(все файлы будут установлены в /usr/local/)

Настройка

Настройка vsftpd довольна проста. Конфигурационый файл достаточно короткий, все опции документированы.

cat /usr/local/etc/vsftpd/vsftpd.conf  | grep -v "#"
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=YES
idle_session_timeout=600
data_connection_timeout=120
chroot_list_enable=YES
chroot_local_user=YES
chroot_list_file=/usr/local/etc/vsftpd/vsftpd.chroot_list
ls_recurse_enable=YES
listen=YES
listen_ipv6=NO
secure_chroot_dir=/var/empty

Обратить внимание на secure_chroot_dir=/var/empty - это должен быть пустой существующий каталог.Использовать или нет chroot_list_file=/usr/local/etc/vsftpd/vsftpd.chroot_list - по желанию. Я всегда использую.

Стартовый скрипт

Стартовый скрипт - простой. Для работы с системой SMF он должен отрабатывать как минимуму 2 возможных параметра - start и stop

  • Обратить внимание - bash установлен в системе.
#!/usr/local/bin/bash
SVCNAME=vsftpd
VSFTPD_EXEC=/usr/local/sbin/vsftpd
VSFTPD_CONF=/usr/local/etc/vsftpd/vsftpd.conf
VSFTPD_PID=/usr/local/var/run/vsftpd.pid

start() {
        echo "Starting ${SVCNAME}"
         $VSFTPD_EXEC "${VSFTPD_CONF}" &
        echo $! > $VSFTPD_PID
        echo Pid is $VSFTPD_PID
}

stop() {
    echo "Stopping ${SVCNAME}"
    if [ -f ${VSFTPD_PID} ]; then
        NUM_PID=`cat ${VSFTPD_PID}`
        /usr/bin/kill -9 $NUM_PID
    else
        echo "Couldn't found" ${VSFTPD_PID}
    fi
}

case $1 in
    start)
        start
        exit $?
    ;;
    stop)
        stop
        exit $?
    ;;
    restart)
        stop
        sleep 5
        start
        ;;

    *)
        echo "Usage: `basename $0` {start | stop | restart}"
        exit 64
    ;;
esac

Интеграция с системой SMF

Разные источники советуют помещать конфигурационный файл (описание) в разные каталоги. Я встречал варианты

  • /var/svc/manifest/site/
  • /var/svc/manifest/application

Судя по всему, это просто логическое разделение, и используется для удобства.

Конфигурационный файл сервиса

Создаю файл описания:

# cat /var/svc/manifest/site/vsftpd.xml
<!--
    Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
    Use is subject to license terms.

    pragma ident        "@(#)vsftpd.xml 1.2     04/08/09 SMI"
-->

<service_bundle type='manifest' name='OPTnew:vsftpd'>
<service
    name='site/vsftpd'
    type='service'
    version='1'>
    <single_instance/>
    <dependency
            name='usr'
            type='service'
            grouping='require_all'
            restart_on='none'>
                <service_fmri value='svc:/system/filesystem/local'/>
        </dependency>

        <dependency
            name='vsftpd'
            type='service'
            grouping='require_all'
            restart_on='none'>
                <service_fmri value='svc:/milestone/multi-user'/>
        </dependency>

        <exec_method
            type='method'
            name='start'
            exec='/usr/local/etc/rc.d/vsftpd start'
            timeout_seconds='30' />

        <exec_method
            type='method'
            name='stop'
            exec='/usr/local/etc/rc.d/vsftpd stop'
            timeout_seconds='30' />

        <property_group name='startd' type='framework'>
                <propval name='duration' type='astring' value='transient' />
        </property_group>

        <instance name='default' enabled='true' />

        <stability value='Unstable' />

        <template>
                <common_name>
                        <loctext xml:lang='C'>
                                vsftpd_service
                        </loctext>
                </common_name>
        </template>
</service>

</service_bundle>

Подробное описание секций конфига

Останавлюсь на некоторых его частях немного подробнее:

Стандартный заголовок (одинаковый у всех аналогичных файлов)

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM
"/usr/share/lib/xml/dtd/service_bundle.dtd.1">

Комментарий

<!--
    Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
    Use is subject to license terms.

    pragma ident        "@(#)vsftpd.xml 1.2     04/08/09 SMI"
-->

Имя сервиса Тип (manifest) показывает что это отдельный сервис (а какие еще бывают?)

<service_bundle type='manifest' name='OPTnew:vsftpd'>

Категория сервиса, тип, версия (описательная секция)

<service
   name='site/vsftpd'
   type='service'
   version='1'

Возможна ли множественный запуск сервисов (в моем случае - нет)

<single_instance/>

Тут цитата:
the service model to use. The entry shows that the service will be started by svc.startd. transient services are started once and not restarted.
Судя по всему, совершенно необязательная секция.

<property_group name='startd' type='framework'>
   <propval name='duration' type='astring' value='transient' />
</property_group>

Команды для запуска. Обратите внимание, что здесь же можно задать имя пользователя от которого команда будет выполнена.

<method_context>
   <method_credential user='myuser' group='mygroup' />
</method_context>

"Метод" - это стартовый скрипт. Я поместил свой скрипт отдельно, что бы не путать его с системными, хотя, возможно это не совсем верно. Правильный путь для методов - '/lib/svc/method/'

<exec_method
   type='method'
   name='start'
   exec='/usr/local/etc/rc.d/vsftpd start'
   timeout_seconds='30' />

Если сервисы обозначеные как зависимости не работают – сервис не должен запускатся.
<PRE>
<dependency
   name='usr'
   type='service'
   grouping='require_all'
   restart_on='none'>
   <service_fmri value='svc:/system/filesystem/local'/>
</dependency>

Цитата:
The second entry makes sure that your service is associated with the multi-user milestone and that the multi-user milestone requires this service.

<dependency
   name='vsftpd'
   grouping='require_all'
   restart_on='none'>
    <service_fmri value='svc:/milestone/multi-user'/>
</dependency>

Цитата:
Creating the instance.

 <instance name='default' enabled='true' />
 <stability value='Unstable' />

Цитата:
Creating information to describe the service.

<template>
   <common_name>
      <loctext xml:lang='C'>
         New Service
      </loctext>
   </common_name>
</template>

Права доступа

chown root:sys /var/svc/manifest/site/vsftpd.xml
chmod 444 /var/svc/manifest/site/vsftpd.xml
chown root:bin /usr/local/etc/rc.d/vsftpd
chmod 555 /usr/local/etc/rc.d/vsftpd

Проверка конфигурационного файла

svccfg validate /var/svc/manifest/site/vsftpd.xml

или если не проходит:

xmllint /var/svc/manifest/site/vsftpd.xml

Запуск сервиса

Далее проводи импорт из файла:

svccfg import /var/svc/manifest/site/vsftpd.xml

Запуск сервиса:

svcadm –v enable vsftpd


Проверить запустился ли сервис можно командой:

svcs -a | grep vsftpd

При успешном запуске вывод должен содержать строку:

online         15:23:46 svc:/site/vsftpd:default

Для просмотра детальной информации о сервисе следует воспользоваться следующей командой:

svcs -x vsftpd

вывод этой команды:

bash-4.1# svcs -x vsftpd
svc:/site/vsftpd:default (vsftpd_service)
 State: online since Wed May 26 15:23:46 2010
   See: /var/svc/log/site-vsftpd:default.log
Impact: None.
bash-4.1#

Чтобы увидеть список процессов запущенных сервисом, воспользуйтесь следующей командой:

bash-4.1# svcs -p vsftpd
STATE          STIME    FMRI
online         15:23:46 svc:/site/vsftpd:default
bash-4.1#

В случае необходимости становить сервис можно командой:

svcadm –v disable vsftpd

Если во время запуска произошла ошибка и сервис не смог запуститься, например из-за ошибки в конфигурации, подсистема SMF переводит его в состояние maintenance и после этого сервис не запустится командой svcadm enable. Для того чтобы запустить сервис после устранения ошибки, необходимо сначала «сбросить» его состояние командой:

svcadm clear vsftpd

Для каждого сервиса ведется свой журнал событий. Журналы располагаются в каталоге /var/svc/log.

Профили

В каталоге /var/svc/profile есть предустановленные профили:

  • /var/svc/profile/generic_open.xml – службы, стандартные для более ранних версий Solaris (до S10U3 включительно);
  • /var/svc/profile/generic_limited_net.xml – стандартные службы, как и в generic_open.xml, но с запретом запускать сетевые службы, кроме ssh;
  • /var/svc/profile/ns_*.xml –запуск служб, имеющих отношение к службе имен;
  • /var/svc/profile/platform_*.xml – профиль служб, связанных с конкретной платформой.

Если создать профиль site.xml, в качестве списка запускаемых по умолчанию служб будет использоваться он. Для каждого экземпляра службы существует несколько снимков настроек, которые можно использовать для возврата к предыдущим:

  • initial - начальная настройка службы, созданная при первом импорте ее описания,
  • last-import - последняя из импортированных с помощью svccfg,
  • running - настройка запущенного экземпляра службы,
  • start – снимок при последнем успешном переходе экземпляра службы в состояние online,
  • previous - созданный при последнем возврате к предыдущим настройкам.

Режимы работы системы (runlevels)

Для упрощения переключения между разными наборами программ, используемых для разных типов задач, была создана концепция режимов работы системы. Любая UNIX System V может работать в одном из семи режимов. В Solaris используется восемь режимов (0-6 и S или s). Режим работы иногда называют состоянием (state) или уровнем выполнения. Набор программ, запускаемых в данном режиме, определяется содержимым файла /etc/inittab, в котором указываются стартовые скрипты, автоматически запускаемые при переходе к каждому из уровней выполнения. Эти скрипты находятся в каталоге /etc, и из них вызываются другие скрипты, расположенные в каталогах /etc/rcN.d. Режим 0 - система останавливается, управление передается OpenBootPROM, а для архитектуры х86 - система останавливается и затем может быть перезагружена нажатием любой клавиши. Режим 1 - файловые системы для многопользовательской работы, смонтированы, запущены некоторые демоны, но пользователям не разрешено входить в систему (работает один пользователь). Режим s (S) называется однопользовательским. Все пользовательские процессы останавливаются, а файловые системы, необходимые для многопользовательской работы, демонтируются. Доступ к системе возможен только с консоли и с логином, не требующим доступа к пользовательским файловым системам. Система переходит в состояние s автоматически, когда файловая система /usr повреждена и переход в этот режим возможен даже при поврежденном или отсутствующем файле /etc/inittab. Пре переходе в режим S из других режимов файловые системы, которые уже смонтированы к этому моменту, остаются смонтированными, но все процессы, запущенные ранее, которые должны быть запущены только в многопользовательских режимах или запущенные от имени пользователей, завершаются.

  • Режим 2 – многопользовательский.
  • Режим 3 – тоже многопользовательский, но поддерживается разделение каталогов с помощью NFS, в отличие от режима 2.
  • Режим 4 – в настоящее время не реализован.
  • Режим 5 – операционная система останавливается, если есть аппаратная поддержка выключения питания – оно автоматически отключается.
  • Режим 6 - останавливает и перезагружает систему в состояние, определяемое записью initdefault в файле /etc/inittab. Если введена команда touch /reconfigure, конфигурирует перед перезагрузкой новый образ ядра (после изменения его параметров или добавления новых устройств).

Проверить, в какой режим работы загрузилась система, можно командой

 # who -r
run-level 3  2008-07-05 22:57 


Этапы работы системы

В Solaris 10 введено понятие "этапов" (milestone). Разные этапы предполагают функционирование разных наборов служб. Переход от одного этапа к другому и объявление одного из этапов "этапом по умолчанию" (к которому система должна прийти в результате нормальной загрузки) выполняется командами svcs, svcadm и svccfg. В системах SPARC указание этапа работы при загрузке выполняется так:

ok boot -m milestone=value

Например, для запуска системы с загрузкой всех установленных служб указывается этап all, а без запущенных служб (когда загружаются только init, svc.startd и svc.configd) – этап none.

Порядок загрузки системы изменился: теперь после загрузки ядра запускается процесс init, он считывает файл /etc/default/init и устанавливает переменные среды окружения (по умолчанию устанавливается TIMEZONE, а установка других переменных зависит от дистрибутива и версии системы), затем init считывает файл /etc/inittab и запускает все процессы, у которых в поле "тип запуска" указано sysinit, и управление дальнейшим запуском служб переходит к службе svc.startd.