Linux-Kernel

如何防止核心訪問 ext4 分區上的日誌?

  • June 22, 2022

我希望這不是一個重複的問題。我見過幾個類似的問題,答案是將相應的設備或分區列入黑名單。但就我而言,我不能這樣做(見下文)。說了這麼多:

在 debian buster x64 主機上,我創建了一個 VM(基於 QEMU)。VM 在塊設備分區上執行,比如說/dev/sdc1. 我已經在那個分區上安裝了 debian 系統,基本上是這樣的(省略了一些步驟):

#> mkfs.ext4 -j /dev/sdc1
#> mount /dev/sdc1 /mnt/target
#> debootstrap ... bullseye /mnt/target

然後我綁定掛載了必要的目錄(/dev/sys),chroot 到/mnt/target,完成了客戶作業系統的安裝並啟動了虛擬機。

VM 首次啟動時沒有問題。但是隨著每次 VM 重新啟動,VM 都會出現更多問題,我在GRUBinitramfs提示下進行修復,直到無法再修復,因為顯然ext4文件系統已損壞。

因為我最初認為我做錯了什麼,例如ext4在啟動 VM 之前忘記解除安裝分區,所以我多次從頭開始重複整個安裝。結果在每種情況下都是一樣的:幾次重新啟動後,ext4文件系統被嚴重損壞,我無法修復它。

偶然發現了這個問題的原因,但不知道如何解決這個問題。我注意到e2fsck拒絕在該分區上操作,聲稱它正在使用中,儘管它沒有安裝並且 VM 沒有執行。進一步調查表明存在核心執行緒jbd2/sdc

這意味著主機核心訪問該分區/文件系統上的日誌。當我啟動 VM 時,來賓核心當然也會這樣做。我幾乎可以肯定文件系統的損壞是由於兩個核心同時訪問文件系統,特別是日誌。

我該如何解決這個問題?

我無法將主機上的相應磁碟或相應分區列入黑名單,因為我需要將它們掛載到那里以準備或完成在 chroot 中安裝來賓作業系統。另一方面,似乎不可能在 VM 啟動時告訴主機核心釋放日誌。

ext4在過去的幾年裡,我安裝了很多虛擬機,完全相同的方式,但是在創建他們的文件系統時沒有打開日誌。因此,我對這些虛擬機沒有這個問題。

編輯 1

如果相關,在掛載分區並 chroot 到其中以完成來賓作業系統安裝時,我使用以下命令:

cd /mnt
mkdir target

mount /dev/sdc1 target

mount --rbind /dev target/dev
mount --make-rslave target/dev
mount --rbind /proc target/proc
mount --make-rslave target/proc
mount --rbind /sys target/sys
mount --make-rslave target/sys

LANG=C.UTF-8 chroot target /bin/bash --login

解除安裝時,我只是這樣做

umount -R target

umount命令不報告任何錯誤。

通過傳遞-o norecoverymount,您可以在完全不使用日誌的情況下掛載文件系統。

mount的手冊頁,ext3 部分:

norecovery/空載

不要在安裝時載入日誌。請注意,如果文件系統沒有完全解除安裝,跳過日誌重播將導致文件系統包含可能導致任何數量問題的不一致。

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