NBD вообще забавно оказывается сделано - ты типа сам открываешь сокет, сам делаешь хендшейк, а потом просто отдаёшь сокет ядру, дёргаешь ioctl и ядро через него передаёт данные само
то есть таким образом никто не мешает просто сделать socketpair(), один конец отдать ядру, а с вторым работать в юзерспейсе. то есть таки NBD всё-таки практически "block device in userspace" и есть