当前位置:
文章详情

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

2024-03-14 11:47:08 18点赞 135收藏 14评论

大家好,我是爱学习爱折腾的vicai,应值友需求,这篇来讲讲PVE LXC容器下如何挂载和访问常见的NAS服务,也作为我学习使用Linux系统的个人记录。篇幅较长,知识点较多,我尽量把逻辑思路讲清楚,如果没耐心看完可以先关注收藏,谢谢在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

一般家庭NAS用户用的最多的就是SMB、NFS和Webdav这三种文件服务协议。前两者适合内网传输场景,后者适合外网使用。在PVE系统中,NAS服务不仅可以来自内外网络上的物理机(如群晖威联通、极空间等NAS),也可以来自pve内创建的虚拟机(如Windows、Unraid、OVM、Openwrt、iStore、CasaOS)和LXC容器(如TurnkeyFS、Alist等)。

一、准备工作

以最常见的群晖为例,先在控制面板>文件服务中开启相关的NAS服务:

开启NFS服务开启NFS服务开启WebDAV服务,需先安装WebDAV Server套件开启WebDAV服务,需先安装WebDAV Server套件

然后在共享文件夹中新建共享,设定用户权限:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

如果是NFS服务,需要再设定NFS客户端IP及权限:

群晖NFS权限设置群晖NFS权限设置

PVE及其它Linux系统也可以手动部署NAS服务,例如搭建一个简单的Samba服务器

此外,PVE上需先创建好LXC容器,作为访问NAS服务的客户端,具体步骤参考:

总而言之,无论你的NAS服务是部署在物理机还是PVE虚拟机甚至LXC容器下,对于客户端最重要的事情是检查NAS服务器设置,并记录:

- 服务器IP:端口/域名

- 共享目录路径

- 用于访问服务器的用户名和密码

二、挂载流程

2.1 特权LXC容器内挂载NAS服务(推荐)

PVE容器想要挂载NAS服务,官方优先推荐特权LXC容器,以基于Debian/Ubuntu系统的LXC容器为例:

基础流程概览

  1. 容器开启NAS相关功能

  2. 容器内安装NAS客户端

    2.1.测试与服务器的连接

  3. 容器内创建挂载点(目录)

  4. 将NAS服务器共享目录挂载到容器目录下

  5. 设置容器开机自动挂载

挂载SMB:

1. 在PVE的web界面,选择容器,在选项-功能中勾选SMB/CIFS:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

以下操作在LXC容器控制台内执行:

2 安装smb/cifs客户端:

apt-get install cifs-utils -y

2.1 测试与smb服务器的连接:

#安装samba-client

apt install samba-client

#使用samba-client登录SMB服务器

smbclient -L //SMB服务器IP/共享目录名 -U samba用户名

输出目录表示连接成功输出目录表示连接成功

3. 创建挂载点:

mkdir /mnt/smb

4. 将SMB服务器上的共享目录挂载到lxc容器内:

mount.cifs //SMB服务器ip地址/共享目录名 /mnt/smb -o user=smb用户名,pass=密码,vers=2.0

5. 设置开机自动挂载

# 编辑/etc/fstab

nano /etc/fstab

# 添加挂载内容,重启后用df -h或ls查看自动挂载是否生效

//SMB服务器ip地址/共享目录名 /mnt/smb cifs defaults,username=账号,password=密码

挂载NFS:

1. 在容器选项-功能中勾选NFS:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

2. 安装nfs客户端:

apt-get install nfs-common -y

2.1 列出nfs服务器上可用的共享目录和允许访问的IP地址范围(可选):

# showmount -e NFS服务器ip地址

showmount 列出可用的挂载showmount 列出可用的挂载

3.创建挂载点:

mkdir /mnt/nfs

4.将nfs服务器上的共享目录挂载到lxc容器内:

mount NFS服务器ip地址:/共享目录名 /mnt/nfs

# 服务端nfs协议默认为v3版本:

mount 192.168.2.163:/volume1/NFShare /mnt/nfs

# 服务端nfs协议为v4版本:

mount -t nfs4 192.168.2.163:/volume1/NFShare /mnt/nfs

5. 设置开机自动挂载

# 编辑/etc/fstab:

nano /etc/fstab

# 添加挂载内容,重启后用df -h或ls查看自动挂载是否生效:

//NFS服务器ip地址:/共享目录名 /mnt/smb nfs auto,nolock 0 0

挂载WebDAV:

PVE可以通过davfs、rclone、部署Nginx/Apache等方式挂载WebDAV,这里以davfs为例:

1. 在容器选项-功能中勾选FUSE:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

2. 安装WebDAV客户端协议:

apt-get install davfs2 -y

apt-get install neon -y

#davfs2编译时依赖于neon,neon是一个WebDAV client library. 如果要编译安装davfs2,需要安装neon

