A totally proof-of-concept FoundationDB based NBD backend
Do not use this in production, unless you like data loss, kernel crashes and you don't mind if your house burns down.
If you're interested in a more serious implementation, have a look at https://github.com/spullara/nbd.
- Install FoundationDB.
fdb-nbd.py. It will start a local TCP server on port 10809 (default NBD port).
- Load the
nbd-client -N example 127.0.0.1 /dev/nbd0. This will initialize the network block device
/dev/nbd0and point it to the started python server.
- You might now format
/dev/nbd0with any filesystem and mount it.
- Unmount your filesystem
nbd-client -d /dev/nbd0to disconnect the block device from the server
- The server can handle multiple block device "stores" at once. In the above example,
examplegot selected with the
nbd-client. Have a look at the source code of
fdb-nbd.pyto see how this is initialized.
- You can list all other available "stores" with
nbd-client -l 127.0.0.1
- The server is hardcoded to use a blocksize of
1024. Each block is stored in its own FoundationDB key
('dev', 'example', 'blocks', block_nr). Partial reads or writes of blocks are not supported.
- Since it's possible, I just compress/decompress each key before set/get. Yay.
- It's interesting to see how block device caching works. File system actions often don't directly cause block device operations. Play around with
syncand flushing the cache
echo 3 > /proc/sys/vm/drop_cachesfor maximum effect.
- Don't suddenly stop the server or disconnect with
nbd-client. The kernel can be a bit sensitive about this. I've had unkillable processes as a result and a kernel OOPS. You have been warned.
- Performance isn't too good, at least in my tests. It's around 10MB/s or so with a locally running FoundationDB. But hey: It works :-)