nbdkit is our flexible, plug-in based Network Block Device server.
While I was visiting the KVM Forum last week, one of the most respected members of the QEMU development team mentioned to me that he wanted to think about deprecating QEMU’s VVFAT driver. This QEMU driver is a bit of an oddity — it lets you point QEMU to a directory of files, and inside the guest it will see a virtual floppy containing those files:
$ qemu -drive file=fat:/some/directory
That’s not the odd thing. The odd thing is that it also lets you make the drive writable, and the VVFAT driver then turns those writes back into modifications to the host filesystem (remember that these are writes happening to raw FAT32 data structures, the driver has to infer from just seeing the writes what is happening at the filesystem level). Which is both amazing and crazy (and also buggy).
Anyway I have implemented the read-only part of this in nbdkit. I didn’t implement the write stuff because that’s very ambitious, although if you were going to implement that, doing it in nbdkit would be better than qemu since the only thing that can crash is nbdkit, not the whole hypervisor.
Usage is very simple:
$ nbdkit floppy /some/directory
This gives you an NBD source which you can connect straight to a qemu virtual machine:
$ qemu -drive nbd:localhost:10809
or examine with guestfish:
$ guestfish --ro --format=raw -a nbd://localhost -m /dev/sda1 Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell > ll / total 2420 drwxr-xr-x 14 root root 16384 Jan 1 1970 . drwxr-xr-x 19 root root 4096 Oct 28 10:07 .. -rwxr-xr-x 1 root root 40 Sep 17 21:23 .dir-locals.el -rwxr-xr-x 1 root root 879 Oct 27 21:10 .gdb_history drwxr-xr-x 8 root root 16384 Oct 28 10:05 .git -rwxr-xr-x 1 root root 1383 Sep 17 21:23 .gitignore -rwxr-xr-x 1 root root 1453 Sep 17 21:23 LICENSE -rwxr-xr-x 1 root root 34182 Oct 28 10:04 Makefile -rwxr-xr-x 1 root root 2568 Oct 27 22:17 Makefile.am -rwxr-xr-x 1 root root 32085 Oct 27 22:18 Makefile.in -rwxr-xr-x 1 root root 620 Sep 17 21:23 OTHER_PLUGINS -rwxr-xr-x 1 root root 4628 Oct 16 22:36 README -rwxr-xr-x 1 root root 4007 Sep 17 21:23 TODO -rwxr-xr-x 1 root root 54733 Oct 27 22:18 aclocal.m4 drwxr-xr-x 2 root root 16384 Oct 27 22:18 autom4te.cache drwxr-xr-x 2 root root 16384 Oct 28 10:04 bash drwxr-xr-x 5 root root 16384 Oct 27 18:07 common [etc]