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なぜこの特別なケースがコマンドではなくカーネルにあるのかわかりません。 1つの理由は、古いカーネルがファイルシステムがマウントされたディレクトリではなくマウントされたデバイスの名前を受け入れるためです。おそらく、これにより、このコードをカーネルに配置する方が簡単で信頼性が高いように見えます。

umount(2)特別な場合は、またはの現在のマニュアルページに文書化されていませんumount(8)。したがって、現在のマニュアルページにはumount -aエラーが常に表示されることが示唆されていますが、実際にはそうではありません。umount -a今はあまり広く使われていないようです。

以前のバージョンのLinuxにも非常に似たコードコメントがありました。0.99.10(1993)を含む

これは従来のUNIX標準ではないようです。 FreeBSDカーネル代わりにエラーを返します。。この場合、現在使用中のファイルシステムをアンマウントするための一般的なエラーチェックとは別に、特定のエラーチェックがある理由はわかりません。 FreeBSDに対応するプログラムは、umount -aこの問題を認識し、最初のファイルシステム(ルートなど)をアンマウントする前に停止します。 (コードはここしかし、Cでループと配列のインデックス付けがどのように機能するかを理解する必要がありますfor:-)。

たとえば、依存する古いスクリプトは、umount -aDebianでまだ利用可能なSysVinitの最新のスクリプトとは対照的です。明示的に読み取り/etc/init.d/umount_root専用で再マウントします。/残りのマウントは/etc/init.d/umountfsおよびで別々に処理されます/etc/init.d/umountnfs.sh

umount -a最新システムでは理想的ではありません。引き続き使用できる/procように、ファイルシステムをマウントされたままにする方が/proc/mounts簡単です。/dev通常、別々にマウントされたファイルシステムもありますが、これは問題になる可能性があります。

前の終了スクリプトの例については、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 (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.

おすすめ記事