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には読み取り/書き込みブロックデバイスが必要なので、読み取り専用ブロックデバイスに基づいてオーバーレイブロックデバイスを作成します(他の質問を見る)。

rootユーザーとして:

  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. 同じUUIDを持つ冗長PVに対してLVMが不平を言わないようにするには、/etc/lvm/lvm.confを編集して元の/dev/loop1を除外しますdevices { scan = [ "/dev/mapper" ] }devices { filter = [ "r|/dev/loop1|" ] }LVM Wikiに関するFAQ)
  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

関連情報