Solaris SMF: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показано 27 промежуточных версий этого же участника)
Строка 1: Строка 1:
  +
[[Категория:Solaris]]
 
=SMF=
 
=SMF=
 
Этот документ является компиляцией из нескольких источников.
 
Этот документ является компиляцией из нескольких источников.
Строка 10: Строка 11:
 
Экземпляр (instance, каждый из запущенных с разными файлами настроек процессов) может унаследовать настройки службы в целом или иметь собственные настройки, имеющие более высокий приоритет, чем общие. Каждый экземпляр службы имеет свой идентификатор (FMRI - fault managed resource identifier), имя идентификатора всегда начинается с svc, к экземпляру можно обращаться по полному имени или по сокращенному. Службы, специфичные для конкретной системы, принято относить к категории site. Все службы содержатся в определенном контексте (scope), представляющем собой набор логически связанных служб (в Solaris 10 определен только контекст localhost).
 
Экземпляр (instance, каждый из запущенных с разными файлами настроек процессов) может унаследовать настройки службы в целом или иметь собственные настройки, имеющие более высокий приоритет, чем общие. Каждый экземпляр службы имеет свой идентификатор (FMRI - fault managed resource identifier), имя идентификатора всегда начинается с svc, к экземпляру можно обращаться по полному имени или по сокращенному. Службы, специфичные для конкретной системы, принято относить к категории site. Все службы содержатся в определенном контексте (scope), представляющем собой набор логически связанных служб (в Solaris 10 определен только контекст localhost).
   
  +
===Управление службами===
 
Для вывода всех запущенных служб используется
 
Для вывода всех запущенных служб используется
  +
{{Root|<nowiki># svcs
 
<PRE>
 
# svcs
 
 
STATE STIME FMRI
 
STATE STIME FMRI
 
legacy_run 11:28:37 lrc:/etc/rc2_d/S20sysetup
 
legacy_run 11:28:37 lrc:/etc/rc2_d/S20sysetup
Строка 24: Строка 24:
 
online 11:28:12 svc:/system/scheduler:default
 
online 11:28:12 svc:/system/scheduler:default
 
online 11:28:14 svc:/system/boot-archive:default
 
online 11:28:14 svc:/system/boot-archive:default
</PRE>
+
</nowiki>}}
   
А для вывода всех служб, включая те, запуск которых запрещен:
+
Для вывода всех служб, включая те, запуск которых запрещен:
  +
{{Root|<nowiki># svcs -a
<PRE>
 
# svcs -a
 
 
STATE STIME FMRI
 
STATE STIME FMRI
 
legacy_run 22:58:12 lrc:/etc/rc2_d/S20sysetup
 
legacy_run 22:58:12 lrc:/etc/rc2_d/S20sysetup
Строка 42: Строка 41:
 
online 22:57:58 svc:/network/initial:default
 
online 22:57:58 svc:/network/initial:default
 
</PRE>
 
</PRE>
  +
</nowiki>}}
   
  +
===Состояния служб===
 
Экземпляр службы в любой момент времени может находиться в одном из семи состояний:
 
Экземпляр службы в любой момент времени может находиться в одном из семи состояний:
  +
1. degraded (ослабленное) – запуск разрешен, но работа происходит с ограниченной функциональностью,
 
  +
# degraded (ослабленное) – запуск разрешен, но работа происходит с ограниченной функциональностью,
2. disabled (запрещено запускать) – запуск запрещен, экземпляр службы не запущен,
 
  +
# disabled (запрещено запускать) – запуск запрещен, экземпляр службы не запущен,
3. legacy_run (унаследованный) – некоторые унаследованные службы не подлежат управлению через SMF, но их работу можно наблюдать стандартными для SMF средствами,
 
  +
# legacy_run (унаследованный) – некоторые унаследованные службы не подлежат управлению через SMF, но их работу можно наблюдать стандартными для SMF средствами,
4. maintenance (обслуживание) – экземпляр службы аварийно завершился,
 
