我搜索了很多次,发现了类似的问题,但没有找到对我有用的解决方案。
我在 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 的 repo 显示在安装 nfs-utils 时应该引入它,其他 rpc 目录也是如此。
我添加了以前版本的 Alpine 的 repo,并安装了回滚的 nfs-utils。这成功地为我提供了 /usr/sbin 中的 rpc.statd 文件,但仍然无法启动。
答案1
所以我没有解决根本问题,nfsmount 仍然无法启动。
但是,对于任何想要在 LXC 容器内自动挂载 NFS 共享的人来说,我确实有一个解决方案。
我首先尝试将脚本添加到 if-up.d 位置,但似乎 LXC 容器不会启动典型安装所需的所有 init 部分。
我的解决方案是使用 rc-update add local default 启用 local.d 服务
然后,我将一个名为“fstab.local”的文件放在 /etc/local.d/ 中,作为一个 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。您需要重置功能,然后根据通用和 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 共享以用于各种用途,其中包括一些不能直接供主机使用的共享,因此采用这种方法。