我想要做的是让我的 openBSD 客户端 (OpenBSD 4.9) 自动挂载 Linux NFS 文件系统 (Scientific Linux 6.1)。到目前为止,我不确定它是否配置正确。
为了解决问题,我可以手动挂载 nfs:
# mount_nfs -T -3 192.168.15.100:/exports /mnt
# ls -la /mnt
total 52
drwxr-xr-x 7 root wheel 4096 Oct 4 22:42 .
drwxr-xr-x 16 root wheel 512 Nov 26 16:33 ..
drwxrwxr-x 5 _sndio _sndio 4096 Oct 31 21:58 centos
drwxr-xr-x 15 root wheel 4096 Nov 6 09:17 home
drwxr-xr-x 5 root wheel 4096 Oct 31 21:27 sl
drwxr-xr-x 3 root wheel 4096 Nov 19 16:02 sles
drwxr-xr-x 17 503 503 4096 Nov 10 17:37 users
#
所以据我所知,连接性不是问题。
根据手册页,在 /etc/amd/auto.home 中配置以下内容:
/defaults type:=nfs;sublink:=${key};opts:=rw,soft,intr,vers=3,proto=tcp
* rhost:=192.168.15.100;rfs:=/exports
反过来,/etc/amd/master 配置如下:
# cat /etc/amd/master
/exports amd.home
重新启动后,我可以看到挂载,但奇怪的是,看到的不是主机名:
amd:24490 0 0 0 100% /exports
据我所知,amd 的行为与 FreeBSD 略有不同。不过,我还是尝试了一下它是否可以自动挂载。
没有:
ksh: cd: /exports/users - Resource temporarily unavailable
# cd /exports/192.168.15.100/host/users
ksh: cd: /exports/192.168.15.100/host/users - Resource temporarily unavailable
在 google 上搜索没有太大帮助 - 似乎使用 OpenBSD 自动挂载 NFS 并不是通常的做法。除了这,信息相当稀少。
当然,我可以一直永久地安装它,但是我倾向于对惯例有点严格,所以现在不行。:)
某些方向会令人感激。
(哦,如果您好奇的话,我尝试了 FreeBSD 中使用 amd 的方式,但没有成功 - 虽然我不介意解释一下 FreeBSD 实现方式和 OpenBSD 实现方式之间的区别)
更新:在多次重写映射文件之后,我可以使用以下配置与 NFS 服务器进行实际通信:
/defaults type:=nfs;rhost:=kerberos.monzell.com;rfs:=/exports;\
sublink:=${key};opts:=rw,nodev,nosuid,soft,intr,tcp,resvport
* ${host}==${rhost};type:=nfs;fs:=${rfs};opts:=rw,nodev,nosuid,soft,intr,tcp,resvport
然而,由于某种原因,似乎 amd 只会默认通过 udp 使用 NFS 版本 2:
# tcpdump dst kerberos
tcpdump: listening on pcn0, link-type EN10MB
tcpdump: WARNING: compensating for unaligned libpcap packets
20:38:28.558385 openbsd.monzell.com.856 > kerberos.monzell.com.sunrpc: udp 100
20:38:28.559154 openbsd.monzell.com.856 > kerberos.monzell.com.892: udp 96
20:38:30.592761 openbsd.monzell.com.856 > kerberos.monzell.com.nfsd: xid 0x22000000 (NFSv2) 40 null
20:38:33.558107 arp reply openbsd.monzell.com is-at 52:54:00:52:8f:66
我尝试了各种选项来强制它尝试以 nfsv3 形式挂载,例如:
/defaults type:=nfs;rhost:=kerberos.monzell.com;rfs:=/exports;\
sublink:=${key};opts:=rw,nodev,nosuid,soft,intr,vers=3,proto=tcp,resvport
* ${host}==${rhost};type:=nfs;fs:=${rfs};opts:=rw,nodev,nosuid,soft,intr,vers=3,proto=tcp,resvport
或者:
/defaults type:=nfs;rhost:=kerberos.monzell.com;rfs:=/exports;\
sublink:=${key};opts:=rw,nodev,nosuid,soft,intr,vers=-3,proto=tcp,resvport
* ${host}==${rhost};type:=nfs;fs:=${rfs};opts:=rw,nodev,nosuid,soft,intr,vers=3,proto=tcp,resvport
至今仍没有任何动静。
奇怪的是,OpenBSD 默认挂载版本为 3,所以我不确定为什么它会在 amd 中以版本 3 开始。传递给自动挂载的正确选项是什么?
编辑:正如我指出的那样,我可以通过 fstab 指向。为了证明这一点,下面是它:
kerberos:/exports /mnt nfs rw,nodev,nosuid,tcp,soft,intr 1 1
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/wd0a 290396 89032 186848 32% /
/dev/wd0k 3240316 1858940 1219364 60% /home
/dev/wd0d 448956 12 426500 0% /tmp
/dev/wd0f 1943196 903596 942444 49% /usr
/dev/wd0g 1105820 346852 703680 33% /usr/X11R6
/dev/wd0h 4387772 256560 3911824 6% /usr/local
/dev/wd0j 2137436 4 2030564 0% /usr/obj
/dev/wd0i 2137436 4 2030564 0% /usr/src
/dev/wd0e 498940 18676 455320 4% /var
amd:26660 0 0 0 100% /net
kerberos:/exports 103212280 66319088 31650312 68% /mnt
正如我所指出的,OpenBSD 首先通过版本 3 挂载,所以我不知道为什么在 amd 下它不通过版本 3(tcp)挂载,而是通过带有 udp 的版本 2 挂载。
编辑:根据建议,我尝试了以下配置:
defaults type:=nfs;fs:=${autodir}
# autodir = -a parameter of amd call = amd_mnt in rc.conf = /tmp_mnt
# Be careful with 'umount' and 'unmount' in the following.
remote type:=program;fs:=/mnt;\
mount:="/sbin/mount_nfs kerberos.monzell.com:/exports/";\
unmount:="/sbin/umount /mnt"
那回来了
# cd /net/remote
usage: [-23bcdilsTU] [-a maxreadahead] [-g maxgroups]
[-I readdirsize] [-o options] [-R retrycnt] [-r readsize]
[-t timeout] [-w writesize] [-x retrans] rhost:path node
ksh: cd: /net/remote - Operation not permitted
然后是这个:
defaults type:=nfs;fs:=${autodir}
# autodir = -a parameter of amd call = amd_mnt in rc.conf = /tmp_mnt
# Be careful with 'umount' and 'unmount' in the following.
remote type:=program;fs:=/mnt;\
mount:="/sbin/mount nfs kerberos.monzell.com:/exports/";\
unmount:="/sbin/umount /mnt"
返回的是:
# cd /net/remote
nfs: realpath kerberos.monzell.com:/exports/: No such file or directory
ksh: cd: /net/remote - Operation not permitted
还没有。
答案1
终于“搞清楚”了。我所做的就是将现有的 FreeBSD 映射文件复制到 /etc/amd/amd.net,如下所示:
/defaults type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key}
* opts:=rw,grpid,resvport,vers=3,proto=tcp,nosuid,nodev
{autodir} 设置为 amd 使用的默认目录(显然是 /tmp_mnt,而 ${rhost} 是键指定的远程主机(在 DNS 或 /etc/hosts 文件中查找主机名:
192.168.15.250 qnap qnap.monzell.com
最上面是主机目录。
然后我在根目录中创建了一个目录:
在 /etc/amd/master 中:
/host amd.net
然后我在根目录下创建一个主机目录。之后,它按预期工作。
$ df
Filesystem 512-blocks Used Avail Capacity Mounted on
/dev/wd0a 290396 89088 186792 32% /
/dev/wd0k 3240316 1858968 1219336 60% /home
/dev/wd0d 448956 12 426500 0% /tmp
/dev/wd0f 1943196 903596 942444 49% /usr
/dev/wd0g 1105820 346852 703680 33% /usr/X11R6
/dev/wd0h 4387772 256560 3911824 6% /usr/local
/dev/wd0j 2137436 4 2030564 0% /usr/obj
/dev/wd0i 2137436 4 2030564 0% /usr/src
/dev/wd0e 498940 18656 455340 4% /var
amd:9747 0 0 0 100% /host
qnap:/Public 1916713232 642213152 1274500080 34% /tmp_mnt/qnap/host/Public
qnap:/pub 1916713232 642213152 1274500080 34% /tmp_mnt/qnap/host/pub
qnap:/users 1916713232 642213152 1274500080 34% /tmp_mnt/qnap/host/users
看起来大多数 NFS 通信都需要通过主机进行,主机负责通过 NFSv3/TCP 进行远程挂载。任何直接通过 amd 进行远程挂载的尝试都将默认使用 udp,版本 2。
仍然不太了解 amd,但我让它工作了,这意味着我基本已经搞定了。:)
答案2
关于 type:=program mount/unmount 命令,OpenBSD 上 amd 的信息文档提到参数中的第一个元素是需要执行的程序,第二个参数是作为 $0 传入的。
所以如果我这样做
安装:=“/sbin/mount_nfs -x10 -3 -dt600 -r32768 -w32768 -o rw,tcp.intr 主机:/path/${key} /local/${key}”
我最终得到:
用法:-x10 [-23bcdilsTU] [-a maxreadahead] [-g maxgroups] [-I readdirsize] [-o options] [-R retrycnt] [-r readsize] [-t timeout] [-w writesize] [-x retrans] rhost:path 节点
将“mount_nfs”放在 -x10 前面(卸载程序也类似)解决了语法错误,但我发现整个“挂载到 -a mount_point 然后创建符号链接”的事情在这种情况下不会自动处理。我考虑写一个包装脚本,但最终还是选择了:
/默认类型:=nfs;jspiegel rhost:=NFS_HOST;rfs:=NFS_EXPORT_PATH/${key};opts:=“rw,tcp,intr”
就我而言,我通过 NIS 获取 auto.home,其中的语法特定于 linux 的 nfs 挂载,因此我执行一个 cronjob,在 auto.home 上执行 yppoll,如果服务器有较新的,我会将其拉下来并基本上通过 sed(1) 多次运行它并输出一个我已经读取的 auto.home.fixed 文件。并不完美,但所讨论的机器只是一个 YP 客户端,而不是从属机器,因此 yp/Makefile 中的任何内容都对我没有任何用处。
答案3
您可能不需要 amd。我自动挂载了许多 NFS 目录,我从来不需要 amd。使用 OpenBSD,您无需求助于 Google,只需求助于手册页。请参阅 fstab(5) 手册页,其中有以下示例:
server:/export/ports /usr/ports nfs rw,nodev,nosuid,soft,intr 0 0
答案4
我认为你最后编辑的 mount 命令是错误的。我对 BSD 了解不多,但让我们试一试。
defaults type:=nfs;fs:=${autodir} # autodir = -a parameter of amd call = amd_mnt in rc.conf = /tmp_mnt # Be careful with 'umount' and 'unmount' in the following. remote type:=program;fs:=/mnt;\ mount:="/sbin/mount_nfs kerberos.monzell.com:/exports/";\ unmount:="/sbin/umount /mnt"
那回来了
# cd /net/remote usage: [-23bcdilsTU] [-a maxreadahead] [-g maxgroups] [-I readdirsize] [-o options] [-R retrycnt] [-r readsize] [-t timeout] [-w writesize] [-x retrans] rhost:path node ksh: cd: /net/remote - Operation not permitted
因为它给出了使用输出,所以参数是错误的。在这种情况下,缺少目标目录。
然后是这个: defaults type:=nfs;fs:=${autodir} # autodir = -a paramd call = amd_mnt in rc.conf = /tmp_mnt # 请小心下面的 'umount' 和 'unmount'。 remote type:=program;fs:=/mnt;\ mount:="/sbin/mount nfs kerberos.monzell.com:/exports/";\ unmount:="/sbin/umount /mnt" 返回的是这个:
# cd /net/remote nfs: realpath kerberos.monzell.com:/exports/: No such file or directory ksh: cd: /net/remote - Operation not permitted
您错过-t
了/sbin/mount -t nfs kerberos.monzell.com:/exports/
。
我认为它应该可以在没有程序参数的情况下工作,即不直接使用 mount 命令。但我现在不知道...