Kernel

fsck 在哪裡執行?

  • June 29, 2018

在此處輸入圖像描述我正在閱讀啟動期間執行的所有內容,並看到在安裝 rootfs/sbin/fsck.ext4後執行,然後執行 systemd。我想知道在哪里或如何fsck執行,因為我在核心原始碼中搜尋它並且找不到它並且它不是初始化腳本的一部分。那麼執行fsck什麼?我使用的發行版是薄荷。

編輯:在此圖像中,顯示 fsck 在安裝根文件系統後執行

編輯2:檢查來源

我找到了 ubuntu initramfs-tools sources。在這裡你可以清楚地看到,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@第 244 行

mountroot()
{
   local_mount_root
}

/scripts/local@第 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
}

原始答案,因歷史原因保留

兩種選擇:

  1. Root 在引導期間以只讀方式掛載,並且init實現正在執行fsckSystemd是 mint 上的init實現,因為您已經檢查了它是否存在,所以此選項不適用。
  2. /sbin/fsck.ext4在*“早期使用者空間”*中執行,由initramfs設置。這很可能是您系統中的情況。

系統

即使您注意到/sbin/fsck.ext4之前執行過systemd,我也想詳細說明一下。Systemd完全有能力fsck在只讀掛載的文件系統上執行自己。請參閱systemd-fsck@.service文件。很可能這個服務在 mint 中預設沒有啟用,因為它與早期的使用者空間服務是多餘的。

初始化程序

我不知道 initramfs mint 的哪個實現正在執行,但我將dracut用作範例。(用於 Debian、openSuse 等)它在其掛載準備文件中聲明了以下內容:

當根文件系統最終變得可見時:

  • 任何無法在已掛載的根文件系統上執行的維護任務都已完成。
  • 根文件系統以只讀方式掛載。
  • 任何必須繼續執行的程序(例如 rd.splash 螢幕幫助程序及其命令 FIFO)都被提升到新安裝的根文件系統中。

並且維護任務包括fsck。進一步的證據是,dracut cmdline 選項有可能關閉fsck

rd.skipfsck

為 rootfs 和 /usr 跳過 fsck。如果您以只讀方式掛載 /usr 並且 init 系統在重新掛載之前執行 fsck,您可能希望使用此選項來避免重複

initramfs 的實現

可以使用systemd 基礎架構實現動態(基於 udev)和靈活的 initramfs 。Dracut 就是這樣一個實現,可能有發行版想要編寫自己的。

另一種選擇是基於腳本的 initramfs。在這種情況下busybox ash,它被用作腳本外殼,甚至可能替換udevmdev,或者可能只是完全靜態的。我發現有些人由於一些 fsck 錯誤 int mint 被丟棄到busyboxshell,所以這個實現可以適用於 mint。

如果您真的想確定,請嘗試將 initramfs 文件解壓縮/boot並查看其中的內容。也有可能看到它安裝在/initramfs.

引用自:https://unix.stackexchange.com/questions/452321