Насколько я понимаю, 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?