Зачем initrd нужен в linux

Обновлено: 01.07.2024

Исходный RAM-диск Linux (initrd) — это временная корневая файловая система, которая монтируется во время загрузки системы для поддержки процесса загрузки с двумя состояниями. Initrd содержит различные исполняемые файлы и драйверы, которые позволяют смонтировать реальную корневую файловую систему, после чего RAM-диск initrd размонтируется и освобождается его память.

Где находится файл initrd в Linux?

После этого новую корневую файловую систему можно смонтировать с другого устройства. Предыдущий корень (из initrd) затем перемещается в каталог и впоследствии может быть размонтирован. Файлы initrd обычно находятся в каталоге /boot с именем /boot/initrd. img-kversion с /initrd.

Что такое initrd и initramfs в Linux?

В вычислительной технике (в частности, при работе с Linux) initrd (начальный электронный диск) — это схема загрузки временной корневой файловой системы в память, которую можно использовать как часть процесса запуска Linux. initrd и initramfs относятся к двум различным методам достижения этого.

Что такое initrd и Vmlinuz в Linux?

vmlinuz — это имя исполняемого файла ядра Linux. … vmlinux обычно является промежуточным шагом к созданию vmlinuz. initrd: начальный RAM-диск (initrd) — это исходная корневая файловая система, которая монтируется до того, как настоящая корневая файловая система станет доступной.

Зачем нужен initramfs?

initramfs — это корневая файловая система, встроенная в ядро ​​и загружаемая на ранней стадии процесса загрузки. Это преемник initrd. Он предоставляет раннее пользовательское пространство, которое может делать то, что ядро ​​не может сделать само по себе в процессе загрузки. Использование initramfs необязательно.

Что такое Ramfs в Linux?

Ramfs — это очень простая файловая система, которая экспортирует механизмы кэширования диска Linux (кеш страниц и кэш dentry) в виде файловой системы на основе оперативной памяти с динамически изменяемым размером. Обычно все файлы кэшируются в памяти Linux. … По сути, вы монтируете кэш диска как файловую систему.

Что такое образ initrd в Linux?

Образ initrd содержит необходимые исполняемые файлы и системные файлы для поддержки второго этапа загрузки системы Linux.

В чем разница между initrd и initramfs?

И initrd, и ramfs архивируются во время компиляции, но разница в том, что initrd — это блочное устройство, распаковываемое для монтирования ядром при загрузке, а ramfs распаковывается в память через cpio.

Что такое процесс инициализации в Linux?

init является родителем всех процессов Linux с PID или идентификатором процесса, равным 1. Это первый процесс, который запускается при загрузке компьютера и работает до тех пор, пока система не выключится. init означает инициализацию. … Это последний шаг последовательности загрузки ядра. /etc/inittab Указывает управляющий файл команды инициализации.

Что такое bzImage в Linux?

bzImage — это сжатый образ ядра, созданный с помощью команды make bzImage во время компиляции ядра. Важно отметить, что bzImage не сжимается с помощью bzip2 !! Имя bz в bzImage вводит в заблуждение!! Расшифровывается как «Большой Зимаж». «b» в bzImage означает «большой».

Какова цель vmlinuz?

vmlinuz — это имя исполняемого файла ядра Linux. vmlinuz — это сжатое ядро ​​Linux, способное загружать операционную систему в память, чтобы можно было использовать компьютер и запускать прикладные программы.

Как извлечь vmlinuz?

Извлечение образа ядра Linux (vmlinuz)

Вы сможете найти скрипт extract-linux в /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux . Вы сможете найти скрипт extract-linux в /usr/src/kernels/$(uname -r)/scripts/extract-vmlinux .

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

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

В этом документе дается краткий обзор использования initrd. Более подробное обсуждение процесса загрузки можно найти в 1.

Операция¶

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

  1. загрузчик загружает ядро ​​и начальный RAM-диск

  2. ядро преобразует initrd в «обычный» RAM-диск и освобождает память, используемую initrd

  3. если корневым устройством является не /dev/ram0 , используется старая (устаревшая) процедура change_root. см. раздел "Устаревший механизм изменения корня" ниже.

  4. корневое устройство смонтировано. если это /dev/ram0 , образ initrd монтируется как root

  5. Выполняется
  6. /sbin/init (это может быть любой допустимый исполняемый файл, включая сценарии оболочки; он запускается с uid 0 и может делать практически все, что может делать init).

  7. init монтирует «настоящую» корневую файловую систему

  8. init помещает корневую файловую систему в корневой каталог с помощью системного вызова pivot_root

  9. init выполняет /sbin/init в новой корневой файловой системе, выполняя обычную последовательность загрузки

  10. файловая система initrd удалена

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

