Как initramfs монтирует корневую файловую систему?

Пришлось внести несколько изменений в ответ @xn. для Mac. Это сработало для меня:

  1. brew install gawk
  2. 7z rn windows.zip $(7z l windows.zip | grep '\\' | gawk '{ print $6, gensub(/\\/, "/", "g", $6); }' | paste -s -)
1
10.10.2019, 14:45
1 ответ

После этого initrd/initramfs (извлекается и монтируется только историческая разница ), запускается скрипт /init. В основном он только монтирует настоящий корень с помощью модулей из initramfs.

И затем он должен повернуть/переключить корень на этот новый раздел, что возможно только при pid 1.

Вот минимальный скрипт /init:

mkdir /newroot
mount /dev/sda2 /newroot
mount --move /sys /newroot
mount --move /dev /newroot
mount --move /proc /newroot

switch_root /newroot /bin/bash

(или /sbin/init для нормального продолжения)

Дело в том, что ядро ​​не может смонтировать /dev/sda2 без встроенных необходимых модулей. Наличие модулей на sda2 не помогает :egg -и -проблеме hen.

Итак, ядро ​​получает cpio-архив с корневой файловой системой, содержащей модули и скрипты. Ядро просто передает /init и завершает свой собственный запуск.


Эта ссылка на gentoo начинается с:

initramfs is a root filesystem that is embedded into the kernel...

Что это должно означать?


Это минимальная командная строка ядра:

vmlinuz root=/dev/sdaX

приказывает загрузчику загрузить ядро ​​«vmlinuz» и приказывает ядру смонтировать /dev/sdaX.

И это:

vmlinuz initrd=initramfs.img root=/dev/sdaX

заставляет загрузчик также загружать initrd, который ядро ​​​​обнаружит и смонтирует как root, и сообщает (сценарию по умолчанию )/init, чтобы повернуть/переключиться на /dev/sdaX (, а затем запустить по умолчанию /sbin/init ).

3
27.01.2020, 23:22

Теги

Похожие вопросы