NBD是什么
NBD指的是Network Block Device,正如其名字的意思,NBD让用户可以通过网络访问到某个块设备,或者设备镜像。和NFS的区别在于,NFS是直接提供基于网络的文件系统,而NBD是提供基于网络的块设备,你可以你在这个块设备上任意创建文件系统. 通常NBD是有Client端和Server端.并且依赖内核的NBD模块.
SPDK的NBD模块
SPDK自带了一个基于SPDK的NBD模块,其提供的功能是可以将SPDK在本地创建的BDEV通过NBD方式导出到本地,并可以挂载读写.
使用方法简单:
- 内核加载nbd模块
modprobe nbd
2, 已经使用SPDK创建了一个Volume. 名字为lvstor0/lvol1
那么使用SPDK自带的rpc命令可以创建1个NBD设备:
./scripts/rpc.py start_nbd_disk lvstor0/lvol0 /dev/nbd3
执行成功,返回 /dev/nbd3
3,对/dev/nbd3 进行格式化操作
mkfs.ext4 /dev/nbd3
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 102400000 4k blocks and 25600000 inodes
Filesystem UUID: 43333327-49b3-4b1a-8a5c-1f13d900477b
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information: done
格式化成功,可以挂载并读写了.
4, 停止命令:
rpc.py stop_nbd_disk /dev/nbd0
SPDK的NBD实现分析
- 创建流程

核心是 注册了一个基于socket的nbd设备,在spdk内创建poller不停的在socket上收包,收到的包再调用spdk的bdev_read和bdev_write等接口下发给spdk的bdev设备. 访问/dev/nbd0 的设备是内核流程,通过socket发送到用户态处理.