根据这篇博文,这应该很容易:
# nbd-server MyFile.dat
# nbd-client localhost /dev/nbd0
问题是...实际上并非如此工作。
首先,nbd-server
除非我明确指定端口号和文件的绝对路径,否则会抱怨“没有配置导出”。但好吧,无论如何。 (它仍然抱怨说这在某种程度上“已被弃用”,你应该真正编辑配置文件 - 我是这样的确实不想这样做!)它现在似乎正在为块设备提供服务。 (至少,现在有一个nbd-server
进程正在运行,并且打开了 TCP/10809 进行侦听。)
然而,尝试建立nbd-client
连接是不可能的。无论我给它什么论据,它都会呻吟、抱怨并拒绝做任何事物!它一直说
ERROR: not enough information specified
接下来是用法概要。但实际上不会告诉我它有什么不高兴的。无论是否指定端口号,我都会收到相同的错误消息。我该怎么做实际连接?
(显然我正在连接到同一台机器。最终我想在网络上的机器之间执行此操作。但我什至无法让它在本地工作!)
附言。一些例子讨论modprobe nbd-client
和modprobe nbd-server
。我的 OpenSUSE 机器似乎只有nbd.ko
,所以我插入了它。在此之前,/dev/nbd0
甚至不存在。之后,它就存在得很好。
答案1
这需要一些弄清楚。
似乎除了 NBD 服务器和端口号之外,您还需要指定一个“导出名称”,文档对此并没有很好地解释。
我还不得不求助于使用配置文件[我非常想避免]。幸运的是,您实际上不必将其放在任何特殊位置或任何东西。
我实际上能够让以下内容发挥作用:
创建一个空磁盘映像。
创建一个如下所示的文件:
[generic] # Must always exist. [Mu] exportname=/path/to/image/file
启动NBD服务器:
nbd-server -C /path/to/config/file
这似乎会生成
/var/run/nbd-server.pid
,它保存 NBD 服务器进程的 PID(即,因此您可以杀死它)。似乎没有任何其他停止命令。启动NBD客户端:
nbd-client localhost -N Mu /dev/nbd0
该
Mu
部分必须与您在配置文件中选择的任何随机名称相匹配。完全可以用一台服务器来服务多种的文件一次,因此您需要指定所需的文件。 (这大概就是客户之前抱怨的“信息不足”。)
此时,/dev/nbd0
应该可以像普通的块设备一样工作。
到目前为止,除了终止客户端/服务器进程(例如pkill nbd
)之外,我还没有找到任何断开连接的方法。
我也测试过;如果您替换localhost
为适当的主机名,这可以远程工作。
答案2
我建议使用NBD套件而不是 nbd 服务器。 (注:我写的)。它是一个更现代、功能更强大的服务器,默认情况下它不关心导出名称。以下是使用它创建 1 TB RAM 磁盘并使用 nbd-client 连接到该磁盘的示例:
$ nbdkit memory 1T
$ sudo nbd-client localhost /dev/nbd0
Negotiation: ..size = 1048576MB
Connected /dev/nbd0
$ sudo blockdev --getsize64 /dev/nbd0
1099511627776
我们编写的另一个工具是NB信息它可用于查询 NBD 服务器的属性,包括列出它们所服务的导出名称:
$ nbdinfo nbd://localhost
protocol: newstyle-fixed without TLS
export="":
export-size: 1099511627776
content: data
uri: nbd://localhost:10809/
[more output clipped]
清理:
$ sudo nbd-client -d /dev/nbd0
$ killall nbdkit
(如果你做得正确,有比 更好的方法killall
。你可以让 nbdkit 编写一个 PID 文件,然后杀死该 PID。或者你可以使用圈养nbdkit)