NBD

NBD的全称是Network Block Device,网络块设备,简单理解就是通过网络访问的硬盘。

这里使用开源的jsnbd来实现NBD。通过jsnbd,Web浏览器成为了服务器端,存放着文件,而本地系统通过/dev/nbdx来访问Web浏览器文件。

下载

下载源码:

git clone https://github.com/openbmc/jsnbd.git

下载到目录:

$ ls
autom4te.cache      configure.ac  m4           nbd-proxy.c  web
config.sample.json  LICENCE       Makefile.am  README

编译

首先nbd-proxy.c依赖于JSON和udev,所以需要安装cjson库和udev库:

$ sudo apt install libjson-c-dev libudev-dev

之后需要生成makefile文件,具体过程如下(需要安装autoconf,pkgconf):

$ autoscan
configure.ac: warning: missing AC_CHECK_FUNCS([dup2]) wanted by: nbd-proxy.c:151
configure.ac: warning: missing AC_CHECK_FUNCS([memset]) wanted by: nbd-proxy.c:258
configure.ac: warning: missing AC_CHECK_FUNCS([socket]) wanted by: nbd-proxy.c:89
configure.ac: warning: missing AC_CHECK_FUNCS([strchr]) wanted by: nbd-proxy.c:398
configure.ac: warning: missing AC_CHECK_FUNCS([strdup]) wanted by: nbd-proxy.c:622
configure.ac: warning: missing AC_CHECK_HEADERS([fcntl.h]) wanted by: nbd-proxy.c:23
configure.ac: warning: missing AC_CHECK_HEADERS([limits.h]) wanted by: nbd-proxy.c:25
configure.ac: warning: missing AC_CHECK_HEADERS([stdint.h]) wanted by: nbd-proxy.c:28
configure.ac: warning: missing AC_CHECK_HEADERS([stdlib.h]) wanted by: nbd-proxy.c:30
configure.ac: warning: missing AC_CHECK_HEADERS([string.h]) wanted by: nbd-proxy.c:31
configure.ac: warning: missing AC_CHECK_HEADERS([sys/socket.h]) wanted by: nbd-proxy.c:35
configure.ac: warning: missing AC_CHECK_HEADERS([unistd.h]) wanted by: nbd-proxy.c:32
configure.ac: warning: missing AC_CHECK_HEADER_STDBOOL wanted by: nbd-proxy.c:48
configure.ac: warning: missing AC_CHECK_MEMBERS([struct stat.st_rdev]) wanted by: nbd-proxy.c:766
configure.ac: warning: missing AC_FUNC_FORK wanted by: nbd-proxy.c:133
configure.ac: warning: missing AC_FUNC_MALLOC wanted by: nbd-proxy.c:820
configure.ac: warning: missing AC_TYPE_PID_T wanted by: nbd-proxy.c:58
configure.ac: warning: missing AC_TYPE_SIZE_T wanted by: nbd-proxy.c:63
configure.ac: warning: missing AC_TYPE_SSIZE_T wanted by: nbd-proxy.c:196
configure.ac: warning: missing AC_TYPE_UINT8_T wanted by: nbd-proxy.c:62
$ aclocal
$ autoreconf --install
$ ./configure
$ make

完成之后得到nbd-proxy工具:

$ ls
aclocal.m4      config.log          install-sh   nbd-proxy
ar-lib          config.sample.json  LICENCE      nbd-proxy.c
autom4te.cache  config.status       m4           nbd_proxy-nbd-proxy.o
autoscan.log    configure           Makefile     README
compile         configure.ac        Makefile.am  stamp-h1
config.h        configure.scan      Makefile.in  web
config.h.in     depcomp             missing

使用

直接使用nbd-proxy工具会报错:

$ ./nbd-proxy
json_object_from_file: error opening file /usr/local/etc/nbd-proxy/config.json: No such file or directory
nbd-proxy: can't read configuration from /usr/local/etc/nbd-proxy/config.json

因为它需要配置文件,源代码中本来就有一个示例:

$ cat config.sample.json
{"timeout": 30,"configurations": {"0": {"nbd-device": "/dev/nbd0","metadata": {"description": "Virtual media device"}},"1": {"nbd-device": "/dev/nbd1","metadata": {"description": "Dump Offload"}}}
}

