Arch boot process (Русский)

From ArchWiki
Revision as of 08:17, 21 October 2012 by Klay (Talk | contribs)

Jump to: navigation, search

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end

Эта статья призвана описать процесс загрузки Arch Linux и перечислить вовлеченные в процесс загрузки системные файлы, предоставляя ссылки на соответствующие статьи в вики там, где это потребуется. Arch славится своей приверженностью стилю загрузки BSD, в отличии более распространенного SysV. Это означает, что существует небольшое различие между уровнями выполнения(Wikipedia:runlevel), поскольку система по умолчанию сконфигурирована использовать и запускать одни и те же модули и процессы на всех уровнях выполнения. Преимуществом такой схемы выступает то, что пользователю становится легче настроить процесс запуска (см. rc.conf); с другой стороны, некоторые способы углубленного конфигурирования (какие были в SysV) потеряны. Тем, кого это не устраивает, будет полезно обратиться к статье Adding Runlevels. Чтобы узнать больше о различиях между стилями инициализации BSD и SysV см. Wikipedia:Init

До выполнения init

После подачи питания системе и завершения POST, BIOS определяет с какого устройства необходимо начать загрузку и передает управление на Master Boot Record этого устройства. На машине под управлением GNU/Linux в качестве загрузчика ОС чаще всего используют GRUB или LILO, который собственно и располагается в MBR. Загрузчик может предоставить пользователю выбор ОС для загрузки. Такая установка описана в статье Windows and Arch Dual Boot (Русский). После выбора Arch Linux в качестве ОС для запуска, загрузчик размещает в памяти ядро Linux (vmlinuz-linux) и образ первичной корневой файловой системы (initramfs-linux.img), затем загрузчик запускает ядро, передавая ему также параметры запуска, указанные в конфигурационном файле загрузчика.

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

Также, после запуска, ядро распаковывает initramfs (сокр. от initial RAM filesystem/первичная файловая система в ОЗУ), которая становится первичной корневой файловой системой. Затем ядро запускает на выполнение /init. Таким образом, init становится первым процессом пространства пользователя

Конечной целью работы initramfs является получение доступа к корневой файловой системе с устройства (см. также FHS). Для работы с устройствами IDE, SCSI, SATA, USB/FW (если загрузка происходит с внешнего носителя) требуются соответствующие модули, которые должны быть либо встроены в ядро, или непосредственно загружены из initramfs; как только подходящий модуль найден (с помощью программы/скрипта или через udev), процесс загрузки продолжится. Для получения доступа к корневой файловой системе, initramfs не обязательно содержать все возможные модули, которые только могут потребоваться во время работы с устройствами хранения данных. Большинство остальных модулей устройств будут загружены позже, во время инициализации, с помощью udev.

На заключительной стадии раннего пространства пользователя взамен первичной(инициализирующей) корневой файловой системы монтируется ФС с устройства. И с неё запускается /sbin/init, подменяя собой временный /init.

init и стартовые скрипты Arch

Одну из важнейших ролей в старте ОС выполняет программа init, которая запускает все остальные процессы. Назначением init является приведение системы в рабочее состояние путем запуска предназначенных для этого скриптов. Как уже было упомянуто ранее, Arch использует BSD-стиль инициализации. init читает содержимое файла /etc/inittab; в оригинальном виде начало inittab выглядит примерно следующим образом:

/etc/inittab
...

# Загрузка в консоль
id:3:initdefault:
# Загрузка в графический интерфейс X11
#id:5:initdefault:

rc::sysinit:/etc/rc.sysinit
rs:S1:wait:/etc/rc.single
rm:2345:wait:/etc/rc.multi
rh:06:wait:/etc/rc.shutdown
su:S:wait:/sbin/sulogin

...

Первая строка определяет уровень выполнения (Wikipedia:runlevel) по умолчанию (в данном случае 3 уровень). После запуска ядром init:

  • Сперва выполняется главный скрипт инициализации /etc/rc.sysinit (скрипт Bash).
  • Если запуск произведен в однопользовательском режиме (уровень выполнения 1 или S), будет выполнен скрипт /etc/rc.single.
  • В случае если был выбран какой-либо другой уровень выполнения (2-5), будет запущен другой скрипт - /etc/rc.multi.
  • Последним поступит на исполнение /etc/rc.local (только посредством /etc/rc.multi), который по умолчанию пуст.
