1.说明
1.1 文档说明
1.nbd协议文档
2.nbd介绍文档
nbd
协议文档也可以从github协议文档查看到。
3.linux bugzilla
4.nbd client其他实现
5.release包下载 推荐方法
6.bmc上一种实现想法讨论
1.2 架构方式
client-server
架构模式,server
端即:提供文件服务功能。client
端即:使用文件服务的功能。
由于linux
系统应用层无严格操作底层设备的功能,因此client
需要提供kernel
驱动程序级别的支持,这就是linux
驱动端模块nbd.c
的来由。
1.2 模块意义
该linux
模块可以将远程的文件看作本地文件使用,如果搭配上usb
,将可以做到usb cdrom
等安装系统。例如将远程系统iso
镜像文件挂接到开发板上,开发板模拟出一个usb
设备,然后连接到待安装系统的usb
上,将可以做到系统安装的功能。
2.开发分析
2.1 底层代码
1.Linux
内核代码:linux/drivers/block/nbd.c
2.头文件:linux/usr/include/linux/nbd.h
3.头文件:linux/usr/include/linux/nbd-netlink.h
4.应用层代码:下载地址1或者下载地址2
使用方法可以参考github
上的描述。
2.1.1 linux/drivers/block/nbd.c
内容分析
2.1.1.1 文件操作结构体
总的对用户空间而言,需要查看结构体内容:
static const struct block_device_operations nbd_fops =
{
.owner = THIS_MODULE,
.open = nbd_open,
.release = nbd_release,
.ioctl = nbd_ioctl,
.compat_ioctl = nbd_ioctl,
};
2.1.1.2 ioctl()
ioctl
的调用流程为:
nbd_ioctl()
---> __nbd_ioctl()
---> NBD_DISCONNECT : nbd_disconnect()
---> NBD_CLEAR_SOCK : nbd_clear_sock_ioctl()
---> NBD_SET_SOCK: nbd_add_socket()
---> NBD_SET_BLKSIZE: nbd_size_set()
---> NBD_SET_SIZE : nbd_size_set()
---> NBD_SET_SIZE_BLOCKS: nbd_size_set()
---> NBD_SET_TIMEOUT: nbd_set_cmd_timeout()
---> NBD_SET_FLAGS: config->flags = arg;
---> NBD_DO_IT: nbd_start_device_ioctl(