Lvm
將 PV 映像掛載為只讀循環設備(再次 - 它曾經工作)
幾年前,我用更大的硬碟升級了我的上網本。我想保留舊硬碟驅動器的內容,以防我仍然想要它。
所以我將舊硬碟複製到新硬碟上的文件中:
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,同時保持嚴格只讀?
以下是一種解決方法:鑑於 LVM 想要一個讀寫塊設備,我們創建一個基於只讀塊設備的覆蓋塊設備(請參閱this other question)。
作為根:
- 創建一個與只讀塊設備大小相同的稀疏文件
truncate -s`blockdev --getsize64 /dev/loop1` '/tmp/overlay.bin'
(即使大於目前文件系統) 2. 創建覆蓋塊設備
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