- Home
- Packages
- Forums
- Wiki
- Bugs
- AUR
- Download

# Arch Boot Process (Русский)

From ArchWiki

Сводка
Обзор загрузки системы в хронологическом порядке.
Краткое описание
Чтобы компьютер смог запустить 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

## До выполнения 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
    https://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() {
        /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 охватывает методы, которые не требуют установки менеджера входа.

## См. также

- Boot Linux Grub Into Single User Mode
- Boot with GRUB
- Inside the Linux boot process
- Linux / Unix Command: sysctl.conf
- Search the forum for rc.local examples
- Wikipedia:Linux startup process
- Wikipedia:initrd

Retrieved from "https://wiki.archlinux.org/index.php?title=Arch_Boot_Process_(Русский)&oldid=260107"
Categories:

- Русский
- Загрузка (Русский)
- Процесс Загрузки (Русский)

## Navigation menu