Параметры командной строки загрузки¶

initrd добавляет следующие новые параметры:

Сжатые изображения cpio¶

Последние версии ядер поддерживают заполнение виртуального диска из сжатого архива cpio. В таких системах для создания образа виртуального диска не нужно использовать специальные блочные устройства или петли; вы просто создаете каталог на диске с нужным содержимым initrd, переходите в этот каталог и запускаете (в качестве примера):

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

Установка¶

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

Имя не имеет значения. Дополнительную информацию можно найти на pivot_root(2) справочной странице.

Если корневая файловая система создается во время процедуры загрузки (т. е. если вы создаете установочную дискету), процедура создания корневой файловой системы должна создать каталог /initrd.

Если в некоторых случаях initrd не будет смонтирован, его содержимое будет по-прежнему доступно, если было создано следующее устройство:

Во-вторых, ядро ​​должно быть скомпилировано с поддержкой RAM-диска и включенной поддержкой исходного RAM-диска. Кроме того, по крайней мере все компоненты, необходимые для выполнения программ из initrd (например, формат исполняемого файла и файловая система), должны быть скомпилированы в ядро.

В-третьих, вам необходимо создать образ RAM-диска. Это делается путем создания файловой системы на блочном устройстве, копирования на нее файлов по мере необходимости, а затем копирования содержимого блочного устройства в файл initrd. С последними ядрами для этого подходят как минимум три типа устройств:

  • дискета (работает везде, но очень медленно)

  • RAM-диск (быстрый, но выделяет физическую память)

  • петлевое устройство (наиболее элегантное решение)

Мы опишем метод петлевого устройства:

  1. убедитесь, что блочные устройства замыкания на себя настроены в ядре

  2. создайте пустую файловую систему подходящего размера, например:

Примечание

Разрешения /sbin/init должны включать «x» (выполнение).

Для экспериментов с initrd вы можете взять аварийную дискету и добавить только символическую ссылку из /sbin/init в /bin/sh . Кроме того, вы можете попробовать экспериментальную среду newlib 2, чтобы создать небольшой файл initrd.

Наконец, вам нужно загрузить ядро ​​и загрузить initrd. Почти все загрузчики Linux поддерживают initrd. Поскольку процесс загрузки по-прежнему совместим со старым механизмом, необходимо указать следующие параметры командной строки загрузки:

(rw необходим только при записи в файловую систему initrd.)

С LOADLIN вы просто выполняете:

В LILO вы добавляете опцию INITRD=

либо в раздел global, либо в раздел соответствующего ядра в /etc/lilo.conf и передайте параметры с помощью APPEND, например:

и запустите /sbin/lilo

Информацию о других загрузчиках см. в соответствующей документации.

Теперь вы можете загрузиться и наслаждаться использованием initrd.

Изменение корневого устройства¶

Выполнив свои обязанности, init обычно меняет корневое устройство и продолжает запуск системы Linux на «настоящем» корневом устройстве.

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

превращение его в корневую файловую систему

удаление всех обращений к старой (initrd) корневой файловой системе

размонтирование файловой системы initrd и освобождение RAM-диска

Смонтировать новую корневую файловую систему очень просто: ее нужно просто смонтировать в каталог под текущим корнем. Пример:

Корневое изменение выполняется с помощью системного вызова pivot_root, который также доступен через утилиту pivot_root (см. справочную страницу pivot_root(8); pivot_root распространяется с util-linux версии 2.10h или выше). 3). pivot_root перемещает текущий корень в каталог под новым корнем и помещает новый корень на его место. Каталог для старого корня должен существовать до вызова pivot_root. Пример:

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

Где what-follow — это программа под новым корнем, например. /sbin/init Если новая корневая файловая система будет использоваться с udev и не имеет действительного каталога /dev, udev необходимо инициализировать перед вызовом chroot, чтобы предоставить /dev/console .

