Linux что такое initrd

Исследуем процесс загрузки Linux

(C) В.А.Костромин, 2007
(версия файла от 5.10.2007 г.)

Этап 3: Загрузчик 2 этапа операционной системы

3.2. Файл /boot/initrd и его назначение

Как было сказано в предыдущем разделе, в процессе начальной загрузки вначале монтируется временный виртуальный диск, содержащий корневую файловую систему (очевидно, тоже временную), с помощью которой осуществляется запуск на выполнение ядра операционной системы. Образ этой корневой системы хранится на загрузочном устройстве в каталоге /boot и обычно носит имя initrd-2.x.yy-zzzz (точное наименование файла смотрите в вашей системе, далее он будет именоваться просто initrd). Загрузчик переносит образ корневой файловой системы из файла initrd в оперативную пямять одновременно с образом ядра, ядро преобразует initrd в «нормальный» RAM диск, монтирует временную корневую файловую систему, извлекает из нее нужные драйверы и другие служебные файлы, с помощью которых инициализирует все необходимые устройства. После этого происходит перемонтирование корневой файловой системы, временная ФС заменяется на постоянную, размещающуюся уже на долговременном носителе и процесс загрузки системы продолжается.

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

3.2.1. Внутреннее устройство initrd

Как сказано в статье [10] в дистрибутиве Fedora Core 3 (и его предшественниках) файл initrd создавался с использованием виртуального loop-устройства. В этом случае сделать содержимое файла initrd доступным для просмотра можно с помощью следующих команд (напомню, что имя вашего образа initrd может отличаться):

В таких дистрибутивах, как Fedora Core 4, SUSE 10, . файл initrd представляет собой cpio-архив, сжатый упаковщиком gzip. Чтобы просмотреть его содержимое, надо выполнить команды, приведенные в листинге 3

/tmp вы найдете каталоговую структуру, аналогичную структуре каталогов обычной Linux-системы. В ней вы обнаружите обычные для корневого каталога подкаталоги, а также файл linuxrc. Могут там оказаться и другие файлы, например, файл bootsplash (судя по названию он содержит картинку, которая отображается при запуске).

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

3.2.2. Загрузка системы в случае использования initrd (ядра версий 2.4.х)

Приводимое ниже описание последовательности операций на этапе загрузки я позаимствовал из [11,12].

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

2. Ядро содержит в себе небольшую несжатую часть, которая вначале разархивирует само ядро. Видимо как раз на этом этапе на экране монитора отображается сообщение «Uncompressing Linux. Ok, booting the kernel.»

3. Ядро инициализирует устройства, создает файловую систему устройств /dev, разархивирует initrd и копирует его содержимое на устройство /dev/ram0, а затем освобождает память, занятую initrd.

4. Ядро монтирует устройство /dev/ram0 для чтения и записи в качестве начальной корневой файловой системы.

5. Если в начальной корневой файловой системе находится исполняемый файл /linuxrc, он исполняется с uid 0. Этот файл должен иметь разрешения на исполнение, он может быть как обычным исполняемым файлом, так и просто скриптом оболочки, но в последнем случае должен быть и интерпретатор скриптов.

6. Cкрипт /linuxrc монтирует нормальную корневую файловую систему.

7. Корневая файловая система помещается в корневую директорию. Смена корневого устройства выполняется системным вызовом pivot_root, который также доступен через утилиту pivot_root (см. pivot_root(8); pivot_root распространяется в составе util-linux версии не ниже 2.10h ). Смена корневой директории не включает её демонтирование. Следовательно, при выполнении данной процедуры можно сохранить процессы, запущенные с файловой системы initrd.

8. Если нормальная корневая файловая система имеет каталог /initrd, то устройство /dev/ram0 перемещается из / в /initrd. Иначе, если каталог /initrd не существует, устройство /dev/ram0 размонтируется.

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

10. Теперь можно демонтировать /dev/ram0 и освободить память, занятую RAM диском.

3.2.3. Initramfs — новая модель инициализации (ядра версий 2.6.х)

Во-первых, виртуальный диск, как и все блочные устройства, требует драйвер файловой системы для интерпретации данных во время выполнения. Этот драйвер приходилось включать в ядро.

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

