Почему 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.

  • Команда для установки заголовков Linux не выполняется
  • Загрузка Centos 7 с пользовательской проблемой ядра
  • Только загрузка GRUB автоматически
  • Маркировка TSC неустойчивая из-за ошибки check_tsc_sync_source
  • Как осуществляется перенаправление?
  • RAMDISK неполная запись ошибка ядро ​​паника
  • Идентификация дисков во время установки RHEL / CentOS / Fedora
  • Ошибка загрузки U-Boot
  • * ОШИБКА * время ожидания ожидания включения панели
  • Учитывая vmlinuz и initrd.gz, как узнать, откуда ядро ​​загружается / (корневая) файловая система?
  • lsof: измерять скорость ввода-вывода сокета fd
  • Interesting Posts

    Что означает «$ {x %% *}» в sh?

    Какую проблему я вызвал eth1, сбросив мою машину ubuntu?

    как установить псевдоним команды в bash, который содержит как одиночные, так и двойные qoutes

    Компиляция Riofs не может скомпилироваться с поддержкой -force-head-запросов

    Проблемы с производительностью Linux Mint на qemu-kvm – возможно, запущены в текстовом режиме и используют удаленную графику для администрирования?

    Как я могу узнать, какую беспроводную карту у меня есть на выходе lspci

    изменить данные для входа в систему пользователя (gdm)

    npm установить couchbase на компьютере с отказом Linux

    Преобразование файла с целыми числами, написанными в ascii, в двоичный файл целых чисел

    Доля подключения к Интернету с ноутбука Debian на рабочий стол FreeBSD

    Переполнение FIFO FlexCan

    Как исправить команду unix `join`, вставив ^ M между столбцами соединения? -unix

    Служба mariadb не запускается после загрузки, CentOS 7

    отсутствующие кусочки определенных букв в тексте в Linux Mint

    Добавление SSD к существующей файловой системе BTRFS на жестком диске

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