PVE8.2.4下-Ubuntu虚拟机创建与虚拟核显直通
# 背景之前弄了allinone,是时候上docker了。
# 配置
首先先说一下我的配置吧,
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/275f20b68d1b5ff4bfd052a7b80ca3aa_1724054435_5945.png)
配置大概就是这样,下面说一下主要思路吧,以PVE为基础,做五个虚拟系统,nas、旁路网关、docker载体、桌面OS(linux+win)。
1、旁路网关(已搭建)。我用的是istoreos,,从稳定性的角度来看,目前我也是把他作为旁路网关,主路由还是我的小米AX3000T。
2、docker的载体,我选用的ubuntu的服务器版,之所以选用这个版本,也没什么特别的原因,只是linux的桌面版比较喜欢ubuntu而已,但据说centos服务器版跟稳定一下,不过无所谓吧,我觉得差不多。另外不选择把docker直接安装到PVE里主要还是处于稳定性考虑。
之前已经将12300T核显虚拟了3个分身
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/9da7d3f5a380111bb8b36b82843cb972_1724054435_8526.png)
# 计划
在PVE虚拟机模式下, Linux系统使用宿主机基于SR-IOV虚拟的核显. Ubuntu22.04LTS服务器版系统的虚拟机。
虽然近期发布了24.04LTS,但我还是先用旧的吧。
# 安装 Ubuntu 22.04 LTS
1. 安装 Ubuntu 22.04 LTS
手工下载 Ubuntu 22.04 LTS ISO 镜像,阿里云 ISO 镜像下载地址。手工上传到 PVE 系统。
我选择通过 PVE 自动下载 ISO(推荐)
# 虚拟机创建
在pve节点下新建虚拟机
如图二到十, 虚拟机配置设置
准备在pve节点下新建虚拟机
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/fe112ebeca3183b37405b107455005ef_1724054435_4591.png)
常规设置页面, 填入虚拟机的名字, 然后点击下一步
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/ea0f5d907ea9c27635adb42e7b9644e1_1724054435_1452.png)
选择引导镜像, 首先选择镜像所在存储节点, 然后在镜像列表中选择目标镜像; 之后点击下一步
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/c4c60e3e60624afd4ab6fcd8c412ec1e_1724054435_2371.png)
磁盘设置, 选择存储节点, 磁盘大小后, 点击下一步
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/f10de498d39e4b4d612a9bf12e8351e3_1724054435_2058.png)
CPU设置页面, 修改要分配的核心数, 类别选择host, 然后点击下一步(6)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/7491244bcba37e6eb0fd38657df67483_1724054435_5650.png)
内存设置, 根据需要调整大小, 然后点击下一步(8192 4096)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/665cfe9f52d16759fe75b11893868ac7_1724054436_2586.png)
络设置, 取消勾选防火墙, 避免远程访问的一些问题; 选择默认的半虚拟化, 然后点击下一步
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/7abe1a5c1d317911365ec22fd3b8f397_1724054436_5384.png)
确认配置无误后, 点击完成
调整虚拟机引导顺序配置, 将系统镜像设置为第一引导选项,之后点击控制台, 启动虚拟机开始系统安装
在控制台页面, 点击start now开始运行虚拟机
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/f7a7bff96a44a909016f44d9c6059937_1724054436_2826.png)
虚拟机运行后, 后面是正常的Ubuntu系统安装过程,按提示进行
安装完会提示要移除cd设备
点击左侧工具栏, 电源按钮, Hard Stop强制关机
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/0eb8046be05388e5320b7c0a3df08ae4_1724054436_7501.png)
系统安装完毕后, 需要先停止虚拟机, 修改引导选项, 取消使用iso镜像引导
启动虚拟机
配置国内源(root或sudo权限用户)
```
sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup
sudo vim /etc/apt/sources.list
# 添加内容
"""
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
"""
```
# 配置dns和网关
使用旁路网关
刚好讲下ubantu系统
```
sudo vi /etc/netplan/00-installer-config.yaml
```
修改前
```
# This is the network config written by 'subiquity'
network:
ethernets:
enp6s18:
dhcp4: true
version: 2
```
修改后
```
# This is the network config written by 'subiquity'
network:
version: 2
renderer: networkd
ethernets:
enp6s18:#your net card
dhcp4: no
addresses: # static ip
nameservers:
addresses: # gateway as dns
routes:
- to: default
via: 192.168.31.2## gateway
```
重启网络
```
sudo netplan apply
```
测试是否可以谷歌
`wget/ping google.com `
笔者ping没有延迟,但是wget可以下载到页面,说明走了旁路。
# 驱动安装与配置调整
驱动安装的主要过程与PVE8.2下配置SR-IOV虚拟核显相似, 主要区别在于不在需要sysfsutils工具库安装以及对应的/etc/sysfs.conf配置.
系统信息查看
ubuntu22.04.4 LTS使用的内核为5.15.0-118-generic, 与PVE8.2内核(我降级的)6.5.13-3-pve版本差的有点大
```
# 系统
cat /etc/os-release
# 内核
uname -ar
```
APT软件源索引更新与必要工具软件安装
```
sudo apt update
sudo apt install -y git build-* dkms # 必要编译工具安装
# 可选
# apt install -y vim
```
设置环境变量
```
KERNEL=$(uname -r); KERNEL=${KERNEL%-generic}
echo ${KERNEL}
```
核显虚拟化驱动项目的源码下载与配置修改(需要切换root执行)
```
# 切换到root
# sudo -i
# 进入root家目录, 下载驱动项目源码
cd ~
git clone https://github.com/strongtz/i915-sriov-dkms.git
cd ~/i915-sriov-dkms
# 备选操作
# 2024.04.20最新commit的版本编译安装阶段可能导致失败, 相关问题issue暂未解决
# 建议切换到2023.12月份的版本尝试, 可以执行如下代码, 之后再继续操作
git checkout cdb1399821e942db6fcc2b8322da72b517a9bc0d
# 修改项目配置
cp -a ~/i915-sriov-dkms/dkms.conf{,.bak}
sed -i 's/"@_PKGBASE@"/"i915-sriov-dkms"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/"@PKGVER@"/"'"$KERNEL"'"/g' ~/i915-sriov-dkms/dkms.conf
# sed -i 's/ -j$(nproc)//g' ~/i915-sriov-dkms/dkms.conf
# 查看修改后结果
cat ~/i915-sriov-dkms/dkms.conf
```
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/bdd90bc88a690c7167f734f85edb98ae_1724054436_8568.png)
DKMS添加驱动源码管理并安装部署
```
# 链接内核源代码,并检查状态。确认内核显示已添加。
sudo cp -r ~/i915-sriov-dkms /usr/src/i915-sriov-dkms-$KERNEL
ls /usr/src # 查看
cd /usr/src/i915-sriov-dkms-$KERNEL
sudo dkms add .
dkms status
# 构建新内核并检查状态。验证是否显示已安装。
# 安装内核扩展, 会触发MOK相关设置.
sudo dkms install -m i915-sriov-dkms -v $KERNEL -k $(uname -r) --force -j 4
```
构建安装内核扩展, 提示需要安全引导已启用,需要设置MOK,此处随意设置一个不太简单密码即可, 正常只会使用一次.
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/034d75f786b844efe4fb8a3a3837f518_1724054436_7090.png)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/3da75ad6a97c35e5638cf24e948ebdfb_1724054436_1242.png)
再输入一遍,确认。
# GRUB 配置
```
# 解释: i915.max_vfs=7 表示最多虚拟成3个设备
sudo cp -a /etc/default/grub{,.bak}
# 会在第10行追加内容: intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=3
sudo sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT/c\GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=3"' /etc/default/grub
# 更新引导
sudo update-grub
sudo update-initramfs -u -k all
```
# 系统重启与引导项MOK配置
执行到此, 应该对该虚拟机系统进行重启, 但需要额外强调下:
因为当前版本系统启用了安全引导, 因此必须在安装驱动后, 重启进入系统前, 在引导页面进行MOK相关配置. 只需在第一次重启配置成功, 之后不在需要设置.
开机启动/引导项MOK配置过程: Enroll MOK, Continue, Yes, <password>, Reboot
```
# 重启机器, 在开机页面, 开机引导页面依次选择:
# * Enroll MOK, Continue, Yes, <password>, Reboot
# 如果错过, 需要进入终端, 重新运行 mokutil ... 命令并再次重启。
# 在完成此设置之前,DKMS 模块不会加载。
# Ubuntu重置MOK
# 参见: https://wiki.ubuntu.com/UEFI/SecureBoot
update-secureboot-policy --enroll-key
```
图片按钮如下:
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/de3099ef0170a83997e5a4781885774a_1724054557_6799.png)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/f2dc1f768f22679e5a6e88ed3067a5f4_1724054557_7371.png)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/faeb9163c50ff3df119d7173478d95af_1724054557_4397.png)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/40563f1634fa273e63d94e57c08602f1_1724054557_7135.png)
密码就是刚才设置的mok密码,不是root ssh密码。
# 虚拟机配置调整
接下来我们需要调整虚拟机显示配置, 移除默认显示设别, 同时添加宿主机的虚拟PCI集显, 之后关闭系统, 使配置生效; 然后启动系统, 通过SSH远程登录系统, 通过如下命令行可以如下输出.
1. 虚拟机关机
2. 修改虚拟机配置2处
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/04451779894164c84addbf125f3a410f_1724054557_6278.png)
显示修改为无,添加pci虚拟的核显,勾选如图,添加。
3. 开启虚拟机
`ls /dev/dri`
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/04451779894164c84addbf125f3a410f_1724054557_6921.png)
以上是正确添加了虚拟化核显。没有添加会少一个renderD128
# 效果验证
通过以上步骤完成虚拟化集显设备直通后, 下面我们基于Docker部署Jellyfen在线流媒体应用, 验证集显直通是否成功.
1. 集显查询工具
为了了解集显的实时使用情况, 还需要在pve系统内安装intel_gpu_top工具
```
apt install intel-gpu-tools
# LXC容器内,直接执行(我是虚拟机,就没有用这个,直接在pve系统使用查看
# intel_gpu_top
# PVE宿主机上, 我们配置了SR-IOV虚拟核显, 需要指定真实的核显相关参数
# 否则可能遇到这类错误提示: "Kernel 4.16 or newer is required for i915 PMU support."
# lspci | grep VGA# 查看真实显卡地址, 一般不需要修改
intel_gpu_top -d sys:/sys/devices/pci0000:00/0000:00:02.0
```
PVE宿主机配置配置了SR-IOV虚拟核显, 有三个虚拟核显设备。
集显未使用时: intel_gpu_top输出
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/9d420e485c653385b3659ee43c363bf7_1724054558_4277.png)
# Docker部署
完成Docker环境安装以及portainer的安装
1. 一键安装脚本
下载脚本依赖curl, 可能需要提前安装,可直接敲 `curl -h`验证
配置国内加速源, 需要修改配置, 需要安装常用的编辑器, 如vim,可直接敲 `vim -h`验证
原始官方部署教程链接
```
# 可选
# apt install -y curl vim
# 官方脚本, 指定使用Aliyun加速, root权限执行
sudo -i #切换到root
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
```
大环境禁止了,所以上述脚本直接连不到getdocker
笔者使用代码来源:
`https://github.com/xiehs211/install_docker/blob/main/install_docker.sh`
将上述代码块下载保存到服务器
运行
```
#
sh install_docker.sh --mirror Aliyun
```
执行安装后,验证是否安装成功
```
root@docker:~# docker --version
Docker version 27.1.2, build d01f264
```
# 给普通用户授权docker权限(备用)
```
# 注意登录用户身份
sudo usermod -aG docker $USER# 需要登出再重新登录才生效(实测需要重启生效)
# 没有生效前 id 与 id $USER 显示不一致
# id $USER 或 cat /etc/group | grep docker# 查看
newgrp - docker # 更新用户组 很重要(临时生效)
docker ps # 测试docker命令是否可以使用sudo正常使用
```
以上代码我没用。
因为实际我安装ubantu使用用户名docker,安装docker的root身份是基于普通用户docker(sudo -i)切换的。
```
root@docker:~# id docker
uid=1000(docker) gid=1000(docker) groups=1000(docker),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd)
root@docker:~# exit
logout
docker@docker:~$ groups
docker adm cdrom sudo dip plugdev lxd
```
在给权限前,我发现docker用户已经有了。
切回docker用户验证自己的group,也是包含docker的。
```
docker@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
```
正常使用。
# 测试镜像拉取&运行容器
```
# 测试镜像拉取&容器运行
docker run hello-world
```
成功走了旁路网关拉取
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/531d87bb672afdfe5400a6985f0f6190_1724055691_3507.png)
# 管理
portainer是一款流行的web端docker管理工具, 简单易用且能够满足个人折腾的需要, 下面介绍如何部署。
1. 官方版本(可以跳过)
参考链接
```
# 1. 拉取镜像
docker pull portainer/portainer-ce:latest
# 2.创建磁盘卷(可选)
docker volume create portainer_data
# 3. 创建容器
# 端口组合二选一即可, 粘贴代码前注意先删除 自#之后的注释, 避免格式问题
docker run -d --name portainer --restart=always \
-p 8000:8000 -p 9443:9443 \ # https使用, 仅使用http的话可以尝试注释掉
-p 9000:9000 \ # 使用传统的http端口
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:latest
```
2. 汉化版本(笔者用)
```
docker pull 6053537/portainer-ce:latest
docker volume create portainer_data
docker run -d --name portainer-zh --restart=always \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data6053537/portainer-ce:latest
```
http://虚拟机ip:9000/打开protainer.io
新安装设置用户名和密码 确定
3. 设置节点IP
节点上部署的容器, 端口映射链接地址, 默认为 0.0.0.0:端口, 此处设置后打开为设定ip:端口
点击环境-local
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/83bb3392646e3f104949fda3c3c2c3fa_1724055690_8557.png)
设置虚拟机的ip保存
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/82d1bb24aefbd96310122e88b485c87e_1724055690_4983.png)
点击首页-选中local
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/079a3b80baf3812229b8ec1fd37af0e1_1724055691_9484.png)
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/caef77d8f85882015d6464aa70761e25_1724055691_7845.png)
再点击容器,就可以点击到所有容器各自的入口(ip和端口—)了
效果: 节点下容器的端口链接地址
!24.png
# jellyfen部署测试核显
http://虚拟机ip:9000/打开protainer.io
1. 添加容器
!25.png
2. 设置容器名/镜像/端口映射
名称:Jellyfin
容器名: nyanmisaka/jellyfin:latest
主机80端口-docker8096端口
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/2edb493ef961c83dce2f060e0bde3970_1724055693_1509.png)
3. 设置共享核显
找到分配给unbantu系统的虚拟化核显 `/dev/dri`
!66.png
按图修改好,部署
等一分钟, 容器状态会由staring变为healthy, 着急可以手动刷新下查看变化;
确认变为healthy后, 此时可以通过lxc容器ip地址在浏览器访问http://ip端口, 开始Jellyfen的初始化
4. 设置磁盘卷映射
准备工作
docker所在虚拟机已共享了pve的磁盘。其/mnt/nfs/media目录存在测试视频wsb_B_02_r720P.mp4。
复制到jellyfen的存储卷
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/19a75f563aeabe59a876fa43d4b981ec_1724055691_2476.png)
记下目录
```
cp /mnt/nfs/media/wsb_B_02_r720P.mp4 /var/lib/docker/volumes/47d310fb79b8501a7c6c08ac114408cdd2902fa1ac32d6fa1ef9dff2979316c0/_data
```
# 重启策略设置"除非停止"
!38.png
# Jellyfen初始化应用
过程无特殊, 可以参考各类视频/博客
注意: 添加一个电影文件夹: 路径为前面设置的/media目录
# 验证实时转码
设置中启用了硬件加速
设置缩小影片分辨率或者选择不支持的音/视频编码视频播放
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/ebcd7e0f9ffd5272726656bc296d118b_1724055690_5808.png)
测试视频720p调低分辨率到360p 420kbps,触发转码, 实时集显使用情况
!(data/attachment/forum/plugin_zhanmishu_markdown/202408/78bf3cc6dda4ff0180620f2e8ed1cf17_1724055690_1688.png)
完美
# 后记
本次分享重点:
1. pve独立了系统
2. 网络独立了旁路网关
3. 存储直接挂载nfs
4. 硬解直通了,核显的虚拟化。
可以,AIO算是成了。
页:
[1]