Monte uma imagem fotovoltaica como um dispositivo de loop somente leitura (novamente - costumava funcionar)

Monte uma imagem fotovoltaica como um dispositivo de loop somente leitura (novamente - costumava funcionar)

Há alguns anos, atualizei meu netbook com um disco rígido maior. Eu queria manter o conteúdo do disco rígido antigo, caso ainda houvesse algo que eu quisesse dele.

Então copiei o disco rígido antigo para um arquivo no novo:

dd if=/dev/sdd5 of=~/fw-disk-image/fw-sdd5-linux-lvm-partition.raw

e escrevi/copiei um script para montar os lvms nessa partição como sistemas de arquivos somente leitura:

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

Agora isso funcionou por muito tempo e agora de repente falha no vgchange -a y fwcomando:

# 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

Suponho que, desde que criei um dispositivo de loopback somente leitura, o vgchange não está feliz por não poder gravar nele. Acho que o sistema de arquivos estava sujo quando o disco foi usado pela última vez, mas quero ignorar isso.

Meu sistema atual está em execução:

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

Existe alguma maneira de eu poder (novamente) montar os LVs nesta partição enquanto permaneço estritamente somente leitura?

Responder1

Abaixo está uma solução alternativa: dado que o LVM deseja um dispositivo de bloco de leitura e gravação, criamos um com um dispositivo de bloco de sobreposição baseado no dispositivo de bloco somente leitura (veja esta outra pergunta).

Como raiz:

  1. Crie um arquivo esparso com o mesmo tamanho do dispositivo de bloco somente leitura
    truncate -s`blockdev --getsize64 /dev/loop1` '/tmp/overlay.bin'
    
    (mesmo que seja maior que o sistema de arquivos atual)
  2. Crie o dispositivo de bloco de sobreposição
    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. Para evitar que o LVM reclame sobre PV duplicado com o mesmo UUID, edite /etc/lvm/lvm.conf para excluir o /dev/loop1 original: ou devices { scan = [ "/dev/mapper" ] }( devices { filter = [ "r|/dev/loop1|" ] }vejaeste FAQ no wiki do LVM)
  4. Agora vgchange -a y fwfunciona.

Durante o uso, o arquivo /tmp/overlay.bin deve ser monitorado, embora não deva aumentar particularmente se o sistema de arquivos do LV for montado somente leitura.

Para fechar o dispositivo de loop:

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

Responder2

Não o sistema de arquivos estava sujo (pode ter sido, mas esse não é o problema aqui), mas a estrutura do bcache do LVM. Acho que alguma configuração padrão foi alterada e é por isso que não funciona mais.

Sugestões:

  1. Configure o dispositivo de loop no modo rw uma vez. Isso deve resolver o problema. Após o sucesso, vgchangevocê pode destruir o dispositivo de loop e configurá-lo novamente. Sem ter montado o sistema de arquivos.
    Você pode até tentar se isso resolve o problema sem fazer o loopdev rw: Você pode criar outro loopdev em um arquivo de 100M e criar um instantâneo. Infelizmente você teria que fazer isso manualmente com dmsetup. Então você pode fazer com que as ferramentas LVM verifiquem o instantâneo. Todas as alterações seriam gravadas no instantâneo.

  2. Tentarvgchange -a y --readonly fw

informação relacionada