stringtranslate.com

Начальный электронный диск

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

Обоснование

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

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

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

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

Выполнение

mkinitcpio, программа для генерации initramfs в Arch Linux и родственных дистрибутивах
dracut, еще одна программа для генерации initramfs в некоторых дистрибутивах Linux

Образ этой начальной корневой файловой системы (вместе с образом ядра) должен храниться где-то, доступном загрузчику 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] и zstd .

Подготовка к монтированию

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

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

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

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

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

Большинство начальных корневых файловых систем реализуют /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.

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

Ссылки

  1. ^ Альмесбергер, Вернер (2000), «Загрузка Linux: история и будущее», Труды симпозиума Ottawa Linux , архивировано из оригинала 24 июля 2008 г.
  2. ^ ab Landley, Rob (15 марта 2005 г.), Знакомимся с initramfs, новой моделью для начальных RAM-дисков
  3. ^ ab Almesberger, Werner; Lermen, Hans (2000). "Использование начального RAM-диска (initrd)". Архивировано из оригинала 2 апреля 2015 г. Получено 14 марта 2015 г.
  4. ^ "linux/do_mounts_initrd.c по адресу 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds/linux · GitHub". GitHub .
  5. ^ ab 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, для настройки файловой системы оперативной памяти initramfs «на лету», обеспечивая большую гибкость и дополнительно сокращая код файловой системы оперативной памяти.
  7. ^ "Ubuntu Manpage: casper - хук для initramfs-tools для загрузки живых систем". manpages.ubuntu.com . Архивировано из оригинала 4 августа 2017 г. . Получено 7 августа 2017 г. .
  8. ^ Шон Пауэрс . «Каспер, дружелюбный (и настойчивый) призрак». Linux Journal. 2012.
  9. ^ Kyungsik Lee (30 мая 2013 г.). "LZ4 Compression and Improving Boot Time" (PDF) . events.linuxfoundation.org . стр. 18 . Получено 29 мая 2015 г. .
  10. Fish, Richard (6 июля 2005 г.). "pivot_root из initramfs вызывает циклическую ссылку в дереве монтирования". Linux Kernel Bug Tracker . Получено 28 февраля 2009 г.
  11. ^ Гарзик, Джефф (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 (WIM) из официального центра загрузки Microsoft". Microsoft.com . Microsoft.

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