Примечание: детали реализации pivot_root могут со временем меняться. Для обеспечения совместимости необходимо соблюдать следующие пункты:

  • перед вызовом pivot_root текущий каталог вызывающего процесса должен указывать на новый корневой каталог

  • использовать . в качестве первого аргумента и _относительный_ путь к каталогу для старого корня в качестве второго аргумента

  • программа chroot должна быть доступна в старой и новой корневой папке

  • после этого выполнить chroot в новый корень

  • использовать относительные пути для dev/console в команде exec

Теперь initrd можно размонтировать и освободить память, выделенную RAM-диском:

Также можно использовать initrd с корневым каталогом, подключенным к NFS, подробности см. на справочной странице pivot_root(8).

Сценарии использования¶

Главной причиной реализации initrd было обеспечение модульной конфигурации ядра при установке системы. Процедура будет работать следующим образом:

  1. система загружается с дискеты или другого носителя с минимальным ядром (например, с поддержкой RAM-дисков, initrd, a.out и файловой системы Ext2) и загружает initrd

  2. /sbin/init определяет, что необходимо для (1) монтирования «настоящей» корневой ФС (т. е. тип устройства, драйверы устройств, файловая система) и (2) носителя распространения (например, CD-ROM, сетевой , Лента, …). Это можно сделать, спросив пользователя, автоматически выполнив поиск или используя смешанный подход.

  3. /sbin/init загружает необходимые модули ядра

  4. /sbin/init создает и заполняет корневую файловую систему (пока это не обязательно должна быть очень удобная система)

  5. /sbin/init вызывает pivot_root для изменения корневой файловой системы и запускает — через chroot — программу, которая продолжает установку

  6. загрузчик установлен

  7. загрузчик настроен на загрузку initrd с набором модулей, которые использовались для запуска системы (например, /initrd можно изменить, затем размонтировать и, наконец, образ записывается из /dev/ ram0 или /dev/rd/0 в файл)

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

Ключевая роль initrd здесь заключается в повторном использовании данных конфигурации во время нормальной работы системы без необходимости использования раздутого «универсального» ядра или повторной компиляции или повторной компоновки ядра.

Второй сценарий предназначен для установок, в которых Linux работает на системах с разными конфигурациями оборудования в одном административном домене. В таких случаях желательно сгенерировать только небольшой набор ядер (в идеале только одно) и сохранить как можно меньше системной части информации о конфигурации. В этом случае можно было бы сгенерировать общий initrd со всеми необходимыми модулями. Тогда только /sbin/init или файл, который он читает, должен быть другим.

Третий сценарий — более удобные диски восстановления, поскольку такую ​​информацию, как расположение корневого раздела файловой системы, не нужно предоставлять во время загрузки, но система, загружаемая из initrd, может вызывать удобный диалог, а также выполнять некоторые проверки работоспособности (или даже некоторые формы автоматического обнаружения).

И последнее, что не менее важно, распространители компакт-дисков могут использовать его для лучшей установки с компакт-диска, например. используя загрузочную дискету и загрузив RAM-диск большего размера через initrd с компакт-диска; или загрузившись с помощью загрузчика, такого как LOADLIN, или непосредственно с компакт-диска, и загрузив RAM-диск с компакт-диска без использования дискет.

Устаревший механизм смены корня¶

Перед введением pivot_root использовался следующий механизм. Текущие ядра по-прежнему поддерживают его, но вам не следует полагаться на его постоянную доступность.

Он работает путем монтирования «настоящего» корневого устройства (то есть того, которое установлено с помощью rdev в образе ядра или с помощью root=… в командной строке загрузки) в качестве корневой файловой системы при выходе из linuxrc. Затем файловая система initrd размонтируется или, если она все еще занята, перемещается в каталог /initrd , если такой каталог существует в новой корневой файловой системе.

Чтобы использовать этот механизм, вам не нужно указывать параметры команды загрузки root, init или rw. (Если они указаны, они повлияют на реальную корневую файловую систему, а не на среду initrd.)

Если смонтирован /proc, «настоящее» корневое устройство можно изменить из linuxrc, записав номер нового корневого устройства FS в специальный файл /proc/sys/kernel/real-root-dev, например:

Обратите внимание, что этот механизм несовместим с NFS и аналогичными файловыми системами.

Этот старый, устаревший механизм обычно называется change_root , а новый, поддерживаемый механизм называется pivot_root .

Смешанный механизм change_root и pivot_root¶

Если вы не хотите использовать root=/dev/ram0 для запуска механизма pivot_root, вы можете создать и /linuxrc, и /sbin/init в образе initrd.

