一般来说,我对使用 nbd 很陌生。我用 Rust 编写了一个 nbdkit 插件,我一直将其用作 nbd 服务器来从后备存储中读取数据,并使用 guestfish(一种文件系统 shell)作为我的客户端。
#!/bin/bash -
guestfish --ro --format=raw -a nbd://localhost <<-EOF
run
mount /dev/sda /
mount-local ./data
mount-local-run
EOF
这对于各种文件系统类型(xfs、ext2..4、FAT 等)都非常有效,除了 guestfish 的挂载命令相当慢之外。因此,我尝试将其作为依赖项删除,并使用本机 linuxnbd-client
作为客户端。
> modprobe nbd
// no output
> sudo nbd-client localhost /dev/nbd0
//successfully connects
> sudo mkdir /mnt/nbd0
> sudo mount /dev/nbd0 /mnt/nbd0
mount: /mnt/nbd0: cannot mount /dev/nbd0 read-only.
我不确定为什么这个安装命令失败。我没有实现 nbdkit 的写入回调,因此我确实希望这些文件是只读的,但我不明白为什么这会导致安装失败。我可以改为运行
sudo mount -o ro,noload /dev/nbd0 /mnt/nbd0
之后发生的情况取决于卷的文件系统。我的文件系统是ext4,供参考。
如果卷的文件系统类型不是 ext4:mount: /mnt/nbd0: wrong fs type, bad option, bad superblock on /dev/nbd0, missing codepage or helper program, or other error.
如果卷的文件系统类型为 ext4:安装成功,我可以进入目录、移动等,但是我在该卷中的所有文件都是空的。就像当我安装客鱼时,我可以执行
cat dir0/textFile0.txt
"This is text file 0!"
现在执行相同的cat
命令,或者使用 vim 输入文本文件,显示文件完全是空的。
这个问题是由命令-o ro,noload
中的参数引起的吗mount
?如果是这样,在尝试正常安装时如何避免该错误?如果不是,是否有任何已知的原因导致这种行为?我知道我的 nbdkit 插件可以工作,因为它使用 guestfish 可以完全正常工作,但使用 nbd-client 1. 我无法在我的文件系统上安装除 ext4 之外的任何内容(例如,即使添加-t xfs
标签时),并且 2. 文件内容完全完整删除了。