转载请注明出处,本文仅用于学习交流,不对之处,恳请指正 ,部分图片摘取网络,如有侵权请联系
Proxmox VE(PVE) 7.x中,使用Ubuntu LXC安装Jellyfiy,并开启硬解码,直通网卡,修复Ubuntu中文乱码,修复Jellyfin中文显示框框,开启https,挂载NAS网络磁盘等,也解决了群晖没有部分核显驱动的问题
前因
为什么选择用LXC来部署Jellyfin,而非在NAS虚拟机中部署Jellyfin?
- Intel GPU很多都支持虚拟化,可供多个虚拟机或者LXC使用,故不使用直通的方式。
- 我的NAS并没有用到硬转码的功能
- 我的核显型号是P630,在NAS系统中安装驱动相对麻烦
使用LXC安装Ubuntu 22.04系统
- 先在CT Templates中下载对应的系统模板,这里我使用的是最新的 Ubuntu-22.04-standard
- 在对应的宿主机节点上右键创建CT(LXC),根据提示一步步完成即可,其中应该注意的是,我们需要取消选中非特权容器的按钮,以便访问宿主机的显卡或者开启SMB的功能,其他步骤就不再赘述。
- 根据提示完成安装后,启动LXC容器,并进入容器中
- 更新源
apt-get update
- 更新软件
apt-get dist-upgrade
- 更新源
Proxmox VE(PVE) 7.x 下,LXC”直通”核显
宿主机中操作
- 关闭LXC容器
- 获取显卡文件ID
ls -l /dev/dri/ # drwxr-xr-x 2 root root 80 Jul 14 01:29 by-path # crw-rw---- 1 root video 226, 0 Dec 29 11:20 card0 # crw-rw---- 1 root render 226, 128 Jul 14 01:29 renderD128
- 修改LXC容器配置映射显卡
编辑对应的LXC配置文件,如
nano /etc/pve/lxc/101.conf
,将上面查询到的ID写入到配置文件中# Proxmox VE(PVE) 6.x # lxc.cgroup.devices.allow: c 226:0 rwm # lxc.cgroup.devices.allow: c 226:128 rwm # Proxmox VE(PVE) 7.x lxc.cgroup2.devices.allow: c 226:0 rwm lxc.cgroup2.devices.allow: c 226:128 rwm lxc.autodev: 1 lxc.hook.autodev: /var/lib/lxc/101/mount_hook.sh # 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
- 编写mount_hook脚本
nano /var/lib/lxc/101/mount_hook.sh
写入以下代码
mkdir -p ${LXC_ROOTFS_MOUNT}/dev/dri mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/card0 c 226 0 mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/renderD128 c 226 128
修改脚本权限为可执行
chmod +x /var/lib/lxc/101/mount_hook.sh
(可选) Proxmox VE(PVE) 7.x下, LXC”直通”网卡
宿主机中操作
如果你没有特定的硬件网卡需要绑定可以跳过此步骤。!!!如果你有绑定网卡的需求,需要在桥接网卡下,最少启动过LXC容器一次!!!
- 因为视频播放占用的流量较大,使用桥接网卡可能会导致占用过多性能,我们可以通过以下方式绑定特定的网卡。
lxc.net.0.type: phys lxc.net.0.link: enp7s0f0 lxc.net.0.ipv4.address: 192.168.1.101/24 lxc.net.0.ipv4.gateway: 192.168.1.100 lxc.net.0.flags: up
- 删除原先的桥接网卡
我们可以选择在Proxmox的管理页面删除,也可以在配置文件中删除。
- 启动LXC容器并测试网卡是否可用
ping 114.114.114.114
解决LXC容器内Ubuntu Server 22.04显示中文乱码问题
编辑/etc/default/locale文件
nano /etc/default/locale
修改为以下内容
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
修改Linux的时区
查看当前设置的时区
timedatectl
列出所有可用时区
timedatectl list-timezones
设置时区为上海时区
timedatectl set-timezone Asia/Shanghai
开启NTP时钟同步
timedatectl set-ntp true
Proxmox VE(PVE) 7.x下,LXC中安装Jellyfin
- 安装apt-transport-https,software-properties-common
# Install HTTPS transport for APT as well as gnupg and lsb-release if you haven't already. apt-get install apt-transport-https software-properties-common -y
- 加入Universe仓库
# Enable the Universe repository to obtain all the FFMpeg dependencies: add-apt-repository universe
- 获取密钥
# Import the GPG signing key (signed by the Jellyfin Team): wget -O - https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | apt-key add -
- 添加Jellyfin源
# Add a repository configuration at /etc/apt/sources.list.d/jellyfin.list: echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $( lsb_release -c -s ) main" | tee /etc/apt/sources.list.d/jellyfin.list
- 更新源
apt-get update
- 安装Jellyfin
apt-get install jellyfin -y
- 查看Jellyfin运行状态
service jellyfin status
- 开机启动
systemctl enable jellyfin
- 打开网站
http://192.168.1.101:8096
Proxmox VE(PVE) 7.x下,LXC中开启Jellyfin硬解
经过测试,我们并不需要在宿主机安装驱动。本着不污染宿主机的精神,不对宿主机进行任何操作
- 安装 gpg-agent
apt-get install -y gpg-agent
- 获取密钥
wget -qO - https://repositories.intel.com/graphics/intel-graphics.key | apt-key add -
- 新增安装源
echo "deb [trusted=yes arch=amd64] https://repositories.intel.com/graphics/ubuntu focal main" > /etc/apt/sources.list.d/intel-graphics.list
- 更新源
apt-get update
- 安装驱动
apt-get install -y intel-media-va-driver-non-free intel-gpu-tools vainfo
- 测试驱动是否正常
vainfo
输出以下内容则正常
- 在Jellyfin控制台中选中播放,并启用硬解,注意你的核显或显卡支持哪些格式,如果需要启动低功耗模式,需要在宿主机进行一些配置,这里我就不进行修改了
解决Jellyfin中文显示框框的问题
因为Jellyfin对中文字体支持不好,所以我们可以通过Jellyfin管理页面的备用字体来解决这个问题。为了后续可以一次性配置完成,所以我选择先上传字体
- 启动Root账号登陆
nano /etc/ssh/sshd_config
- 修改PermitRootLogin项为yes,如该项为被注释状态(最前面有个#),则先取消该项注释(删掉#号)
- 重启ssh
systemctl restart sshd
- 复制字体,我选择的是微软雅黑,直接在Windows中复制的,如果你是想要公开使用你的视频网站,甚至是商用,请注意版权问题….
在ubuntu中先新建一个存放字体的目录,Jellyfin的默认目录为:
/usr/share/fonts/truetype/dejavu
,所以我选择在相同目录下新建一个文件夹mkdir /usr/share/fonts/truetype/msyh
在windows或者其他你所使用的操作系统
scp -R ~/Desktop/msyh* [email protected]:/usr/share/fonts/truetype/msyh/
在控制台中选择播放,启用备用字体,这里需要注意的是路径最后需要有一个斜杆,否则无法找到字体
- 修改完成之后需要重启
systemctl restart jellyfin
或者直接重启服务器
reboot
Jellyfin挂载群晖或者其他NAS系统的Samba服务
1. 安装CIFS,并挂载Samba
- 安装CIFS
apt-get install cifs-utils -y
- 创建被挂载的文件目录
mkdir -p /mnt/nas/nasname/samba
- 挂载Samba(非永久,可自行在/etc/fstab中配置开机自动挂载,我使用的是另一种方式)
mount -t cifs //你的NAS的IP/你的共享目录 /mnt/nas/nasname/samba -o user=你的账号,password=你的密码,vers=2.1,mfsymlinks
2. Proxmox VE(PVE) 7.x 安装虚拟交换机
如果你的NAS跟你的LXC容器均在同一台Proxmox主机下,你可以通过虚拟交换机来实现内部通讯,只要你的CPU性能够强,是完全可以跑满硬盘速度的。
- 安装openvswitch
apt-get install openvswitch-switch -y
- Network->Create->OVSBridge
IPV4中写入: 10.0.0.1/8
- Network->Create->OVSIntPort
name中写入: ovseno1, OVS Bridge中选中vmbr1
- 分别在LXC容器与你的NAS虚拟机中新建网卡,均选中vmbr1,并输入你想要的IP地址,切记LXC的IP段与你的NAS的IP段相同,且都不输入网关
3. (可选) 延迟挂载Samba,并自动识别NAS是否在线
相信很多朋友在使用Proxmox的同时,会将NAS系统安装在Proxmox之中,所以其他虚拟机想要挂载对应的Samba或者NFS服务,一般都是采用延迟启动的方式,这是一个方案。但考虑到有时候我会关闭NAS虚拟机,所以我更期望的方式是自动检测到对应的NAS系统启动后,自动挂载。于是我编写了以下脚本
- 创建脚本存放的目录
mkdir /usr/script
- 编写脚本
nano /usr/script/nasname-smb.sh
写入以下代码,需要注意的是,我将离线日志写入到系统日志中,如果你有长时间不在线的情况下,请自行修改对应的脚本内容,以免出现过多的日志内容
#!/bin/bash # author alain # site:https://www.alainlam.cn # 循环检测Samba服务器是否在线,并自动挂载 server_ip="10.0.0.101" server_path="/media" mount_point="/mnt/nasname/media" # 是否循环检查是否在线(没有挂载时) online_check=true # 循环检查是否在线的间隔时间(没有挂载时) online_check_interval=10 # 离线检查 offline_check=true # 离线检查间隔时间 offline_check_interval=60 # SMB账号 smb_username="你的账号" # SMB密码 smb_pwd="你的密码" # 是否已经挂载 isMounted=false while :; do if mountpoint -q $mount_point; then if ! $isMounted; then # 设置为挂载状态 isMounted=true echo "SMB挂载成功" if $offline_check; then echo "开启在线状态检测,间隔时间${offline_check_interval}s" fi fi if $offline_check; then sleep $offline_check_interval continue fi else # 设置为非挂载状态 isMounted=false echo "SMB没有挂载,ping ${server_ip} ..." if (ping -c 1 -w 5 $server_ip >/dev/null 2>&1); then echo "${server_ip}在线,尝试挂载" # 判断挂载目录是否存在 if [ ! -d $mount_point ]; then echo "挂载目录不存在,新建目录" mkdir -p $mount_point fi if [ ! -d $mount_point ]; then echo "挂载目录不存在,取消挂载,请检查权限, code:403" exit 403 fi # 挂载SMB网络硬盘 mount.cifs -o vers=2.1,username=$smb_username,password=$smb_pwd //$server_ip$server_path $mount_point if mountpoint -q $mount_point; then continue else echo "挂载失败" if $online_check; then echo "继续尝试挂载${server_ip},间隔时间${online_check_interval}s" sleep $online_check_interval continue else echo "不继续尝试挂载,退出脚本,code:404" exit 404 fi fi else if $online_check; then echo "${server_ip}离线,上线检查间隔时间${online_check_interval}s" sleep $online_check_interval continue else echo "不循环检查,退出脚本,code:404" exit 404 fi fi fi done
- 加入执行权限
chmod +x /usr/script/nasname-smb.sh
- 编写开机启动服务
nano /etc/systemd/system/nasname-smb.service
写入以下代码
[Unit] Description=Automatically mount the SMB folder from nasname After=network.target [Service] Type=simple ExecStart=/usr/script/nasname-smb.sh [Install] WantedBy=multi-user.target
- 设置开机启动
systemctl enable --now nasname-smb.service
- 查看运行效果
Jellyfin开启Https
当你希望使用Nginx进行反向代理时,你可以跳过此步骤,直接看Nginx反向代理部分
- 新建存放SSL证书的目录
mkdir -p /etc/ssl/certificates
- 上传证书到指定目录
scp -R ~/Desktop/alainlam.cn* [email protected]:/etc/ssl/certificates/
- 进入证书目录,并生成pfx证书
进入证书目录
cd /etc/ssl/certificates/
生成pfx证书
openssl pkcs12 -export -out alainlam.cn.pfx -inkey alainlam.cn.key -in alainlam.cn.pem
根据提示输入密码,可设置为空
- 修改证书所有者
chown jellyfin:jellyfin /etc/ssl/certificates/ -R
- 在Jellyfin控制台中启用Https
- 填写证书路径
其中强制HTTPS为可选
- 完成配置后需要重启Jellfyfin
最后效果展示
扩展阅读