Начальный рамдиск - 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.
Смотрите также
- Процесс запуска Linux
- Список дистрибутивов Linux, запускаемых из ОЗУ
- Загрузка EFISTUB позволяет прошивке EFI загружать ядро Linux (Arch Linux Wiki)
использованная литература
внешние ссылки
- Подробное сравнение наборов инструментов для генерации initrd
- Документация ядра по ранней поддержке пользовательского пространства
- «Мотивация перехода с initrd на initramfs» . Архивировано из оригинала 4 января 2013 года . Альтернативный URL