Почему kernel ​​Linux поддерживает «umount /»?

Почему Linux поддерживает это:

umount / 

Зачем кому-то писать это вместо этого:

 mount / -oremount,ro 

Я смотрю на код ядра здесь:

 if (&mnt->mnt == current->fs->root.mnt && !(flags & MNT_DETACH)) { /* * Special case for "unmounting" root ... * we just try to remount it readonly. */ if (!ns_capable(sb->s_user_ns, CAP_SYS_ADMIN)) return -EPERM; down_write(&sb->s_umount); if (!sb_rdonly(sb)) retval = do_remount_sb(sb, SB_RDONLY, NULL, 0); 

https://elixir.bootlin.com/linux/v4.18/source/fs/namespace.c#L1612

One Solution collect form web for “Почему kernel ​​Linux поддерживает «umount /»?”

Luciano Andress Martini отмечает:

В первый раз, когда у меня возникла проблема в файловой системе Linux, я получил сообщение от fsck вроде “/ dev / hda2 смонтирован для чтения-записи”. В ту эпоху (1999) я не понимал, что это значит. Мне 11 лет. Единственное, что мне пришло в голову, было: umount / , и оно работает (так как перемонтировано только для чтения).

(Для этого необходимо, чтобы не было файлов, открытых для записи. Например, это может работать, когда система работает в однопользовательском режиме. Обратите внимание, что после запуска fsck для восстановления файловой системы, которая по-прежнему монтируется в режиме только для чтения, вы всегда должны перезагрузиться по соображениям безопасности).

Другими словами, если вы даже не знаете, что есть команда для перемонтирования файловой системы только для чтения, вы можете попробовать те же команды, что и для fsck (repair) /dev/fd0 или вашей /home файловой системы. Особый случай позволяет это работать, даже если команда fsck находится в файловой системе, которую вы, очевидно, размонтировали :-). Приятно, что Linux может быть таким полезным, когда вы пытаетесь восстановить поврежденную систему.

Существует еще одно использование этого особого случая: umount -a , используемый в старых сценариях завершения работы. Это определено для простого размонтирования всех файловых систем в обратном порядке, заканчивая корневой файловой системой. Это гарантирует, что все файловые системы находятся в согласованном состоянии на диске, поэтому они не требуют fsck при следующей загрузке. Ядро Linux не закрывает файловую систему автоматически; у вас должна быть какая-то программа завершения работы или «система инициализации», которая делает это.

Я не уверен, почему этот особый случай находится в ядре, а не в команде umount . Одной из причин может быть то, что старые ядра приняли имя подключенного устройства вместо каталога, в котором смонтирована файловая система. Возможно, из-за этого было проще или надежнее поместить этот код в kernel.

Особый случай не описан в текущих страницах руководства для umount(2) или umount(8) . Таким образом, текущая страница руководства подразумевает, что umount -a всегда будет отображать ошибку, но это не так. Я подозреваю, что в настоящее время umount -a не очень широко используется.

Существует очень похожий комментарий к коду в ранних версиях Linux, включая 0.99.10 (1993) .

Это не является стандартом для традиционной UNIX. Ядро FreeBSD возвращает ошибку . Я не уверен, почему есть конкретная проверка ошибок для этого случая, отдельная от общей проверки ошибок для размонтирования файловой системы, которая используется в настоящее время. Эквивалент umount -a FreeBSD знает об этой проблеме и останавливается перед размонтированием первой файловой системы, то есть корневой. (Код здесь , но вам нужно понять, как циклы и индексы массивов работают в C :-).

Старые сценарии, которые используют umount -a , отличаются от более свежих сценариев для SysVinit, которые, например, все еще доступны в Debian /etc/init.d/umount_root явно перемонтирует / как только для чтения. Остальные монтирования обрабатываются индивидуально, с помощью /etc/init.d/umountfs и /etc/init.d/umountnfs.sh .

umount -a не идеален в современных системах. Проще оставить файловую систему /proc смонтированной, чтобы можно было использовать /proc/mounts . И /dev обычно представляет собой отдельную смонтированную файловую систему, которая покажет ошибку размонтирования, поскольку /dev/console все еще открыта

Пример старого сценария выключения приведен в справочном сценарии etc/rc.d/rc.0 в старом SysVinit-2.4.tar.z / SysVinit-2.4.tar.gz .

 #! /bin/sh # # brc This file is executed by init(8) when the system is being # shutdown (ie set to run at level 0). It usually takes # care of un-mounting al unneeded file systems. # # Version: @(#)/etc/brc 2.01 02/17/93 # # Authors: Miquel van Smoorenburg,  # Fred N. van Kempen,  # PATH=/bin:/etc:/usr/bin echo Unmounting file systems..... umount -a echo Done. и #! /bin/sh # # brc This file is executed by init(8) when the system is being # shutdown (ie set to run at level 0). It usually takes # care of un-mounting al unneeded file systems. # # Version: @(#)/etc/brc 2.01 02/17/93 # # Authors: Miquel van Smoorenburg,  # Fred N. van Kempen,  # PATH=/bin:/etc:/usr/bin echo Unmounting file systems..... umount -a echo Done. 
Interesting Posts

генерировать согласованный уникальный идентификатор машины

Регулярное выражение ERE для разделения () между разделителем и конечным словом

Пытался разрастить мой массив raid6 с новым диском, получил «Не удалось восстановить критический раздел»

Почему разрешение отклонено для запуска npm с использованием node-dev?

Xorg несколько позиций экрана

Файл анализа с Awk только в том случае, если первая строка соответствует шаблону

Двойная загрузка Fedora 23 и Windows 10

Wifi внезапно не работает на thinkpad, как в Manjaro, так и в parrot linux

sudo и sssd не работают с группами пользователей

Как получить идентификатор очень короткого дочернего процесса, если родитель известен?

Отображать проблемы в KDE на ноутбуке при запуске (это происходит, когда я подключаю и отсоединяю адаптер переменного тока)

Как часто нарушаются пользовательские репозитории?

Подавлять конкретные экземпляры ключа поиска в grep

Порядок изменения Xfce в Alt-tab

Может ли файл быть извлечен его inode?

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