initramfs linux что это

Содержание

Глава 5. initramfs

Содержание

В этой главе мы рассмотрим зачем нам в действительности требуется initramfs и почему она важна в общем процессе запуска. Иы знаем, что initramfs загружается в память самим начальным загрузчиком, но мы пока не обсуждали как выделяется initramfs. Данная глава адресована этому. Мы также рассмотрим все этапы выделения, повторной сборки и персонализации initramfs. Затем мы рассмотрим собственно структуру initramfs, а также соответствующую последовательность запуска внутри initramfs.

Зачем требуется initramfs?

основная цель процедуры запуска состоит в представлении своему пользователю его собственных файлов, которые размещены в общей корневой файловой системе. Иными словами, именно для имеющегося ядра в обязанности входят поиск, монтирование и представление такой корневой файловой системы своему пользователю. Для достижения этой цели наше ядро обязано запустить соответствующий исполняемый файл systemd, который, опять же, располагается в корневой файловой системе своего пользователя. Теперь это становится задачей курицы и яйца. Для запуска процесса systemd прежде всего нам требуется смонтировать необходимую корневую файловую систему, а для монтирования такой корневой файловой системы нам придётся запустить systemd из его корневой файловой системы. К тому же, помимо этой реальной корневой файловой системы пользователи могут обладать файлами в некоторых прочих файловых системах, таких как NFS, CIFS и т.п., а этот перечень прочих файловых систем также внутри устанавливаемой корневой файловой системы ( /etc/fstab ).

Допустим, наша корневая файловая система расположена в NFS и нет никакого понятия об initramfs. Это означает, что наше ядро обязано смонтировать необходимую корневую файловую систему пользователя в самом себе из NFS. В таком случае, наше ядро должно осуществить следующие задачи:

поднять собственный первичный сетевой интерфейс.

Вызвать некого клиента DHCP и получить со своего сервера DHCP некий IP адрес.

Отыскать необходимый совместный ресурс NFS и связанный с ним сервер NFS.

Смонтировать этот совместный ресурс NFS (свою корневую файловую систему).

Теперь, предположим, наша корневая файловая система находится на устройстве программного RAID. Тогда наше ядро обязано выполнить такие задачи:

Теперь, допустим, наша корневая файловая система расположена в неком логическом томе. Тогда для нашего ядра требуется покончить со следующими задачами для самого себя:

наконец, после того как необходимый root lv заполнен, смонтировать его в качестве корневой файловой системы.

Давайте предположим, что наша корневая файловая система находится на зашифрованном блочном устройстве. В этом случае нашему ядру придётся завершить следующие задачи:

Получить некий пароль от самого пользователя и/ или со вставленного аппаратного маркера (такого как смарт- карта или некий ключ безопасности USB).

Создать некую расшифрованную цель при помощи надлежащего устройства соответствия.

для получения всего этого нашему ядру необходимы исполняемые файлы, относящиеся к LUKS.

Для ядра не представляется возможным включать в себе возможности всех таких корневых файловых систем; следовательно, разработчики пришли к понятию initramfs, чья единственная цель состоит в монтировании необходимой корневой файловой системы.

Само ядро всё ещё способно выполнять все только что обсуждённые нами этапы. Например, если вы соберёте простую систему Linux командной строки из LFS, вам не понадобится монтировать некую корневую файловую систему, поскольку ядро само по себе достаточно в состоянии смонтировать необходимую файловую систему. Однако в тот момент, как вы попробуете добавить в неё GUI через BLFS, вам потребуется initramfs.

Это испортит основной повод исполняемого самого файла ядра.

Исполняемый файл такого ядра будет гигантским в размере. Чем большим размером будет обладать исполняемый файл, тем сложнее его сопровождение.

Такой громадный исполняемый файл сложный в поддержке, обновлении, совместном использовании и обработке в серверах (с точки зрения пакетов RPM).

Источник

Не загружается Ubuntu/Mint/Kali с initramfs в BusyBox