将该文件拷贝到/usr/local/etc/nbd-proxy/目录并重命名为config.json,另外需要注意这里提到的/dev/nbdx,如果不安装会报错:

$ ./nbd-proxy
nbd-proxy: can't stat nbd device /dev/nbd0: No such file or directory

它们也需要额外安装:

$ sudo apt install nbd-client
$ sudo modprobe nbd

注意需要modprobe,之后可以看到在/dev下多出来了nbdx设备:

# ls /dev/nbd*
/dev/nbd0   /dev/nbd12  /dev/nbd2  /dev/nbd6
/dev/nbd1   /dev/nbd13  /dev/nbd3  /dev/nbd7
/dev/nbd10  /dev/nbd14  /dev/nbd4  /dev/nbd8
/dev/nbd11  /dev/nbd15  /dev/nbd5  /dev/nbd9

然后再运行nbd-proxy,报错如下:

nbd-proxy: no config specified, and no default

这里是代码本身还有问题,最简单的一个修改办法是去掉配置中的第二项,配置文件变成如下的样子:

$ cat /usr/local/etc/nbd-proxy/config.json
{"timeout": 30,"configurations": {"0": {"nbd-device": "/dev/nbd0","metadata": {"description": "Virtual media device"}}}
}

再次执行nbd-proxy还是会报错:

$ ./nbd-proxy
nbd-proxy: can't bind to path /usr/local/var/run/nbd.17370.sock: No such file or directory

/usr/local/var/run/nbd.17370.sock这个文件确实也不存在。

原因是下面的代码:

static const char *sockpath_tmpl = RUNSTATEDIR "/nbd.%d.sock";

这里的RUNSTATEDIR就是/usr/local/var/run目录,但是这个目录在当前系统中无法创建,修改为如下的目录:

static const char *sockpath_tmpl = "/tmp/nbd.%d.sock";

程序就能够正常执行了。

当然光有这个程序还不够,因为jsnbd浏览器端依赖于websocket,所以需要额外的工具来支持。

这里使用websocketd工具,首先下载该工具:

sudo apt install websocketd

之后通过如下的命令启动websocketd和nbd-proxy:

$ sudo websocketd --port=8000 --staticdir=web --binary ./nbd-proxy
Wed, 18 Aug 2021 00:40:24 +0800 | INFO   | server     |  | Serving using application   : ./nbd-proxy
Wed, 18 Aug 2021 00:40:24 +0800 | INFO   | server     |  | Serving static content from : web
Wed, 18 Aug 2021 00:40:24 +0800 | INFO   | server     |  | Starting WebSocket server   : ws://X1C:8000/
Wed, 18 Aug 2021 00:40:24 +0800 | INFO   | server     |  | Serving CGI or static files : http://X1C:8000/

–staticdir指定了使用的web目录,jsnbd源码目录中存在web目录,其中包含index.html和nbd.js文件;–binary指定执行的二进制,就是nbd-proxy程序。

成功之后就可以打开浏览器,输入地址http://X1C:8000/,访问到的就是index.html文件:

点击“浏览”增加文件,然后点击“Serve Image”上传文件,结果如下:

可以看到上传的记录,也就是说文件被上传了。但是上传到哪里去了呢?这就要看前面提到的/dev/nbd0了:

$ sudo fdisk -l /dev/nbd0
Disk /dev/nbd0:25.5 MiB,26759168 字节,26132 个扇区
单元:扇区 / 1 * 1024 = 1024 字节
扇区大小(逻辑/物理):1024 字节 / 1024 字节
I/O 大小(最小/最佳):1024 字节 / 1024 字节

实际上这里看到的文件就是前面上传的sogoupinyin_2.3.1.0112_amd64.deb。不过大小有一些区别,这跟文件系统有关,问题不大。

点击“stop”再次查看,就会发现/dev/nbd0无法操作了:

$ sudo fdisk -l /dev/nbd0
fdisk: 打不开 /dev/nbd0: 对设备不适当的 ioctl 操作

这也证明了/dev/nbd0中确实包含了上传的文件。

总结

以上是nbd-proxy的一些基础内容,为了进一步了解nbd-proxy,对以下的内容还需要进一步了解:

  • nbd-client
  • websocket

