Monte una imagen fotovoltaica como un dispositivo de bucle de solo lectura (nuevamente, solía funcionar)

Monte una imagen fotovoltaica como un dispositivo de bucle de solo lectura (nuevamente, solía funcionar)

Hace un par de años actualicé mi netbook con un disco duro más grande. Quería conservar el contenido del antiguo disco duro en caso de que todavía quisiera sacar algo de él.

Así que copié el disco duro antiguo en un archivo del nuevo:

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

y escribí/copié un script para montar los lvms en esa partición como sistemas de archivos de solo lectura:

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

Esto funcionó durante mucho tiempo y ahora, de repente, falla con el 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

Supongo que desde que creé un dispositivo de bucle invertido de solo lectura, a vgchange no le gusta no poder escribir en él. Creo que el sistema de archivos estaba sucio la última vez que se utilizó el disco, pero quiero ignorarlo.

Mi sistema actual se está ejecutando actualmente:

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

¿Hay alguna manera de que pueda (nuevamente) montar los LV en esta partición sin dejar de ser estrictamente de solo lectura?

Respuesta1

A continuación se muestra una solución alternativa: dado que LVM quiere un dispositivo de bloque de lectura y escritura, creamos uno con un dispositivo de bloque superpuesto basado en el dispositivo de bloque de solo lectura (ver esta otra pregunta).

Como raíz:

  1. Cree un archivo disperso con el mismo tamaño que el dispositivo de bloque de solo lectura
    truncate -s`blockdev --getsize64 /dev/loop1` '/tmp/overlay.bin'
    
    (incluso si es más grande que el sistema de archivos actual)
  2. Crear el dispositivo de bloque superpuesto
    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 LVM se queje de PV duplicado con el mismo UUID, edite /etc/lvm/lvm.conf para excluir el /dev/loop1 original: ya sea devices { scan = [ "/dev/mapper" ] }( devices { filter = [ "r|/dev/loop1|" ] }verestas preguntas frecuentes en la wiki de LVM)
  4. Ahora vgchange -a y fwtrabaja.

Durante el uso, se debe monitorear el archivo /tmp/overlay.bin, aunque no debería aumentar, especialmente si el sistema de archivos del LV está montado como de solo lectura.

Para cerrar el dispositivo de bucle:

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

Respuesta2

No era el sistema de archivos el que estaba sucio (puede que lo estuviera, pero ese no es el problema aquí), sino la estructura bcache de LVM. Supongo que se ha cambiado alguna configuración predeterminada y esa es la razón por la que ya no funciona.

Sugerencias:

  1. Configure el dispositivo de bucle en modo rw una vez. Eso debería arreglar el problema. Después del éxito, vgchangepuede destruir el dispositivo de bucle y configurarlo nuevamente. Sin haber montado el sistema de archivos.
    Incluso puedes probar si eso resuelve el problema sin hacer que loopdev sea rw: puedes crear otro loopdev en un archivo de 100 M y crear una instantánea. Desafortunadamente, tendrías que hacerlo manualmente con dmsetup. Luego puede hacer que las herramientas LVM escaneen la instantánea. Todos los cambios se escribirán en la instantánea.

  2. Intentarvgchange -a y --readonly fw

información relacionada