/linuxrc будет содержать только следующее:

После выхода из linuxrc ядро ​​снова смонтирует ваш initrd как root, на этот раз выполнив /sbin/init . Опять же, обязанностью этого init будет создание правильной среды (возможно, с использованием устройства root=, переданного в командной строке) перед окончательным выполнением настоящего /sbin/init .

Узнайте об устройстве, создании и использовании в процессе загрузки Linux

М. Джонс
Опубликовано 31 июля 2006 г.

Что такое начальный RAM-диск?

Исходный RAM-диск (initrd) — это начальная корневая файловая система, которая монтируется до того, как настоящая корневая файловая система станет доступной. initrd привязан к ядру и загружается как часть процедуры загрузки ядра. Затем ядро ​​монтирует этот initrd как часть двухэтапного процесса загрузки, чтобы загрузить модули, чтобы сделать доступными настоящие файловые системы и получить доступ к настоящей корневой файловой системе.

Initrd содержит минимальный набор каталогов и исполняемых файлов для достижения этой цели, например, инструмент insmod для установки модулей ядра в ядро.

В случае настольных или серверных систем Linux initrd является временной файловой системой. Его срок службы короток, он служит только мостом к настоящей корневой файловой системе. Во встроенных системах без изменяемого хранилища initrd является постоянной корневой файловой системой. В этой статье рассматриваются оба этих контекста.

Анатомия initrd

Образ initrd содержит необходимые исполняемые файлы и системные файлы для поддержки второго этапа загрузки системы Linux.

В зависимости от используемой версии Linux способ создания начального RAM-диска может различаться. До Fedora Core 3 initrd создавался с использованием loop device. loop device — это драйвер устройства, который позволяет вам монтировать файл как блочное устройство, а затем интерпретировать представляемую им файловую систему. Устройство петли может отсутствовать в вашем ядре, но вы можете включить его с помощью инструмента настройки ядра ( make menuconfig ), выбрав «Драйверы устройств» > «Блочные устройства» > «Поддержка устройств обратной связи». Вы можете проверить петлевое устройство следующим образом (имя файла initrd может отличаться):

Листинг 1. Проверка initrd (до FC3)

Теперь вы можете проверить подкаталог /mnt/initrd на наличие содержимого файла initrd. Обратите внимание, что даже если ваш файл образа initrd не заканчивается суффиксом .gz, это сжатый файл, и вы можете добавить суффикс .gz, чтобы заархивировать его.

Начиная с Fedora Core 3 образ initrd по умолчанию представляет собой сжатый файл архива cpio. Вместо того, чтобы монтировать файл как сжатый образ с помощью устройства loop, вы можете использовать архив cpio. Чтобы просмотреть содержимое архива cpio, используйте следующие команды:

Листинг 2. Проверка initrd (FC3 и более поздние версии)

В результате получается небольшая корневая файловая система, как показано в листинге 3. Небольшой, но необходимый набор приложений находится в каталоге ./bin, включая nash (не оболочка, интерпретатор скриптов), insmod для загрузка модулей ядра и lvm (инструменты управления логическими томами).

Листинг 3. Структура каталогов Linux initrd по умолчанию

В листинге 3 интерес представляет файл инициализации в корне. Этот файл, как и традиционный процесс загрузки Linux, вызывается, когда образ initrd распаковывается на RAM-диск. Мы рассмотрим это позже в этой статье.

Инструменты для создания initrd

Команда cpio

С помощью команды cpio вы можете управлять файлами cpio. Cpio также является файловым форматом, представляющим собой просто объединение файлов с заголовками. Формат файла cpio допускает использование как ASCII, так и двоичных файлов. Для переносимости используйте ASCII. Чтобы уменьшить размер файла, используйте двоичную версию.

Давайте теперь вернемся к началу, чтобы формально понять, как создается образ initrd. Для традиционной системы Linux образ initrd создается в процессе сборки Linux. Многочисленные инструменты, такие как mkinitrd, могут использоваться для автоматической сборки initrd с необходимыми библиотеками и модулями для подключения к реальной корневой файловой системе. Утилита mkinitrd на самом деле является сценарием оболочки, поэтому вы можете видеть, как именно она достигает своего результата. Существует также утилита YAIRD (Yet Another Mkinitrd), которая позволяет настраивать каждый аспект конструкции initrd.

Создание пользовательского начального RAM-диска вручную

