在Proxmox VE中直通设备给LXC容器
PVE下利用LXC容器安装了Jellyfin服务,同时把PVE下的硬盘在LXC资源下以raw文件形式挂载,也就是Jellyfin媒体库实际上是挂载在Proxmox VE虚拟机的虚拟磁盘上,媒体库挂载点原本是一个loop设备。
虚拟磁盘+loop设备的双重抽象确实会对视频流媒体性能产生影响。那么如何将PVE下的硬盘直通给jellyfin做媒体库?在LXC下挂载直通盘是无法实现的?
由于我们正在将PVE下的设备/dev/sda1直通给LXC容器(jellyfin),我们需要在Proxmox VE宿主机上操作,并将该设备添加到LXC容器的配置中。
注意:LXC容器使用设备直通需要特定的配置步骤。
步骤1:在Proxmox VE宿主机上,检查设备/dev/sda1的详细信息,特别是主要和次要设备号。
在PVE宿主机上执行:
# 查看磁盘设备信息
lsblk
fdisk -l /dev/sda
# 检查文件系统类型
blkid /dev/sda1
# 查看设备主要和次要编号
ls -la /dev/sda1
输出示例:
brw-rw---- 1 root disk 8, 1 May 25 10:00 /dev/sda1
这里8是主设备号,1是次设备号。

步骤2:编辑LXC容器的配置文件
编辑配件文件前需要先停止LXC容器
在PVE宿主机上:pct stop 101
在PVE宿主机上,LXC容器的配置文件通常位于 /etc/pve/lxc/<容器ID>.conf
假设容器ID为101,则配置文件为 /etc/pve/lxc/101.conf
在文件中添加以下行:
lxc.cgroup2.devices.allow: b 8:1 rwm
lxc.mount.entry: /dev/sda1 dev/sda1 none bind,optional,create=file
解释:
第一行:允许容器访问特定设备(主设备号8,次设备号1,块设备,读写权限)
第二行:将宿主机的/dev/sda1挂载到容器内的/dev/sda1
步骤3:重启LXC容器
在PVE宿主机上执行:pct restart 101
步骤4:在容器内检查设备
进入容器:pct enter 101
或者
lxc-attach -n 101
在容器内执行:
ls -l /dev/sda1
如果设备存在,则直通成功。
注意:如果容器内需要使用该设备,可能需要容器内也有相应的驱动。对于磁盘设备,通常容器内会自动识别。
另外,如果希望容器启动时自动挂载该设备上的文件系统,需要在容器内编辑/etc/fstab并添加挂载项,但请注意,直通设备后,在容器内看到的设备是/dev/sda1,你可以在容器内将其挂载到某个目录,例如/mnt/yingshi。
在容器内挂载:
mkdir -p /mnt/yingshi
mount /dev/sda1 /mnt/yingshi
如果希望开机自动挂载,在容器内的/etc/fstab中添加:
/dev/sda1 /mnt/yingshi ext4 defaults 0 0
请根据实际文件系统类型替换ext4。
重要:在直通设备并挂载后,确保Jellyfin容器内的用户jellyfin有权限访问/mnt/yingshi下的文件。
如果之前媒体文件就在这个设备上,那么现在Jellyfin应该可以访问了。
如果之前媒体文件不在这个设备上,那么你可能需要将媒体文件复制到这个设备上,然后调整Jellyfin的媒体库设置。
注意:直通整个磁盘设备给LXC容器意味着容器可以直接访问该磁盘,请确保容器是可信的,因为直通设备可能会带来安全风险。
如果遇到权限问题,可以在容器内使用chmod和chown调整权限,或者确保Jellyfin运行的用户有权限访问该挂载点。
完成以上步骤后,你的Jellyfin LXC容器就可以使用直通的磁盘设备了,性能会比之前的loop设备方案好很多。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
