Arch Boot Process (Русский)
| Сводка |
|---|
| Обзор загрузки системы в хронологическом порядке. |
| Краткое описание |
| Чтобы компьютер смог запустить Arch Linux, в Master Boot Record или GUID Partition Table устройства, с которого производится запуск, должен быть установлен загрузчик операционной системы, способный загружать ядро Linux. Например: GRUB, GRUB2, LILO или Syslinux. Загрузчик ответственен за запуск ядра Linux и установку диска в оперативной памяти для начальной инициализации. После запуска ядра и первичной инициализации устройств, происходит старт первых процессов с помощью утилиты Init, а также запуск остальных скриптов Arch, настройки которых можно поменять редактируя rc.conf |
| По теме |
| fstab |
| rc.conf |
| Autostarting |
Эта статья призвана описать процесс загрузки Arch Linux и перечислить вовлеченные в процесс загрузки системные файлы, предоставляя ссылки на соответствующие статьи в вики там, где это потребуется. Arch славится своей приверженностью стилю загрузки BSD, в отличии более распространенного SysV. Это означает, что существует небольшое различие между уровнями выполнения(Wikipedia:runlevel), поскольку система по умолчанию сконфигурирована использовать и запускать одни и те же модули и процессы на всех уровнях выполнения. Преимуществом такой схемы выступает то, что пользователю становится легче настроить процесс запуска (см. rc.conf); с другой стороны, некоторые способы углубленного конфигурирования (какие были в SysV) потеряны. Тем, кого это не устраивает, будет полезно обратиться к статье Adding Runlevels. Чтобы узнать больше о различиях между стилями инициализации BSD и SysV см. Wikipedia:Init
Contents |
До выполнения 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), который по умолчанию пуст.
/etc/rc.sysinit
/etc/rc.sysinit это большой стартовый скрипт, который настраивает оборудование и выполняет основные задачи по инициализации. Начало его выполнения сопровождается выводом примерно следующих строк:
Arch Linux https://www.archlinux.org Copyright 2002-2007 Judd Vinet Copyright 2007-2010 Aaron Griffin Distributed under the GNU General Public License (GPL)
Итак, rc.sysinit:
- подгружает
/etc/rc.conf. - подгружает
/etc/rc.d/functions. - выводит сообщение приветствия.
- монтирует различные виртуальные файловые системы. (например: /proc, /sys, /run, /dev, /run/lock, /dev/pts, /dev/shm)
- запускает
bootlogd, который записывает сообщения выведенные на консоль в файл/var/log/boot. - настраивает аппаратные часы согласно с
/etc/rc.conf. - запускает udev и проверяет наличие событий (получает uevents).
- грузит необходимые модули из массива
MODULES, объявленного в конфигурационном файле rc.conf. - запускает интерфейс обратного замыкания.
- активирует тома BTRFS и программные RAID-массивы.
- активирует группы LVM2 (если имеются).
- активирует шифрованные тома.
- форсирует проверку файловых систем утилитой fsck (если требуется). Может перезагрузить машину или зайти в Режиме одного пользователя (см. ниже) в зависимости от результата проверки.
- монтирует корневую систему(/) в режиме чтения/записи, локальные файловые системы и активирует своп.
- инициализирует генератор случайных чисел.
- удаляет временные файлы.
- устанавливает имя машины в сети(т.н. hostname), локаль, шрифт консоли и раскладки клавиатуры как указано в
rc.conf. - выводит сообщения от 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 для форматирования вывода. Этот скрипт:
- Стартует программу
sysctl, чтобы применить настройки, находящиеся в файле/etc/sysctl.conf, которые модифицируют параметры ядра Linux прямо во время работы; Arch использует совсем немного таких параметров (в основном настройки связанные с сетью). - Запускает службы в соответствии с массивом
DAEMONSв конфигурационном файлеrc.conf. - Исполняет пользовательский скрипт
/etc/rc.local. - Останавливает
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() {
/usr/bin/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 охватывает методы, которые не требуют установки менеджера входа.