为什么Linux内核支持“umount /”?

为什么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

答案1

Luciano Andress Martini指出:

第一次我在 Linux 中的文件系统中遇到问题时,我收到了一条fsck类似“/dev/hda2 已安装为可读写”的消息。在那个时代(1999年),我不明白这意味着什么。我今年 11 岁,我脑子里唯一想到的是:umount /,它有效(因为它重新安装为只读)。

(这要求没有打开用于写入的文件。例如,当系统以单用户模式运行时它可以工作。请注意,运行 fsck 后,要修复仍以只读模式挂载的文件系统,必须始终重新启动出于安全原因)。

换句话说,如果您甚至不知道有一个以只读方式重新挂载文件系统的命令,您可以尝试与需要 fsck(修复)/dev/fd0/home文件系统相同的命令。即使该fsck命令位于您显然已卸载的文件系统上,特殊情况也允许此操作:-)。当您尝试修复损坏的系统时,Linux 可以提供这样的帮助,这真是太好了。

这种特殊情况还有另一种用途:umount -a在旧的关闭脚本中使用。这被定义为简单地以相反的顺序卸载所有文件系统,最后是根文件系统。它确保所有文件系统在磁盘上处于一致状态,因此fsck下次启动时不需要。 Linux 内核是这样的不是自动关闭任何文件系统;您需要有一些关闭程序或“初始化系统”来执行此操作。

我不确定为什么这种特殊情况是在内核中,而不是在umount命令中。原因之一可能是旧内核接受已安装设备的名称,而不是文件系统安装的目录。也许这使得将此代码放入内核中看起来更简单或更可靠。

umount(2)或的当前手册页中未记录特殊情况umount(8)。因此当前的手册页暗示umount -a将始终显示错误,但事实并非如此。我怀疑umount -a现在它的使用还不是很广泛。

Linux早期版本中有一个非常相似的代码注释包括 0.99.10 (1993)

这似乎不是传统 UNIX 的标准。 FreeBSD 内核相反返回一个错误。我不确定为什么在这种情况下有一个特定的错误检查,与卸载当前正在使用的文件系统的一般错误检查分开。 FreeBSD 的等效版本umount -a意识到了这个问题,并在卸载第一个文件系统(即根)之前停止。 (代码是这里,但您需要了解for循环和数组索引在 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通常也是一个单独安装的文件系统,这可能是一个问题。

有关旧关闭脚本的示例,请参阅etc/rc.d/rc.0SysVinit-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 (i.e. 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, <[email protected]>
#       Fred N. van Kempen, <[email protected]>
#

  PATH=/bin:/etc:/usr/bin
  echo Unmounting file systems.....
  umount -a
  echo Done.

相关内容