Поскольку во многих встроенных системах на базе Linux нет жесткого диска, initrd также служит постоянной корневой файловой системой. В листинге 4 показано, как создать образ initrd. Я использую стандартный рабочий стол Linux, поэтому вы можете следовать ему без встроенной цели. За исключением кросс-компиляции, концепции (применительно к конструкции initrd) одинаковы для встроенной цели.

Листинг 4. Утилита (mkird) для создания собственного initrd

Initrd дистрибутив Linux

Минимакс представляет собой интересный проект с открытым исходным кодом, который был разработан как дистрибутив Linux, вписывающийся в initrd. Он имеет размер 32 МБ и использует BusyBox и uClibc для своего сверхмалого размера. Несмотря на небольшой размер, это ядро ​​Linux версии 2.6 с большим набором полезных инструментов.

Чтобы создать initrd, начните с создания пустого файла, используя /dev/zero (поток нулей) в качестве входных данных для записи в файл ramdisk.img. Результирующий файл имеет размер 4 МБ (4000 блоков по 1 КБ). Затем используйте команду mke2fs для создания файловой системы ext2 (вторая расширенная) с использованием пустого файла. Теперь, когда этот файл является файловой системой ext2, смонтируйте файл в /mnt/initrd, используя устройство цикла. В точке монтирования у вас теперь есть каталог, представляющий файловую систему ext2, которую вы можете заполнить для вашего initrd. Большая часть остального скрипта обеспечивает эту функциональность.

Следующий шаг — создание необходимых подкаталогов, образующих корневую файловую систему: /bin, /sys, /dev и /proc. Нужны лишь некоторые из них (например, нет библиотек), но они содержат довольно много функций.

Альтернатива файловой системе ext2

Хотя ext2 является распространенным форматом файловой системы Linux, существуют альтернативы, которые могут уменьшить размер образа initrd и результирующих смонтированных файловых систем. Примеры включают romfs (файловая система ROM), cramfs (сжатая файловая система ROM) и squashfs (сильно сжатая файловая система только для чтения). Если вам нужно временно записать данные в файловую систему, ext2 отлично подойдет. Наконец, e2compr — это расширение драйвера файловой системы ext2, поддерживающее онлайн-сжатие.

Чтобы сделать вашу корневую файловую систему полезной, используйте BusyBox. Эта утилита представляет собой единый образ, содержащий множество отдельных утилит, обычно встречающихся в системах Linux (например, ash, awk, sed, insmod и т. д.). Преимущество BusyBox в том, что он упаковывает множество утилит в одну, разделяя при этом их общие элементы, в результате чего изображение становится намного меньше. Это идеально подходит для встраиваемых систем. Скопируйте образ BusyBox из его исходного каталога в корневой каталог /bin. Затем создается ряд символических ссылок, которые указывают на утилиту BusyBox. BusyBox определяет, какая утилита была вызвана, и выполняет эту функцию. В этом каталоге создается небольшой набор ссылок для поддержки вашего сценария инициализации (каждая ссылка на команду указывает на BusyBox).

Следующий шаг — создание небольшого количества специальных файлов устройств. Я копирую их прямо из моего текущего подкаталога /dev, используя параметр -a (архив), чтобы сохранить их атрибуты.

Предпоследним шагом является создание файла linuxrc. После того, как ядро ​​монтирует RAM-диск, оно ищет файл инициализации для выполнения. Если файл инициализации не найден, ядро ​​вызывает файл linuxrc в качестве сценария запуска. В этом файле вы выполняете базовую настройку среды, например монтируете файловую систему /proc. В дополнение к /proc я также монтирую файловую систему /sys и вывожу сообщение на консоль. Наконец, я вызываю ash (клон Bourne Shell), чтобы иметь возможность взаимодействовать с корневой файловой системой. Затем файл linuxrc становится исполняемым с помощью chmod .

Наконец ваша корневая файловая система готова. Он размонтируется, а затем сжимается с помощью gzip. Полученный файл (ramdisk.img.gz) копируется в подкаталог /boot, чтобы его можно было загрузить через GNU GRUB.

Чтобы создать исходный RAM-диск, вы просто вызываете mkird , и образ автоматически создается и копируется в /boot.

Поддержка Initrd в ядре Linux

Чтобы ядро ​​Linux поддерживало исходный RAM-диск, ядро ​​должно быть скомпилировано с параметрами CONFIG_BLK_DEV_RAM и CONFIG_BLK_DEV_INITRD.

