PVE部署OMV-LXC及安装Jellyfin
前言
上篇文章我在PVE上部署了OMV,一切都准备就绪,但发现传输速度其实也并没有非常快,大概也就比黑群晖快了一倍左右,并没有跑满带宽。于是我又翻阅了大量的资料和文章。(这里吐槽一下国内的环境,百度出来的内容都是千篇一律,有价值的东西真的很少)
LXC技术
为了解决性能问题,就需要更好的方式来部署,那么PVE除了可以创建虚拟机以外,还可以创建LXC容器,LXC技术是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,这类似于我们熟悉的docker。LXC容器有以下优势:
- 与宿主机使用同一个内核,性能损耗小
- 不需要指令级模拟
- 不需要即时(Just-in-time)编译
- 容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制
- 避免了准虚拟化和系统调用替换中的复杂性
- 轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享
那么LXC容器的性能肯定是优于普通虚拟机的。于是,我就想OMV可以使用LXC进行部署吗?其实这是可行的,因为OMV的底层系统就是在debian系统,我们只需要部署一个debian的LXC容器,然后在该容器上安装OMV即可。
PVE Helper Scripts
说起来简单,但其实部署需要花很多的时间,在我决定要开始手动部署的时候,竟然发现了一个PVE宝藏脚本,Proxmox VE Helper Scripts。这是一个用来自动化创建PVE虚拟机的脚本集合,只需要界面化交互即可。这让使用PVE更加简单了。
Github地址:https://github.com/tteck/Proxmox
脚本下载地址:https://tteck.github.io/Proxmox/
大家可以去这个项目的网站看一下,会有很多新的发现和理解,它是一个非常好的开源项目,强烈推荐使用PVE的人使用它。那么在其官网,是有OMV-LXC部署脚本的,这个脚本使用起来真是相当简单。

这个网站有非常多的实用脚本可以使用,我们就以OMV-LXC脚本开始吧。
创建OMV-LXC
相比我们手动部署OMV虚拟机,使用PVE-Helper-Scripts简直不要太简单。
-
首先我们在官网找到
OMV-LXC的脚本。

-
然后打开
PVE的shell命令终端,执行该脚本即可。

-
执行脚本命令后,会出现图形化界面,只需根据提示设置即可,非常简单。在这个过程中,会问你是否默认设置安装,可以选择
Advanced高级,根据提示去设置,主要是设置CPU,内存,硬盘等信息,硬盘我只给了20GB,用于安装系统和docker,之后会挂载新的硬盘。

-
安装过程中,需要根据提示,选择
debian 11,设置容器为特权容器(这个很重要),打开ssh等,然后等待安装完成即可,安装完成后,PVE管理页面左侧就会出现该虚拟机,这就安装完成了。 -
注意点:在
PVE中,LXC被称为CT。
设置OMV-LXC
虽然安装是比较简单的,但是当我们进入OMV-Web管理页面时,会发现没有磁盘可用,OMV无法发现磁盘。这才是整个部署过程中最难最花费时间的部分。
挂载硬盘
首先因为我只给了omv 20GB的磁盘,只为了装系统和简单使用docker而已。所以我需要挂载新的硬盘上去,但因为LXC容器是没有直通的,直接使用宿主机的资源。所以我们需要先将其他的硬盘作为lvm或目录挂载到PVE上。

在跟节点,选择磁盘,然后创建Volume Group,当然你也可以创建目录的形式,这些都是可以挂载到LXC容器的。在创建Volume Group时选择一个新的硬盘,如果没有新的硬盘,就无需创建,直接使用系统盘挂载到omv即可。
创建完成后,点开我们刚刚安装好的`omv-lxc`虚拟机,选择资源,点击左上角添加,添加挂载点即可。这里存储选择系统盘或者刚刚创建的即可。路径是挂载到`omv-lxc`中的路径。输入要挂载的磁盘大小即可。

设置硬盘
虽然我们挂载了磁盘,但是在omv中,我们还是无法使用,omv找不到这些挂载点。我们需要进行一些设置,让omv可以识别到。
查看挂载点Block Device
我们打开PVE,在PVE的shell执行以下代码,用来查询挂载点的Block Device:
lvdisplay

