Процесс загрузки OpenWRT

Процесс загрузки OpenWRT крайне схож с процессом загрузки персонального компьютера, работающего под управлением Linux или UNIX. Он может быть разделен на три этапа.

Процесс загрузки ПК под упÑ€авлением Linux
Процесс загрузки ПК под управлением Linux

Системный загрузчик

Системный загрузчик является специальной программой, которая предназначена для начальной загрузки устройства. В Linux-системах в качестве системного загрузчика используется программа GRUB 2, которая разбирает параметры загрузки и выводит системное меню. После завершения начальной загрузки системный загрузчик передает управление ядру Linux.

В случае OpenWRT процесс загрузки выглядит следующим образом:

  1. Программа системного загрузчика исполняется напрямую из флэш-памяти.
  2. Системный загрузчик выполняет операцию POST (Power-On-Self-Test), в рамках которой осуществляется низкоуровневая инициализация аппаратных устройств.
  3. Системный загрузчик распаковывает образ ядра Linux, расположенный в заранее известной области флэш-памяти, в оперативную память.
  4. Системный загрузчик исполняет ядро Linux с параметром init= (по умолчанию параметром является /etc/preinit).

Ядро Linux

После завершения работы системного загрузчика управление передается ядру Linux (Linux Kernel). Оно выполняет следующие операции:

  1. Запускает само себя (да, это необходимо).
  2. Исполняет функцию start_kernel.
  3. Сканирует MTD-раздел с корневой файловой системой в поисках корректного суперблока и монтирует раздел с файловой системой SquashFS (содержащей директорию со стандартными файлами конфигурации и сценариями инициализации /etc) в точку монтирования /rom в случае его нахождения.
  4. Запускает сценарий /etc/preinit для осуществления предварительной инициализации (создание системных директорий, монтирование файловых систем /proc, /sys и так далее).
  5. Запущенный ранее сценарий /etc/preinit запускает сценарий /etc/mount_root, который монтирует другую файловую систему JFFS2 в точку монтирования /overlay и комбинирует ее с ранее смонтированной в точку монтирования /rom файловой системой SquashFS для формирования корневой файловой системы /.
  6. При наличии переменной INITRAMFS инициирует запуск процесса /sbin/init (родительский процесс для всех процессов в пространстве пользователя).
  7. Наконец, поток ядра становится родительским процессом для всех процессов в пространстве пользователя.

Система инициализации

На персональных компьютерах в качестве системы инициализации чаще всего используется набор программ Systemd, в то время, как в OpenWRT для тех же целей используется проверенный временем набор сценариев командной оболочки. Первый сценарий системы инициализации запускается ядром Linux для последующего запуска системных процессов, не относящихся к нему. Пространство пользователя становится доступным после монтирования ядром Linux корневой файловой системы и запуска первого процесса пространства пользователя (по умолчанию /sbin/init). Интерфейсом между пространствами ядра и пользователя являются функции библиотеки языка C и системные вызовы.

Сценарий системы инициализации считается родителем всех процессов пространства пользователя, так как он позволяет запускать демоны, изменять уровни исполнения, работать с терминалами/псевдотерминалами и так далее.

В OpenWRT система инициализации выполняет следующие операции:

  1. Сценарий init читает файл /etc/inittab в поисках записи sysinit (по умолчанию "::sysinit:/etc/init.d/rcS S boot").
  2. Сценарий init исполняет прочитанную на предыдущем этапе команду /etc/init.d/rcS S boot.
  3. Запущенный на предыдущем этапе сценарий rcS переходит по символьным ссылкам и исполняет реальные сценарии инициализации с именами /etc/rc.d/S##xxxxxx с параметром start.
  4. После завершения работы сценария rcS система должна находиться в рабочем состоянии.