stringtranslate.com

Начальный виртуальный диск

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

Обоснование

Многие дистрибутивы 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 ). Для дополнительной экономии места оболочка, утилиты и поддерживающие их библиотеки обычно компилируются с включенной оптимизацией пространства (например, с флагом «-Os» gcc ) и компонуются с 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 для модулей ядра во время загрузки, а для этой задачи в Linux требуется initrd.

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

Рекомендации

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

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