В третьих, в Linux осуществляется кэширование всех файлов и записей каталогов, прочитанных или записанных на блочное устройство. Виртуальный диск тоже кешируется, как и обычные диски, то есть часть данных будет храниться не только на RAM диске, но и в страничном кэше «page cache» (для файловых данных) и в кэше для записей каталогов «dentry cache», что еще больше снижает эффективность использования памяти.

Для устраненеия этих недостатков Линус Торвальдс предложил монтировать кэш ядра Линукс как особую файловую систему, работающую полностью в кэше ядра. При этом нет лишнего дублирования информации между блочным устройством и кэшем, так как блочного устройства попросту нет. Файловая система, реализующая эти идеи, была разработана и получила название initramfs. Ее использование имеет следующие преимущества:

  • Система, использующая initramfs в качестве корневой файловой системы, более не нуждается в соответствующем драйвере файловой системы, встроенном в ядро, так как нет блочных устройств для интерпретации файловых систем.
  • Размер этой файловой системы автоматически изменяется в соответствии с обьёмом данных, которые она содержит. При добавлении новых файлов (как и при расширении существующих) автоматически выделяется память, при удалении или уменьшении файла происходит высвобождение памяти.
  • Достоинством initramfs является также то, что это не новый код, а новое применение уже существующего кода кэширования ядра Линукс, что практически не влечёт увеличение размера ядра, выполнение будет очень простым и основано на чрезвычайно хорошо протестированной инфраструктуре.
  • Исчезают некоторые проблемы загрузки с SATA-дисков.
  • Initramfs загружается немного быстрее, чем initrd.
Читайте также:  Свойства операционной системы windows рабочий стол

Формат initramfs используется по умолчанию для всех ядер, начиная с версии 2.6.15.

В каталоге /boot такая файловая система хранится, по-прежнему, в файле в виде сжатого cpio-архива. Только имя включаемого в этот архив скрипта изменилось с linuxrc на init. Например, в системе ASP Linux 11 после разархивирования файла initrd-2.6.14-1.1653.1asp.img по приведенному в листинге 3 алгоритму я увидел скрипт init и следующую структуру каталогов:

В подкаталоге /bin обнаружилось всего 4 исполняемых файла и две ссылки, в подкаталоге /dev — 8 файлов устройств, в /etc — конфигурационный файл udev/udev.conf, в каталоге lib — два файла: ext3.ko и jbd.ko. Остальные подкаталоги — пустые. Файл init оказался скриптом оболочки следующего вида:

Листинг 4. Содержимое файла init в дистрибутиве ASP Linux версии 11. Обратите внимание на первую строку этого файла: это скрипт для оболочки nash, которая является сильно урезанной версией командного процессора и тоже включена в состав initramfs. Другие, более мощные оболочки на этом этапе еще недоступны.

Как видно из листинга 4, скрипт init монтирует файловые системы /sys и /dev, инициализирует несколько устройств, загружает модули из подкаталога /lib и монтирует корневую файловую систему. Сколько я ни вглядывался в экран при перезагрузках системы, я не увидел сообщений, которые вроде бы должны выдаваться командами echo, включенными в этот скрипт.

Образ виртуальной файловой системы initramfs хранится на диске по-прежнему в файле /boot/initrd-version и создается такой файл как и ранее командой mkinitrd. Прочитать о том, как создать такой файл, можно в статье [10]. Перечень модулей (иначе говоря, драйверов), которые будут включены в эту файловую систему, приведен в переменой INITRD_MODULES в файле /etc/sysconfig/kernel. Если вам требуется включить в /boot/initrd-version какие-то дополнительные модули (например, в случае изменения состава оборудования), вы можете скорректировать соответствующим образом список модулей в файле /etc/sysconfig/kernel, после чего заново создать файл /boot/initrd-version.

Источник

Linux что такое initrd

Для использования /dev/initrd с поддержкой «диска в RAM» и «начального диска в RAM» ядро Linux должно быть собрано с параметрами CONFIG_BLK_DEV_RAM=y и CONFIG_BLK_DEV_INITRD=y. При использовании /dev/initrd драйвер диска в RAM не может загружаться как модуль.

ОПИСАНИЕ

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

Выполнение загрузки

Параметры

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

Также сменить нормальное корневое устройство можно из /linuxrc. Для этого должен быть смонтирован каталог /proc. После монтирования /proc, сменить нормальное корневое устройство из /linuxrc можно записав настройки в proc-файлы /proc/sys/kernel/real-root-dev, /proc/sys/kernel/nfs-root-name и /proc/sys/kernel/nfs-root-addrs. Для смены физического корневого устройства из /linuxrc нужно записать номер нового устройства корневой файловой системы в /proc/sys/kernel/real-root-dev. Для смены корневой файловой системы NFS из /linuxrc нужно записать настройки NFS в файлы /proc/sys/kernel/nfs-root-name и /proc/sys/kernel/nfs-root-addrs, а затем записать 0xff (номер псевдо-NFS-устройства) в файл /proc/sys/kernel/real-root-dev. Так, например, следующие команды изменят нормальное корневое устройство на /dev/hdb1:

В качестве примера c NFS, следующие команды изменят нормальное корневое устройство на каталог NFS /var/nfsroot на NFS-сервере локальной сети с IP-адресом 193.8.232.7 для системы с IP-адресом 193.8.232.2 и именем ‘idefix’:

Замечание: Файл /proc/sys/kernel/real-root-dev для смены корневой файловой системы больше не применяется. Современный метод смены корневой файловой системы описан в файле Documentation/initrd.txt из исходного кода ядра Linux, а также в pivot_root(2) и pivot_root(8).

Использование

Возможный сценарий установки системы:

1. Программа-загрузчик стартует с дискеты или другого носителя с минимальным ядром (например, включающим поддержку /dev/ram, /dev/initrd и файловой системы ext2) и загружает в /dev/initrd начальную файловую систему, сжатую программой gzip. 2. Исполняемый файл /linuxrc определяет: (1) что необходимо, чтобы смонтировать нормальную корневую файловую систему (т.е., тип устройства, драйверы, файловую систему) и (2) носитель распространения (например, CD-ROM, сеть, лента, …). Для этого может быть задан вопрос пользователю, запущена автоматического определения или использован гибридный подход. 3. Исполняемый файл /linuxrc загружает необходимые модули из начальной корневой файловой системы. 4. Исполняемый файл /linuxrc создаёт и заполняет корневую файловую систему (на этой стадии нормальная корневая файловая система ещё не является законченной системой). 5. Исполняемый файл /linuxrc устанавливает /proc/sys/kernel/real-root-dev, размонтирует /proc, нормальную корневую файловую систему и все другие файловые системы, которые он монтировал, а затем завершает работу. 6. Затем ядро монтирует нормальную корневую файловую систему. 7. Теперь, поскольку файловая система доступна и полноценна, может быть установлен системный загрузчик. 8. Системный загрузчик настраивается так, чтобы загружать в /dev/initrd файловую систему с набором модулей, которые были использованы для запуска системы в первый раз (например, устройство /dev/ram0 может быть изменено, затем размонтировано и, наконец, образ записывается из /dev/ram0 в файл). 9. Система теперь может загружаться, и можно выполнять дополнительные действия по установке.

Читайте также:  Звук при открытии папки windows 10

Ключевая роль /dev/initrd в вышеописанном механизме — в повторном использовании данных настройки во время нормальных действий системы без необходимости начального выбора ядра, загрузки ядра большего размера или пересборки ядра.

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

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

И наконец, дистрибутивы Linux на CD-ROM могут использовать initrd для упрощения установки с CD-ROM. Дистрибутив может использовать LOADLIN для непосредственной загрузки /dev/initrd с CD-ROM без необходимости в дискетах. Дистрибутив также может использовать загрузочную дискету LILO и затем запускаться с помощью /dev/initrd с большего RAM-диска, находящегося на CD-ROM.

Источник

Linux initial RAM disk (initrd) overview

Linux® initial RAM disk (initrd)- временная рутовая файловая система,которая монтируется во время загрузки. initrd включает в себя различные утилиты и драйвера, которые уже в свою очередь монтируют реальную рутовую систему, после чего initrd RAM отмонтируется и освободит память. Во многих embedded Linux системах initrd является собственно рутовой файловой системой. Эта статья делает обзор RAM disk для Linux 2.6, включая его создание и использование в ядре.

