我希望这不是一个重复的问题。我见过几个类似的问题,答案是将相应的设备或分区列入黑名单。但就我而言,我不能这样做(见下文)。说了这么多:
在 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 都会出现更多问题,我在GRUB
和initramfs
提示下进行修复,直到无法再修复,因为显然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 norecovery
到mount
,您可以在完全不使用日志的情况下挂载文件系统。mount的手册页,ext3 部分: