105-More


Структура каталога Slax
Все файлы данных Slax находятся на загрузочном носителе в одном каталоге. Неудивительно, что название этого каталога - «slax». Вся магия происходит внутри. Вот обзор упрощенной структуры каталогов; каталоги выделены красным , упоминаются также некоторые интересные файлы курсивом :
slax
├─── boot
│ ├─── isolinux.bin
│ ├─── syslinux.cfg
│ ├─── initrfs.img
│ ├─── vmlinuz
│ └─── ...
├─── changes
├─── rootcopy
├─── 01-core.sb
├─── 02-xorg.sb
├─── 03-desktop.sb
├─── 04-chromium.sb
└─── ...
Загрузка ядра Linux
Когда BIOS вашего компьютера загружает Slax, он фактически запускает загрузчик SYSLINUX. Сам загрузчик хранится в файле isolinux.bin или ldlinux.sys, в зависимости от вашего загрузочного носителя - CD / DVD использует isolinux.bin, USB-диск или жесткий диск использует ldlinux.sys.
Как только запускается загрузчик SYSLINUX, он узнает, что делать дальше, из своего файла конфигурации (как вы уже догадались) syslinux.cfg. В Slax этот файл конфигурации содержит инструкции, чтобы показать какой-нибудь классный логотип загрузки и, при необходимости, предоставить меню загрузки, если пользователь нажимает клавишу до истечения времени ожидания. Когда счетчик тайм-аута достигает нуля или пользовательское меню загрузки загружается, загрузчик SYSLINUX загружает в память два файла: vmlinuz (ядро Linux) и initrfs.img (базовая корневая файловая система). Прогресс отображается непрерывным потоком точек, напечатанных на экране. После загрузки файлов исполняется двоичный файл vmlinuz, чтобы запустить ядро ​​Linux.
Pre-INIT
При нормальных условиях (когда стандартный дистрибутив Linux запускается с жесткого диска), ядро ​​Linux монтирует корневую файловую систему с жесткого диска и /sbin/init выполняется как основной процесс, который заботится о запуске системы. В Slax ситуация иная - нет жесткого диска, с которого монтируется корневая файловая система, но ядру, безусловно, нужен какой-то процесс init для запуска. Для этого Slax содержит базовую файловую систему в файле initrfs.img - это сжатый архив CPIO с некоторыми каталогами и файлами внутри, включая основные инструменты Linux (команды) и требуемый init.
Поэтому после того, как ядро ​​Linux успешно инициализировано и полностью контролирует ваш компьютер, его последняя задача - найти упомянутый архив CPIO в памяти (он был загружен из файла initrfs.img загрузчиком syslinux, как вы наверняка помните), распаковать это (в область памяти, которая действует как временная корневая файловая система, называемая initramfs) и выполняет временный /init процесс оттуда.
Спасаясь от initramfs
На данный момент у нас работает полностью инициализированное ядро ​​Linux, область initramfs в памяти заполняется временной корневой файловой системой, содержащей только самые основные команды Linux, и временная инициализация только начинается.
Временная корневая файловая система в initramfs не идеальна, так как она не поддерживает pivot_root системный вызов - важная операция, которая будет использоваться позже в процессе загрузки. Нам нужно переключиться с initramfs на что-то другое. Для этого временный init сначала монтирует файловую систему tmpfs /m, перемещает туда все файлы и каталоги, включая сам скрипт init, и использует switch_root, чтобы сделать этот tmpfs /m новым корнем и перезапустить сам init там же. Синяя звезда обозначает каталог, который перемещается.
initramfs as root:
(initramfs)
/
├─── bin
│ ├─── sh
│ ├─── mount
│ └─── ...
├─── dev
├─── mnt
├─── m (tmpfs) ★
├─── memory
├─── proc
├─── sys
├─── init
└─── shutdown
->
initramfs after move to tmpfs:
(initramfs)
/
└─── m (tmpfs) ★