Note: Узнать больше про Init и inittab.

/etc/rc.sysinit

/etc/rc.sysinit это большой стартовый скрипт, который настраивает оборудование и выполняет основные задачи по инициализации. Начало его выполнения сопровождается выводом примерно следующих строк:

Arch Linux
http://www.archlinux.org
Copyright 2002-2007 Judd Vinet
Copyright 2007-2010 Aaron Griffin
Distributed under the GNU General Public License (GPL)

Итак, rc.sysinit:

  1. подгружает /etc/rc.conf.
  2. подгружает /etc/rc.d/functions.
  3. выводит сообщение приветствия.
  4. монтирует различные виртуальные файловые системы. (например: /proc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm)
  5. запускает bootlogd, который записывает сообщения выведенные на консоль в файл /var/log/boot.
  6. настраивает аппаратные часы согласно с /etc/rc.conf.
  7. запускает udev и проверяет наличие событий (получает uevents).
  8. грузит необходимые модули из массива MODULES, объявленного в конфигурационном файле rc.conf.
  9. запускает интерфейс обратного замыкания.
  10. активирует тома BTRFS и программные RAID-массивы.
  11. активирует группы LVM2 (если имеются).
  12. активирует шифрованные тома.
  13. форсирует проверку файловых систем утилитой fsck (если требуется). Может перезагрузить машину или зайти в Режиме одного пользователя (см. ниже) в зависимости от результата проверки.
  14. монтирует корневую систему(/) в режиме чтения/записи, локальные файловые системы и активирует своп.
  15. инициализирует генератор случайных чисел.
  16. удаляет временные файлы.
  17. устанавливает имя машины в сети(т.н. hostname), локаль, шрифт консоли и раскладки клавиатуры как указано в rc.conf.
  18. выводит сообщения от dmesg в /var/log/dmesg.log.

/etc/rc.sysinit - это скрипт инициализации, а не склад настроек. Он читает rc.conf для их получения, и /etc/rc.d/functions содержащий сервисные функции (отвечающие среди прочего и за форматированный вывод - цвета консоли, выравнивание текста, замена BUSY на DONE и т.д.). Обычно нет причин для редактирования /etc/rc.sysinit, за исключением желания, например, ускорить запуск ОС.

/etc/rc.single

Режим одного пользователя загружает систему под учетной записью суперпользователя. Этот режим предусмотрен к использованию в случае, если система не может быть запущена другим образом. Скрипт, в своем оригинальном виде, не предусматривает запуска каких-либо служб, помимо syslog-ng и udev. Однопользовательский режим удобен при восстановлении системы, когда необходимо ограничить удаленных пользователей от действий, способных повлечь потерю или повреждение данных. Из этого режима можно выйти в стандартный(многопользовательский), прописав exit в командной строке.

/etc/rc.multi

/etc/rc.multi исполняется при загрузке любого из многопользовательских (т.е. стандартных) уровней выполнения (2, 3, 4, и 5). Обычно, пользователь не замечает перехода исполнения от rc.sysinit к rc.multi, поскольку rc.multi также использует /etc/rc.d/functions для форматирования вывода. Этот скрипт:

  1. Стартует программу sysctl, чтобы применить настройки, находящиеся в файле /etc/sysctl.conf, которые модифицируют параметры ядра Linux прямо во время работы; Arch использует совсем немного таких параметров (в основном настройки связанные с сетью).
  2. Запускает службы в соответствии с массивом DAEMONS в конфигурационном файле rc.conf.
  3. Исполняет пользовательский скрипт /etc/rc.local.
  4. Останавливает bootlogd, запущенный из /etc/rc.sysinit.

/etc/rc.local

/etc/rc.local - это локальный скрипт, выполняющийся при загрузке многопользовательского режима. Пустой по умолчанию; он хорош тем, что в него можно поместить команды, которые будут исполняться почти в самом конце процесса загрузки. Популярные настройки системы (такие как загрузка модулей, смена шрифта консоли, конфигурация устройств) обычно располагаются в более подходящих местах. Дабы не вносить беспорядок, лучше дважды убедиться, что команды располагающиеся в rc.local больше соответствуют этому скрипту, чем к примеру /etc/profile.d.