【Web】jsnbd相关推荐

  1. 【Web】Rest API 验证授权如何做?

    参考资料: [Web]Rest && 权限管理等:http://www.itdadao.com/2016/03/15/593144/ 无需OAuth就可以设计一个安全的REST (We ...

  2. 01【Web】基础-HTML

    01[Web]基础-HTML(P1) 本系列文章,针对Web前端的相关知识进行了详细的介绍 文章目录 01[Web]基础-HTML(P1) Chapter01 HTML概述 1. Internet起源 ...

  3. 03【Web】基础-JavaScript

    03[Web]基础-JavaScript(P2)对象 本系列文章,针对Web前端的相关知识进行了详细的介绍 文章目录 03[Web]基础-JavaScript(P2)对象 1. 数组对象 1.1 基本 ...

  4. 【Web】HAProxy走私漏洞

    [Web]HAProxy走私漏洞 JFrog安全研究团队发布了一个HAProxy的严重漏洞的信息.HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和H ...

  5. 【Web】Web内容可访问性指南 1.0

    为什么80%的码农都做不了架构师?>>>    译文:Web内容可访问性指南 1.0 http://www.junchenwu.com/WAI/wai-pageauth.html原文 ...

  6. 【Web】HTML学习笔记

    目录 一.HTML简介 1. 官方介绍 2. 互连网原理 3. 服务器 4. 浏览器 二.认识HTML 三.HTML骨架 1. HTML骨架完整写法 四.HTML语法规则 1. 双标签 2. 单标签 ...

  7. 【Web】多读书多看报

    页面渲染 你不知道的浏览器页面渲染机制 [JS] JavaScript自增.自减运算符 节流和防抖 JS原型和原型链 深入理解Javascript中构造函数和原型对象的区别(转存) [CSS] MDN ...

  8. 【Web】使用Three.js制作有数据源控制的3D模型动画

    懒得写了,大概记录下步骤. 1. 使用开源软件Blender制作3D模型 1.1 Blender Blender类似于3DMax.Maya,是制作3D模型的工具软件,是开源软件,但较难使用,无法制作精 ...

  9. 【WEB】PHP代码分析溯源(PHP文件包含)

    [原题] https://www.mozhe.cn/bug/detail/T0YyUmZRa1paTkJNQ0JmVWt3Sm13dz09bW96aGUmozhe [题干] 网页显示源码 eval(g ...

最新文章

  1. 前端入门(水球特效,css)
  2. 【UIKit】文本框(UITextField)及键盘遮挡处理和回收
  3. Boost:线程实例
  4. Qt官方开发环境生成的exe发布方式--使用windeployqt
  5. 再见了,Docker Desktop!
  6. 甲方爸爸素材给得少,怎么做出高大上的设计?
  7. 小程序怎么判断是在PC端打开的还是手机端打开的?
  8. 软考-中级-网络工程师-知识点个人总结(八)
  9. 关于设计BOM和制造BOM的介绍
  10. Vant Tab标签页
  11. 百度网盘真实地址解析(告别下载百度网盘)--修改版
  12. 报错:“TypeError: Cannot read property ‘0‘ of undefined“的原因
  13. JVM总结(四)GC收集器以及JDK7,JDK8中JVM内存变化
  14. 记录apache和tomcat整合(windows—x64)
  15. 中鑫吉鼎|一份行之有效的投资计划
  16. PHP+swoole 聊天窒 五子棋斗地主
  17. Java全栈技术体系汇总----主目录----持续更新
  18. JVM 解析阶段 符号引用和直接引用的区别
  19. doc es 中type_Elasticsearch基础——概念和基本API操作
  20. Java微信公众号开发之开源框架推荐

热门文章

  1. 模糊PID控制器MATLAB仿真探讨,基于Matlab的模糊自整定PID控制器仿真研究
  2. 上传项目到码云或GitHub
  3. 常用开源软件开发平台和仓库(学生的福利)
  4. 已知一个向量,计算向量上的某个点的坐标
  5. ORA-01034:oracle不可用 的解决方法
  6. 农村大叔开饭店,本来快倒闭了,后来做了一个活动能就买车买房?
  7. html写剑网三界面
  8. 戴尔服务器阵列装系统,戴尔服务器R720做Raid 0并安装VMware ESXi 6.7系统方法
  9. ZYNQ | AXI DMA数据环路测试
  10. 3s安装JupyterLab,4步完成JupyterLab插件安装(附多款高生产力插件推荐)