从零开始搭建基于PVE的all-in-one

xiaok

全TM是坑

准备工作

需求:

  • PVE虚拟环境
  • PT下载环境(transmission,flexget)
  • jellyfin影音服务器

知道了需求,那么我们可以开工了

鉴于现在大部分电影都是HEVC Main10编码,所以我们需要一个较新的核显,这里我使用的是 i5-1135G7,根据官方文档,这是目前 “High-Performance” 的方案,应该不是瓶颈,同时这枚在轻薄本上的低压U也可以做到安静,低温地运行,而不是让电表倒转并且伴随着TOGA般的风扇噪音(

安装PVE

PVE实际上基于debian,最新的PVE8.X基于debian12,因为我需要win/debian双系统安装(这台笔记本还有不少资料无处安放),而且在这里PVE弱智般的安装程序不仅对我2k高分屏适配的就是1托4(你能想象那种DPI开到100,字和按钮小到费眼的感觉吗),并且分区只能全盘分。因此,我们改用更加智能的debian12官方安装iso
(ps:图的话就没有了,大晚上的忘了拍)
十分顺利,成功安装了debian。
然后我们来安装PVE,首先,添加PVE软件源,这里我们使用tuna(ps:我被tuna封过IP)
新建 /etc/apt/sources.list.d/pve-no-subscription.list,
内容为deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve bookworm pve-no-subscription
这样我们就有了PVE仓库,然后安装PVE管理器(就是那个webui)
# apt install proxmox-ve postfix open-iscsi
在Set up步骤之前,postfix会有一个选项,选择Local Only即可
在漫长的等待过后,我们还有一件事。。。。。

修改hosts


在这里,将你的域名前面的IP改为你自己的内网IP,必须是静态IP,不然 无法访问WEBUI,我选择在路由器里进行IP-MAC绑定,然后重启一下networking服务,重新获取IP
然后重启即可,IP:8006就是熟悉的界面了

但是在这里我们需要配置一个事情,就是虚拟机联网问题

WIFI联网及NAT配置

这台华为的matebook并没有物理网口,所以我们采用wifi链接。
WIFI因为某些特性,是不允许桥接端口的,只能使用NAT
按照官方文档,我们使用iptables进行配置
我把我的配置文件贴在这

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto wlp0s20f3
iface wlp0s20f3 inet dhcp
wpa-ssid WiFi的SSID
wpa-psk wifi密码
auto vmbr0
#private sub network
iface vmbr0 inet static
address 10.10.10.1/24
bridge-ports none
bridge-stp off
bridge-fd 0

post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o wlp0s20f3 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o wlp0s20f3 -j MASQUERADE
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

核显解码相关驱动的安装

英特尔的核显驱动分为两种,free和non-free,只有non-free才支持硬件编解码,但是debian默认生成的source.list中并不包含non-free,所以微微改一下
算了要不直接照着抄上吧tuna链接,选上使用非自由软件源就好,记得核对debian版本
然后执行apt install intel-media-va-driver-non-free vainfo
一通操作后输入vainfo检查一下有没有问题,有问题先重启
大致输出应该是这样的

1
2
3
4
5
6
7
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.17 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 23.1.1 ()
vainfo: Supported profile and entrypoints

如果Driver那里不是iHD的话export LIBVA_DRIVER_NAME=iHD试一下,当然不试也没关系,毕竟我们的jellyfin是要扔在LXC里的,PVE宿主机能识别就行
ls /dev/dri输出应该和我一样

1
2
root@pve:~# ls /dev/dri
by-path card0 renderD128

到这里,检查一下PVE的各项功能有没有问题,NAT是否正常,如果没问题的话,PVE的安装就完成了

LXC容器的安装

这里也许你会问:为什么不直接安装在宿主机?宿主机不是更加方便更加容易嘛?反正都是debian
但是这样会污染环境,而且时间久了你会忘掉你装了什么东西,万一哪天就爆了也不好说,所以这里我们整一个LXC容器去装jellyfin(但是transmission不这么玩,因为我们是NAT,端口转发很难搞)

因为原版ct模板源在国外,这里我们换成tuna来加速
cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
重启生效
然后来到local储存 -> CT模板 -> 下载,在这里我们选择debian12,进行下载
然后点击右上角的创建CT,然后记得去掉无特权的容器其他的随意

模板记得选择我们下载的debian。
磁盘这里,我非常推荐给一个大一点的硬盘,大概25G左右,因为jellyfin转码要占用大量的空间,并且拿来放各种docker容器,也少不了,所以需要大♂空间。
核心这里我给满了,8颗,内存给的是2g。其实大部分docker容器优化都不错,不是很吃内存。
网络啥的就不用说了,记好了咱的NAT没有DHCP,你需要静态ip,v6咱就不需要了,就v6的普及情况和路由器那边的打洞成功率当作没有就行。
我的配置,参考下,记住IP不要和vmbr0的ip重合哦,你把vmbr0看作交换机,你这个容器就是插在交换机的设备就行啦(交换机为什么会有IP。。。

然后不要启动,我们需要进行亿些配置
在后面添加这些配置:

1
2
3
4
5
6
7
8
9
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a *:* rwm
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

这些代码也许有些屎山,因为都是我在别人文章配置没法用的基础上瞎JB改的,不过目的达到了就行了。尤其是lxc.cgroup.devices.allow: a *:* rwm有一种chmod 777的美(笑
wq一下,然后来到pve的webui,

把功能里能打的勾全打上,然后开机,来到控制台,你之前设置的密码是root的密码
首先换源,都是debian12,参照前面的步骤进行,然后update再upgrade
再然后ls /dev/dri看一下显卡的透传有没有问题,没有问题我们开始安装docker了

docker的安装

apt install docker.io这个没得说
然后为了方便操作,我们使用portainer
运行docker run -d --restart=always --name="portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 6053537/portainer-ce然后你就会发现一个事,就是唉我访问PVE的ip:9000居然打不开后台???
是的,这是我们的NAT特性导致的,我们需要进行端口映射
操作非常简单,一句话就行,在PVE里执行
iptables -t nat -A PREROUTING -p 协议(tcp或udp) -m 协议(tcp或udp) --dport 外部端口 -j DNAT --to-destination 容器IP:容器端口
没效果就重启容器。这句命令PVE关机失效,每次重新开机都需要执行
如果IP:9000正常使用portainer的话,恭喜你,可以下一步了

jellyfin的安装

portainer里容器 ->新建容器 然后按照我的来,我们使用的是nyanmisaka大佬的特供版镜像,傻瓜式无需折腾

镜像nyanmisaka/jellyfin:latest

下方高级设置这样设置

将显卡给丢进去
然后部署就行了

按照其他的jellyfin教程完成配置,此处我们不再展开,我将讲述我才到的坑

FAQ

  1. jellyfin是配置好了,但是我硬盘呐???
    这种问题困惑我了我好久,我们要进行两次透传,第一次从PVE到LXC,第二次从LXC到docker容器
    解决方法也非常简单,如果你的硬盘已经有资料的话,我推荐你把硬盘写进fstab自动挂载,如果没有,我推荐你到
    创建硬盘分区,为什么,原因很简单,目录会自动挂载XD

    在你把硬盘在PVE中安装妥善了的话,我们开始挂载到LXC中。这部分需要在PVE的shell里进行pct set LXC容器ID -mp1 PVE中path,mp=容器中path即可将文件夹共享到LXC中
    然后我们需要在LXC中进行一个骚操作,因为docker默认不支持挂载文件夹,

    1
    2
    3
    4
    5
    6
    7
    wget https://mirror.ghproxy.com/https://github.com/MatchbookLab/local-persist/releases/download/v1.3.0/local-persist-linux-amd64
    mv ./local-persist-linux-amd64 /usr/bin/docker-volume-local-persist
    chmod +x /usr/bin/docker-volume-local-persist
    wget https://raw.kkgithub.com/MatchbookLab/local-persist/master/init/systemd.service
    mv -f ./systemd.service /etc/systemd/system/docker-volume-local-persist.service
    systemctl enable docker-volume-local-persist
    systemctl start docker-volume-local-persist

    重启LXC生效
    这样我们就添加了一个叫做local-persist的驱动,然后在portainter中新建卷
    然后添加驱动程序选项,按照里面的实例添加mountpoint,值就是LXC里的路径,也就是mp=后面的
    最后,编辑jellyfin容器,
    在底下高级设置中添加卷,容器就是容器里的路径,随意
    然后部署。
    重新打开jellyfin的后台,你就会发现一个恐怖的事情,就是他居然让你选择媒体服务器!
    解决方法:清空浏览器缓存,最近一小时,能勾的就勾,仔细看看别误删了什么,然后刷新就好了~
    再在jellyfin中添加媒体库就好了~

  2. jellyfin逆天磁盘占用,吃光了我LXC的20G!!!
    非常好解决,这里我们依赖一个脚本,Jellyfin-Transcodes-cleanup
    这个脚本要求在docker容器里安装配置,咋搞?很简单,
    附加,用bash,然后apt安装git,接下来clone到/config/ffmpeg目录,然后跟着文档走就好了,大部分配置都不用改,基本上就是开箱即用状态。
    笔者在写这个东西的时候发现还没配置完,遂去配置,却发现居然改不了ffmpeg路径。。。。等哪天研究好了再更新吧。。
    2024.2.3 22:41

  • 本文标题:从零开始搭建基于PVE的all-in-one
  • 本文作者:xiaok
  • 创建时间:2024-02-02 20:28:10
  • 本文链接:https://xkblog.pages.dev/2024/02/02/从零开始搭建基于PVE的all-in-one/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论