私は、起動時に実行されるすべてのものを読んでいて、rootfsをマウントした後、/sbin/fsck.ext4
が実行され、その後systemdが実行されます。 fsck
がどこで、どのように実行されているのか疑問に思っていました。カーネルソースコードで検索していて、それが見つからず、initスクリプトの一部ではなかったためです。では、何がfsck
を実行するのでしょうか。私が使用しているディストリビューションはミントです。
編集:この画像では、ルートファイルシステムをマウントした後にfsckが実行されることが示されています
私は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つのオプション:
fsck
を実行しています。 Systemdはミントのinit実装であり、すでにチェックしたのでそこに存在する場合、このオプションは適用されません。/sbin/fsck.ext4
は initramfs によって設定された "初期ユーザー空間"で実行されます。これは、おそらくシステムに当てはまります。/sbin/fsck.ext4
がsystemd
の前に実行されていることに気付いたとしても、少し詳しく説明したいと思います。 Systemdは、読み取り専用でマウントされたファイルシステムでfsck
自体を完全に実行できます。 systemd-fsck @ .service のドキュメントを参照してください。このサービスは、初期のユーザースペースと冗長になるため、ミントではデフォルトで有効になっていない可能性があります。
実行中のinitramfs mintの実装はわかりませんが、例として dracut
を使用します。 (Debian、openSuseなどで使用されています) mount preperation ドキュメントに次のように記載されています。
最終的にルートファイルシステムが表示されるようになります。
- マウントされたルートファイルシステムで実行できないメンテナンスタスクが実行されます。
- ルートファイルシステムは読み取り専用でマウントされます。
- 実行を継続する必要のあるプロセス(rd.splashスクリーンヘルパーやそのコマンドFIFOなど)は、新しくマウントされたルートファイルシステムに引き上げられます。
また、メンテナンスタスクにはfsck
が含まれます。さらなる証拠として、 dracut cmdline options でfsck
をオフにする可能性があります。
rd.skipfsck
rootfsおよび/ usrの場合はfsckをスキップします。/usrを読み取り専用でマウントしていて、initシステムが再マウントする前にfsckを実行する場合は、重複を避けるためにこのオプションを使用することをお勧めします
動的(udevベース)および柔軟なinitramfsは、 systemdインフラストラクチャ を使用して実装できます。 Dracutはそのような実装であり、おそらく独自のディストリビューションを作成したいディストリビューションがあります。
別のオプションは、スクリプトベースのinitramfsです。そのような場合、busybox ash
はスクリプトシェルとして使用され、udev
をmdev
に置き換えるか、完全に静的にすることができます。 I found fsck error intmintが原因でbusybox
Shellにドロップされる人がいるため、この実装はmintに適用できます。
本当に確実に知りたい場合は、/boot
のinitramfsファイルを解凍して、そこに何があるかを確認してください。 /initramfs
の下にマウントされていることも確認できる場合があります。
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