首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Linux内核支持"umount /"?

为什么Linux内核支持"umount /"?
EN

Unix & Linux用户
提问于 2018-09-03 09:51:14
回答 1查看 584关注 0票数 1

为什么Linux支持这个:

代码语言:javascript
复制
umount /

为什么有人会这样写,而不是这样写:

代码语言:javascript
复制
mount / -oremount,ro

我在这里查看内核代码:

代码语言:javascript
复制
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

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-09-03 09:51:14

Luciano Andress Martini指出:

当我第一次在linux中的文件系统中遇到问题时,我收到了fsck的一条消息,比如"/dev/hda2 2是挂载读写“。在那个时代(1999年),我不明白这意味着什么。我11岁。我脑海中唯一想到的是:umount /,它可以工作(当它重新挂载只读时)。

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

换句话说,如果您甚至不知道有一个命令可以重新装入只读的文件系统,您可以尝试相同的命令,就好像您需要fsck (修复) /dev/fd0/home文件系统一样。特殊情况允许这样做,即使fsck命令位于您显然卸载的文件系统上:-)。当您试图修复损坏的系统时,Linux可以帮助您这样做,这是很好的。

这种特殊情况还有另外一种用法:umount -a,用于旧的关机脚本。这被定义为简单地以反向顺序卸载所有文件系统,最后使用根文件系统完成。它确保所有文件系统在磁盘上处于一致状态,因此它们在下一次引导时不需要fsck。Linux内核不会自动关闭任何文件系统;您需要一些关闭程序或"init系统“来实现这一点。

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

特殊情况未在umount(2)umount(8)的当前手册页中记录。因此,当前的手册页意味着umount -a将始终显示错误,但事实并非如此。我怀疑umount -a现在并没有得到广泛的应用。

在Linux的早期版本中,有一个非常类似的代码注释。

这似乎不是传统UNIX的标准。FreeBSD内核返回一个错误。我不知道为什么在这种情况下会有一个特定的错误检查,与当前正在使用的文件系统卸载的一般错误检查不同。FreeBSD等效的umount -a知道这个问题,并在卸载第一个文件系统(即根)之前停止。(代码是这里,但您需要了解C :-)中for循环和数组索引是如何工作的。

依赖于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仍然处于打开状态。

有关旧关闭脚本的示例,请参阅旧SysVinit-2.4.tar.z / SysVinit-2.4.tar.gz中的引用脚本D32

代码语言:javascript
复制
#! /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, 
#       Fred N. van Kempen, 
#

  PATH=/bin:/etc:/usr/bin
  echo Unmounting file systems.....
  umount -a
  echo Done.
票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/466535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档