Начальный рамдиск - Initial ramdisk

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

Обоснование

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

Еще больше усложняет ситуацию то, что корневая файловая система может находиться на томе программного RAID , LVM , NFS (на бездисковых рабочих станциях) или в зашифрованном разделе. Все это требует специальной подготовки для установки.

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

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

Реализация

Изображение этой начальной корневой файловой системы (наряду с изображением ядра) должны храниться где - то доступны в Linux загрузчика или загрузки встроенного программного обеспечения компьютера. Это может быть сама корневая файловая система, загрузочный образ на оптическом диске , небольшой раздел на локальном диске ( загрузочный раздел , обычно использующий файловые системы ext2 или FAT ) или TFTP- сервер (в системах, которые могут загружаться через Ethernet. ).

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

В схеме initrd образ может быть образом файловой системы (необязательно сжатым), который становится доступным на специальном блочном устройстве ( / dev / ram ), которое затем монтируется в качестве начальной корневой файловой системы. Драйвер для этой файловой системы должен быть статически скомпилирован в ядро. Многие дистрибутивы изначально использовали сжатые образы файловой системы ext2 , в то время как другие (включая Debian 3.1) использовали cramfs для загрузки в системах с ограниченным объемом памяти, поскольку образ cramfs можно смонтировать на месте, не требуя дополнительного места для распаковки. Как только начальная корневая файловая система запущена , ядро ​​выполняет / linuxrc в качестве своего первого процесса; при выходе ядро ​​предполагает, что настоящая корневая файловая система смонтирована, и выполняет / sbin / init, чтобы начать обычный процесс загрузки в пользовательском пространстве.

В схеме initramfs (доступной начиная с ядра Linux 2.6.13) образ может быть архивом cpio (необязательно сжатым). Архив распаковывается ядром в специальный экземпляр tmpfs, который становится начальной корневой файловой системой. Эта схема имеет то преимущество, что не требует компиляции промежуточной файловой системы или блочных драйверов в ядро. Некоторые системы используют пакет dracut для создания образа initramfs. В схеме initramfs ядро ​​выполняет / init в качестве первого процесса , завершение которого не ожидается. Для некоторых приложений initramfs может использовать утилиту casper для создания среды с возможностью записи, используя unionfs для наложения уровня сохраняемости поверх образа корневой файловой системы, доступного только для чтения. Например, данные оверлея могут храниться на USB-накопителе , а сжатый образ SquashFS, доступный только для чтения, хранящийся на live CD, действует как корневая файловая система.

В зависимости от того, какие алгоритмы были статически скомпилированы в него, ядро ​​может распаковывать образы initrd / initramfs, сжатые с помощью gzip , bzip2 , LZMA , XZ , LZO и LZ4 .

Подготовка к креплению

Некоторые дистрибутивы Linux, такие как Debian , создают настроенный образ initrd, который содержит только все, что необходимо для загрузки определенного компьютера, например , модули ядра ATA , SCSI и файловой системы . Обычно они включают расположение и тип корневой файловой системы.

Другие дистрибутивы Linux (такие как Fedora и Ubuntu ) создают более общий образ initrd. Они начинаются только с имени устройства корневой файловой системы (или его UUID ) и должны обнаруживать все остальное во время загрузки. В этом случае программное обеспечение должно выполнить сложный каскад задач, чтобы смонтировать корневую файловую систему:

  • Все драйверы оборудования, от которых зависит процесс загрузки, должны быть загружены. Распространенным способом является упаковка модулей ядра для обычных запоминающих устройств на initrd, а затем вызов агента горячего подключения для вставки модулей, соответствующих обнаруженному компьютерному оборудованию.
  • В системах, которые отображают заставку при загрузке , видеооборудование должно быть инициализировано, и помощник пользовательского пространства начал рисовать анимацию на дисплее синхронно с процессом загрузки.
  • Если корневая файловая система находится на NFS, она должна затем вызвать основной сетевой интерфейс , вызвать DHCP- клиент, с помощью которого он может получить аренду DHCP, извлечь имя общего ресурса NFS и адрес NFS-сервера из аренды. и смонтируйте общий ресурс NFS.
  • Если кажется, что корневая файловая система находится на программном RAID-устройстве, невозможно узнать, какие устройства охватывает том RAID; стандартные утилиты MD должны быть вызваны для сканирования всех доступных блочных устройств и перевода требуемых в оперативный режим.
  • Если кажется, что корневая файловая система находится на логическом томе , необходимо вызвать утилиты LVM для поиска и активации группы томов, содержащей ее.
  • Если корневая файловая система находится на зашифрованном блочном устройстве, программное обеспечение должно вызвать вспомогательный сценарий, чтобы предложить пользователю ввести кодовую фразу и / или вставить аппаратный токен (например, смарт-карту или защитный ключ USB ), и затем создайте цель дешифрования с помощью устройства сопоставления .

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

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

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

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

Большинство исходных корневых файловых систем реализуют / linuxrc или / init как сценарий оболочки и, таким образом, включают минимальную оболочку (обычно / bin / ash ) вместе с некоторыми важными утилитами пользовательского пространства (обычно набор инструментов BusyBox ). Для дополнительной экономии места оболочка, утилиты и их вспомогательные библиотеки обычно компилируются с включенной оптимизацией пространства (например, с флагом gcc "-Os") и связаны с klibc , минимальной версией библиотеки C, написанной специально для этой цели. .

Другое использование

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

Tiny Core Linux и Puppy Linux могут работать полностью из initrd.

Сходства в других операционных системах

Начиная с Windows Vista, Windows может загружаться с файла образа диска WIM , для которого опубликован формат файла; он очень похож на формат ZIP, за исключением того, что он поддерживает жесткие ссылки, использует сжатие по частям и может поддерживать дедуплицированные фрагменты. В этом случае весь WIM сначала загружается в ОЗУ, после чего выполняется инициализация ядра. Затем загруженный WIM доступен как SystemRoot с назначенной буквой диска. Установщик Windows использует это, поэтому он загружается из BOOT.WIM, а затем использует INSTALL.WIM как набор устанавливаемых файлов Windows.

Кроме того, среда предустановки Windows (Windows PE) использует то же самое, являясь основой для версий с раздельной загрузкой некоторых антивирусных программ и программного обеспечения для резервного копирования / аварийного восстановления.

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

Смотрите также

использованная литература

внешние ссылки