5. offline (не работает) – запуск разрешен, но экземпляр службы еще не запущен или нет возможности его запустить,
+
# maintenance (обслуживание) – экземпляр службы аварийно завершился,
6. online (работает) – запуск разрешен, экземпляр службы работает без проблем,
+
# offline (не работает) – запуск разрешен, но экземпляр службы еще не запущен или нет возможности его запустить,
  +
# online (работает) – запуск разрешен, экземпляр службы работает без проблем,
7. uninitialized (неинициализирован) – в этом состоянии находятся все службы до считывания конфигурации.
 
  +
# uninitialized (неинициализирован) – в этом состоянии находятся все службы до считывания конфигурации.
  +
 
Перевод службы из состояния в состояние осуществляется автоматически.
 
Перевод службы из состояния в состояние осуществляется автоматически.
Просмотр служб, находящихся в состоянии maintenance, выполняется командой svcs –xv.
+
Просмотр служб, находящихся в состоянии maintenance, выполняется командой
  +
{{Root|<nowiki>
  +
svcs –xv
  +
</nowiki>}}
  +
  +
===Описание служб===
 
В описании каждой службы указывается, от каких служб и/или файлов она зависит.
 
В описании каждой службы указывается, от каких служб и/или файлов она зависит.
 
Типы взаимосвязи (зависимости):
 
Типы взаимосвязи (зависимости):
Строка 59: Строка 67:
 
3. optional_all – считается удовлетворенной, когда все перечисленные службы находятся в состояниях online или degraded или в состояниях disabled, maintenance, offline, либо не существуют.
 
3. optional_all – считается удовлетворенной, когда все перечисленные службы находятся в состояниях online или degraded или в состояниях disabled, maintenance, offline, либо не существуют.
 
4. exclude_all – считается удовлетворенной, когда все перечисленные службы запрещено запускать, либо они находятся в состоянии maintenance, или все указанные службы или файлы отсутствуют.
 
4. exclude_all – считается удовлетворенной, когда все перечисленные службы запрещено запускать, либо они находятся в состоянии maintenance, или все указанные службы или файлы отсутствуют.
  +
Для изменения состояния службы используется svcadm (чтобы измененные настройки вступили в силу – svcadm refresh), для изменения настроек– svccfg(и ее подкоманды – listsnap, selectsnap и revertsnap), а для получения информации о свойствах– svcprop.
 
  +
Для изменения состояния службы используется
  +
  +
* svcadm (чтобы измененные настройки вступили в силу – svcadm refresh)
  +
* для изменения настроек– svccfg(и ее подкоманды – listsnap, selectsnap и revertsnap), а для получения информации о свойствах– svcprop.
  +
 
Каждая служба имеет свое объявление (manifest) – файл в формате XML, содержащий полное описание всех свойств службы или ее экземпляра. Объявления служб хранятся в каталоге /var/svc/manifest. Файлы объявлений не являются источником информации для служб SMF -таким источником является репозиторий. Для импорта информации из файлов объявлений в репозиторий используется команда svccfg import (при перезагрузке это происходит автоматически), а для получения архива XML с постоянными свойствами всех служб - svccfg export.
 
Каждая служба имеет свое объявление (manifest) – файл в формате XML, содержащий полное описание всех свойств службы или ее экземпляра. Объявления служб хранятся в каталоге /var/svc/manifest. Файлы объявлений не являются источником информации для служб SMF -таким источником является репозиторий. Для импорта информации из файлов объявлений в репозиторий используется команда svccfg import (при перезагрузке это происходит автоматически), а для получения архива XML с постоянными свойствами всех служб - svccfg export.
 
Профиль – это файл XML, содержащий список служб, разрешенных к запуску. После установки или обновления система обращается к профилю generic.xml, который является символической ссылкой на generic_limited_net.xml.
 
Профиль – это файл XML, содержащий список служб, разрешенных к запуску. После установки или обновления система обращается к профилю generic.xml, который является символической ссылкой на generic_limited_net.xml.
  +
  +
==Пример установки стороннего ПО в качестве службы==
  +
Для примера - устанавливаю vsftpd в качестве службы.
  +
  +
===Установка ПО===
  +
* скачиваю пакет и зависимости с http://www.sunfreeware.com/programlistintel10.html
  +
