无法让 NBD 工作

无法让 NBD 工作

根据这篇博文,这应该很容易:

# nbd-server MyFile.dat
# nbd-client localhost /dev/nbd0

问题是...实际上并非如此工作

首先,nbd-server除非我明确指定端口号和文件的绝对路径,否则会抱怨“没有配置导出”。但好吧,无论如何。 (它仍然抱怨说这在某种程度上“已被弃用”,你应该真正编辑配置文件 - 我是这样的确实不想这样做!)它现在似乎正在为块设备提供服务。 (至少,现在有一个nbd-server进程正在运行,并且打开了 TCP/10809 进行侦听。)

然而,尝试建立nbd-client连接是不可能的。无论我给它什么论据,它都会呻吟、抱怨并拒绝任何事物!它一直说

 ERROR: not enough information specified

接下来是用法概要。但实际上不会告诉我它有什么不高兴的。无论是否指定端口号,我都会收到相同的错误消息。我该怎么做实际连接?

(显然我正在连接到同一台机器。最终我想在网络上的机器之间执行此操作。但我什至无法让它在本地工作!)

附言。一些例子讨论modprobe nbd-clientmodprobe nbd-server。我的 OpenSUSE 机器似乎只有nbd.ko,所以我插入了它。在此之前,/dev/nbd0甚至不存在。之后,它就存在得很好。

答案1

这需要一些弄清楚。

似乎除了 NBD 服务器和端口号之外,您还需要指定一个“导出名称”,文档对此并没有很好地解释。

我还不得不求助于使用配置文件[我非常想避免]。幸运的是,您实际上不必将其放在任何特殊位置或任何东西。

我实际上能够让以下内容发挥作用:

  1. 创建一个空磁盘映像。

  2. 创建一个如下所示的文件:

    [generic]
    # Must always exist.
    
    [Mu]
    exportname=/path/to/image/file
    
  3. 启动NBD服务器:

    nbd-server -C /path/to/config/file
    

    这似乎会生成/var/run/nbd-server.pid,它保存 NBD 服务器进程的 PID(即,因此您可以杀死它)。似乎没有任何其他停止命令。

  4. 启动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

相关内容