记住这个参数253:10,我们需要设置LXC容器的执行权限,并告诉OMV有这个磁盘。不管你挂载了多少磁盘,都是通过上面的命令来获取Block Device参数的。
创建挂载脚本
为了让OMV识别该挂载点,我们需要编写一个挂载脚本,我这里LXC容器ID是102,需要换成你LXC容器的ID,然后在脚本中填入需要识别的block device。
# 使用vim创建挂载脚本,也可以使用nano或vi
vim /var/lib/lxc/102/mount_hook.sh
# 将下面的内容放入脚本中,253 10 就是刚刚我们获取到的block device
#--------------------这是分隔符,忽略----------------------------
#!/bin/sh
mknod -m 777 ${LXC_ROOTFS_MOUNT}/dev/sda b 253 10
#--------------------这是分隔符,忽略----------------------------
这里需要说明的是,
/dev/sda是LXC容器内的设备,这个需要挂载后去 容器中查看 的。在容器中使用lsblk命令进行查看。例如,我这里是sda,所以是/dev/sda。这一步的对应,主要是为了在omv中存储器/磁盘中可以看到该磁盘。
设置LXC容器权限
上面设置好挂载点后,我们还需要将磁盘的权限给LXC容器开通,并将挂载脚本告诉LXC容器。这里我们只需要设置/etc/pve/lxc/[LXC_ID].conf文件即可,[LXC_ID]就是你的LXC容器ID。
# 编辑conf文件,102换成你LXC容器的ID
vim /etc/pve/lxc/102.conf
# 加入以下代码
# 其中253:10是磁盘挂载的block device
# lxc.hook.autodev用来设置挂载脚本
#--------------------这是分隔符,忽略----------------------------
lxc.apparmor.profile: unconfined
lxc.cgroup2.devices.allow: b 253:10 rwm
lxc.autodev: 1
lxc.hook.autodev: /var/lib/lxc/102/mount_hook.sh
#--------------------这是分隔符,忽略----------------------------
设置文件系统
-
修改完配置文件后,重启
LXC容器,然后登录omv网页即可看到磁盘了。 -
进入
omv存储器菜单 -> 点击文件系统 -> 挂载现有文件系统 即可。 -
剩下的设置SMB/NFS与上篇文章一样。
更新OMV
只需要执行以下命令进行更新即可。
omv-upgrade
安装docker及部署jellyfin
在omv中可以使用omv-extras安装docker,web页面有portainer进行管理。但新版已经将portainer移除,使用compose进行管理,易用性确实没有portainer强了。
我的想法是将jellyfin安装在LXC容器中,这样方便使用。不过在LXC容器中的omv安装compose插件时却出错了,根本无法安装,又因为已经没有了portainer进行管理,不如自己手动安装docker好了,顺便再安装portainer进行管理即可。
安装docker
- 更新apt及安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
- 添加官方
Docker GPG Key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
- 设置仓库
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 完成
# 查看版本
docker --version
# 查看运行状态
systemctl status docker
安装docker-compose(可选)
docker-compose可以不装,但是我比较喜欢使用docker-compose去写yaml脚本,然后再去运行容器,不需要输入一大堆命令。
# 下载docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 设置软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 赋予权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本,验证安装是否成功
docker-compose --version
部署portainer
- 创建docker-compose.yml
version: '3.2'
services:
portainer:
image: portainer/portainer-ce
container_name: portainer
restart: unless-stopped
security_opt:
- no-new-privileges:true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./portainer/data:/data
environment:
TZ: Asia/Sahnghai
LANG: en_US.UTF-8
ports:
- "9000:9000"
- 启动portainer
docker-compose up -d
部署jellyfin
我们可以通过portainer或者docker-compose进行部署。
Portainer部署jellyfin
-
创建容器,镜像为
nyanmisaka/jellyfin,端口为8096

-
设置挂载

-
设置设备挂载

-
部署容器

docker-compose部署jellyfin
- 编写
docker-compose.yml文件
version: '3.2'
services:
jellyfin:
image: nyanmisaka/jellyfin
container_name: jellyfin
restart: unless-stopped
volumes:
- /docker/jellyfin/config:/config
- /docker/jellyfin/cache:/cache
- /srv/dev-sda/media:/media
devices:
- /dev/dri:/dev/dri
ports:
- "8096:8096"
- 运行容器
docker-compose up -d
总结
在LXC容器中的omv性能确实非常不错,上传直接跑满带宽,下载速度要稍微慢一些,但也很不错了。总的来说很不错,不枉费这段时间的折腾。
部分参考
- https://tteck.github.io/Proxmox/
- https://github.com/tteck/Proxmox
- https://github.com/tteck/Proxmox/discussions/1075
- https://github.com/tteck/Proxmox/discussions/418
- https://forum.proxmox.com/threads/openmediavault-installation-in-lxc-with-attached-hw-block-device.29918/
- https://hub.docker.com/r/nyanmisaka/jellyfin