* распаковываю
  +
{{Root|<nowiki>gunzip /path/to/file/vsftpd-<ver>-local.gz</nowiki>}}
  +
* устнавливаю с помошью менеджера пакетов
  +
{{Root|<nowiki>pkgadd -d /path/to/file/vsftpd-<ver>-local.gz</nowiki>}}
  +
(все файлы будут установлены в /usr/local/)
  +
  +
===Настройка===
  +
Настройка vsftpd довольна проста. Конфигурационый файл достаточно короткий, все опции документированы.
  +
<PRE>
  +
cat /usr/local/etc/vsftpd/vsftpd.conf | grep -v "#"
  +
</PRE>
  +
<PRE>
  +
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
  +
</PRE>
  +
Обратить внимание на secure_chroot_dir=/var/empty - это должен быть пустой существующий каталог.Использовать или нет chroot_list_file=/usr/local/etc/vsftpd/vsftpd.chroot_list - по желанию. Я всегда использую.
  +
  +
===Стартовый скрипт===
  +
Стартовый скрипт - простой. Для работы с системой SMF он должен отрабатывать как минимуму 2 возможных параметра - start и stop
  +
* Обратить внимание - bash установлен в системе.
  +
<PRE>
  +
#!/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
  +
</PRE>
  +
  +
===Интеграция с системой SMF===
  +
  +
Разные источники советуют помещать конфигурационный файл (описание) в разные каталоги. Я встречал варианты
  +
* /var/svc/manifest/site/
  +
* /var/svc/manifest/application
  +
Судя по всему, это просто логическое разделение, и используется для удобства.
  +
====Конфигурационный файл сервиса====
  +
Создаю файл описания:
  +
<PRE>
  +
# cat /var/svc/manifest/site/vsftpd.xml
  +
</PRE>
  +
<PRE>
  +
<!--
  +
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>
  +
</PRE>
  +
====Подробное описание секций конфига====
  +
Останавлюсь на некоторых его частях немного подробнее:
  +
  +
Стандартный заголовок (одинаковый у всех аналогичных файлов)
  +
<PRE>
  +
<?xml version="1.0"?>
  +
<!DOCTYPE service_bundle SYSTEM
  +
"/usr/share/lib/xml/dtd/service_bundle.dtd.1">
  +
</PRE>
  +
  +
Комментарий
  +
<PRE>
  +
<!--
  +
Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  +
Use is subject to license terms.
  +
  +
pragma ident "@(#)vsftpd.xml 1.2 04/08/09 SMI"
  +
-->
  +
</PRE>
  +
  +
Имя сервиса
  +
Тип (manifest) показывает что это отдельный сервис (а какие еще бывают?)
  +
<PRE>
  +
<service_bundle type='manifest' name='OPTnew:vsftpd'>
  +
</PRE>
  +
  +
Категория сервиса, тип, версия (описательная секция)
  +
<PRE>
  +
<service
  +
name='site/vsftpd'
  +
type='service'
  +
version='1'
  +
</PRE>
  +
  +
Возможна ли множественный запуск сервисов (в моем случае - нет)
  +
<PRE>
  +
<single_instance/>
  +
</PRE>
  +
  +
Тут цитата:<BR>
  +
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.<BR>
  +
Судя по всему, совершенно необязательная секция.
  +
  +
<PRE>
  +
<property_group name='startd' type='framework'>
  +
<propval name='duration' type='astring' value='transient' />
  +
</property_group>
  +
</PRE>
  +
  +
Команды для запуска.
  +
Обратите внимание, что здесь же можно задать имя пользователя от которого команда будет выполнена.
  +
<PRE>
  +
<method_context>
  +
<method_credential user='myuser' group='mygroup' />
  +
</method_context>
  +
</PRE>
  +
"Метод" - это стартовый скрипт. Я поместил свой скрипт отдельно, что бы не путать его с системными, хотя, возможно это не совсем верно.
  +
Правильный путь для методов - '/lib/svc/method/'
  +
<PRE>
  +
<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>
  +
</PRE>
  +
  +
Цитата: <BR>
  +
The second entry makes sure that your service is associated with the multi-user milestone and that the multi-user milestone requires this service.
  +
  +
