2018年10月21日日曜日

Debian sidでnfsdが立ち上がらなくなったのでscriptを修正 (sysvinit)

*** 注意 ***

Debianはinit daemonとしてsystemdを採用している。

個人的な趣味から今回の問題が起きたPCではsystemdを入れていない (sysvinitで運用)。おそらく、maintenanceされていないsysvinit用のscriptが原因でこのような問題が発生したと考える。

よって、普通にsystemdを使っているuserにはaffectしない。

*** 注意ここまで ***


大容量HDDを搭載したPCでnfsdを立ち上げて、LAN内にあるPCからNFSv4でmountできるようにしてあるのだが、kernelのupgrade後にmountできなくなった。

Debianでは、NFSの機能がnfs-commonとnfs-kernel-serverに分割されている。このうちnfs-commonの方は問題なかった。

一方、nfsdが立ち上がっていないし、以下のようなmessageも出るので、nfs-kerrnel-server側のscript内でerrorが発生しているとわかった。

% sudo service nfs-kernel-server restart
[ ok ] Stopping NFS kernel daemon: mountd nfsd.
[ ok ] Unexporting directories for NFS kernel daemon....
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd
[warn] Not starting: portmapper is not running ... (warning).

script (/etc/init.d/nfs-kernel-server)を眺めてみると、92-99行にportmapperがどうのというwarningを出力する箇所で、rpcinfoというcommandへのpathが$PREFIX/sbin/rpcinfoとなっている:

        # See if rpcbind is running
        $PREFIX/bin/rpcinfo -p >/dev/null 2>&1
        RET=$?
        if [ $RET != 0 ]; then
            echo
            log_warning_msg "Not starting: portmapper is not running"
            exit 0
        fi

rpcinfoのreturn valueがnon zeroなのでifに引っ掛かってexit 0している訳だ。

rpcinfoがどういう出力なのか確かめてみようと打ってみる:

% sudo /usr/sbin/rpcinfo -p
sudo: /usr/sbin/rpcinfo: command not found

/usr/sbin/rpcinfoが存在しない。では、rpcinfoがどのpackageに含まれているのか (あるいは存在しないのか)調べてみる:

% dpkg -S rpcinfo
rpcbind: /usr/bin/rpcinfo
nmap-common: /usr/share/nmap/scripts/rpcinfo.nse
rpcbind: /usr/share/man/man8/rpcinfo.8.gz

sbinじゃなくてbinになっている。移動したようだ。では改めて:

% /usr/bin/rpcinfo -p                                         
   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  57281  status
    100024    1   tcp  59599  status
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049
    100003    3   udp   2049  nfs
    100227    3   udp   2049
    100021    1   udp  49265  nlockmgr
    100021    3   udp  49265  nlockmgr
    100021    4   udp  49265  nlockmgr
    100021    1   tcp  33993  nlockmgr
    100021    3   tcp  33993  nlockmgr
    100021    4   tcp  33993  nlockmgr
    100005    1   udp  49349  mountd
    100005    1   tcp  53921  mountd
    100005    2   udp  60977  mountd
    100005    2   tcp  32831  mountd
    100005    3   udp  52847  mountd
    100005    3   tcp  49695  mountd

scriptではrpcinfoの実行結果 (というか出力は/dev/nullに棄てて、return valueだけを見て)からportmapperがsupportされているかどうかを確認していた。この出力を見る限り、portmapperはsupportされていると分かる。

scriptの当該箇所を修正 ($PREFIX/sbin/rpcinfo → $PREFIX/bin/rpcinfo) して、改めて試してみる:

% sudo service nfs-kernel-server restart
[ ok ] Stopping NFS kernel daemon: mountd nfsd.
[ ok ] Unexporting directories for NFS kernel daemon....
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd mountdrpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
. ok 

ここでtcp6やudp6に関するerror或いはwarningが出ているのは、IPv6を使ってないのでkernel levelでsupportを切っているため。明示的に使っていなくても切らない方がいいのかも知れない。或いは、/etc/netconfigのtcp6とudp6の行をcomment outする手もある。

何れにしてもnfsdが立ち上がるようになり、NFS clientからもmountできるようになった。

今回このような問題が発生したのは、Debianではinit daemonがsystemdに変更されたため、sysvinitに由来するscriptが既にmaintenanceされていないからと考えられる。


0 件のコメント:

コメントを投稿