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与上篇文章一样。
安装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