超详细openBmc Virtual Media 功能及实现流程(1)
后续会 持续更新相关debug 技巧
1. VirtualMedia 功能介绍:
- BMC的 Virtual Media(虚拟介质) 功能是一项重要的远程管理特性,主要用于通过远程服务器模拟本地存储设备(如 CD/DVD)供主机访问;
- 基于VirtualMedai 功能,管理员可以加载本机镜像,并将镜像挂载到远程服务器主机,从而实现远程镜像安装,而无需去机房接入实际的镜像介质。
2. VirtualMedai 实现框架:
2.1 VirtualMedia Module 依赖:
- 浏览器:该功能需要浏览器加载本机镜像
- bmc 服务:该功能需要bmc VirtualMedia 服务通过websocket 与浏览器沟通
- nbd 网络块:该功能需要nbd 网络块设备能将远程的sock 数据通过内核块转入bio_vec
- USB-Gadget:该功能需要usbGadget 将网络块nbd与USB设备的file 进行关联,以遍bio_vec 中的数据可以通过USB 到达主机
2.2 镜像数据传输流程:
- 本地镜像上传浏览器,然后通过websocket 发送给bmc VirtualMeida 服务
- bmc VirtualMedia 从websocket 读取数据并写入管道
- nbd_proxy 进程从管道读取数据并写入sock_client
- nbd 服务接收sock 数据并存储到bio_vec以便通过USB 协议传输给主机;
2.3 底层cmd 传输流程:
- 底层USB 请求转化为块请求,然后通过nbd server sock 通知到nbd_client
- nbd_proxy 从sokcet 读取数据并写入pipeout
- bmc VirtualMedia 从pipeout 中读取请求数据并通过websock 发送给NBDServer.js
- NBDServer.js 从load的文件中读取指定偏移&指定长度的数据
2.4 框架简化:
3. VirtualMedia 的具体实现:
3.1 Web code Flow:
3.2 nbd-proxy Flow:
3.3 nbd-client Flow:
3.4 nbd Module Flow:
参考我之前所写文章:
https://blog.csdn.net/gege_hxg/article/details/148118291?spm=1001.2014.3001.5501
3.5 VirtualMedia 整体传输Flow:
- 详细请下载openbmc_VirtualMedia_allFlow.drawio 文件;
4. 感悟:
- 刚拿到openbmc code 不知道VirtualMedia 所依赖的Module 有哪些,对应哪些Source;
- 需要查阅openbmc 开源技术文档确认VirtualMedia 的大致流程,VirtualMedia 开源技术文档参考如下:
- https://github.com/openbmc/docs/blob/master/features.md
- https://github.com/openbmc/docs/blob/master/designs/virtual-media.md
- 从代码中依据数据传输线进行确认,找到所依赖的进程以及整个数据传输流程;