几年前,我用更大的硬盘升级了我的上网本。我想保留旧硬盘上的内容,以防万一我还想删除它。
所以我将旧硬盘复制到新硬盘上的文件中:
dd if=/dev/sdd5 of=~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw
我编写/复制了一个脚本,用于将lvms作为只读文件系统安装在该分区上:
losetup -r /dev/loop1 ~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw
pvscan
vgscan
vgchange -a y fw
cd /mnt/fw
for i in root tmp usr var home
do
mount -o ro /dev/fw/$i $i
done
现在这工作了很长一段时间,现在突然在vgchange -a y fw
命令中失败了:
# vgchange -a y fw
Error writing device /dev/loop1 at 4096 length 512.
bcache_invalidate: block (4, 0) still dirty
Failed to write mda header to /dev/loop1 fd -1
Failed to update old PV extension headers in VG fw.
Volume group "fw" not found
Cannot process volume group fw
我猜想,自从我创建了一个只读环回设备后,vgchange 就因为无法写入而感到不高兴。我认为上次使用磁盘时文件系统是脏的,但我想忽略它。
我当前的系统当前正在运行:
Linux fw 4.19.0-8-686-pae #1 SMP Debian 4.19.98-1 (2020-01-26) i686 GNU/Linux
$ vgchange --version
vgchange --version
LVM version: 2.03.02(2) (2018-12-18)
Library version: 1.02.155 (2018-12-18)
Driver version: 4.39.0
Configuration: ./configure --build=i686-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir=${prefix}/lib/i386-linux-gnu --libexecdir=${prefix}/lib/i386-linux-gnu --runstatedir=/run --disable-maintainer-mode --disable-dependency-tracking --exec-prefix= --bindir=/bin --libdir=/lib/i386-linux-gnu --sbindir=/sbin --with-usrlibdir=/usr/lib/i386-linux-gnu --with-optimisation=-O2 --with-cache=internal --with-device-uid=0 --with-device-gid=6 --with-device-mode=0660 --with-default-pid-dir=/run --with-default-run-dir=/run/lvm --with-default-locking-dir=/run/lock/lvm --with-thin=internal --with-thin-check=/usr/sbin/thin_check --with-thin-dump=/usr/sbin/thin_dump --with-thin-repair=/usr/sbin/thin_repair --enable-applib --enable-blkid_wiping --enable-cmdlib --enable-dmeventd --enable-dbus-service --enable-lvmlockd-dlm --enable-lvmlockd-sanlock --enable-lvmpolld --enable-notify-dbus --enable-pkgconfig --enable-readline --enable-udev_rules --enable-udev_sync
有什么方法可以(再次)将 LV 挂载到该分区上,同时保持严格只读吗?
答案1
下面是一种解决方法:鉴于 LVM 需要一个读写块设备,我们创建一个基于只读块设备的覆盖块设备(请参阅另一个问题)。
作为根用户:
- 创建与只读块设备大小相同的稀疏文件
(即使大于当前文件系统)truncate -s`blockdev --getsize64 /dev/loop1` '/tmp/overlay.bin'
- 创建覆盖块设备
loop=`losetup -f --show -- '/tmp/overlay.bin'` size=`blockdev --getsz /dev/loop1` printf '%s\n' "0 $size snapshot /dev/loop1 $loop P 8" | dmsetup create 'overlayloop1'
- 为了避免 LVM 抱怨具有相同 UUID 的重复 PV,请编辑 /etc/lvm/lvm.conf 以排除原始 /dev/loop1: 要么
devices { scan = [ "/dev/mapper" ] }
(devices { filter = [ "r|/dev/loop1|" ] }
参见LVM wiki 上的常见问题解答) - 现在
vgchange -a y fw
可以了。
在使用过程中,应该监视文件/tmp/overlay.bin,尽管它不应该增加,特别是如果LV的文件系统以只读方式挂载。
关闭循环设备:
vgchange -a n fw
dmsetup remove /dev/mapper/overlayloop1
rm /tmp/overlay.bin
losetup -d /dev/loop1
答案2
不是文件系统脏了(可能已经脏了,但这不是这里的问题),而是 LVM bcache 结构脏了。我想一些默认设置已被更改,这就是它不再起作用的原因。
建议:
将循环设备设置为 rw 模式一次。这应该可以解决问题。成功后
vgchange
您可以销毁循环设备并重新设置它。没有安装文件系统。
您甚至可以尝试是否可以在不使loopdev rw的情况下解决问题:您可以在100M文件上创建另一个loopdev并创建快照。不幸的是,您必须使用 手动执行此操作dmsetup
。然后您可以让 LVM 工具扫描快照。所有更改都将写入快照。尝试
vgchange -a y --readonly fw