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
# 

したがって、私が知る限り、接続性は問題ではありません。

man ページによると、/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を自動マウントすることは通常行われていないようです。これ、情報はかなり少ないです。

もちろん、いつでも永続的にマウントできますが、私は慣習に少しこだわる傾向があるので、今のところはそうではありません。 :)

いくつかの方向性としては、感謝の気持ちが挙げられます。

(あ、もしあなたが不思議に思っているなら、私は amd を使用する FreeBSD の方法を試しましたが、うまくいきませんでした。ただし、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 から始まる理由がよくわかりません。automount に渡す正しいオプションは何でしょうか?

編集: 指摘したように、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) 経由でマウントされず、代わりにバージョン 2 の udp 経由でマウントされる理由がわかりません。

編集: 提案されたとおり、次の構成を試みました。

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/マスター:

/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 マウント/アンマウント コマンドに関しては、OpenBSD の amd の infodoc に、引数の最初の要素は実行するプログラムであり、2 番目の引数は $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 node

-x10 の前に 'mount_nfs' を入れると (アンマウント プログラムでも同様)、構文エラーは解決しましたが、この場合、「-a mount_point にマウントしてシンボリック リンクを作成する」という処理全体が自動的に処理されないことがわかりました。ラッパー スクリプトを書こうかと考えましたが、代わりに次のスクリプトを採用しました。

/defaults type:=nfs; jspiegel rhost:=NFS_HOST;rfs:=NFS_EXPORT_PATH/${key};opts:="rw,tcp,intr"

私の場合、NIS 経由で auto.home を取得していますが、その構文は Linux の NFS マウントに固有のものです。そのため、auto.home で yppoll を実行する cronjob を実行し、サーバーに新しいものがある場合はそれをプルダウンして、基本的に 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

最後の編集でのマウント コマンドが間違っていると思います。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 = amd の -a パラメータ 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/

プログラム パラメータなしで、つまりマウント コマンドを直接使用せずに動作するはずです。しかし、私は現在、amd を使用しません...

関連情報