OpenBSD 配置:客户端无法使用 Berkeley Automounter (amd) 通过 NFS 挂载

OpenBSD 配置:客户端无法使用 Berkeley Automounter (amd) 通过 NFS 挂载

我想要做的是让我的 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 命令。但我现在不知道...

相关内容