Alpine Linux 3.12.0 -> rpc.statd が起動しないため NFSMount が失敗する

Alpine Linux 3.12.0 -> rpc.statd が起動しないため NFSMount が失敗する

かなり検索してみたところ、類似の問題は見つかりましたが、私にとって有効な修正方法は見つかりませんでした。

私は Proxmox 上で Alpine LXC を実行しています。これは特権コンテナであり、NFS マウントが有効になっています。

mount コマンドを使用して NFS 共有を手動でマウントできます。その後、/etc/fstab にマウントを追加し、再起動時を除いて動作しています。

起動時にこれを処理するために nfsmount サービスを開始/有効化する必要があると読みました。ただし、そのサービスを有効にしようとすると、次のようなエラーが発生します。

 * Starting NFS statd ...
 * start-stop-daemon: failed to start `/usr/sbin/rpc.statd'                                                                                                         [ !! ]
 * ERROR: rpc.statd failed to start
 * ERROR: cannot start nfsmount as rpc.statd would not start

/usr/sbin ディレクトリを確認すると、rpc.statd がないことがわかります。Alpine のリポジトリでは、nfs-utils がインストールされている場合は rpc.statd もインストールする必要があることが示されていますが、他の rpc ディレクトリはインストールされています。

以前の Alpine バージョンのリポジトリを追加し、ロールバックされた nfs-utils をインストールしました。これにより、/usr/sbin に rpc.statd ファイルが正常に提供されますが、起動に失敗します。

答え1

したがって、根本的な問題は解決されず、nfsmount はまだ起動しません。

しかし、LXC コンテナ内で NFS 共有を自動マウントする方法を探している人には、解決策があります。

最初に if-up.d の場所にスクリプトを追加しようとしましたが、LXC コンテナーは通常のインストールで実行されるすべての init セクションを起動しないようです。

私の解決策は、rc-update add local defaultでlocal.dサービスを有効にすることでした。

次に、ネットワーク インターフェイスが起動しているかどうかを確認した後、mount -a オプションを呼び出す bash スクリプトとして、/etc/local.d/ に「fstab.local」というファイルを配置しました。

答え2

少し古い回答ですが、参考になります。

NFS を自動的に起動できるようにするには、Alpine に「ファイル機能」が必要ですが、これは /usr/share/lxc/config/alpine.common.conf ファイルではデフォルトで削除されています。

lxc.cap.drop = setpcap

機能ビットの説明については、を参照してくださいman capabilities。これを修正する方法はいくつかあります。alpine.common.conf ファイルを更新して、上記の行をコメントアウトできます (私の alpine コンテナのほとんどが NFS を使用しているため、これが私の選択です)。ただし、更新によってリセットされることに注意してください。そのため、更新後にファイルを確認/変更することを忘れないようにしてください。または、個々のコンテナの .conf ファイルを変更することもできます。このファイルは、/etc/pve/lxc/####.conf (#### はコンテナ ID) にあります。機能をリセットしてから、共通および alpine 構成に従って機能を再度ドロップする必要があります。個々のファイルを変更したときに、これを実行するために次の操作を使用しました。これは、私のシステムでは /usr/local/bin/alpine-enable-nfs.sh として保存されていたため、次のように入力するとalpine-enable-nsf.sh 1492、コンテナ 1492 に NFS を許可する機能が設定されました。

#!/bin/bash
defdir=/usr/share/lxc/config
cfile=/etc/pve/lxc/${1}.conf
if [ ! -r ${cfile} ] ; then
  echo "usage: ${0##*/} IDNO"
  exit
fi
if grep -q "lxc.cap.drop" ${cfile} ; then
  echo "File has lxc.cap.drop configurations already"
  exit
fi
if ! grep -q "ostype: alpine" ${cfile} ; then
  echo "Container ID: ${1} is not alpine."
  exit
fi
echo "# Reset capabilities" >> ${cfile}
echo "lxc.cap.drop:" >> ${cfile}
grep cap ${defdir}/common.conf >> ${cfile}
sed -n "/cap/{/setpcap/s/^/#/;p}" ${defdir}/alpine.common.conf >> ${cfile}
grep cap ${cfile}
echo -e "\nNFS should now be available in container #${1}"

執筆時点では、コンテナ構成に次の内容が追加されるはずです。

# Reset capabilities
lxc.cap.drop:
# Drop some harmful capabilities
lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
# Drop another (potentially) harmful capabilities.
lxc.cap.drop = audit_write
lxc.cap.drop = ipc_owner
lxc.cap.drop = mknod
#lxc.cap.drop = setpcap
lxc.cap.drop = sys_nice
lxc.cap.drop = sys_pacct
lxc.cap.drop = sys_rawio
lxc.cap.drop = sys_resource
lxc.cap.drop = sys_tty_config
lxc.cap.drop = syslog
lxc.cap.drop = wake_alarm

setpcap 行がコメントアウトされていることに注意してください (先頭に # があります)

これを有効にするには、コンテナを停止して起動する必要があります (コンテナを再起動しても変更は反映されません。停止してから再度起動する必要があります)

ホストに NFS 共有をマウントするのが「正しい」方法だと言う人もいますが、私にとっては問題があります。なぜなら、数十個の alpine コンテナーがあり、それらすべてがさまざまな用途でいくつかの異なるサーバーから異なる NFS 共有をマウントしており、その中にはホストで直接利用できないものも含まれているため、このアプローチを採用しているからです。

関連情報