.png)
Пару лет назад я обновил свой нетбук, установив на него более объемный жесткий диск. Я хотел сохранить содержимое старого жесткого диска на случай, если мне еще что-то понадобится.
Поэтому я скопировал старый жесткий диск в файл на новом:
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
Я предполагаю, что поскольку я создал устройство loop-back только для чтения, 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
Есть ли способ (снова) смонтировать логические тома на этом разделе, оставив их строго доступными только для чтения?
решение1
Ниже приведено обходное решение: учитывая, что LVM требуется блочное устройство для чтения и записи, мы создаем его с помощью оверлейного блочного устройства на основе блочного устройства только для чтения (см. этот другой вопрос).
Как root:
- Создать разреженный файл того же размера, что и блочное устройство, доступное только для чтения
(даже если он больше текущей файловой системы)truncate -s`blockdev --getsize64 /dev/loop1` '/tmp/overlay.bin'
- Создайте устройство наложения блока
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 не жаловался на дублирование PV с одинаковым UUID, отредактируйте /etc/lvm/lvm.conf, исключив оригинальный /dev/loop1: либо
devices { scan = [ "/dev/mapper" ] }
(devices { filter = [ "r|/dev/loop1|" ] }
см.этот FAQ на 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
решение2
Не файловая система была грязной (может быть, но проблема не в этом), а структура LVM bcache. Думаю, были изменены какие-то настройки по умолчанию, и поэтому это больше не работает.
Предложения:
Настройте устройство loop в режиме rw один раз. Это должно решить проблему. После успешного выполнения
vgchange
вы можете уничтожить устройство loop и настроить его снова в режиме ro. Без монтирования файловой системы.
Вы даже можете попробовать решить проблему, не делая loopdev rw: Вы можете создать еще один loopdev для файла размером 100 МБ и создать снимок. К сожалению, вам придется сделать это вручную с помощьюdmsetup
. Затем вы можете заставить инструменты LVM просканировать снимок. Все изменения будут записаны в снимок.Пытаться
vgchange -a y --readonly fw