折腾本腾
PVE文件管理新手指南 篇五:在特权/无特权LXC容器中挂载SMB/NFS/WebDAV等NAS服务_网络存储_什么值得买
00 分钟
2024-3-28
2024-9-28
type
status
date
slug
summary
tags
category
icon
password
URL
notion image
大家好,我是爱学习爱折腾的vicai,应值友需求,这篇来讲讲PVE LXC容器下如何挂载和访问常见的NAS服务,也作为我学习使用Linux系统的个人记录。篇幅较长,知识点较多,我尽量把逻辑思路讲清楚,如果没耐心看完可以先关注收藏,谢谢。
一般家庭NAS用户用的最多的就是SMB、NFS和Webdav这三种文件服务协议。前两者适合内网传输场景,后者适合外网使用。在PVE系统中,NAS服务不仅可以来自内外网络上的物理机(如群晖
威联通、极空间等NAS),也可以来自pve内创建的虚拟机(如Windows、Unraid、OVM、Openwrt、iStore、CasaOS)和LXC容器(如TurnkeyFS、Alist等)。

一、准备工作

以最常见的群晖为例,先在控制面板>文件服务中开启相关的NAS服务:
开启NFS服务
notion image
开启WebDAV服务,需先安装WebDAV Server套件
notion image
然后在共享文件夹中新建共享,设定用户权限:
如果是NFS服务,需要再设定NFS客户端IP及权限:
群晖NFS权限设置
notion image
PVE及其它Linux系统也可以手动部署NAS服务,例如搭建一个简单的Samba服务器
此外,PVE上需先创建好LXC容器,作为访问NAS服务的客户端,具体步骤参考:
总而言之,无论你的NAS服务是部署在物理机还是PVE虚拟机甚至LXC容器下,对于客户端最重要的事情是检查NAS服务器设置,并记录:
- 服务器IP:端口/域名
  • 共享目录路径
  • 用于访问服务器的用户名和密码

二、挂载流程

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

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

基础流程概览

  1. 容器开启NAS相关功能
  1. 容器内安装NAS客户端
    1. 2.1.测试与服务器的连接
  1. 容器内创建挂载点(目录)
  1. 将NAS服务器共享目录挂载到容器目录下
  1. 设置容器开机自动挂载

挂载SMB:

1. 在PVE的web界面,选择容器,在选项-功能中勾选SMB/CIFS:
以下操作在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用户名
输出目录表示连接成功
notion image
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:
notion image
2. 安装nfs客户端:
apt-get install nfs-common -y
2.1 列出nfs服务器上可用的共享目录和允许访问的IP地址范围(可选):
# showmount -e NFS服务器ip地址
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:
notion image
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功能
notion image
如果强行用mount命令挂载大部分会报错:
mount: permission denied(are you root?)
mount.nfs: Operation not permitted
mount.nfs: not installed setuid - "user" NFS mounts not supported.
....
notion image
这意味着想要挂载NAS得另辟蹊径。

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

如果没啥重要数据,那就删除当前容器重建为特权容器就完事。但就是不想删除呢?可以尝试更改该容器的配置文件(可能会有安全问题)。
LXC容器的配置文件通常在/etc/pve/lxc下,然后在pve shell输入
nano /etc/pve/lxc/<LXC容器ID>.conf
修改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存储
notion image
在弹出的界面中填写以下内容:
ID:自定义PVE宿主机下的目录名称,会自动创建路径 /mnt/pve/<目录名>作为挂载点
服务器:NAS服务器的IP地址
用户名、密码:访问SMB服务器的用户名和密码
Export:选择NFS服务器上的共享目录
Share:选择SMB服务器上的共享目录
内容:存储的数据类型,默认为磁盘映像,会在挂载点下自动生成/images文件夹
添加SMB/CIFS
notion image
notion image
添加NFS
添加完成后可以看到共享目录的路径(后面会用到):
notion image
  1. 在PVE shell中执行命令:
pct set -mpX /宿主机共享目录的路径,mp=/挂载到LXC容器中的路径
将pve宿主机的路径/目标映射到LXC容器中:
执行成功会在LXC容器的资源页中看到挂载点:
notion image
同时也会出现在该容器的conf配置文件中:
notion image
也就是说:
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命令查看是否挂载成功:
notion image
验证挂载

折腾方案:创建适用于特定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-nest
ing
可以看到一共有四个基本配置文件,分别是:
  • 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命令挂载即可。

三、参考资料

notion image
上一篇
PVE-LXC-docker 安装Emby/Plex前期准备 | NAS.LOL个人导航页及折腾日记
下一篇
Unraid ⚙️ - theme.park Docs

评论
Loading...