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

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

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

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

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

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

решение1

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

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

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

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

решение2

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

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

решение3

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

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

initramfs — это всего лишь временная корневая файловая система, используемая во время процесса загрузки, пока не будет смонтирована «настоящая» корневая файловая система. Так почему же initramfs должна находиться в /etc/fstab?

Связанный контент