<PRE>
  +
<dependency
  +
name='vsftpd'
  +
grouping='require_all'
  +
restart_on='none'>
  +
<service_fmri value='svc:/milestone/multi-user'/>
  +
</dependency>
  +
</PRE>
  +
  +
Цитата: <BR>
  +
Creating the instance.
  +
<PRE>
  +
<instance name='default' enabled='true' />
  +
<stability value='Unstable' />
  +
</PRE>
  +
  +
Цитата: <BR>
  +
Creating information to describe the service.
  +
<PRE>
  +
<template>
  +
<common_name>
  +
<loctext xml:lang='C'>
  +
New Service
  +
</loctext>
  +
</common_name>
  +
</template>
  +
</PRE>
  +
====Права доступа====
  +
<PRE>
  +
chown root:sys /var/svc/manifest/site/vsftpd.xml
  +
chmod 444 /var/svc/manifest/site/vsftpd.xml
  +
</PRE>
  +
<PRE>
  +
chown root:bin /usr/local/etc/rc.d/vsftpd
  +
chmod 555 /usr/local/etc/rc.d/vsftpd
  +
</PRE>
  +
  +
====Проверка конфигурационного файла====
  +
<PRE>
  +
svccfg validate /var/svc/manifest/site/vsftpd.xml
  +
</PRE>
  +
или если не проходит:
  +
<PRE>
  +
xmllint /var/svc/manifest/site/vsftpd.xml
  +
</PRE>
  +
  +
====Запуск сервиса====
  +
Далее проводи импорт из файла:
  +
<PRE>
  +
svccfg import /var/svc/manifest/site/vsftpd.xml
  +
</PRE>
  +
  +
Запуск сервиса:
  +
<PRE>
  +
svcadm –v enable vsftpd
  +
</PRE>
  +
  +
  +
Проверить запустился ли сервис можно командой:
  +
<PRE>
  +
svcs -a | grep vsftpd
  +
</PRE>
  +
  +
При успешном запуске вывод должен содержать строку:
  +
<PRE>
  +
online 15:23:46 svc:/site/vsftpd:default
  +
</PRE>
  +
  +
Для просмотра детальной информации о сервисе следует воспользоваться следующей командой:
  +
  +
svcs -x vsftpd
  +
  +
вывод этой команды:
  +
<PRE>
  +
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#
  +
</PRE>
  +
  +
Чтобы увидеть список процессов запущенных сервисом, воспользуйтесь следующей командой:
  +
<PRE>
  +
bash-4.1# svcs -p vsftpd
  +
STATE STIME FMRI
  +
online 15:23:46 svc:/site/vsftpd:default
  +
bash-4.1#
  +
</PRE>
  +
  +
В случае необходимости становить сервис можно командой:
  +
  +
<PRE>
  +
svcadm –v disable vsftpd
  +
</PRE>
  +
  +
Если во время запуска произошла ошибка и сервис не смог запуститься, например из-за ошибки в конфигурации, подсистема SMF переводит его в состояние maintenance и после этого сервис не запустится командой svcadm enable. Для того чтобы запустить сервис после устранения ошибки, необходимо сначала «сбросить» его состояние командой:
  +
<PRE>
  +
svcadm clear vsftpd
  +
</PRE>
  +
  +
Для каждого сервиса ведется свой журнал событий. Журналы располагаются в каталоге /var/svc/log.
  +
  +
==Профили==
 
В каталоге /var/svc/profile есть предустановленные профили:
 
В каталоге /var/svc/profile есть предустановленные профили:
/var/svc/profile/generic_open.xml – службы, стандартные для более ранних версий Solaris (до S10U3 включительно);
+
* /var/svc/profile/generic_open.xml – службы, стандартные для более ранних версий Solaris (до S10U3 включительно);
/var/svc/profile/generic_limited_net.xml – стандартные службы, как и в generic_open.xml, но с запретом запускать сетевые службы, кроме ssh;
+
* /var/svc/profile/generic_limited_net.xml – стандартные службы, как и в generic_open.xml, но с запретом запускать сетевые службы, кроме ssh;
/var/svc/profile/ns_*.xml –запуск служб, имеющих отношение к службе имен;
+
* /var/svc/profile/ns_*.xml –запуск служб, имеющих отношение к службе имен;
/var/svc/profile/platform_*.xml – профиль служб, связанных с конкретной платформой.
+
* /var/svc/profile/platform_*.xml – профиль служб, связанных с конкретной платформой.
  +
 
