Использует ли initramfs / etc / fstab?

20

Насколько я понимаю, initramfs отвечает за загрузку «настоящей» корневой файловой системы.

Теперь есть два места, где мы определяем этот корень. Сначала мы помещаем запись в /etc/fstab. Во-вторых, мы помещаем устройство в команды загрузки ядра, например root=/dev/sda1.

Какой из них использует initramfs, чтобы определить, где находится корневая файловая система? Если он использует корневой параметр ядра, почему у нас есть запись в /etc/fstab? Второй вариант (он читает /etc/fstab) довольно нелогичен, поскольку /etc/fstabфайл находится на самом корневом устройстве, которое initramfs пытается смонтировать в первую очередь.

Очень запутанные вещи.

Ахмед Гоним
источник

Ответы:

14

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

Без initramfs ядро ​​обычно монтирует раздел как доступный только для чтения, а затем передает управление /sbin/init. Initramfs просто берет на себя эту задачу из ядра, обычно когда корневая файловая система не является нормальным разделом (mdraid, lvm, зашифрованный и т. Д.).

Теперь, кроме фона для initramfs, вы находитесь /etc/fstabв корневой файловой системе. Таким образом, когда запускается initramfs, этой корневой файловой системы нет, и поэтому он не может добраться до fstab (проблема с курицей и яйцом).
Вместо этого мы должны передать параметр в аргументы загрузки ядра для использования initramfs. Обычно это что-то вроде root=/dev/sdX. Однако он также может что-то сделать, чтобы автоматически выяснить, где находится ваше корневое устройство, и поэтому параметров вообще нет. Так как это просто программное обеспечение (обычно скрипт), оно может действительно делать все, что захочет для монтирования корневого устройства.

Теперь, как указывалось ранее, ядро ​​будет монтировать настоящий root только для чтения. Initramfs должен делать именно это. После завершения initramfs система продолжает загрузку точно так же, как если бы не было initramfs, и /sbin/initзапускается. Затем этот init запускает все ваши обычные загрузочные сценарии, и задача одного из этих сценариев - читать /etc/fstab, переключать root на чтение-запись и монтировать все остальные ваши файловые системы.

Патрик
источник
Итак, вы говорите, что / sbin / init внутри настоящей корневой файловой системы снова перемонтирует root, используя параметры в / etc / fstab?
Ахмед Гоним
3
Да. Обычно с помощью простого mount -o remount,rw /. Это не изменит подключенное устройство, но изменит параметры на монтировании. Со страницы руководства:After this call mount reads fstab (or mtab) and merges these options with options from command line
Патрик,
Как мы передаем параметр в параметры загрузки ядра, если мы используем командную строку grub2? Моя система по какой-то причине не показывает меню grub.
интуитивно
@intuited Вы должны задать новый вопрос. Комментарии не место для Q & A.
Патрик
lsinitramfs /boot/initrd* | fgrep fstabи удивительно, initramfs действительно содержит файл fstab, по крайней мере для меня.
youfu
2

Может или не может. Поскольку Initramfs могут быть созданы различными способами (ядро просто загружает его и запускает, /initчто угодно). Тем не менее, использование параметра является более распространенным, поскольку он обеспечивает большую гибкость - то есть, если что-то меняется, вы можете просто отредактировать загрузочную запись и все будет работать. Со встроенным жестко закодированным рутом это не обязательно будет возможно.

Запись fstab все еще может потребоваться в любом случае, так как она также определяет другие вещи, такие как параметры монтирования (некоторые из которых могут быть изменены на ходу) и fsckпорядок. Кроме того, даже если бы это было полностью излишним (и если Initramfs справится с этим, оно может работать без него), я бы все равно оставил запись там просто ради полноты.

frostschutz
источник
1

Вы можете рассматривать / etc / fstab как статическое монтирование, это только способ выполнения такой задачи, но не единственный, на самом деле, запуск команды mount, и вы видите множество файловых систем, отсутствующих в fstab. Служба такого udev и udisk управляет большей частью «автомонтирования», игнорируя файл / etc / fstab ...

Так что, если что-то монтируется или не часто, это не имеет ничего общего с / etc / fstab.

initramfs - это только временные rootfs, используемые во время процесса загрузки до тех пор, пока не смонтированы «истинные» rootfs, так почему же initramfs должен быть в / etc / fstab?

sebelk
источник