Eu tenho um script que eu uso para montar diskimages que são imagens de LVM. ele faz:
x='losetup -f' #create a loop device
echo $x > loopdev #echo that device to a file for later use
losetup $x disk.img #mount the disk.img to the loop device
kpartx -av $x #use kpartx to add the partition mappings
vgscan && vgchange -ay #vgscan the new mappings and make active
mount /dev/VolGroupRoot/LogVolRoot /mnt #mount the volgroup to /mnt
mount -o loop,offset=$((2048 * 512)) disk.img /mnt/boot #mount the boot partition in the image to /mnt/boot
Isso funciona bem quando há dispositivos de loop disponíveis.
Alternativamente, para desmontar a img que eu executo:
umount /mnt/boot #umount boot
umount /mnt #umount volgroup
vgchange -an VolGroupRoot #make volgroup inactive
x='cat loopdev' #get my used loopdevice
kpartx -d $x #delete the partition mappings
losetup -d $x #detach the loop device
/bin/rm loopdev #remove the loopdev file in prep for the next time I mount something using the script.
Isso é executado sem erros, no entanto, acho que nem sempre remove o dispositivo de loop para uso posterior. losetup -a mostra frequentemente os dispositivos de loop usados anteriormente ainda em sua tabela. A informação do dmsetup não mostra os dispositivos de loop, mas eu os vejo com o lsof sendo mantido pelo kthreadd. Como resultado, parece que não há como remover os dispositivos / dev / loop sem uma reinicialização, o que parece ser uma espécie de marreta para o problema. Eu posso (e freqüentemente faço) acabar criando novos dispositivos de loop para contornar isso, mas isso é insustentável e não resolve o problema real. Alguém viu isso e / ou tem outras coisas que eu posso tentar (fwiw, isso está acontecendo em 3.18 e 4.1 sistemas de kernel).
Tags loop-device linux