#dsvfs2在mount时会使用fuse或是coda这两个文件系统,前者一般linux系统都会自带,davfs2在mount时会首先尝试使用fuse。

2.创建挂载点:

mkdir /mnt/webdav

3.将WebDAV服务器上的共享目录挂载到lxc容器内:

mount -t davfs http://服务器ip或者域名:端口号/dav /mnt/webdav

根据提示输入用户名和密码即可。

4. 设置开机自动挂载

# 编辑/etc/fstab:

nano /etc/fstab

# 添加配置:

https://服务器ip或域名:端口号/dav /mnt/webdav davfs user,noauto,uid=用户名,file_mode=600,dir_mode=700 0 1

2.2 无特权LXC容器内挂载NAS服务(不推荐)

无特权的容器不支持NFS和SMB/CIFS:

非特权LXC容器无法勾选NFS和SMB功能非特权LXC容器无法勾选NFS和SMB功能

如果强行用mount命令挂载大部分会报错:

mount: permission denied(are you root?)

mount.nfs: Operation not permitted

mount.nfs: not installed setuid - "user" NFS mounts not supported.

....

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

这意味着想要挂载NAS得另辟蹊径。

最简单粗暴的方案:将无特权容器改为特权容器

如果没啥重要数据,那就删除当前容器重建为特权容器就完事。但就是不想删除呢?可以尝试更改该容器的配置文件(可能会有安全问题)。

LXC容器的配置文件通常在/etc/pve/lxc下,然后在pve shell输入

nano /etc/pve/lxc/<LXC容器ID>.conf

修改unprivileged修改unprivileged

将unprivileged: 1改成unprivileged: 0,然后保存重启LXC容器,即可在图形界面开启NFS和SMB功能。

lxc容器对SMB/NFS等文件服务的访问限制主要来源是Apparmor安全模块,也可以在这个配置文件中追加一行:

lxc.apparmor.profile: unconfined

直接取消lxc.apparmor的限制,之后的操作参考上面的2.1特权容器挂载流程即可。

安全通用方案:将宿主机共享目录映射到容器内目录(推荐)

虽然无特权LXC容器不支持挂载SMB或NFS共享目录,但是PVE系统本身肯定是支持的,因此可以先将远程NAS服务器挂载到PVE宿主机的目录下,再将此目录映射到无特权LXC容器,这个过程称为bind mount point(绑定挂载点)。如果你像我一样之前已经使用无特权容器部署了一些服务,想临时挂载NAS不想删除重建容器,或者某些服务必须要在无特权容器下运行(如TurnkeyFS),可以考虑这个方案。相对于命令行,这个方案可以在WEB图形界面下直接操作,更为方便。步骤如下:

