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 目錄也是如此。

我新增了先前 Alpine 版本的儲存庫並安裝了回滾的 nfs-utils。這成功地為我提供了 /usr/sbin 中的 rpc.statd 文件,但仍然無法啟動。

答案1

所以我沒有解決根本問題,nfsmount仍然無法啟動。

然而,對於任何尋找在 LXC 容器內自動掛載 NFS 共享的方法的人來說,我確實有一個解決方案。

我首先嘗試將腳本新增至 if-up.d 位置,但 LXC 容器似乎不會啟動典型安裝所會啟動的所有 init 部分。

我的解決方案是使用 rc-update add local default 啟用 local.d 服務

然後我在 /etc/local.d/ 中放置了一個名為「fstab.local」的檔案作為 bash 腳本,該腳本在檢查網路介面是否啟動後呼叫 mount -a 選項。

答案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。您需要重設功能,然後根據常見配置和高山配置重新刪除功能。當我執行單一檔案時,我使用以下命令來執行此操作,它在我的系統上儲存為 /usr/local/bin/alpine-enable-nfs.sh ,因此我可以鍵入alpine-enable-nsf.sh 1492,容器1492 將具有設定為允許的功能網路檔案系統:

#!/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共享以用於各種用途,包括一些主機無法直接使用的內容,因此採用了這種方法。

相關內容