Тестирование пользовательского начального RAM-диска

Ваш новый образ initrd находится в /boot, поэтому следующим шагом будет его тестирование с ядром по умолчанию. Теперь вы можете перезагрузить систему Linux. Когда появится GRUB, нажмите клавишу C, чтобы включить утилиту командной строки в GRUB. Теперь вы можете взаимодействовать с GRUB, чтобы определить конкретное ядро ​​и образ initrd для загрузки. Команда ядра позволяет вам определить файл ядра, а команда initrd позволяет указать конкретный файл образа initrd. Когда они определены, используйте команду boot для загрузки ядра, как показано в листинге 5.

Листинг 5. Загрузка ядра и initrd вручную с помощью GRUB

После запуска ядро ​​проверяет, доступен ли образ initrd (подробнее об этом позже), а затем загружает и монтирует его как корневую файловую систему. Вы можете увидеть конец этого конкретного запуска Linux в листинге 6. При запуске оболочка ash доступна для ввода команд. В этом примере я исследую корневую файловую систему и опрашиваю запись файловой системы виртуального proc. Я также демонстрирую, что вы можете писать в файловую систему, прикасаясь к файлу (тем самым создавая его). Обратите внимание, что первым созданным процессом является linuxrc (обычно init ).

Листинг 6. Загрузка ядра Linux с помощью простого initrd

Загрузка с начального RAM-диска

Теперь, когда вы узнали, как создать и использовать собственный начальный RAM-диск, в этом разделе рассматривается, как ядро ​​идентифицирует и монтирует initrd в качестве своей корневой файловой системы. Я пройдусь по некоторым основным функциям в цепочке загрузки и объясню, что происходит.

Загрузчик, такой как GRUB, идентифицирует ядро, которое должно быть загружено, и копирует этот образ ядра и любой связанный файл initrd в память. Вы можете найти большую часть этих функций в подкаталоге ./init в исходном каталоге ядра Linux.

После того как ядро ​​и образы initrd распакованы и скопированы в память, запускается ядро. Выполняется различная инициализация и, в конце концов, вы оказываетесь в init/main.c:init() (подкаталог/файл:функция). Эта функция выполняет большую часть инициализации подсистемы. Здесь делается вызов init/do_mounts.c:prepare_namespace() , который используется для подготовки пространства имен (монтирования файловой системы dev, RAID или md, устройств и, наконец, initrd). Загрузка initrd выполняется через вызов init/do_mounts_initrd.c:initrd_load() .

Функция initrd_load() вызывает init/do_mounts_rd.c:rd_load_image() , которая определяет образ RAM-диска для загрузки с помощью вызова init/do_mounts_rd.c:identify_ramdisk_image() . Эта функция проверяет магический номер изображения, чтобы определить, является ли оно форматом minux, etc2, romfs, cramfs или gzip. По возвращении в initrd_load_image выполняется вызов init/do_mounts_rd:crd_load(). Эта функция выделяет место для RAM-диска, вычисляет контроль циклическим избыточным кодом (CRC), а затем распаковывает и загружает образ RAM-диска в память. На данный момент у вас есть образ initrd в блочном устройстве, подходящем для монтирования.

Монтирование блочного устройства теперь как root начинается с вызова init/do_mounts.c:mount_root() . Создается корневое устройство, а затем выполняется вызов init/do_mounts.c:mount_block_root() . Отсюда вызывается init/do_mounts.c:do_mount_root(), который вызывает fs/namespace.c:sys_mount() для фактического монтирования корневой файловой системы, а затем chdir к ней. Здесь вы видите знакомое сообщение, показанное в листинге 6: VFS: смонтированный корень (файловая система ext2).

Наконец, вы возвращаетесь к функции инициализации и вызываете init/main.c:run_init_process. Это приводит к вызову execve для запуска процесса инициализации (в данном случае /linuxrc ). linuxrc может быть исполняемым файлом или сценарием (если для него доступен интерпретатор сценариев).

Иерархия вызываемых функций показана в листинге 7. Здесь показаны не все функции, участвующие в копировании и монтировании исходного RAM-диска, но это дает вам приблизительное представление об общем потоке.

Листинг 7. Иерархия основных функций загрузки и монтирования initrd

Бездисковая загрузка