Если создать профиль site.xml, в качестве списка запускаемых по умолчанию служб будет использоваться он.
 
Если создать профиль site.xml, в качестве списка запускаемых по умолчанию служб будет использоваться он.
 
Для каждого экземпляра службы существует несколько снимков настроек, которые можно использовать для возврата к предыдущим:
 
Для каждого экземпляра службы существует несколько снимков настроек, которые можно использовать для возврата к предыдущим:
initial - начальная настройка службы, созданная при первом импорте ее описания,
+
* initial - начальная настройка службы, созданная при первом импорте ее описания,
last-import - последняя из импортированных с помощью svccfg,
+
* last-import - последняя из импортированных с помощью svccfg,
running - настройка запущенного экземпляра службы,
+
* running - настройка запущенного экземпляра службы,
start – снимок при последнем успешном переходе экземпляра службы в состояние online,
+
* start – снимок при последнем успешном переходе экземпляра службы в состояние online,
previous - созданный при последнем возврате к предыдущим настройкам.
+
* previous - созданный при последнем возврате к предыдущим настройкам.
  +
Режимы работы системы (runlevels)
 
  +
==Режимы работы системы (runlevels)==
 
Для упрощения переключения между разными наборами программ, используемых для разных типов задач, была создана концепция режимов работы системы. Любая UNIX System V может работать в одном из семи режимов. В Solaris используется восемь режимов (0-6 и S или s).
 
Для упрощения переключения между разными наборами программ, используемых для разных типов задач, была создана концепция режимов работы системы. Любая UNIX System V может работать в одном из семи режимов. В Solaris используется восемь режимов (0-6 и S или s).
 
Режим работы иногда называют состоянием (state) или уровнем выполнения. Набор программ, запускаемых в данном режиме, определяется содержимым файла /etc/inittab, в котором указываются стартовые скрипты, автоматически запускаемые при переходе к каждому из уровней выполнения. Эти скрипты находятся в каталоге /etc, и из них вызываются другие скрипты, расположенные в каталогах /etc/rcN.d.
 
Режим работы иногда называют состоянием (state) или уровнем выполнения. Набор программ, запускаемых в данном режиме, определяется содержимым файла /etc/inittab, в котором указываются стартовые скрипты, автоматически запускаемые при переходе к каждому из уровней выполнения. Эти скрипты находятся в каталоге /etc, и из них вызываются другие скрипты, расположенные в каталогах /etc/rcN.d.
Строка 80: Строка 439:
 
Режим 1 - файловые системы для многопользовательской работы, смонтированы, запущены некоторые демоны, но пользователям не разрешено входить в систему (работает один пользователь).
 
Режим 1 - файловые системы для многопользовательской работы, смонтированы, запущены некоторые демоны, но пользователям не разрешено входить в систему (работает один пользователь).
 
Режим s (S) называется однопользовательским. Все пользовательские процессы останавливаются, а файловые системы, необходимые для многопользовательской работы, демонтируются. Доступ к системе возможен только с консоли и с логином, не требующим доступа к пользовательским файловым системам. Система переходит в состояние s автоматически, когда файловая система /usr повреждена и переход в этот режим возможен даже при поврежденном или отсутствующем файле /etc/inittab. Пре переходе в режим S из других режимов файловые системы, которые уже смонтированы к этому моменту, остаются смонтированными, но все процессы, запущенные ранее, которые должны быть запущены только в многопользовательских режимах или запущенные от имени пользователей, завершаются.
 
