web-dev-qa-db-ja.com

fsckはどこで実行されますか?

enter image description here 私は、起動時に実行されるすべてのものを読んでいて、rootfsをマウントした後、/sbin/fsck.ext4が実行され、その後systemdが実行されます。 fsckがどこで、どのように実行されているのか疑問に思っていました。カーネルソースコードで検索していて、それが見つからず、initスクリプトの一部ではなかったためです。では、何がfsckを実行するのでしょうか。私が使用しているディストリビューションはミントです。

編集:この画像では、ルートファイルシステムをマウントした後にfsckが実行されることが示されています

6
systolicDrake

編集2:チェックされたソース

私はubuntuを見つけました initramfs-toolssources 。ここではっきりとわかるように、Begin: "Mounting root file system"メッセージが最初に出力されますが、mount_root関数ではfsckが実際のマウントの前に実行されます。順序を示すために、関連性のないコードをいくつか省略しました。 (リンクされたソースを検査すると、スクリーンショットから他の報告されたスクリプトも見つかります)。

/init 256行

log_begin_msg "Mounting root file system"
# Always load local and nfs (since these might be needed for /etc or
# /usr, irrespective of the boot script used to mount the rootfs).
. /scripts/local
. /scripts/nfs
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mount_top
mount_premount
mountroot
log_end_msg

/scripts/local @line 244

mountroot()
{
    local_mount_root
}

/scripts/local @line 131

local_mount_root()
{
# Some code ommited
    # FIXME This has no error checking
    [ -n "${FSTYPE}" ] && modprobe ${FSTYPE}

    checkfs ${ROOT} root "${FSTYPE}"

    # FIXME This has no error checking
    # Mount root
    mount ${roflag} ${FSTYPE:+-t ${FSTYPE} }${ROOTFLAGS} ${ROOT} ${rootmnt}
    mountroot_status="$?"
    if [ "$LOOP" ]; then
        if [ "$mountroot_status" != 0 ]; then
            if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
                panic "<Error message ommited>"
            fi
        fi

        mkdir -p /Host
        mount -o move ${rootmnt} /Host
# Some code ommitted
}

元の回答、歴史的な理由により保持

2つのオプション:

  1. ルートは起動時に読み取り専用でマウントされ、init実装がfsckを実行しています。 Systemdはミントのinit実装であり、すでにチェックしたのでそこに存在する場合、このオプションは適用されません。
  2. /sbin/fsck.ext4initramfs によって設定された "初期ユーザー空間"で実行されます。これは、おそらくシステムに当てはまります。

Systemd

/sbin/fsck.ext4systemdの前に実行されていることに気付いたとしても、少し詳しく説明したいと思います。 Systemdは、読み取り専用でマウントされたファイルシステムでfsck自体を完全に実行できます。 systemd-fsck @ .service のドキュメントを参照してください。このサービスは、初期のユーザースペースと冗長になるため、ミントではデフォルトで有効になっていない可能性があります。

Initramfs

実行中のinitramfs mintの実装はわかりませんが、例として dracut を使用します。 (Debian、openSuseなどで使用されています) mount preperation ドキュメントに次のように記載されています。

最終的にルートファイルシステムが表示されるようになります。

  • マウントされたルートファイルシステムで実行できないメンテナンスタスクが実行されます。
  • ルートファイルシステムは読み取り専用でマウントされます。
  • 実行を継続する必要のあるプロセス(rd.splashスクリーンヘルパーやそのコマンドFIFOなど)は、新しくマウントされたルートファイルシステムに引き上げられます。

また、メンテナンスタスクにはfsckが含まれます。さらなる証拠として、 dracut cmdline optionsfsckをオフにする可能性があります。

rd.skipfsck

rootfsおよび/ usrの場合はfsckをスキップします。/usrを読み取り専用でマウントしていて、initシステムが再マウントする前にfsckを実行する場合は、重複を避けるためにこのオプションを使用することをお勧めします

Initramfsの実装

動的(udevベース)および柔軟なinitramfsは、 systemdインフラストラクチャ を使用して実装できます。 Dracutはそのような実装であり、おそらく独自のディストリビューションを作成したいディストリビューションがあります。

別のオプションは、スクリプトベースのinitramfsです。そのような場合、busybox ashはスクリプトシェルとして使用され、udevmdevに置き換えるか、完全に静的にすることができます。 I found fsck error intmintが原因でbusybox Shellにドロップされる人がいるため、この実装はmintに適用できます。

本当に確実に知りたい場合は、/bootのinitramfsファイルを解凍して、そこに何があるかを確認してください。 /initramfsの下にマウントされていることも確認できる場合があります。

5
Tim

systemd-fsck @ .serviceとsystemd-fsck-root.serviceは、ファイルシステムチェックを担当するサービスです。これらは、ファイルシステムチェック用に構成されているデバイスごとにインスタンス化されます。 systemd-fsck-root.serviceは、ルートファイルシステムのファイルシステムチェックを担当しますが、ルートファイルシステムがinitramfsでチェックされていない場合に限ります。 systemd-fsck @ .serviceは、他のすべてのファイルシステムとinitramfsのルートファイルシステムに使用されます。

https://www.freedesktop.org/software/systemd/man/[email protected]

あなたもこれに興味があるようです:

https://www.freedesktop.org/software/systemd/man/bootup.html

1
sourcejedi