Enrico Zini: Egg-walking with qemu-nbd and kpartx
I wanted to retrieve a file from a VirtualBox VDI image for this blog post.
I followed these instructions
and ended up here:
It turns out it's really
At this point I managed to get my file, almost:
As can be seen from the multiple exclamation marks,
those Ancient Beings from beyond spacetime did manage to have a bite on my
sanity after all.
Once having used nbd0, only rebooting the system makes it possible to mount another image ... a little bit unpractical.What happened was this:
# modprobe nbd # NOO! Don't *EVER* do that! # qemu-nbd -c /dev/nbd0 file.vdi # kpartx -d /dev/nbd0 # mount /dev/nbd0 EHI! Where's /dev/nbdpp1 ?? # qemu-nbd -d /dev/nbd0 # rmmod nbd rmmod: ERROR: Module nbd is in use # kpartx -d /dev/nbd0 read error, sector 0 llseek error llseek error llseek error # rmmod nbd rmmod: ERROR: Module nbd is in use # WHAT THE
modprobe nbd max_part=16
, otherwise max_part
defaults to, uhm, zero? really? and kpartx cannot create device mappings
because there are not enough (as in, not even a single one) partition devices
available.
At this point, however, kpartx did create some mappings connected to, uhm,
probably Ancient Beings from beyond spacetime, and because of those the device
is in use and cannot be removed, and unmapping doesn't work either because the
Ancient Beings from beyond spacetime are keeping the device busy by feeding on
it.
I energized the pentacle and tried a desperate ritual of banishment:
# # Reconnect nbd0 to the vdi file to Restore the Balance # qemu-nbd --verbose -c /dev/nbd0 file.vdi # # This works now # kpartx -vd /dev/nbd0 del devmap : nbd0p5 del devmap : nbd0p2 del devmap : nbd0p1 # # This too, the Ancient Beings lie asleep yet again # modprobe nbd -r
# modprobe nbd max_part=16 # qemu-nbd --verbose -c /dev/nbd0 file.vdi NBD device /dev/nbd0 is now connected to file.vdi # kpartx -va /dev/nbd0 add map nbd0p1 (254:12): 0 60260352 linear 43:0 2048 add map nbd0p2 (254:13): 0 2 linear 43:0 60264446 add map nbd0p5 (254:14): 0 2648064 linear 43:0 60264448 # mount /dev/nbd0p1 /mnt mount: /dev/nbd0p1 is already mounted or /mnt busy # # WHAT NOW?! # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nbd0 43:0 0 30G 0 disk nbd0p1 43:1 0 28.8G 0 part nbd0p2 43:2 0 1K 0 part nbd0p5 43:5 0 1.3G 0 part nbd0p1 254:12 0 28.8G 0 part nbd0p2 254:13 0 1K 0 part nbd0p5 254:14 0 1.3G 0 part # # WHAAAT?!! # kpartx -vd /dev/nbd0 del devmap : nbd0p5 del devmap : nbd0p2 del devmap : nbd0p1 # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nbd0 43:0 0 30G 0 disk nbd0p1 43:1 0 28.8G 0 part nbd0p2 43:2 0 1K 0 part nbd0p5 43:5 0 1.3G 0 part # mount /dev/nbd0p1 /mnt # # I got my file, my preciouss file! # umount /mnt # kpartx -vd /dev/nbd0 # qemu-nbd -d /dev/nbd0 # rmmod nbd # # sit in a corner hugging my precious file and sobbing quietly