將 PV 映像安裝為唯讀循環裝置(同樣 - 它曾經有效)

將 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 掛載到該分割區上,同時保持嚴格只讀嗎?

答案1

以下是一種解決方法:鑑於 LVM 需要一個讀寫區塊設備,我們建立一個基於唯讀區塊設備的覆蓋區塊設備(請參閱另一個問題)。

作為根用戶:

  1. 建立與唯讀區塊設備大小相同的稀疏文件
    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'
    
  3. 為了避免 LVM 抱怨具有相同 UUID 的重複 PV,請編輯 /etc/lvm/lvm.conf 以排除原始 /dev/loop1: 要么devices { scan = [ "/dev/mapper" ] }(devices { filter = [ "r|/dev/loop1|" ] }參見LVM wiki 上的常見問題解答
  4. 現在vgchange -a y fw可以了。

在使用過程中,應該監視檔案/tmp/overlay.bin,儘管它不應該增加,特別是如果LV的檔案系統以唯讀方式掛載。

關閉循環設備:

  1. vgchange -a n fw
  2. dmsetup remove /dev/mapper/overlayloop1
  3. rm /tmp/overlay.bin
  4. losetup -d /dev/loop1

答案2

不是檔案系統髒了(可能已經髒了,但這不是這裡的問題),而是 LVM bcache 結構髒了。我想一些預設設定已被更改,這就是它不再起作用的原因。

建議:

  1. 將循環設備設定為 rw 模式一次。這應該可以解決問題。成功後vgchange您可以銷毀循環設備並重新設定它。沒有安裝檔案系統。
    您甚至可以嘗試是否可以在不使loopdev rw的情況下解決問題:您可以在100M檔案上建立另一個loopdev並建立快照。不幸的是,您必須使用 手動執行此操作dmsetup。然後您可以讓 LVM 工具掃描快照。所有變更都將寫入快照。

  2. 嘗試vgchange -a y --readonly fw

相關內容