我有许多要导出的 ZFS 文件系统:
$ sudo zfs get sharenfs
NAME PROPERTY VALUE SOURCE
zpool0 sharenfs off local
zpool0/books sharenfs [email protected]/24 local
zpool0/music sharenfs [email protected]/24 local
zpool0/photo sharenfs [email protected]/24 local
zpool0/video sharenfs [email protected]/24 local
[...]
这些是唯一打算通过 NFS 导出的文件系统,因此它们未在中列出/etc/exports
:
$ grep -v '^#' < /etc/exports | wc -c
0
不幸的是,这似乎意味着 nfs 内核服务不会注册 ZFS 系统导出相关文件系统所需的各种 RPC 服务:
$ sudo systemctl status nfs-kernel-server.service
● nfs-kernel-server.service - LSB: Kernel NFS server support
Loaded: loaded (/etc/init.d/nfs-kernel-server)
Active: active (exited) since Sun 2017-06-25 13:18:48 IST; 10h ago
Process: 3867 ExecStart=/etc/init.d/nfs-kernel-server start (code=exited, status=0/SUCCESS)
Jun 25 13:18:48 jupiter nfs-kernel-server[3867]: \\
Not starting NFS kernel daemon: no exports. ... (warning).
Jun 25 13:18:48 jupiter systemd[1]: Started LSB: Kernel NFS server support.
(我在标记处添加了换行符,\\
以便清楚地显示相关消息)。
因此,所需的 RPC 服务未注册:
$ /usr/sbin/rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 60457 status
100024 1 tcp 55306 status
请注意,例如 mount 和 stat 服务未注册。因此,ZFS 无法导出自己的文件系统。
我在 Debian 8.8 版本上看到这个问题:
$ dpkg -l nfs-kernel-server zfsutils-linux
[...]
ii nfs-kernel-server 1:1.2.8-9 amd64 support for NFS kernel server
ii zfsutils-linux 0.6.5.9-2~bpo8+1 amd64 command-line tools to manage OpenZFS filesystems
这曾经确实有效,但由于我很少重新启动 NFS 服务器,因此当我上次启动它时,可能有一些条目/etc/exports
可以防止此问题。
我相信我已经正确设置 ZFS 来导出文件系统:
$ grep -B2 ZFS_SHARE /etc/default/zfs
# Run `zfs share -a` during system start?
# nb: The shareiscsi, sharenfs, and sharesmb dataset properties.
ZFS_SHARE='yes'
我有什么想法可以解决这个问题吗?我可以手动破解这个条件/etc/init.d/nfs-kernel-server
...
if [ -f /etc/exports ] && grep -q '^[[:space:]]*[^#]*/' $export_files
then
do_modprobe nfsd
...但这似乎不优雅,并且可能会被未来的更新所扭转。
有什么建议么?
答案1
重读后Aaron Toponce 的出色指南/etc/exports
我相信最好的解决方法是按照他的描述放入一个虚拟导出这里:
$ echo '/mnt localhost(ro)' >> /etc/exports
$ sudo /etc/init.d/nfs-kernel-server start
$ showmount -e hostname.example.com
Export list for hostname.example.com:
/mnt localhost
请注意,上面我们/etc/exports
通过重定向进行编辑,因此尽管有 shell 提示,但可能必须以 root 身份运行$
。