Библиотека сайта 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, выглядит примерно так:- Задаются начальные значения общесистемных переменных PATH, HOSTNAME, HOSTTYPE и т.д., а также значения нескольких переменных, которые будут использоваться на дальнейших этапах загрузки.
- Определяется, используя содержимое файла /etc/sysconfig/network, должна ли данная система подключаться к какой-то локальной сети. В этом файле просто задается значение переменной NETWORKING (да или нет).
- Аналогичным образом (то есть путем считывания установок из нескольких файлов, размещаемых в каталоге ,/etc/sysconfig, и задания каких-то значений переменных) задается необходимость использования usb-устройств, уровень безопасности и т.д.
- Считываются из файла /etc/init.d/functions определения функций, которые будут использоваться скриптами из каталога /etc/init.d на следующих этапах загрузки (а, возможно, и в работающей системе).
- Монтируются файловые системы /proc (файловая система, используемая в Linux для определения состояния различных процессов) и /sys.
- Утилита udev вызывается для создания файлов блоковых устройств в каталоге /dev.
- Задается системный шрифт.
- Содержимое командной строки загрузки ядра записывается в переменную cmdline.
- Выдается сообщение с ссобщением о загружаемой систем и информацией
о возможности продолжения загрузки в интерактивном режиме:
Добро пожаловать в Mandriva Linux 2007.1 Нажмите 'I' для перехода в интерактивную загрузку.
- Перенастраиваются параметры ядра путем запуска команды sysctl. Эта операция выполняется в скрипте rc.sysinit неоднократно по мере изменения каких-то параметров.
- Восстанавливается системное время и другие временные установки (установку часового пояса и т.д.), ориентируясь на показания датчика времени в BIOS и значения параметров, заданные при инсталляции системы.
- Загружаются модули, заданные пользователем в /etc/sysconfig/modules/*.modules.
- Задается сетевое имя компьютера (host name), используемое в процедурах идентификации, таких как NIS (Network Information Service), NIS+ (улучшенная версия NIS) и так далее.
- Задаются настройки, необходимые для подключения устройств Firewire, USB, RAID-массивов, менеджера логических томов и шифрования диска. Например, проверяется существует ли /proc/bus/usb и является ли он каталогом. Если этот каталог существует, но не указан в файле /proc/mounts, то монтируется файловая система типа usbfs.
- Проверяется корневая файловая система и, в случае отсутствия проблем, она монтируется в режиме чтения-записи.
- Задействуется виртуальная память, активизируется и монтируется swap-раздел, указанный в файле /etc/fstab.
- Проверяются другие файловые системы, перечисленные в /etc/fstab.
- Монтируются все файловые системы, перечисленные в файле /etc/fstab.
- Проверяются квоты на использование дискового пространства.
- Идентифицируется и распознается установленное оборудование, конфигурируются устройства Plug'n'Play, активизируются другие устройства, например, звуковая плата.
- Проверяет состояние специальных дисковых устройств, таких как RAID (Redundant Array of Inexpensive Disks).
- Загружаются раскладки клавиатуры. Задается клавиша переключения раскладок.
- Инициализируется генератор (псевдо)случайных чисел.
- Если обнаружен ленточный накопитель или в командной строке запуска присутствует параметр "hdd=ide-scsi", загружаются необходимые модули.
- Запускается оптимизация жесткого диска (вызовом команды hdparm).
- Обновляется ссылка на файл /boot/System.map (чтобы этот файл соответствовал загружаемому ядру).
- Содержимое кольцевого буфера ядра выгружается в файл /var/log/dmesg.
- Производится удаление всех временных файлов, каталогов и переменных, созданных для целей загрузки.
- Если в командной строке не задан выбор графической оболочки, то для нее задается установка по умолчанию.
Включается пространство для свопинга: [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. Но рекомендации в этом плане я давать пока не берусь, буду еще разбираться.Назад | Оглавление | Вперед |