Электронный диск (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)
, а файловая система перемонтируется в режиме чтения-записи.