├─── bin
│ ├───sh
│ ├───mount
│ └─── ...
├─── dev
├─── mnt
├─── memory
├─── proc
├─── sys
├─── init
└─── shutdown
->
tmpfs after switch_root:
(tmpfs) ★
/
├─── bin
│ ├─── sh
│ ├─── mount
│ └─── ...
├─── dev
├─── mnt
├─── memory
├─── proc
├─── sys
├─── init
└─── shutdown
Как бы странно ни выглядело это действие в целом (у нас получилась та же структура каталогов, что и раньше, похоже, никаких улучшений вообще нет), изменение будет значительным. С тех пор временная корневая файловая система находится на tmpfs вместо initramfs, и, таким образом, pivot_root операция будет доступна при необходимости в будущем.
Вы можете задаться вопросом, почему текущая корневая файловая система все еще помечена как временная. Это потому, что мы все еще находимся в самом начале этапа построения, и мы просто позже создадим настоящую корневую файловую систему, как объясняется ниже, путем объединения сжатых изображений данных Slax в объединение AUFS.
Поиск данных Slax
Прежде чем процесс init сможет начать поиск данных Slax на доступных устройствах, необходимо настроить рабочую среду. Файловые системы proc и sysfs монтируются поверх /proc и /sys соответственно. Некоторые важные драйверы ядра, такие как aufs, squashfs и loop, загружаются с помощью modprobe, а файлы устройств создаются в /dev каталоге с помощью команды mdev.
Как только устройства хранения становятся доступными через файлы устройств /dev, команда blkid используется для отфильтровывания только тех, которые могут быть смонтированы (которые содержат файловую систему, известную работающему ядру). Устройства проверяются (монтируются только для чтения /memory/data/) один за другим, пока не будет найден действительный каталог данных Slax. Затем обрабатываются все файлы с расширением .sb (пакеты Slax) - для каждого пакета Slax создается каталог, /memory/bundles/ и пакет (который на самом деле является сжатым файлом образа squashfs) монтируется поверх него. На диаграмме ниже содержимое squashfs выделено зеленым цветом.
(tmpfs)
/
├─── bin
├─── dev
├─── ...
├─── memory
│ ├─── bundles
│ │ ├─── 01-core.sb (squasfhs mount) < ───┐
│ │ │ ├─── bin │
│ │ │ ├─── etc │
│ │ │ ├─── sbin │
│ │ │ └─── ... │
│ │ ├─── 02-xorg.sb ......................│...
│ │ │ ├─── etc │ :
│ │ │ ├─── usr │ :
│ │ │ └─── ... │ :
│ │ ├─── 03-desktop.sb ...................│..:...
│ │ │ ├─── usr │ : :
│ │ │ └─── ... │ : :
│ │ └─── ... │ : : loop
│ ├─── data (slax device mounted here) │ : : mounts
│ │ └─── slax │ : :
│ │ ├─── boot │ : :
│ │ ├─── changes │ : :
│ │ ├─── rootcopy │ : :
│ │ ├─── 01-core.sb ──── > ──── > ───┘ : :
│ │ ├─── 02-xorg.sb ....................: :
│ │ ├─── 03-desktop.sb ....................:
│ │ └─── ...
│ ├─── changes (empty yet)
│ └─── union (empty yet)
├─── proc (procfs mounted here)
├─── sys (sysfs mounted here)
└─── init
Положить его вместе с AUFS
Различные части конечной корневой файловой системы теперь монтируются только для чтения в отдельных папках в /memory/bundles. Базовые системные утилиты и библиотеки Linux, такие как /bin/bash или /lib/ld-linux.so находятся в них /memory/bundles/01-core.sb/, файлы, относящиеся к среде рабочего стола, можно найти в /memory/bundles/03-desktop.sb/ и т.д. Объединение их в единую корневую файловую систему, которая даже доступна для записи, возможно только благодаря AUFS - объединяющей файловой системе, разработанной г-ном Хунжиро Окаджима. AUFS может принимать несколько папок (так называемые ветви) и объединять их в один каталог. Это именно то, что происходит дальше, отдельные части объединяются вместе с каталогом /memory/changes/ в объединение AUFS, которое монтируется в /memory/union.
(tmpfs)
/
├─── ...
└─── memory

├─── bundles
│ ├─── 01-core.sb ───────── > ──────┐
│ ├─── 02-xorg.sb ..................│.......
│ ├─── 03-desktop.sb ...............│......:........
│ └─── ... │ : :
├─── changes ──────── > ───────┐ │ : :
├─── ... ˅ ˅ : :
└─── union < ═══════ < ═══════ < ───── < ─────┘ < ────┘
├─── bin AUFS
├─── etc mount
├─── mnt
├─── root
├─── sbin
├─── usr
├─── ...
└─── var

Изменения
Пустой каталог /memory/changes доступен для записи, поэтому все монтирование AUFS в тоже /memory/union может быть доступно для записи. Все новые или измененные файлы внутри объединения копируются в этот пустой каталог до того, как система создаст или изменит их. Поскольку каталог для изменений находится в tmpfs (то есть в оперативной памяти), все новые и измененные файлы сохраняются в оперативной памяти и, таким образом, теряются при перезагрузке.
Тем не менее, если Slax запускается с записываемого носителя, такого как USB-устройство или жесткий диск, он распознает это и монтирует записываемый диск /memory/changes до того, как он будет соединен с другими объединенными ветвями, что фактически означает, что измененные и новые файлы будут сохранены на загрузочное устройство, а не в оперативной памяти, и перезагрузка не сотрет их. Эта функция называется «Постоянные изменения» и может быть включена или выключена с помощью параметра меню загрузки.
Переключение на настоящий root
На данный момент, полностью доступная для записи конечная корневая файловая система была встроена /memory/union. Жизнь временного инициата подходит к концу. Он использует pivot_root и chroot системные вызовы для создания /memory/union нового корня, передавая временный корень tmpfs /run/initramfs/ в новый корень. Синие и зеленые звезды на диаграмме ниже обозначают, что и куда движется. Наконец, выполняется реальная /sbin/init корневая файловая система aufs. Загрузка операционной системы Slax только начинается.

Корень tmpfs перед системным вызовом pivot_root:
tmpfs root before pivot_root syscall:
(tmpfs) ★
/
├─── ...
└─── memory

└─── union (aufs) ★
├─── bin
├─── etc
├─── root
├─── run
│ └─── initramfs (empty)
├─── sbin
│ ├─── ...
│ └───init
├─── usr
├─── ...
└─── var

aufs as new root:
(aufs) ★
/
├─── bin
├─── etc
├─── root
├─── run
│ └─── initramfs (tmpfs) ★
│ ├─── ...
│ └─── memory
│ └─── union (empty)
├─── sbin
│ ├─── ...
│ └─── init <- gets executed
├─── usr
├─── ...
└─── var
Добавление модулей в Slax на лету
Корневая файловая система доступна для записи, и мы можем установить новые программные пакеты при запуске Slax обычным способом, распаковав их. Еще есть возможность добавить новые файлы и каталоги в Slax на лету без установки каких-либо пакетов. Благодаря тому, что Slax работает с AUFS в качестве пользователя root, мы можем взять некоторую другую сжатую файловую систему squashfs, смонтировать ее в цикле над каталогом, который находится за пределами дерева aufs (например, поверх /run/initramfs/memory/bundles/name.sb/ которого находится в tmpfs), и затем выполнить перемонтирование команда, которая добавляет вновь смонтированный каталог в aufs как новую ветку.
Все файлы и каталоги из нового модуля squashfs будут мгновенно отображаться так, как если бы они были установлены в системе с самого начала, тогда как распаковка выполняется на лету, только для файлов, к которым фактически осуществляется доступ.
Точно так же мы можем удалить ранее добавленную ветку AUFS (смонтированные squashfs) из корня aufs другой командой remount. Файлы, которые были частью ветки, мгновенно исчезнут из системы, что фактически удалит пакет.
Slax shutdown
Когда Slax завершает работу либо для перезагрузки, либо для выключения системы, он выполняет все стандартные задачи, как и любой другой Linux, например, размонтирует все разделы, смонтированные пользователем, завершает все процессы и так далее. Но поскольку загрузочное устройство все еще может быть смонтировано и использовано для постоянных изменений в самом конце, необходимо выполнить еще некоторые шаги до того, как будет выдано реальное отключение питания, чтобы убедиться, что загрузочное устройство чисто размонтировано.
Вместо выключения системы в тот момент, когда init считает, что это необходимо, Slax переключается обратно на initramfs (это автоматически обрабатывается systemd) и выполняет сценарий завершения работы /run/initramfs/shutdown.
Сценарий завершения работы, который позаботится о том, чтобы размонтировать оставшийся смонтированный диск, с которого запустился Slax, и загрузочное устройство было чисто извлечено. В конце компьютер перезагружается или выключается в зависимости от того, что пользователь намеревался сделать.

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.