1. 数据中心-存储-添加:选择要挂载的NAS服务(仅限NFS/SMB

PVE添加SMB/CIFS存储PVE添加SMB/CIFS存储

在弹出的界面中填写以下内容:

ID:自定义PVE宿主机下的目录名称,会自动创建路径 /mnt/pve/<目录名>作为挂载点

服务器:NAS服务器的IP地址

用户名、密码:访问SMB服务器的用户名和密码

Export:选择NFS服务器上的共享目录

Share:选择SMB服务器上的共享目录

内容:存储的数据类型,默认为磁盘映像,会在挂载点下自动生成/images文件夹

添加SMB/CIFS添加SMB/CIFS添加NFS添加NFS

添加完成后可以看到共享目录的路径(后面会用到):

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务
  1. 在PVE shell中执行命令:

pct set -mpX /宿主机共享目录的路径,mp=/挂载到LXC容器中的路径

将pve宿主机的路径/目标映射到LXC容器中:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

执行成功会在LXC容器的资源页中看到挂载点:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

同时也会出现在该容器的conf配置文件中:

在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务

也就是说:

pct set 103 -mp0 /mnt/pve/nfs,mp=/mnt/nfs

这条命令等同于在 /etc/pve/lxc/103.conf 中添加一行:

mp0: /mnt/pve/nfs,mp=/mnt/nfs

3. 在lxc容器内执行chmod给mp挂载点赋予读写权限

chmod 777 /mnt/nfs

需要注意的是,如果你服务器上硬盘的文件系统是ext4之类,极有可能会遭遇权限问题导致LXC容器无法对绑定挂载的宿主机目录进行读/写访问。这是因为PVE默认将LXC容器ID映射为宿主机容器ID+100000 ,例如LXC容器中id=0的root用户在宿主机上实际上是id=100000的普通用户,并不具备id=0的root用户的访问权限,这种情况下,还需要在宿主机上对id=100000的普通用户给宿主机共享目录赋权,并将其id映射到LXC容器中。

chmod -R 100000:100000 /mnt/pve/nfs

ls命令查看是否挂载成功:

验证挂载验证挂载

折腾方案:创建适用于特定LXC容器的Apparmor Profile

LXC容器会在运行时加载Apparmor安全模块,Apparmor的配置文件存放在 /etc/apparmor.d/lxc 目录下,但除非LXC指定这些配置文件否则默认不会被加载。可以通过ls命令查看该目录下的配置文件:

ls -l /etc/apparmor.d/lxc total 18 -rw-r--r-- 1 root root 558 Apr 16 2016 lxc-default -rw-r--r-- 1 root root 528 Dec 2 08:39 lxc-default-cgns -rw-r--r-- 1 root root 544 Dec 2 2015 lxc-default-with-mounting -rw-r--r-- 1 root root 527 Dec 2 08:39 lxc-default-with-nesting

可以看到一共有四个基本配置文件,分别是:

  • lxc-default: lxc默认Apparmor配置文件

  • lxc-default-cgns:lxc cgroup相关配置文件

  • lxc-default-with-mounting:lxc挂载功能相关配置文件

  • lxc-default-with-nesting:lxc嵌套功能相关配置文件

以挂载NFS为例,可以通过创建专门的Apparmor配置文件来让某个无特权LXC容器挂载NFS(注:PVE7.4版本这个方案似乎失效了,我测试还是报错Operation not permitted,不知道是不是出于安全官方删除了对NFS的支持,还请站内PVE大佬指教),以下是具体流程:

首先停止容器,pve宿主机拷贝lxc-default-cgns配置文件并命名为lxc-default-with-nfs,然后编辑这个文件:

nano /etc/apparmor.d/lxc/lxc-default-with-nfs

修改为:

profile lxc-container-default-with-nfs flags=(attach_disconnected,mediate_deleted) {
#include
deny mount fstype=devpts,
mount fstype=cgroup -> /sys/fs/cgroup/**,
mount fstype=cgroup2 -> /sys/fs/cgroup/**,
mount fstype=overlay,

mount fstype=nfs*, mount fstype=rpc_pipefs,

}

然后在你的无特权LXC容器的配置文件中加载这个profile:

echo "lxc.apparmor.profile : lxc-default-with-nfs" >> /etc/pve/lxc/你的LXC ID.conf

之后重启apparmor和容器:

systemctl reload apparmor

pct restart

后续按2.1挂载NFS的流程使用mount命令挂载即可。

三、参考资料

https://pve.proxmox.com/wiki/Unprivileged_LXC_containers

https://unix.stackexchange.com/questions/450308/how-to-allow-specific-proxmox-lxc-containers-to-mount-nfs-shares-on-the-network

https://forum.proxmox.com/threads/nfs-file-system-mount-problem-apparmor.31706/

https://forum.proxmox.com/threads/tutorial-unprivileged-lxcs-mount-cifs-shares.101795/

展开 收起
14评论

  • 精彩
  • 最新
  • 3. 在lxc容器内执行chmod给mp挂载点赋予读写权限

    chmod 777 /mnt/nfs

    需要注意的是,如果你服务器上硬盘的文件系统是ext4之类,极有可能会遭遇权限问题导致LXC容器无法对绑定挂载的宿主机目录进行读/写访问。这是因为PVE默认将LXC容器ID映射为宿主机容器ID+100000 ,例如LXC容器中id=0的root用户在宿主机上实际上是id=100000的普通用户,并不具备id=0的root用户的访问权限,这种情况下,还需要在宿主机上对id=100000的普通用户给宿主机共享目录赋权,并将其id映射到LXC容器中。

    chmod -R 100000:100000 /mnt/pve/nfs


    大佬这步失败 能否详细解释一下

    校验提示文案

    提交
  • emby媒体库挂载/mnt/nfs,好像扫描不出影片,ls,可以看到文件夹。

    校验提示文案

    提交
    给emby赋予读写权限了吗

    校验提示文案

    提交
    大佬,# showmount -e NFS服务器ip地址,这个是nfsIP地址是群晖的IP地址吗,这么输入没有反应

    校验提示文案

    提交
    还有6条回复
    收起所有回复
  • 不明觉厉

    校验提示文案

    提交
  • 感谢大佬,周末试试

    校验提示文案

    提交
  • 太强了,挂载NFS原来可以有这么多种实现方式,总有一种适合能用的!

    校验提示文案

    提交
  • root@qbittorrent:~# chmod 777 /mnt/Downloads
    chmod: changing permissions of '/mnt/Downloads': Operation not permitted
    lxc内的报错怎么解决,能看到文件,但是没有对目录的读写权限

    校验提示文案

    提交
提示信息

取消
确认
评论举报

最新文章 热门文章
135
扫一下,分享更方便,购买更轻松