*** 注意 ***
Debianはinit daemonとしてsystemdを採用している。
個人的な趣味から今回の問題が起きたPCではsystemdを入れていない (sysvinitで運用)。おそらく、maintenanceされていないsysvinit用のscriptが原因でこのような問題が発生したと考える。
よって、普通にsystemdを使っているuserにはaffectしない。
*** 注意ここまで ***
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されていないからと考えられる。