Во время редактирования этого файла просьба помнить, что он он исполняется после основных установок (модулей/служб), от имени суперпользователя и вне зависимости от запуска оконной системы X. В следующем примере скрипт rc.local настраивает звук в ALSA:

/etc/rc.local
#!/bin/bash

# /etc/rc.local: Local multi-user startup script.

amixer sset 'Master Mono' 50% unmute &> /dev/null
amixer sset 'Master' 50% unmute &> /dev/null
amixer sset 'PCM' 75% unmute &> /dev/null

Пользовательские ловушки

Ловушки полезны, когда необходимо включить какой-либо код в различные места скриптов rc.* без их редактирования.

Наименование ловушки Момент исполнения
sysinit_start В начале rc.sysinit
sysinit_udevlaunched После запуска udev в rc.sysinit
sysinit_udevsettled После получения uevents в rc.sysinit
sysinit_prefsck Перед запуском fsck в rc.sysinit
sysinit_postfsck После запуска fsck в rc.sysinit
sysinit_premount Перед монтированием локальных файловых систем, но после того, как был монтирован корень(/) в режиме чтения-записи в rc.sysinit
sysinit_end В конце rc.sysinit
multi_start В начале rc.multi
multi_end В конце rc.multi
single_start В начале rc.single
single_prekillall Перед убийством всех процессов в rc.single
single_postkillall После убийства всех процессов в rc.single
single_udevlaunched После запуска udev в rc.single
single_udevsettled После получения uevents в rc.single
single_end В конце rc.single
shutdown_start В начале rc.shutdown
shutdown_prekillall Перед убийством всех процессов в rc.shutdown
shutdown_postkillall После убийства всех процессов в rc.shutdown
shutdown_poweroff Непосредственно перед отключением питания в rc.shutdown

Для объявления функции-ловушки создайте файл в /etc/rc.d/functions.d используя в качестве примера:

function_name() {
   ...
}
add_hook hook_name function_name

Файлы из /etc/rc.d/functions.d читаются скриптом /etc/rc.d/functions. Позволяется регистрировать как несколько функций-ловушек на один и тот же тип ловушки, так и несколько типов ловушек на одну и ту же функцию-ловушку. В этих файлах запрещается именовать функцию как add_hook или run_hook, поскольку функции с такими именами уже объявлены в /etc/rc.d/functions.

Пример

Добавление следующего файла отключает кэш отложенной записи на жестком диске перед стартом сервисов (полезно для устройств, содержащих файлы MySQL InnoDB).

/etc/rc.d/functions.d/hd_settings
hd_settings() {
    /sbin/hdparm -W0 /dev/sdb
}
add_hook sysinit_udevsettled hd_settings
add_hook single_udevsettled  hd_settings

Сперва объявляется функция-ловушка hd_settings, затем она регистрируется на ловушки типа single_udevsettled и sysinit_udevsettled. Функция-ловушка будет вызываться незамедлительно после получения uevents в /etc/rc.d/rc.sysinit или /etc/rc.d/rc.single.

init: Идентификация в системе

По умолчанию, после завершения всех скриптов запуска, программа /sbin/agetty просит вас представиться в системе. После ввода имени пользователя /sbin/agetty вызывает программу /bin/login, чтобы она запросила пароль.

Наконец, после успешного входа, программа /bin/login запускает командный интерпретатор (shell / оболочку) пользователя. Стандартный шелл а также переменные среды (environment variables) могут быть объявлены глобально, с помощью /etc/profile. Все переменные, объявленные в стартовых скриптах домашней директории пользователя, получают приоритет над переменными объявленными глобально в /etc. К примеру, если переменная с одним и тем же одним именем объявлена в /etc/profile и ~/.bashrc, та, что находится в ~/.bashrc будет иметь преимущественную силу.

Большинство пользователей, желающих запустить при старте оконную систему X, пожелают также установить графический менеджер входа в систему (см. Display Manager). Также, статья Start X at Boot охватывает методы, которые не требуют установки менеджера входа.

См. также