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

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

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

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

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

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

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

3 Solutions collect form web for “Почему initramfs монтирует корневую файловую систему только для чтения”

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

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

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

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

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

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

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

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

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

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

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

  • Какой файл в ядре определяет fork (), vfork () ... для использования системного вызова sys_clone ()
  • вставить модуль в ядро
  • Linux Slackware (Broken - паника ядра)
  • Пользовательское ядро ​​для void linux, не удалось загрузить, nvme drive
  • sysfs альтернатива / proc / acpi / button / lid / LID / state
  • почему .config-файл не появляется в / boot после установки ядра 4.8.8
  • Какой способ Debian сохранить изменение конфигурации ядра через обновления?
  • Сведения о реализации ASLR в ядре Linux
  • Обновление AT91SAM9260EK с 2.6 до 4.4, серийный порт не работает
  • Добавление латентности при доступе к определенным веб-сайтам под Linux
  • Просмотр системных вызовов / активности ядра для ввода-вывода из работающего процесса
  • Interesting Posts

    Получить значения раздела файла

    Ошибка: обновление sudo apt-get

    Нужно ли настраивать ZFS (используя FreeBSD 10) для файлов на иностранном языке (например, имена файлов на японском / тайском языке / etc)?

    Не удалось загрузить виртуальную машину: Ошибка 13: Неверный или неподдерживаемый исполняемый формат

    Звук не работает в учетной записи пользователя, но выполняется в корне

    Проверьте, какие ключи ssh приняты на сервере

    Как проверить, согласны ли `libc`,` font` и `terminal` с версией Unicode?

    Как перечислять файлы с именем XXXmmyy.dat в естественном хронологическом порядке?

    grep определенная строка из вывода

    Виртуальный eth-адаптер в конфигурации сети

    nginx регистрирует неправильный пароль для входа в систему

    Удаление дисков с большим количеством крошечных файлов на Lustre

    Щелкните правой кнопкой мыши, чтобы скопировать имя файла (или имя каталога)

    bcache не работает, как ожидалось, с помощью ramdisk в качестве устройства кэширования

    Есть ли графический редактор меню для LXQT или LXDE?

    Linux и Unix - лучшая ОС в мире.