Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Каспера (настойчивость) )
Перейти к навигации Перейти к поиску

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

Обоснование [ править ]

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

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

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

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

Реализация [ править ]

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

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

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

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

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

Подготовка скакунов [ править ]

Некоторые дистрибутивы 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 исходная корневая файловая система не может быть повернута. [10] Вместо этого он просто очищается, а окончательная корневая файловая система монтируется поверх.

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

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

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

Tiny Core Linux [12] и Puppy Linux [13] [ неудачная проверка ] могут работать полностью из initrd.

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

Начиная с Windows Vista [14] Windows может загружаться с файла образа диска WIM , для которого официально опубликован формат файла; [15] он очень похож на формат 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)

Ссылки [ править ]

  1. ^ Альмесбергер, Вернер (2000), «Загрузка Linux: история и будущее» , Труды Оттавского симпозиума Linux , заархивированные с оригинала 24 июля 2008 г.
  2. ^ a b Лэндли, Роб (15 марта 2005 г.), Представляем initramfs, новую модель для начальных RAM-дисков.
  3. ^ а б Альмесбергер, Вернер; Лермен, Ганс (2000). «Использование исходного RAM-диска (initrd)» . Архивировано из оригинала 2 апреля 2015 года . Проверено 14 марта 2015 года .
  4. ^ "linux / do_mounts_initrd.c в 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds / linux · GitHub" . GitHub .
  5. ^ Б Landley, Rob (17 октября 2005). "ramfs, rootfs и initramfs docs, дубль 2" . Дерево исходных текстов ядра Linux.
  6. ^ Петерсен, Ричард Лиланд (2010). Fedora 13: Администрирование, Сеть, Безопасность . Аламеда, Калифорния: Surfing Turtle Press. п. 76. ISBN 978-1-936280-02-5. Dracut использует параметры ядра, перечисленные в командной строке ядра GRUB, для настройки файловой системы RAM initramfs на лету, обеспечивая большую гибкость и дополнительно сокращая код файловой системы RAM.
  7. ^ "Ubuntu Manpage: casper - ловушка для initramfs-tools для загрузки живых систем" . manpages.ubuntu.com .
  8. ^ Шон Пауэрс. «Каспер, дружелюбный (и стойкий) призрак» . Linux Journal. 2012 г.
  9. ^ Kyungsik Ли (30 мая 2013). «Сжатие LZ4 и улучшение времени загрузки» (PDF) . events.linuxfoundation.org . п. 18 . Дата обращения 29 мая 2015 .
  10. ^ Рыба, Ричард (6 июля 2005 г.). "pivot_root из initramfs вызывает циклическую ссылку в дереве монтирования" . Отслеживание ошибок ядра Linux . Проверено 28 февраля 2009 года .
  11. ^ Garzik, Джефф (2 ноября 2002). "initramfs merge, часть 1 N" . Список рассылки ядра Linux .
  12. ^ «Tiny Core Linux - Концепции» . ibiblio.org .
  13. ^ Барри Каулер. «Объявление о выпуске Puppy Linux» . ibiblio.org .
  14. ^ "Формат файлов изображений Windows (WIM)" . microsoft.com . Microsoft.
  15. ^ «Загрузите Windows Imaging File Format (WIM) из официального центра загрузки Microsoft» . Microsoft.com . Microsoft.

Внешние ссылки [ править ]

  • Подробное сравнение наборов инструментов для генерации initrd
  • Документация ядра по ранней поддержке пользовательского пространства
  • «Мотивация перехода с initrd на initramfs» . Архивировано из оригинала 4 января 2013 года . Альтернативный URL