Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

324次阅读
没有评论

Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

转载请注明出处,本文仅用于学习交流,不对之处,恳请指正 ,部分图片摘取网络,如有侵权请联系

Proxmox VE(PVE) 7.x中,使用Ubuntu LXC安装Jellyfiy,并开启硬解码,直通网卡,修复Ubuntu中文乱码,修复Jellyfin中文显示框框,开启https,挂载NAS网络磁盘等,也解决了群晖没有部分核显驱动的问题

前因

为什么选择用LXC来部署Jellyfin,而非在NAS虚拟机中部署Jellyfin?

  1. Intel GPU很多都支持虚拟化,可供多个虚拟机或者LXC使用,故不使用直通的方式。
  2. 我的NAS并没有用到硬转码的功能
  3. 我的核显型号是P630,在NAS系统中安装驱动相对麻烦

使用LXC安装Ubuntu 22.04系统

  1. 先在CT Templates中下载对应的系统模板,这里我使用的是最新的 Ubuntu-22.04-standard

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  2. 在对应的宿主机节点上右键创建CT(LXC),根据提示一步步完成即可,其中应该注意的是,我们需要取消选中非特权容器的按钮,以便访问宿主机的显卡或者开启SMB的功能,其他步骤就不再赘述。

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  3. 根据提示完成安装后,启动LXC容器,并进入容器中
    1. 更新源
      apt-get update
    2. 更新软件
      apt-get dist-upgrade

Proxmox VE(PVE) 7.x 下,LXC”直通”核显

宿主机中操作

  1. 关闭LXC容器
  2. 获取显卡文件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
  3. 修改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
  4. 编写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容器一次!!!

  1. 因为视频播放占用的流量较大,使用桥接网卡可能会导致占用过多性能,我们可以通过以下方式绑定特定的网卡。
    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
  2. 删除原先的桥接网卡

    我们可以选择在Proxmox的管理页面删除,也可以在配置文件中删除。

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  3. 启动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

  1. 安装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
  2. 加入Universe仓库
    # Enable the Universe repository to obtain all the FFMpeg dependencies:
    add-apt-repository universe
  3. 获取密钥
    # Import the GPG signing key (signed by the Jellyfin Team):
    wget -O - https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | apt-key add -
  4. 添加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
  5. 更新源
    apt-get update
  6. 安装Jellyfin
    apt-get install jellyfin -y
  7. 查看Jellyfin运行状态
    service jellyfin status
  8. 开机启动
    systemctl enable jellyfin
  9. 打开网站
    http://192.168.1.101:8096

Proxmox VE(PVE) 7.x下,LXC中开启Jellyfin硬解

经过测试,我们并不需要在宿主机安装驱动。本着不污染宿主机的精神,不对宿主机进行任何操作

  1. 安装 gpg-agent
    apt-get install -y gpg-agent
  2. 获取密钥
    wget -qO - https://repositories.intel.com/graphics/intel-graphics.key |  apt-key add -
  3. 新增安装源
    echo "deb [trusted=yes arch=amd64] https://repositories.intel.com/graphics/ubuntu focal main" > /etc/apt/sources.list.d/intel-graphics.list
  4. 更新源
    apt-get update
  5. 安装驱动
    apt-get install -y intel-media-va-driver-non-free intel-gpu-tools vainfo
  6. 测试驱动是否正常
    vainfo

    输出以下内容则正常

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  7. 在Jellyfin控制台中选中播放,并启用硬解,注意你的核显或显卡支持哪些格式,如果需要启动低功耗模式,需要在宿主机进行一些配置,这里我就不进行修改了

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

解决Jellyfin中文显示框框的问题

因为Jellyfin对中文字体支持不好,所以我们可以通过Jellyfin管理页面的备用字体来解决这个问题。为了后续可以一次性配置完成,所以我选择先上传字体

  1. 启动Root账号登陆
    nano /etc/ssh/sshd_config
  2. 修改PermitRootLogin项为yes,如该项为被注释状态(最前面有个#),则先取消该项注释(删掉#号)

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  3. 重启ssh
    systemctl restart sshd
  4. 复制字体,我选择的是微软雅黑,直接在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/

    在控制台中选择播放,启用备用字体,这里需要注意的是路径最后需要有一个斜杆,否则无法找到字体

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  5. 修改完成之后需要重启
    systemctl restart jellyfin

    或者直接重启服务器

    reboot

Jellyfin挂载群晖或者其他NAS系统的Samba服务

1. 安装CIFS,并挂载Samba

  1. 安装CIFS
    apt-get install cifs-utils -y
  2. 创建被挂载的文件目录
    mkdir -p /mnt/nas/nasname/samba
  3. 挂载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性能够强,是完全可以跑满硬盘速度的。

  1. 安装openvswitch
apt-get install openvswitch-switch -y
  1. Network->Create->OVSBridge

    IPV4中写入: 10.0.0.1/8

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  2. Network->Create->OVSIntPort

    name中写入: ovseno1, OVS Bridge中选中vmbr1

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  3. 分别在LXC容器与你的NAS虚拟机中新建网卡,均选中vmbr1,并输入你想要的IP地址,切记LXC的IP段与你的NAS的IP段相同,且都不输入网关

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

3. (可选) 延迟挂载Samba,并自动识别NAS是否在线

相信很多朋友在使用Proxmox的同时,会将NAS系统安装在Proxmox之中,所以其他虚拟机想要挂载对应的Samba或者NFS服务,一般都是采用延迟启动的方式,这是一个方案。但考虑到有时候我会关闭NAS虚拟机,所以我更期望的方式是自动检测到对应的NAS系统启动后,自动挂载。于是我编写了以下脚本

  1. 创建脚本存放的目录
    mkdir /usr/script
  2. 编写脚本
    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
  3. 加入执行权限
    chmod +x /usr/script/nasname-smb.sh
  4. 编写开机启动服务
    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
  5. 设置开机启动
    systemctl enable --now nasname-smb.service
  6. 查看运行效果

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

Jellyfin开启Https

当你希望使用Nginx进行反向代理时,你可以跳过此步骤,直接看Nginx反向代理部分

  1. 新建存放SSL证书的目录
    mkdir -p /etc/ssl/certificates
  2. 上传证书到指定目录
    scp -R ~/Desktop/alainlam.cn* [email protected]:/etc/ssl/certificates/
  3. 进入证书目录,并生成pfx证书

    进入证书目录

    cd /etc/ssl/certificates/

    生成pfx证书

    openssl pkcs12 -export -out alainlam.cn.pfx -inkey alainlam.cn.key -in alainlam.cn.pem

    根据提示输入密码,可设置为空

  4. 修改证书所有者
    chown jellyfin:jellyfin /etc/ssl/certificates/ -R
  5. 在Jellyfin控制台中启用Https

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

  6. 填写证书路径

    Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

    其中强制HTTPS为可选

  7. 完成配置后需要重启Jellfyfin

最后效果展示

Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

扩展阅读

Jellyfin使用80/443端口,Nginx反向代理或UFW端口转发

正文完
 0
withero
版权声明:本站原创文章,由 withero 于2024-12-16发表,共计6930字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码