Почему initramfs монтирует корневую файловую систему только для чтения

12

В чем причина монтирования корневой файловой системы roв initramfs (и в initrd).

Например, руководство Gentoo initramfs монтирует корневую файловую систему с помощью:

mount -o ro /dev/sda1 /mnt/root

Почему не следующее?

mount -o rw /dev/sda1 /mnt/root

Я вижу, что, вероятно, есть веская причина (и, вероятно, она включает в себя switchroot), но, похоже, она нигде не документирована.

Portablejim
источник

Ответы:

19

Электронный диск (Initrd) обычно представляет собой урезанную версию корневой файловой системы , содержащей только то , что необходимо , чтобы смонтировать действительную корневую файловую систему и руку от загрузки к нему.

Initrd существует потому, что в современных системах загрузчик нельзя сделать достаточно умным, чтобы надежно найти корневую файловую систему. Для такой маленькой программы, как загрузчик, слишком много возможностей. Рассмотрим корень NFS, нестандартные карты RAID и т. Д. Загрузчик должен выполнять свою работу, используя только BIOS плюс любой код, который можно втиснуть в загрузочный сектор.

Initrd хранится где-то, что может найти загрузчик , и он достаточно мал, чтобы дополнительный бит занимаемого места обычно никого не беспокоил. (В небольших встроенных системах обычно нет «реального» корня, только initrd.)

Initrd драгоценен: его содержимое должно быть сохранено при любых условиях, потому что, если initrd не работает, система не может загрузиться. Один дизайн, который его разработчики сделали, чтобы убедиться, что это заставляет загрузчик загружать initrd только для чтения. Есть и другие принципы, которые работают в этом направлении, например, в случае небольших систем, где нет «реального» корня, вы все равно монтируете отдельно /tmp, /var/cacheи такие для хранения вещей. Изменение initrd выполняется очень редко, а затем должно быть сделано очень осторожно.

Возвращаясь к нормальному случаю , когда есть это реальная корневая файловая система, она изначально установлена только для чтения , так как Initrd было. Затем он остается доступным только для чтения как можно дольше по тем же причинам. Любая запись в настоящий корень, которая должна быть выполнена, откладывается до тех пор, пока система не загрузится, по предпочтению или, по крайней мере, до поздней стадии процесса загрузки, когда это предпочтение не может быть удовлетворено.

Самое важное, что происходит на этом этапе только для чтения, - это проверка корневой файловой системы на правильность ее размонтирования. Это то, что загрузчик, безусловно, мог бы сделать вместо того, чтобы оставить его initrd, но что тогда произойдет, если корневая файловая система не была размонтирована без ошибок? Затем он должен позвонить, fsckчтобы проверить и, возможно, исправить это. Итак, где же initrdвзять fsck, если бы он отвечал за этот шаг, вместо того, чтобы ждать, пока не перейдёт передача к «настоящему» корню? Вы могли бы сказать, что вам нужно скопировать fsckв него initrdпри создании, но теперь он больше. И вдобавок ко всему, что fsck вы будете копировать? Системы Linux регулярно используют дюжину различных файловых систем. Вы копируете только тот, который нужен для реального корня в то времяinitrdсоздано? Вы увеличиваете размер initrd, копируя в него все доступные fsck.fooпрограммы, в случае, если корневая файловая система впоследствии будет перенесена на другой тип файловой системы, и кто-то забудет перестроить initrd?

Архитекторы загрузочной системы Linux мудро решили не обременять initrd этими проблемами. Они делегировали проверку реальной корневой файловой системы настоящей корневой файловой системе, поскольку она находится в лучшем положении, чем initrd.

Как только процесс загрузки продвинулся достаточно далеко, чтобы это было безопасно сделать, initrd выгружается из-под реального корня pivot_root(8), а файловая система перемонтируется в режиме чтения-записи.

Уоррен Янг
источник
4
Initramfs не монтируется только для чтения; ядро распаковывает его в tmpfs для чтения / записи, который монтируется как /. Также pivot_root () используется в устаревшем теперь initrd, но не в initramfs, который большинство систем использует в наши дни (даже если файл по-прежнему называется initrd). С помощью initrd pivot_root имел место перед execing / sbin / init, который перешел к fsck и перемонтировал r / w. С помощью initramfs он просто удаляет все файлы в initramfs, а затем выполняет поиск в реальном корне и execs / sbin / init.
Псуси
0

Потому что во время загрузки корневая файловая система всегда изначально монтируется только для чтения. По завершении различных самотестирований корневая файловая система перемонтируется в режим чтения / записи и начинает монтировать другие файловые системы.

Shadur
источник
0

Одна из причин, по которой я могу думать, - это предотвратить коррупцию. Например, вы можете смонтировать файловую систему ext4 как ext2 (или наоборот), и это безопасно в ro-режиме, но может вызвать несовместимые изменения формата, если смонтировано rw из initram.

Да, и есть еще одна причина: initramfs, вероятно, не имеет fsck, но вам может потребоваться проверить файловую систему перед монтированием rw.

RVS
источник