Как и во встроенных сценариях загрузки, локальный диск (дискета или компакт-диск) не требуется для загрузки ядра и корневой файловой системы виртуального диска. Протокол динамической конфигурации хоста (или DHCP) можно использовать для определения сетевых параметров, таких как IP-адрес и маска подсети. Затем можно использовать простой протокол передачи файлов (или TFTP) для передачи образа ядра и начального образа виртуального диска на локальное устройство. После переноса ядро ​​Linux можно загрузить и смонтировать initrd, как это делается при загрузке с локального образа.

Уменьшение вашего initrd

Если вы создаете встроенную систему и вам нужен самый маленький из возможных образов initrd, обратите внимание на несколько советов. Первый — использовать BusyBox (показано в этой статье). BusyBox занимает несколько мегабайт утилит и сжимает их до нескольких сотен килобайт.

В этом примере образ BusyBox статически связан, поэтому библиотеки не требуются. Однако, если вам нужна стандартная библиотека C (для ваших пользовательских двоичных файлов), помимо массивного glibc есть и другие варианты. Первой небольшой библиотекой является uClibc, которая представляет собой уменьшенную версию стандартной библиотеки C для систем с ограниченным пространством. Еще одна библиотека, идеально подходящая для сред с ограниченным пространством, — dietlib. Имейте в виду, что вам нужно будет перекомпилировать двоичные файлы, которые вы хотите во встроенной системе, используя эти библиотеки, поэтому требуется дополнительная работа (но она того стоит).

Обзор

Первоначальный RAM-диск изначально создавался для поддержки соединения ядра с окончательной корневой файловой системой через временную корневую файловую систему. Initrd также полезен в качестве непостоянной корневой файловой системы, смонтированной на RAM-диске для встраиваемых систем Linux.

Закрыто. Этот вопрос не соответствует правилам переполнения стека. В настоящее время ответы не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос, чтобы он соответствовал теме Stack Overflow.

Закрыт 1 год назад.

Насколько я понимаю, initrd — это небольшой образ, загружаемый в оперативную память. Он используется для загрузки полного ядра со всеми загружаемыми модулями. В рамках этого процесса нам понадобится образ ядра vmlinuz, который представляет собой переименованную версию bzImage.

Можно ли загрузить ядро ​​без создания образа initrd?


Вы пытались опустить initrd=. опция из вашего загрузчика? В принципе, initrd необязателен, если в вашем ядре собраны все необходимые драйверы для поиска корневой файловой системы. Кроме того, как это вопрос программирования?

Возможно, и раньше все Linux-системы загружались без initrd. Но initrd многое упрощает. Мне любопытно. Почему вы хотите загрузиться без initrd? Знание этого, вероятно, облегчит предоставление более осмысленного ответа.

Я занимался разработкой проекта openwrt и хотел создать небольшой образ ядра. Отсутствие части initrd приводило к ошибкам загрузки.

5 ответов 5

initrd/initramfs является необязательным и необязательным. bzImage — это чистый образ ядра, который может быть загружен непосредственно загрузчиком. Однако может потребоваться выполнение некоторых задач (загрузка модулей файловой системы, драйверов для доступа к диску, монтирование корневой файловой системы с какого-либо сменного носителя без фиксированного имени/пути и т. д.), которые обычно требуют доступа к файловой системе и инструментам пользовательского пространства.< /p>

Для этого предназначен initramfs: это архив CPIO, который прикрепляется к образу ядра (образ ядра является контейнером для initramfs, а не наоборот) либо в самом образе ядра, или загрузчиком во время загрузки.

Этот архив CPIO содержит начальную корневую файловую систему с модулями, необходимыми для настройки всех устройств для доступа к правильной корневой файловой системе, и некоторые программы для идентификации этих устройств, загрузки модулей, выполнения некоторых других задач запуска, перемонтирования правильной корневой файловой системы в / и запустить /sbin/инит

initrd аналогичен, с той лишь разницей, что это образ файловой системы, который может быть и обычно сжат. Ядро должно иметь встроенную поддержку используемой файловой системы и будет монтировать этот образ как начальный /.

Поскольку CPIO на несколько порядков проще, initramfs предпочтительнее, чем initrd, поскольку это избавляет от необходимости встраивать какие-либо модули файловой системы, а также упрощает создание initramfs. Вместо того, чтобы создавать образ ext2, монтировать loopdevice и заполнять его, все сводится к простому созданию архива, мало чем отличающемуся от использования tar.

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

Читайте также: