Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Исследуем процесс загрузки Linux

(C) В.А.Костромин, 2007
(версия файла от 5.10.2007 г.)


Назад Оглавление Вперед

Этап 6: Инициализационный скрипт rc.sysinit

В этом и следующем разделах мы рассмотрим инициализационные скрипты, организованные в стиле Red Hat. Для примера будут использоваться скрипты из системы ASP Linux 11 и Mandriva Free 2007.

Если вы внимательно прочитали предыдущий раздел, то представляете, что в обычной ситуации одним из первых действий, выполняемых процессом init является запуск на выполнение скрипта rc.sysinit из каталога /etc/rc.d. О том, какие действия выполняет этот скрипт, можно понять, просмотрев и поранализировав его содержимое. В принципе, это не так уж и сложно, чтобы самому разобраться в этом файле, нужно только немного владеть языком команд командной оболочки bash. Начальные сведения об этом языке вы можете найти в моей книге [1] (по ссылке вы найдете ее электронный вариант, нужный матерал содержится в гл. 5), или же в книге Тейнсли [43]. Разбор инициализационных скриптов - неплохая практика в освоении языка интерпретатора команд. Однако не стоит думать, что это совсем уж просто. Главная сложность не в том, чтобы понять назначение отдельных команд или фрагментов этого файла. Гораздо сложнее понять логику его работы в целом, поскольку чаще всего сначала определяются значения каких-то переменных, выполняются различные подготовительные действия, и только где-то потом, значительно позже, эти заготовки используются. Я хотел было вначале детально разобраться в содержимом этого скрипта и сделать этот разбор основным содержанием настоящего раздела. Однако вскоре увидел, что раздел получается слишком громоздким и нечитаемым (как говорится, за деревьями уже не видно леса). Поэтому мне показалось гораздо более правильным дать просто краткий перечень действий, выполняемых этим скриптом. Тем не менее, если у вас есть желание, вы можете просмотреть сделанный мной разбор файла rc.sysinit в отдельном файле.

Вторым источником данных о том, что делают инициализационные скрипты, могут служить те сообщения, которые выдаются на консоль в процессе загрузки системы. Однако, в отличие от сообщений, сохраняемых в кольцевом буфере ядра, мне не удалось найти полную запись этих сообщений после загрузки системы. Поэтому я просто сделал снимки экрана на этапе загрузки, по которым и восстановил все эти сообщения. Полностью они воспроизведены в листинге 12, вынесенном в отдельное приложение.

Вот пользуясь этими двумя источниками (Приложение 1 и Приложение 2) и давайте кратко рассмотрим, что делает скрипт rc.sysinit.

6.1. Обзор действий, выполняемых скриптом rc.sysinit

Очень кратко, перечень действий, выполняемых скриптом rc.sysinit, выглядит примерно так:
  1. Задаются начальные значения общесистемных переменных PATH, HOSTNAME, HOSTTYPE и т.д., а также значения нескольких переменных, которые будут использоваться на дальнейших этапах загрузки.
  2. Определяется, используя содержимое файла /etc/sysconfig/network, должна ли данная система подключаться к какой-то локальной сети. В этом файле просто задается значение переменной NETWORKING (да или нет).
  3. Аналогичным образом (то есть путем считывания установок из нескольких файлов, размещаемых в каталоге ,/etc/sysconfig, и задания каких-то значений переменных) задается необходимость использования usb-устройств, уровень безопасности и т.д.
  4. Считываются из файла /etc/init.d/functions определения функций, которые будут использоваться скриптами из каталога /etc/init.d на следующих этапах загрузки (а, возможно, и в работающей системе).
  5. Монтируются файловые системы /proc (файловая система, используемая в Linux для определения состояния различных процессов) и /sys.
  6. Утилита udev вызывается для создания файлов блоковых устройств в каталоге /dev.
  7. Задается системный шрифт.
  8. Содержимое командной строки загрузки ядра записывается в переменную cmdline.
  9. Выдается сообщение с ссобщением о загружаемой систем и информацией о возможности продолжения загрузки в интерактивном режиме:
    			Добро пожаловать в Mandriva Linux 2007.1
    		Нажмите 'I' для перехода в интерактивную загрузку.
  10. Перенастраиваются параметры ядра путем запуска команды sysctl. Эта операция выполняется в скрипте rc.sysinit неоднократно по мере изменения каких-то параметров.
  11. Восстанавливается системное время и другие временные установки (установку часового пояса и т.д.), ориентируясь на показания датчика времени в BIOS и значения параметров, заданные при инсталляции системы.
  12. Загружаются модули, заданные пользователем в /etc/sysconfig/modules/*.modules.
  13. Задается сетевое имя компьютера (host name), используемое в процедурах идентификации, таких как NIS (Network Information Service), NIS+ (улучшенная версия NIS) и так далее.
  14. Задаются настройки, необходимые для подключения устройств Firewire, USB, RAID-массивов, менеджера логических томов и шифрования диска. Например, проверяется существует ли /proc/bus/usb и является ли он каталогом. Если этот каталог существует, но не указан в файле /proc/mounts, то монтируется файловая система типа usbfs.
  15. Проверяется корневая файловая система и, в случае отсутствия проблем, она монтируется в режиме чтения-записи.
  16. Задействуется виртуальная память, активизируется и монтируется swap-раздел, указанный в файле /etc/fstab.
  17. Проверяются другие файловые системы, перечисленные в /etc/fstab.
  18. Монтируются все файловые системы, перечисленные в файле /etc/fstab.
  19. Проверяются квоты на использование дискового пространства.
  20. Идентифицируется и распознается установленное оборудование, конфигурируются устройства Plug'n'Play, активизируются другие устройства, например, звуковая плата.
  21. Проверяет состояние специальных дисковых устройств, таких как RAID (Redundant Array of Inexpensive Disks).
  22. Загружаются раскладки клавиатуры. Задается клавиша переключения раскладок.
  23. Инициализируется генератор (псевдо)случайных чисел.
  24. Если обнаружен ленточный накопитель или в командной строке запуска присутствует параметр "hdd=ide-scsi", загружаются необходимые модули.
  25. Запускается оптимизация жесткого диска (вызовом команды hdparm).
  26. Обновляется ссылка на файл /boot/System.map (чтобы этот файл соответствовал загружаемому ядру).
  27. Содержимое кольцевого буфера ядра выгружается в файл /var/log/dmesg.
  28. Производится удаление всех временных файлов, каталогов и переменных, созданных для целей загрузки.
  29. Если в командной строке не задан выбор графической оболочки, то для нее задается установка по умолчанию.
Если вы заглянете в Приложение 2, то увидите, что далеко не все эти действия сопровождаются выдачей сообщений на экран консоли. Последнее сообщение, выдаваемое в процессе работы скрипта rc.sysinit, относится, по-видимому, к инициализации свопа:
Включается пространство для свопинга:				[OK] 
Если я правильно понимаю, дальнейшие сообщения относятся уже к работе скриптов из /etc/init.d. Но об этих скриптах будем говорить в следующем разделе.

6.2. Конфигурационные файлы, вызываемые из rc.sysinit

Как было сказано в разделе 6.1, скрипт rc.sysinit вызывает (или считывает) ряд конфигурационных файлов, размещаемых в каталоге /etc и его подкаталогах, в особености в подкаталоге /etc/sysconfig,. Давайте кратко охарактеризуем эти файлы, рассмотрим, какие задачи они выполняют и что можно с их помощью настроить. В приводимой ниже таблице каталоги выделены жирным шрифтом.
Файл Назначение или содержимое
/etc/mandriva-release Файл, содержащий название данного релиза системы. Используется для вывода баннера (смотри листинг 11-10).
/etc/modprobe.conf
/etc/modprobe.preload
/etc/modules
/etc/modprobe.d
/etc/sysconfig/modules
/etc/modprobe.d/ldetect-lst.conf
/etc/modprobe.preload.d
/etc/modprobe.preload.d/floppy
Эти файлы и каталоги, видимо, используются на этапе загрузки модулей, заданных пользователем в /etc/sysconfig/modules/*.modules и в файле /etc/modprobe.preload, который содержит имена модулей ядра, загружаемых в процессе начальной загрузки системы. Этот файл используется с ядрами 2.5 и выше, для старых ядер аналогичную роль выполняет файл /etc/modules.
/etc/fstab Назначение этого файла известно - он задает список монитруемых файловых систем и параметров монтирования для каждой из них. Используется в скрипте rc.sysinit неоднократно, смотри листинги 11-25 11-34 11-41 11-53).
/etc/locale/ru
/etc/locale/ru_RU.UTF-8

/etc/sysconfig/i18n
Эти два каталога и файл /etc/sysconfig/i18n содержат переменные, которые задают региональные установки системы (локаль), то есть язык, форматы представления даты, времени, денежной единицы и т.д. (смотри листинги 11-4 и 11-44).
/etc/sysconfig/init В этом файле определяются переменные, задающие способ отображения сообщений, поступающих от скриптов запуска.
/etc/sysconfig/syslog Этот файл задает опции для демонов протоколирования syslogd и klogd.
/etc/sysconfig/system В моей системе имеет вид:
SECURITY=3
CLASS=beginner
LIBSAFE=no
META_CLASS=download
/etc/sysconfig/harddisks Задает опции для оптимизации работы с жесткими дисками (смотри листинг 11-57 и man hdparm).
/etc/sysconfig/mouse Задает тип мыши.
/etc/sysconfig/keyboard Задает тип клавиатуры (ru, en), таблицу раскладки и переключатель (GRP_TOGGLE=alt_shift_toggle)
/etc/sysconfig/network У меня содежит всего одну строку: "NETWORKING=yes"
/etc/sysconfig/clock Задает переменные, определяющие временные установки (часовой пояс). В мой Mandriva имеет следующий вид:
UTC=false
ARC=false
ZONE=Europe/Moscow
/etc/sysconfig/console
/etc/sysconfig/console/consolefonts
/etc/sysconfig/console/consoletrans
/etc/sysconfig/console/default.kmap
/etc/sysconfig/console/consolefonts/UniCyr_8x16.psf.gz
Задание консольного шрифта
/etc/sysconfig/network-scripts
/etc/sysconfig/network-scripts/ifdown-post
/etc/sysconfig/network-scripts/ifdown-ppp
/etc/sysconfig/network-scripts/ifdown-tunnel
/etc/sysconfig/network-scripts/ifdown-sit
/etc/sysconfig/network-scripts/ifdown-sl
/etc/sysconfig/network-scripts/ifdown-ipv6
/etc/sysconfig/network-scripts/ifup-aliases
/etc/sysconfig/network-scripts/ifup-wireless
/etc/sysconfig/network-scripts/ifup-bnep
/etc/sysconfig/network-scripts/ifdown-eth
/etc/sysconfig/network-scripts/ifup-ipv6
/etc/sysconfig/network-scripts/ifup-ipx
/etc/sysconfig/network-scripts/ifup-plip
/etc/sysconfig/network-scripts/ifup-plusb
/etc/sysconfig/network-scripts/ifup-post
/etc/sysconfig/network-scripts/ifup-ppp
/etc/sysconfig/network-scripts/ifup-routes
/etc/sysconfig/network-scripts/ifup-sit
/etc/sysconfig/network-scripts/ifup-sl
/etc/sysconfig/network-scripts/ifup-tunnel
/etc/sysconfig/network-scripts/ifdown-bnep
/etc/sysconfig/network-scripts/network-functions-ipv6
/etc/sysconfig/network-scripts/init.ipv6-global
/etc/sysconfig/network-scripts/network-functions
/etc/sysconfig/network-scripts/ifdown-routes
/etc/sysconfig/network-scripts/ifup-eth
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/hostname.d/s2u
/etc/sysconfig/network-scripts/ifdown.d/vpn
/etc/sysconfig/network-scripts/ifup.d/vpn
/etc/sysconfig/network-scripts/ifup.d/netprofile
Каталог /etc/sysconfig/network-scripts содержат скрипты, используемые при подключении/отключении комьютера к/от сети (в том числе на этапе загрузки).
/etc/sysconfig/networking
/etc/sysconfig/networking/ifcfg-lo
Файл ifcfg-lo задает настройки петлевого интерфейса.
/etc/sysconfig
/etc/sysconfig/autofsck
/etc/sysconfig/readonly-root
(Листинг 11-25).
/etc/sysconfig/usb Этот файл определяет, надо ли искать в системе usb-устройства (см. листинг 11-2).
/etc/udev
/etc/udev/udev.conf
/etc/udev/links.conf
/etc/udev/agents.d/usb/usbcam
/etc/udev/conf.d/mouse.conf
/etc/udev/rules.d/60-persistent-input.rules
/etc/udev/rules.d/05-udev-early.rules
/etc/udev/rules.d/50-mdk.rules
/etc/udev/rules.d/60-cdrom_id.rules
/etc/udev/rules.d/61-net_config.rules
/etc/udev/rules.d/60-persistent-storage.rules
/etc/udev/rules.d/62-create_persistent.rules
/etc/udev/rules.d/62-net.rules
/etc/udev/rules.d/70-hotplug_map.rules
/etc/udev/rules.d/95-udev-late.rules
/etc/udev/rules.d/alsa.rules
/etc/udev/rules.d/90-hal.rules
/etc/udev/rules.d/60-dynamic.rules
/etc/udev/rules.d/70-libsane.rules
/etc/udev/rules.d/70-libgphoto2.rules
/etc/udev/rules.d/nomad.rules
/etc/udev/rules.d/70-hplj10xx.rules
/etc/udev/rules.d/61-block_config.rules
/etc/udev/scripts/dvb.sh
/etc/udev/scripts/floppy-extra-devs.sh
/etc/udev/scripts/ide-model.sh
Утилита udev вызывается из rc.sysinit для создания nodes блоковых устройств (см. листинг 11-7).

6.3. Что можно изменить в работе скрипта rc.sysinit

Этот подраздел пока только запланирован. Надо подумать, нужно ли там что-то менять. Для этого хочу сравнить rc.sysinit с инициализационными файлами SUSE, о которых так положительно отозвались Немет и К [42]. Скорее всего в самом файле rc.sysinit менять ничего не стоит, нужно правильно задать параметры в конфигурационных файлах, перечисленных в таблице раздела 6.2. Но рекомендации в этом плане я давать пока не берусь, буду еще разбираться.
Назад Оглавление Вперед