LXC 直通硬盘 lxc 直通磁盘大致需要以下步骤: 配置 cgroup 规则,赋予 lxc 容器对应硬件的权限; 如果使用 cgroup 2,需要将配置文件中的 lxc.cgroup 改为 lxc.cgroup2 ; 之后通过主副设备号将硬

LXC 直通硬盘

lxc 直通磁盘大致需要以下步骤:

  • 配置 cgroup 规则,赋予 lxc 容器对应硬件的权限;
  • 如果使用 cgroup 2,需要将配置文件中的 lxc.cgroup 改为 lxc.cgroup2
  • 之后通过主副设备号将硬盘挂载到 LXC 容器中的对应位置;

使用这条命令看到磁盘、wwn以及主:次设备号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 使用 lsblk -h 看到更多格式
$ lsblk -o name,wwn,MAJ:MIN
NAME WWN MAJ:MIN
sda 0x5002538e728014d6 8:0
├─sda1 0x5002538e728014d6 8:1
├─sda2 0x5002538e728014d6 8:2
└─sda3 0x5002538e728014d6 8:3
├─openeuler-root 253:0
├─openeuler-var 253:1
├─openeuler-var_log 253:2
└─openeuler-home 253:3
sdb 0x5000c500eda070c8 8:16
sdc 0x5000c500eda93f3c 8:32
sdd 0x5000c500eda94c15 8:48
sde 0x5000c500edacae3b 8:64

LXC 直通磁盘步骤

确定硬盘id和关系

1
2
3
ls -al /dev/sd*
#或者
ls -al /dev/disk/by-label

反正最后比如我想找我的sda1设备,那我得到了以下输出:

1
2
3
4
# ls -al /dev/sda
brw-rw---- 1 root disk 8, 0 Dec 19 11:16 /dev/sda1
# ls -al /dev/sda1
brw-rw---- 1 root disk 8, 1 Dec 19 11:16 /dev/sda1

可以看出,sda=> 8,0 sda1=>8,1

绑定硬盘

继续编辑lxc配置文件,添加:

1
2
lxc.cgroup.devices.allow: b 8:0 rwm
lxc.cgroup.devices.allow: b 8:1 rwm

这个8:08:1就是刚才我们得到的。

设置自动挂载脚本

pve中,创建/var/lib/lxc/ID/mount-hook.sh文件,其中ID就是你的lxc的ID:

1
2
3
#!/bin/sh
mknod -m 777 ${LXC_ROOTFS_MOUNT}/dev/sda b 8 0
mknod -m 777 ${LXC_ROOTFS_MOUNT}/dev/sda1 b 8 1

然后chmod +x 一下,然后在lxc配置文件中添加:

1
2
lxc.autodev: 1
lxc.hook.autodev: /var/lib/lxc/ID/mount-hook.sh

然后根据我们要挂载的设备,再添加一行(有个教程说不用,但是我加上了,然后成功了):

1
lxc.mount.entry: /dev/sda1 /dev/sda1 bind,create=dir,optional 0 0

至此,可以启动容器了。

PVE 硬盘直通

要将硬盘直通给 pve 管理的虚拟机,最简单使用下面的命令:

1
2
3
# 下面两种方式均可,风险点不同
qm set 101 --scsi1 /dev/disk/by-id/nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN
qm set 101 --scsi1 /dev/sdb

References