ファイルシステムのマウントとアンマウント

ファイルシステムのマウント処理は、vfs do_mount関数が行う。この関数は、各個別ファイルシステムが用意しているread_superオペレーションを利用してスーパブロックを読み込む。それが成功すると、マウントテーブルに登録する(add_vfsmnt関数)

    do_mount(デバイス名、マウントポイント, ファイルシステムタイプ, ...)
                 :
        マウントするデバイスのスーパブロックを読み出す(read_super関数)
             (ファイルシステムタイプ毎に用意されているread_superオペレーションを実行)
                 :
        マウントテーブルに登録(add_vfsmnt関数)

    get_sb_single

ext2ファイルシステムでは、read_superオペレーションは、下記ext2_read_super関数である。

    ext2_read_super()
        バッファにスーパブロックを読み出す(bread関数)
        メモリ上のスーパブロックと上記バッファをリンク
        ブロックディスクリプタテーブルを全て読み込む(bread関数)
        読み込んだブロックディスクリプタテーブルをメモリ上のスーパブロックにリンク
        iノードとブロックのビットマップ登録域の初期化
        スーパブロックにオペレーション(ext2_sops)を登録
        スーパブロックを使える状態にする(ext2_setup_super関数)

    ext2_setup_super()
        if (前回umountせずにシステムが落ちた ||
             ファイルシステムにエラーが発生している ||
             マウント回数が20回を超えた      ||
             最後にfsckしてから6ヶ月以上経っている)
                "e2fsckコマンドを実行せよ" とメッセージ出力

        スーパブロックのステータスフラグからVALIDビットを落す。
        ◇スーパブロックの遅延書き込み要求(mark_buffer_dirty)

ファイルシステムのマウント解除処理は、vfs do_umount関数が行う。この処理では、スーパブロックに登録されているオペレーションを続けて三つ呼び出す。マウントテーブルからの登録抹消は、do_umount関数呼び出し側で行う。

rootファイルシステムのアンマウントに限り、リードオンリーで再マウントする(do_remount_sb関数)ようになっている。

    do_umount(vfsmount構造体、 ...)
        if(rootファイルシステムなら) {
              リードオンリーで再マウントする(do_remount_sb関数)
              return;
        }
        スーパブロックのumount_beginオペレーション実行
        このファイルシステム上のキャッシュをディスクに書き込む(fsync_dev関数)
        マウントの解除(remove_vfsmnt関数)
        スープブロック情報をディスクに書き戻す(kill_super関数)
             (スーパブロックのwrite_superオペレーション,
              スーパブロックのput_superオペレーション実行)
        このファイルシステム用のiノードの無効化(invalidate_inodes関数)

ext2ファイルシステムでは、umount_beginオペレーションはNULL、write_superオペレーションは、ext2_write_super関数、put_superオペレーションは、ext2_put_super関数が登録されている。

    ext2_write_super(スーパブロック)
        スーパブロックの最終書き込み時間の更新
        ◇スーパブロックが読み込まれているバッファの遅延書き込み要求(ext2_commit_super関数)
        スーパブロックのDirtyビットのクリア

    ext2_put_super(スーパブロック)
        スーパブロックのステータスフラグにVALIDを立てる
        ◇スーパブロックの遅延書き込み要求(mark_buffer_dirty関数)
        ブロックディスクリプタテーブルを読み込んでいたバッファ域を解放
        iノードとブロックのビットマップを読み込んでいた領域を解放
        スーパブロックを読み込んでいたバッファ域を解放

問題点など

  1. SYNCモードのマウントの時でも、マウント処理/アンマウント処理時の スーパブロックの更新が遅延書き込みになっている。 スーパブロックが書き込まれる前に、iノードやフリービットマップ の方が先に更新され、その直後にシステムクラッシュすると、 ディスク上のスーパブロックにはVALIDビットが立っているため、 fsck(e2fsck)は正常なファイルシステムと認識し、ファイルシステムの 修復を行わない。
  2. 20回以上マウントしたり、fsckせずに6ヶ月以上運用を続けていると、 fsckを促すメッセージを出す作りになっている。

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1