Solaris SMF
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).
Управление службами
Для вывода всех запущенных служб используется
Для вывода всех служб, включая те, запуск которых запрещен:
Состояния служб
Экземпляр службы в любой момент времени может находиться в одном из семи состояний:
- degraded (ослабленное) – запуск разрешен, но работа происходит с ограниченной функциональностью,
- disabled (запрещено запускать) – запуск запрещен, экземпляр службы не запущен,
- legacy_run (унаследованный) – некоторые унаследованные службы не подлежат управлению через SMF, но их работу можно наблюдать стандартными для SMF средствами,
- maintenance (обслуживание) – экземпляр службы аварийно завершился,
- offline (не работает) – запуск разрешен, но экземпляр службы еще не запущен или нет возможности его запустить,
- online (работает) – запуск разрешен, экземпляр службы работает без проблем,
- uninitialized (неинициализирован) – в этом состоянии находятся все службы до считывания конфигурации.
Перевод службы из состояния в состояние осуществляется автоматически. Просмотр служб, находящихся в состоянии maintenance, выполняется командой
Описание служб
В описании каждой службы указывается, от каких служб и/или файлов она зависит. Типы взаимосвязи (зависимости): 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 в качестве службы.
Установка ПО
- скачиваю пакет и зависимости с http://www.sunfreeware.com/programlistintel10.html
- распаковываю
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>
Профили
В каталоге /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 указание этапа работы при загрузке выполняется так:
Например, для запуска системы с загрузкой всех установленных служб указывается этап all, а без запущенных служб (когда загружаются только init, svc.startd и svc.configd) – этап none.
Порядок загрузки системы изменился: теперь после загрузки ядра запускается процесс init, он считывает файл /etc/default/init и устанавливает переменные среды окружения (по умолчанию устанавливается TIMEZONE, а установка других переменных зависит от дистрибутива и версии системы), затем init считывает файл /etc/inittab и запускает все процессы, у которых в поле "тип запуска" указано sysinit, и управление дальнейшим запуском служб переходит к службе svc.startd.