【Web】jsnbd
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相关推荐
- 【Web】Rest API 验证授权如何做?
参考资料: [Web]Rest && 权限管理等:http://www.itdadao.com/2016/03/15/593144/ 无需OAuth就可以设计一个安全的REST (We ...
- 01【Web】基础-HTML
01[Web]基础-HTML(P1) 本系列文章,针对Web前端的相关知识进行了详细的介绍 文章目录 01[Web]基础-HTML(P1) Chapter01 HTML概述 1. Internet起源 ...
- 03【Web】基础-JavaScript
03[Web]基础-JavaScript(P2)对象 本系列文章,针对Web前端的相关知识进行了详细的介绍 文章目录 03[Web]基础-JavaScript(P2)对象 1. 数组对象 1.1 基本 ...
- 【Web】HAProxy走私漏洞
[Web]HAProxy走私漏洞 JFrog安全研究团队发布了一个HAProxy的严重漏洞的信息.HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和H ...
- 【Web】Web内容可访问性指南 1.0
为什么80%的码农都做不了架构师?>>> 译文:Web内容可访问性指南 1.0 http://www.junchenwu.com/WAI/wai-pageauth.html原文 ...
- 【Web】HTML学习笔记
目录 一.HTML简介 1. 官方介绍 2. 互连网原理 3. 服务器 4. 浏览器 二.认识HTML 三.HTML骨架 1. HTML骨架完整写法 四.HTML语法规则 1. 双标签 2. 单标签 ...
- 【Web】多读书多看报
页面渲染 你不知道的浏览器页面渲染机制 [JS] JavaScript自增.自减运算符 节流和防抖 JS原型和原型链 深入理解Javascript中构造函数和原型对象的区别(转存) [CSS] MDN ...
- 【Web】使用Three.js制作有数据源控制的3D模型动画
懒得写了,大概记录下步骤. 1. 使用开源软件Blender制作3D模型 1.1 Blender Blender类似于3DMax.Maya,是制作3D模型的工具软件,是开源软件,但较难使用,无法制作精 ...
- 【WEB】PHP代码分析溯源(PHP文件包含)
[原题] https://www.mozhe.cn/bug/detail/T0YyUmZRa1paTkJNQ0JmVWt3Sm13dz09bW96aGUmozhe [题干] 网页显示源码 eval(g ...
最新文章
- 前端入门(水球特效,css)
- 【UIKit】文本框(UITextField)及键盘遮挡处理和回收
- Boost:线程实例
- Qt官方开发环境生成的exe发布方式--使用windeployqt
- 再见了,Docker Desktop!
- 甲方爸爸素材给得少,怎么做出高大上的设计?
- 小程序怎么判断是在PC端打开的还是手机端打开的?
- 软考-中级-网络工程师-知识点个人总结(八)
- 关于设计BOM和制造BOM的介绍
- Vant Tab标签页
- 百度网盘真实地址解析(告别下载百度网盘)--修改版
- 报错:“TypeError: Cannot read property ‘0‘ of undefined“的原因
- JVM总结(四)GC收集器以及JDK7,JDK8中JVM内存变化
- 记录apache和tomcat整合(windows—x64)
- 中鑫吉鼎|一份行之有效的投资计划
- PHP+swoole 聊天窒 五子棋斗地主
- Java全栈技术体系汇总----主目录----持续更新
- JVM 解析阶段 符号引用和直接引用的区别
- doc es 中type_Elasticsearch基础——概念和基本API操作
- Java微信公众号开发之开源框架推荐
热门文章
- 模糊PID控制器MATLAB仿真探讨,基于Matlab的模糊自整定PID控制器仿真研究
- 上传项目到码云或GitHub
- 常用开源软件开发平台和仓库(学生的福利)
- 已知一个向量,计算向量上的某个点的坐标
- ORA-01034:oracle不可用 的解决方法
- 农村大叔开饭店,本来快倒闭了,后来做了一个活动能就买车买房?
- html写剑网三界面
- 戴尔服务器阵列装系统,戴尔服务器R720做Raid 0并安装VMware ESXi 6.7系统方法
- ZYNQ | AXI DMA数据环路测试
- 3s安装JupyterLab,4步完成JupyterLab插件安装(附多款高生产力插件推荐)