RAM disk (initrd)— стартовая рутовая файловая система,которая монтируется в первую очередь. initrd входит в состав ядра и грузится как его часть во время загрузки. Ядро монтирует initrd в первой части загрузочного процесса для последующей загрузки модулей и реальной рутовой файловой системы.

initrd включает минимальный набор каталогов и утилит, таких как insmod для инсталляции kernel modules.

В зависимости от того, что мы имеем- desktop или server- initrd является переходной файловой системой. Его время жизни минимально. В embedded systems initrd является постоянной рутовой файловой системой.

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

В зависимости от версии Linux метод создания initial RAM disk может различаться. Например в Fedora Core initrd создается с помощью loop device. loop device— драйвер,который позволяет монтировать файл как блочное устройство. loop device может не быть в вашем ядре, для этого его можно сконфигурировать. с помощью ( make menuconfig ) с помощью установки Device Drivers > Block Devices > Loopback Device Support. Можно проверить наличие loop device следующим образом (имя initrd file name может варьироваться):

Можно посмотреть содержимое /mnt/initrd. initrd image file может и не иметь на конце расширение .gz, но тем не менее он все равно является архивным файлом.

Начиная с Fedora Core 3, initrd image-архив cpio. Для этого типа архива можно выполнить:

Результатом является небольшая файловая система как показано в Listing 3. В каталоге ./bin directory имеются nash (script interpreter), insmod для загрузки kernel modules, lvm (logical volume manager tools).

Обратите внимание на init file в корне. Этот файл вызывается в момент,когда initrd image разархивируется в RAM disk.

cpio command

Используя команду cpio , можно манипулировать cpio файлами. Cpio-это файловыйй формат,который включает в себя хидеры. Он включает в себя как ASCII,так и бинарный форматы. Для портабельности,используйте ASCII. Для уменьшения размера файла,используйте бинарный формат.

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

Поскольку во многих embedded systems нет дисков, там initrd используется перманентно. Listing 4 показывает,как создать initrd image. Здесь используется стандартный десктоп.

Примером такого проекта является Minimax. Он умещается в 32MB и использует BusyBox и uClibc. Несмотря на размер, он использует 2.6 Linux kernel с большим набором всяких утилит.

Для создания initrd, создадим пустой файл, используя /dev/zero (набор нулей) и запишем его в ramdisk.img file. Результирующий файл получится размером 4MB (4000 1K blocks). Затем с помощью mke2fs создадим ext2 (second extended) файловую систему с помощью созданной пустышки. Монтируем этот файл в /mnt/initrd с помощью loop device. Теперь мы имеем корневую ext2 file system.

Следующий шаг-создание подкаталогов для создания рутовой файловой системы: /bin, /sys, /dev, /proc.

Альтернатива для ext2 file system

Для ext2 есть альтернативные файловые системы, с помощью которых можно уменьшить размер initrd image. Это romfs (ROM file system), cramfs (compressed ROM file system), squashfs (highly compressed read-only file system). Если вам нужно писать данные,ext2 работает прекрасно. И также e2compr является расширением ext2 file system,которая поддерживает компрессию.

Утилита BusyBox представляет из себя image, который включает в себя такие утилиты,как ash, awk, sed, insmod. Преимущество BusyBox в том,что он пакует много утилит в маленький образ. Это идеально для embedded systems. Копируем BusyBox image в каталог /bin. Симлинки указывают на утилиты BusyBox.

Затем создаем набор device files. Для этого создадим каталог /dev, используя -a опцию.

Финальным шагом является создание файла linuxrc. После того как ядро смонтирует RAM disk, оно ищет файл init для выполнения. Если файла init нет, ядро грузит linuxrc в качестве startup script. В этом файле делаются базовые настройки, такие как монтирование файловой системы /proc. Я также монтирую каталог /sys file и вывожу сообщения на консоль. Я вызываю ash (Bourne Shell clone), поэтому я общаюсь с рутовой файловой системой. linuxrc можно сделать исполняемым с помощью chmod .

В конце ваша root file system сделана. Она отмонтируется и сжимается с помощью gzip . Результирующий файл (ramdisk.img.gz) копируется в /boot,и его можно загрузить с помощтю GNU GRUB.

Для создания initial RAM disk, вызовите mkird , при этом образ автоматически создастся и ляжет в /boot.

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

Для поддержки initial RAM disk, ядро должно быть собрано с опциями CONFIG_BLK_DEV_RAM и CONFIG_BLK_DEV_INITRD .

Ваш созданный initrd image лежит в /boot, протестируем его. Можно загрузиться с него При загрузке GRUB нажмите на клавишу C для появления командной строки. Команда kernel позволит вам задать ядро, команда initrd определяет initrd image file. После этого наберите команду boot как показано в Listing 5.

После старта ядро проверяет наличие initrd image, и затем загружает его и монтирует. Окончание Linux startup можно посмотреть в Listing 6. При старте ash shell можно использовать для ввода команд. В примере я проверяю root file system. Я также создаю новый файл. Первый созданный процесс есть linuxrc (или init ).

Загрузчик типа GRUB определяет ядро и копирует его и связанный с ним initrd в память. Подробности можно посмотреть в исходниках в подкаталоге ./init.

После декомпрессии и загрузки в память, запускается ядро. Выполняется инициализация-смотрите init/main.c:init() . Вызывается init/do_mounts.c:prepare_namespace() , которая подготавливает namespace (dev file system, RAID, md, devices, initrd). Загрузка initrd происходит с помощью init/do_mounts_initrd.c:initrd_load() .

Функция initrd_load() вызывает функцию init/do_mounts_rd.c:rd_load_image() , которая определяет RAM disk image и грузит его с помощью функции init/do_mounts_rd.c:identify_ramdisk_image() . Она проверяет формат файловой системы с помощью т.н. magic number. Вернувшись в initrd_load_image , вызываем init/do_mounts_rd:crd_load() . Эта функция выделяет память для RAM disk, вычисляет cyclic redundancy check (CRC), и грузит RAM disk image в память.initrd image становится block device.

Монтирование block device начинается с вызова init/do_mounts.c:mount_root() . root device создан, вызывается init/do_mounts.c:mount_block_root() . Из нее вызываем init/do_mounts.c:do_mount_root() , которая вызывает fs/namespace.c:sys_mount() для монтирования root file system и затем chdir . Смотрите это место в Listing 6: VFS: Mounted root (ext2 file system).

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

Иерархия вызываемых функций показана в Listing 7. Здесь представлены не все функции.

В сценариях embedded booting диск (floppy or CD-ROM) необязателен для загрузки ядра. Dynamic Host Configuration Protocol (DHCP) может быть использован для сетевых настроек. Trivial File Transfer Protocol (TFTP) может быть использован для перевода статуса ядра и initial ramdisk в local device.

Если вам нужен минимальный размер initrd image, есть несколько хинтов. Первый-использование BusyBox. BusyBox занимает несколько метров.

BusyBox image в этой статье статически прилинкован и не требует никаких библиотек. Но если вам нужна стандартная C library (для бинарников), можно взять маленькую библиотеку uClibc, которая минимизирует размер стандартной C library. Другой вариант библиотеки-dietlib. Имейте ввиду,что в обоих случаях вам нужно пересобирать их.

initial RAM disk создан для перехода ядра от временной промежуточной рутовой файловой системы к основной. initrd также полезен как root file system для embedded Linux systems.

Learn

    «Inside the Linux boot process» (developerWorks, May 2006) explores the Linux boot process from the initial bootstrap to the start of the first user-space application.

In «Boot Linux from a FireWire device» (developerWorks, July 2004), see how you can start Linux (with its initrd) from a multitude of devices on a variety of platforms.

The cpio file format is both simple and compact. It’s no wonder the Fedora team chose it as a format option for the initrd.

The mkinitrd utility is ideal for creating initrd images. In addition to creating an initrd image, it also identifies the modules to load for your particular system and populates them into the image.

The loop device is a great driver for mounting image files as file systems.

The Network Boot and Exotic Root HOWTO illustrates not only booting Linux from the network, but also other interesting scenarios such as floppy boot, CD-ROM boot, and embedded scenarios.

In the developerWorks Linux zone, find more resources for Linux developers.

  • Stay current with developerWorks technical events and Webcasts.
  • Get products and technologies