В данной статье мы рассмотрим варианты решения проблем, когда виртуальный или физический серверы на базе Ubuntu/Mint/Kali не загружаются и отваливается в busybox в момент инициализации initramfs. При этом Linux не загружается, и пользователю доступна только командная строка initramfs.

Проблема с суперблоком

Если Ubuntu свалилась в busybox при инициализации initramfs, возможно на диске оказался испорченный суперблок. Linux хранит несколько копий суперблоков.

Для восстановления в случае такой проблемы, нам нужно загрузиться с образа/диска и запустить Terminal. После загрузки, в терминале вводим команду:

Команда вернет информацию о нашем разделе:

Запомните имя раздела и укажите его в следующей команде:

# sudo dumpe2fs /dev/vda2 | grep superblock

Команда вернет список запасных суперблоков:

Мы будем использовать второй резервный суперблок для замены поврежденного (можно выбрать любой, кроме Primary). Выполним проверку диска с использованием резевного суберблока для восстановления:

Нужно отмонтировать раздел:
# umount /dev/vda2

После успешного выполнения замены суперблока, вы должны получить такое сообщение:

Теперь перезагрузите компьютеры, отключив диск с дистрибутивом и все должно быть в порядке.

Ошибка диска fsck

Второй вариант ошибки, наличие следующей строки в окне терминала:

В ошибке будет указан том, который требует запуска ручной проверки диска. В командной строке initramfs выполните:

После полной проверки, нужно перезапустить сервер и проверить все ли в порядке.

Ошибка диска: /dev/sda1 does not exist

Проблема с fstab

Если при загрузке сервера вы видите ошибку:

Скорее всего вы только что установили Linux или то на вашем сервере есть проблемы в fstab. Чаще всего проблема возникает при установке системы с usb-накопителя. Раздел на который ругается система, может быть какой угодно. Как и в первом случае, нам нужно загрузиться с образа системы и выполнить некоторые действия. Проверьте UUID диска командой:

Система выдаст что-то подобное:

Отсюда уже видно, что система должна загружаться с sda2, а по факту загружается с sda1.

Монтируем наш раздел в любую директорию, например:

# sudo mount /dev/sda2 /mnt

Получаем в директории /mnt весь наш раздел /dev/sda2, находим там файл /etc/fstab и изменяем строку, содержащую /dev/sda1 на:

Сохраняем файл. Отмонтируем раздел от /mnt и перезагрузимся, если проблема была связана с не неправильным адресом разделе, сервер загрузится.

Так же данный вариант можно решить, загрузившись в emergency. Перемонтируйте корень для записи:

После чего измените fstab и перезапустите сервер.

Проблема с железом

На некоторых материнских платах порты SATA могут получать произвольные номера. Это также может вызвать описанную в предыдущем пункте ошибку. Для исправления ошибки нужно изменить загрузчик grub.

Загрузитесь в режиме emergency или с live-cd и измените файл /boot/grub/grub.cfg

В строке где происходит загрузка раздела, например:

Измените путь до диска на UUID:

Источник

🧰 Как исправить ошибку Busybox Initramfs на Ubuntu

П оэтому я просто передал команду «exit», чтобы посмотреть, что произойдет.

А потом я увидел настоящую ошибку:

Он обеспечивает замену большинства утилит, которые вы обычно найдете в GNU fileutils, shellutils и т. д.

Initramfs – это начальная файловая система RAM, основанная на tmpfs.

Исправим ошибку Busybox Initramfs на Ubuntu

Чтобы устранить ошибку initramfs в Ubuntu, вам необходимо восстановить файловую систему в поврежденном разделе с помощью команды «fsck»:

Теперь она начнет автоматически исправлять все ломаные блоки в файловой системе.

Через пару минут вы увидите следующий результат:

Теперь введите «reboot» и нажмите ENTER, чтобы перезагрузить систему!

Скрестите пальцы и дождитесь перезагрузки системы!

Если все прошло хорошо, ваша система загрузится без проблем.

15 thoughts on “ 🧰 Как исправить ошибку Busybox Initramfs на Ubuntu ”

Всегда рады помочь!

Помогло на Debian, но в консоле Debian не работала команда reboot.

Сегодня я включила ноутбук, и процесс загрузки начался с ubuntu, и в итоге я получила сообщение initramfs.
Насколько я помню, я не сделала ничего плохого.
Вчера все работало отлично!
после сообщения initramfs я не могу перейти на английский, что бы f не делала?

Все сработало спасибо большое.

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

• Свежие записи

• Категории

• itsecforu.ru

• Страны посетителей

IT is good

Источник

Ubuntu/Mint/Kali загружается в initramfs BusyBox (РЕШЕНО)

В этой статье мы покажем, как решить проблемы, которые возникают, когда компьютер под управлением Ubuntu, Mint Linux или Kali Linux не загружается и во время инициализации initramfs появляется только приглашение busybox. В этой ситуации возможно получить доступ и использовать только командную строку initramfs.

initramfs — это исходная файловая система на основе tmpfs в ОЗУ, которая не использует отдельное блочное устройство. Как и initrd, она содержит инструменты и сценарии для монтирования файловых систем до вызова init, расположенного в корневой файловой системе.

Восстановление неработающего суперблока Ext4 в Linux

Если Ubuntu вылетает в busybox во время инициализации initramfs, возможно, на диске повреждён суперблок.

Несколько копий суперблока хранятся в Linux. Чтобы восстановить систему в случае возникновения этой проблемы, вам необходимо загрузиться с аварийного образа/диска Live CD и запустить терминал. После загрузки введите в терминал следующую команду:

Команда возвращает информацию о вашем томе:

Запомните имя тома и укажите его в следующей команде:

Команда покажет список резервных суперблоков:

Мы воспользуемся вторым резервным суперблоком для замены повреждённого (можно использовать любой суперблок, кроме первичного). Проверьте диск с помощью резервного суперблока:

Если вы получите такой результат:

После успешной замены суперблока вы получите такое сообщение:

Затем отключите загрузочный носитель и перезагрузите компьютер. Все должно работать исправно.

Fsck Boot Error: Unexpected Inconsistency

Второй вариант проблемы initramfs (BusyBox) включает следующее сообщение в окне терминала:

Если вы его не видите, попробуйте ввести в (initramfs)

в окне терминала. Ошибка может появиться после того, как вы это сделаете.

В сообщении будет показан том, на котором требуется выполнить ручную проверку диска. Выполните следующую команду в приглашении initramfs:

После завершения проверки диска перезагрузите компьютер и убедитесь, что Linux загружается правильно.

Alert! /dev/ТОМ Does Not Exist

Проблема с Fstab

При загрузке хоста Linux вы можете увидеть следующую ошибку:

Возможно, вы только что установили Linux или у вашего хоста возникли проблемы с fstab. Чаще всего проблема возникает при установке системы с USB-накопителя. Система может показывать ошибку любого тома. Как и в первом случае, мы должны загрузиться с загрузочного / аварийного носителя Linux и выполнить некоторые действия. Проверьте UUID диска с помощью этой команды:

Система вернёт примерно следующее:

Здесь мы видим, что система должна загружаться с sda2, но на самом деле она пытается загрузиться с sda1.

Смонтируйте том в любой каталог, например:

Когда вы увидите /dev/sda2 в каталоге /mnt, найдите там файл /etc/fstab и измените строку, содержащую /dev/sda1, следующим образом:

Сохраните файл. Отмонтируйте том от /mnt и перезагрузитесь. Если проблема связана с неправильным именем тома, сервер загрузится.

Также вы можете решить эту проблему, загрузившись в аварийном режиме. Перемонтируйте корневой каталог как чтение / запись:

Затем измените fstab и перезапустите сервер.

Аппаратная проблема

На некоторых материнских платах порты SATA могут иметь случайные числа. Это также может вызвать ошибку, описанную в предыдущем разделе. Чтобы исправить это, вы должны отредактировать загрузчик grub.

Загрузитесь в аварийном режиме или с Live CD и отредактируйте файл /boot/grub/grub.cfg.

В строке, определяющей загрузочный раздел, например:

Источник

Модифицируем процесс загрузки с помощью утилиты make-initrd

Модифицируем процесс загрузки с помощью утилиты make-initrd

Упрощенный процесс загрузки ОС Linux

Загрузка ОС на устройстве с UEFI обычно проходит по следующему сценарию:

Размещение в оперативной памяти EFI загрузчика (например, grub) и передача управления ему;

EFI загрузчик записывает образ ядра в оперативную память и вызывает функцию start_kernel;

Ядро инициализирует себя, монтирует корень файловой системы и запускает процесс init, лежащий на корне (/init, /sbin/init или другой). Этим процессом может быть systemd, System V и другие;

Процесс init запускает сервисы и уже подготавливает систему для работы с пользователем.

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

Что такое initramfs?

Initramfs (Initial ram file system) – образ файловой системы, загружаемый в оперативную память вместе с ядром. Основные задачи этого образа: монтирование реального корня файловой системы и запуск процесса init лежащего на нем.

Многие современные дистрибутивы Linux используют initramfs образы для загрузки системы. Вы можете убедиться в этом сами, найдя файл /boot/* в своем любимом дистрибутиве.

Возможные сценарии использования initramfs

Внутри initramfs образа могут реализовываться разнообразные сценарии загрузки ОС. Все они ограничены лишь возможностями Linux, характеристиками устройства и вашей фантазией.

Достаточно популярными и широко используемыми сценариями являются:

Вывод приветственной картинки на экран;

Проверка целостности корневой файловой системы;

Загрузка с нестандартных файловых систем;

К экзотическим можно отнести:

Загрузку с образа корня, лежащего в интернете;

Загрузку с зашифрованного раздела;

Загрузку другой ОС с помощью системного вызова kexec.

Утилиты для создания initramfs образов

Разные дистрибутивы используют разные утилиты для создания initrd образов. Debian обычно используют для этого initramfs-tools, Red Hat – Dracut. Но в этой статье я хочу представить другую, менее известную утилиту – make-initrd.

Почему make-initrd?

make-initrd – утилита для создания initramfs образов, разрабатываемая нашим соотечественником Алексеем Гладковым. Сейчас она используется как основной сборщик initramfs в дистрибутиве ALT Linux.

Этот проект обладает рядом преимуществ:

Имеет модульную структуру. Разные логические части образа создаются разными модулями, именуемыми Features (фичами). Например, есть фича luks, отвечающая за внедрение сценария загрузки с зашифрованных разделов LUKS.

Создаваемые initramfs образы имеют простое внутреннее устройство.

Удобен для использования конечным пользователем. Многие части конфигурации определяются автоматически. Это достигается за счет отдельного модуля guess.

Утилита показала свою работоспособность на множестве различных дистрибутивов. Нам лично удавалось собрать и использовать эту утилиту на Ubuntu, Fedora, ALT Linux, Red OS, Astra Linux.

Генерируемые initramfs образы имеют относительно небольшой размер, а их сборка происходит достаточно быстро Для сравнения: initramfs-tools на моей машине генерирует образы размером 51Мб за 24 секунды. Образы же make-initrd весят всего 5Мб и создаются 10 секунд!

Проект продолжает активно развиваться. Со временем появляются новые фичи, улучшается архитектура утилиты и архитектура initramfs образов. Разработчик идет на контакт и всегда рад вашим патчам и предложениям:)

К сожалению, у make-initrd есть и недостатки:

Проект тестируется лишь на Fedora, Ubuntu и Alt Linux. И, хотя нам удавалось использовать его на других дистрибутивах, нет гарантии, что все будет работать гладко и везде.

Устройство initramfs образов, генерируемых make-initrd

В этом разделе описаны основные сведения по архитектуре образов, генерируемых make-initrd.

Сервисы

Создаваемые образы имеют сервисно-ориентированную архитектуру. При передаче управления программе /init порождается дерево сервисов, которые в дальнейшем взаимодействуют между собой. Последовательность их запуска и завершения определяется в процессе сборки образа и настраивается с помощью конфигурационных файлов LSB.

В системе есть несколько основных сервисов, на которых базируется основная логика работы:

udevdобработчик событий ядра об изменении состояния устройств. При изменении состояния любого устройства он параллельно запускает фильтры (скрипты), добавляющие пользовательские события в очередь. Этот демон используется во многих дистрибутивах Linux.

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

polldдемон, ожидающий выполнения условий загрузки системы. Все, что он делает – один раз в заданное время проверяет условия запуска системы. Если они удовлетворены, запускается некоторый экшен. Скрипты проверки условий и экшена зависят от метода загрузки. Тем не менее, зачастую, их задача – проверить, что корень найден и переключить runlevel на второй уровень.

Runlevel

Runlevel определяет уровень запуска системы. Эти уровни отличаются от тех, что стандартно используются в Linux. В make-initrd номер уровня зависит от состояния загрузки системы. А от номера уровня, в свою очередь, зависит то, какие сервисы будут активны в текущий момент. В make-initrd предусмотрено всего 3 уровня:

Уровень 3 – означает, что реальный корень системы еще не примонтирован. На этом уровне происходит запуск и работа большинства сервисов.

Уровень 2 – означает, что реальный корень системы уже примонтирован. На этом происходит завершение большинства сервисов.

Уровень 9 – специальный уровень, на котором происходит подмена корня системы на реальный и запуск /sbin/init на нем.

Разберем пример загрузки с жесткого диска.

Последовательно запускаются различные сервисы, среди которых будут udevd, ueventd и polld;

После обнаружения устройства жесткого диска ядро сгенерирует соответствующее событие для демона udevd;

udevd просмотрит список своих правил. При нахождении правила на добавление блочного устройства запустится соответствующий обработчик (в make-initrd они называются фильтрами);

В какой-то момент ueventd запустит обработчик этого пользовательского события. Обработчик примонтирует жесткий диск;

Демон polld в очередной раз запустит скрипт проверки наличия корня. После его обнаружения запустится экшен, переключающий runlevel на второй уровень;

После переключения runlevel произойдет отключение большинства сервисов. Далее запустится сервис runinit, который установит runlevel на девятый уровень;

Процесс init произведет подмену корня и запустит /sbin/init ;

Устройство файловой системы initramfs образов

Initramfs образ, генерируемый make-initrd, имеет строгую структуру файловой системы. Поэтому при добавлении собственной фичи важно понимать, что и где должно лежать:

/init – программа, которой передается управление после инициализации ядра;

/etc/ – директория конфигураций;

/etc/rc.d/init.d/ – директория LSB конфигураций сервисов;

/etc/udev/rules.d/ – директория правил udevd;

/etc/initrd/method – файл содержащий текущий метод загрузки;

/etc/initrd/cmdline.d/ – директория описаний аргументов ядра;

/lib/uevent/filters/ – директория фильтров uevent событий;

/lib/uevent/handler/ – директория обработчиков uevent событий;

/lib/initrd/boot/method/ – директория скриптов методов загрузки;

/lib/initrd/boot/method/*/check – скрипт проверки условии активации метода загрузки;

/lib/initrd/boot/method/*/action – скрипт активации метода загрузки;

/lib/initrd/boot/scripts/ – директория подскриптов проверки условий метода загрузки;

/.initrd/ – директория, которую могут использовать сервисы и программы для внутренней работы;

/tmp/ – директория временных файлов.

Устройство генератора initramfs образов

process-config – Считывание конфигурационного файла. Во время ее выполнения происходит последовательный запуск целей guess и genimage;

guess – Угадывание конфигурационного файла;

create – Наполнение корня initramfs образа;

pack – Сортировка сервисов и упаковка initramfs образа в cpio архив. Зависит от create;

install – Установка образа в загрузочную директорию. Зависит от pack;

genimage – Вывод информационного сообщения о сборке образа. Зависит от install.

Процесс выполнения этих целей можно разбить на два больших этапа:

1. Угадывание дополнения к конфигурации (цель guess);

2. Сборка образа (цели create – genimage)

Этап угадывания конфигурации

Неправильное задание конфигурации грозит тем, что initramfs образ может оказаться излишне «тяжелым», а загрузка ОС будет происходить медленнее или не происходить вовсе. Например, если вы активировали фичу network, но не используете сеть в процессе загрузки, это грозит вам лишними секундами на настройку сетевых интерфейсов.

Именно для решения этих проблем в make-initrd был добавлен модуль guess. Он помогает оптимально сгенерировать или дополнить существующую конфигурацию, основываясь на окружении компьютера.

Guess использует разные модули для определения разных сфер образа. Например:

device – определяет модули ядра устройств;

keyboard – определяет модули ядра для работы с клавиатурой;

net – определяет модули ядра сетевых устройств;

root – определяет какие разделы нужно примонтировать, а также модули ядра для работы с ними;

smart-card – определяет конфигурацию фичи smart-card;

common – простой универсальный модуль, который может быть использован внутри фич.

Этот список не является исчерпывающим: описание остальных модулей можно посмотреть в README.md файлах модулей guess.

Этап сборки initramfs образа

Во время выполнения цели create создается временная директория, в которой заполняется корень initramfs образа. Корень заполняется в соответствии с переданной конфигурацией. Туда кладется все необходимое: приложения, библиотеки, файлы конфигурации и т.д. Но это еще не все: на последующих шагах корень еще будет дополняться.

Этап сборки образа может сколь угодно расширяться с помощью фич. Например, если активирована фича compress, то cpio архив будет дополнительно сжат с помощью одного из методов: gzip, lzma, bzip2 и т.п.

Фича – это независимый модуль сборщика initramfs образов. Фичи могут воздействовать практически на любой этап сборки образа. Например:

фича compress позволяет сжимать итоговый образ;

фича luks добавляет в initramfs утилиты и модули для работы с luks;

фича clean – очищает после себя рабочую директорию.

Структура проекта make-initrd

Выгрузим проект make-initrd из репозитория и посмотрим на его содержимое

Проект make-initrd очень хорошо структурирован. Давайте опишем, за что отвечают различные файлы и директории в проекте:

data/ – постоянная часть корня initramfs образа. Файлы, находящиеся в ней, будут присутствовать внутри почти всех образов;

datasrc/ – исходники утилит, устанавливаемые внутрь образа;

mk/config.mk – Makefile c постоянной частью конфигурации make-initrd (переменные путей и т.п.);

mk/functions.mk – Makefile с вспомогательными функциями make;

mk/make-initrd.mk – основной Makefile описывающий правила сборки initramfs образа;

tools/ – внутренние утилиты make-initrd;

utils/ – исходники внешних утилит make-initrd;

guess/ – директория guess модулей;

guess/*/config.mk – Makefile с описанием конфигурации guess модуля (переменные модуля, правила его активации). Он подключается вне зависимости от того, активен ли guess модуль или нет;

guess/*/rules.mk – Makefile с описанием правил отработки guess модуля. Он подключается, только если guess модуль активен;

features/ – директория фич;

features/*/data/ – часть корня initramfs образа, предоставляемая фичей;

features/*/datasrc/ – исходники утилит фичи, устанавливаемые внутрь initramfs;

features/*/guess/ – подскрипты модулей guess;

features/*/bin/ – вспомогательный утилиты сборки initramfs образа;

features/*/config.mk – Makefile с конфигурацией фичи (описание зависимых фич, переменных и т.п.). Он подключается вне зависимости от того, активна ли фича или нет;

features/*/rules.mk – Makefile с правилами сборки фичи. Он подключается только в случае, если фича активна.

Установка make-initrd

Сборка initramfs и запуск на реальной машине

ПРЕДУПРЕЖДЕНИЕ Перед генерацией initramfs образа обязательно сделайте backup.

Если система перестанет загружаться, откройте раздел с /boot на другой системе (например, через загрузочную флешку) и верните backup на место. Если вы не сделали backup, попробуйте загрузиться с помощью другого ядра. Это может сработать, так как по-умолчанию make-initrd собирает initramfs только для текущего ядра.

Перезапустим систему и попробуем загрузиться c ядра, для которого мы сгенерировали initramfs образ.

Добавление собственной фичи

Чтобы лучше разобраться с тем, как устроены фичи, давайте напишем свою – hello-usb.

Фича Hello USB

Примечание Исходный код фичи hello-usb можно взять здесь.

Напишем фичу hello-usb, добавляющую в initramfs функционал вывода сообщения “Hello USB!” при нахождении USB-устройства. Также добавим возможность указывать имя производителя устройства, для которого выводится сообщение.

Внутренняя логика работы нашей фичи, следующая:

Контроль добавления нового USB-устройства осуществляется с помощью udev правила /etc/udev/rules.d/99-hello-usb.rules : при добавлении любого USB-устройства вызывается фильтр /lib/uevent/filter/hello-usb

Внутри фильтра создается uevent событие hello-usb

Дерево файлов фичи следующее:

config.mk содержит описание фичи:

Через функцию feature-requires можно указывать зависимые фичи. Мы хотели получить модули ядра и udev-правила для работы с USB-устройствами, поэтому добавили в зависимости фичу usb.

rules.mk содержит правила сборки фичи:

feature/hello-usb/etc/initrd/cmdline.d/hello-usb – регистрирует опцию ядра usb-vendor:

feature/hello-usb/etc/udev/rules.d/99-hello-usb.rules – udev правило, запускающее фильтр. Число в начале имени нужно для задания порядка его обработки. В нашем случае было важно, чтобы правило hello-usb отработало позже, чем 60-fido-id (т.к. оно выставляет тег security-device ). Поэтому мы выставили любое число больше 60 – это 99.

Подробнее о udev правилах можно прочитать здесь.

Обратите внимание на простоту этого скрипта. Это связано с тем, что udev может запустить несколько таких скриптов одновременно, а это может привести к состоянию гонки. Именно поэтому логика большинства фильтров крайне проста – передать событие uevent, который обработает его последовательно.

feature/hello-usb/lib/uevent/handlers/060-hello-usb – обработчик события hello-usb. Uevent передает управление обработчикам в соотвествии с их номером. В нашем случае порядок обработки нашего события не важен, и мы выставили случайный номер – 60.

Соберем make-initrd с добавленной фичей:

Настройка и генерация initrd образа

Обычно файл с конфигурацией выглядит следующим образом:

Здесь написано, что вся конфигурация будет определена автоматически. Увидеть «угаданную» конфигурацию можно с помощью команды:

Вы можете попросить make-initrd запускать только определенные guess модули. Например, можно попросить «угадывать» только модули ядра и фичи необходимые для монтирования корня и работы с клавиатурой:

Попробуем теперь собрать intird образ вместе с фичей hello-usb. Подправим конфигурацию

И запустим сборку образа:

Перейдем к проверке нашего образа на виртуальной машине.

Запуск в qemu

Проверку образа будем производить с помощью qemu. Установим необходимые пакеты:

В процессе работы мы планируем пробрасывать USB-устройство на виртуальную машину. Чтобы это сделать, необходимо узнать его адрес на USB-шине:

Мы хотим пробросить устройство, имеющее класс Mass Storage (флешку). В нашем случае оно находится на первой шине и втором порту.

Перейдем к запуску:

После запуска системы сначала отобразится вывод ядра, а затем вывод самого initrd. Если вы все сделали правильно, в какой-то момент увидите вывод обработчика событий hello-usb:

На этом, увы, ваша система зависнет:) Это связано с тем, что initramfs будет продолжать искать устройство с корнем, но оно не проброшено в qemu. К счастью, есть возможность экстренно перейти в rescue консоль: для этого надо нажать клавиши ** + **.

В ней можно изучить окружение initramfs образа:

* Убедитесь, что файловая структура, описанная ранее, соответствует действительности;

* Изучите список активных процессов;

* Посмотрите логи в /var/log/ ;

* Посмотрите содержимое других файлов.

Вы всегда можете запустить rescue консоль, если имеются какие-либо проблемы при запуске. В ней возможно:

Изучить логи сервисов;

Примонтировать корень вручную и запуститься с него;

Запустить отладчик (если добавлена фича debug-tools).

Передача аргументов ядра

Запустим qemu с аргументом ядра usb-vendor

Заметьте, если указать другое имя производителя, то в лог может ничего не вывестись.

Популярные опции ядра, которые поддерживает initramfs можно посмотреть здесь

Проверка на реальной машине

После того, как вы убедились, что initramfs образ работает в qemu, можно проверить его на реальной машине. Но здесь могут возникнуть некоторые нюансы.

Мы покажем, как это сделать, на примере GRUB.

Настройка аргументов ядра в GRUB

Откроем файл /etc/default/grub. Его содержимое выглядит примерно следующим образом:

Подробнее об опциях grub можно прочитать здесь

Для генерации конфигурации второго уровня выполним команду:

Разбор полученной конфигурации является уже более сложной задачей и выходит за рамки этой статьи. Тем не менее посмотреть на файл /boot/grub/grub.cfg все равно будет полезно:) Подробную информацию о его конфигурации grub можно найти здесь.

Добавим в аргументы ядра, параметр usb-vendor. Для этого зададим в файле /etc/default/grub переменную GRUB_CMDLINE_LINUX_DEFAULT :

И снова обновим конфигурацию:

Перезапустите систему и посмотрите на результат.

Вывод

Естественно, фича hello-usb не раскрывает всю мощь использования make-initrd. Если вы хотите рассмотреть более живые примеры фич, посмотрите исходники фич:

sshfsroot. – фича для загрузки с сетевых дисков по протоколу ssh;

luks – фича для загрузки с зашифрованных разделов;

raid – фича для загрузки с raid разделов.

В первые две, кстати, мы недавно добавили возможность для аутентификации по смарт-карте.

Обратите внимание насколько архитектура этих фичей совпадает с той, что мы реализовывали в hello-usb. Такая структурированность упрощает процесс разработки, и вы можете опираться на нее.

Make-initrd также удобен и для конечного использования. Такая крупная ОС, как ALT Linux, использует его в своих дистрибутивах в качестве основного генератора initramfs образов, в частности на таких продуктах, как “Альт Рабочая станция” и “Альт Сервер”. Это ли не показывает его широкую направленность?

На десктопных платформах вы можете добиться желаемого с помощью пары строк в конфигурационном файле, а порой полностью автоматически. Хотите добавить загрузку c сетевого раздела, используя sshfs? Просто напишите FEATURE += sshfsroot в файле конфигурации, а в опциях ядра укажите адрес сервера. Хотите добавить загрузку с RAID или LVM разделов? Ничего делать не надо! Если ваш корень лежит на таком разделе, make-initrd автоматически подберет правильную конфигурацию.

На серверных решениях вы можете добиться быстрой загрузки за счет высокой конфигурируемости образов. Вы всегда можете отключить любые ненужные вам фичи, тормозящие загрузку вашей системы. За счет обилия имеющегося функционала можно реализовать загрузку практически любой сложности. А если какого-то функционала будет не хавать, можно быстро реализовать его самостоятельно.

Источник

Операционные системы и программное обеспечение