Режим s (S) называется однопользовательским. Все пользовательские процессы останавливаются, а файловые системы, необходимые для многопользовательской работы, демонтируются. Доступ к системе возможен только с консоли и с логином, не требующим доступа к пользовательским файловым системам. Система переходит в состояние s автоматически, когда файловая система /usr повреждена и переход в этот режим возможен даже при поврежденном или отсутствующем файле /etc/inittab. Пре переходе в режим S из других режимов файловые системы, которые уже смонтированы к этому моменту, остаются смонтированными, но все процессы, запущенные ранее, которые должны быть запущены только в многопользовательских режимах или запущенные от имени пользователей, завершаются.
Режим 2 – многопользовательский.
+
*Режим 2 – многопользовательский.
Режим 3 – тоже многопользовательский, но поддерживается разделение каталогов с помощью NFS, в отличие от режима 2.
+
*Режим 3 – тоже многопользовательский, но поддерживается разделение каталогов с помощью NFS, в отличие от режима 2.
Режим 4 – в настоящее время не реализован.
+
*Режим 4 – в настоящее время не реализован.
Режим 5 – операционная система останавливается, если есть аппаратная поддержка выключения питания – оно автоматически отключается.
+
*Режим 5 – операционная система останавливается, если есть аппаратная поддержка выключения питания – оно автоматически отключается.
Режим 6 - останавливает и перезагружает систему в состояние, определяемое записью initdefault в файле /etc/inittab. Если введена команда touch /reconfigure, конфигурирует перед перезагрузкой новый образ ядра (после изменения его параметров или добавления новых устройств).
+
*Режим 6 - останавливает и перезагружает систему в состояние, определяемое записью initdefault в файле /etc/inittab. Если введена команда touch /reconfigure, конфигурирует перед перезагрузкой новый образ ядра (после изменения его параметров или добавления новых устройств).
 
Проверить, в какой режим работы загрузилась система, можно командой
 
Проверить, в какой режим работы загрузилась система, можно командой
   
# who -r
+
# who -r
   
run-level 3 2008-07-05 22:57
+
run-level 3 2008-07-05 22:57
   
   
   
Этапы работы системы
+
==Этапы работы системы==
 
В Solaris 10 введено понятие "этапов" (milestone). Разные этапы предполагают функционирование разных наборов служб. Переход от одного этапа к другому и объявление одного из этапов "этапом по умолчанию" (к которому система должна прийти в результате нормальной загрузки) выполняется командами svcs, svcadm и svccfg.
 
В Solaris 10 введено понятие "этапов" (milestone). Разные этапы предполагают функционирование разных наборов служб. Переход от одного этапа к другому и объявление одного из этапов "этапом по умолчанию" (к которому система должна прийти в результате нормальной загрузки) выполняется командами svcs, svcadm и svccfg.
 
В системах SPARC указание этапа работы при загрузке выполняется так:
 
В системах SPARC указание этапа работы при загрузке выполняется так:
  +
{{Root|<nowiki>ok boot -m milestone=value</nowiki>}}
   
  +
Например, для запуска системы с загрузкой всех установленных служб указывается этап all, а без запущенных служб (когда загружаются только init, svc.startd и svc.configd) – этап none.<BR>
ok boot -m milestone=value
 
  +
<P>Порядок загрузки системы изменился: теперь после загрузки ядра запускается процесс init, он считывает файл /etc/default/init и устанавливает переменные среды окружения (по умолчанию устанавливается TIMEZONE, а установка других переменных зависит от дистрибутива и версии системы), затем init считывает файл /etc/inittab и запускает все процессы, у которых в поле "тип запуска" указано sysinit, и управление дальнейшим запуском служб переходит к службе svc.startd.
 
 
Например, для запуска системы с загрузкой всех установленных служб указывается этап all, а без запущенных служб (когда загружаются только init, svc.startd и svc.configd) – этап none.
 
Порядок загрузки системы изменился: теперь после загрузки ядра запускается процесс init, он считывает файл /etc/default/init и устанавливает переменные среды окружения (по умолчанию устанавливается TIMEZONE, а установка других переменных зависит от дистрибутива и версии системы), затем init считывает файл /etc/inittab и запускает все процессы, у которых в поле "тип запуска" указано sysinit, и управление дальнейшим запуском служб переходит к службе svc.startd.
 

Текущая версия на 11:41, 24 июня 2010

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.