PVE8.2.4下-Ubuntu虚拟机创建与虚拟核显直通
编辑
背景
之前弄了allinone,是时候上docker了。
配置
首先先说一下我的配置吧,
配置大概就是这样,下面说一下主要思路吧,以PVE为基础,做五个虚拟系统,nas、旁路网关、docker载体、桌面OS(linux+win)。
1、旁路网关(已搭建)。我用的是istoreos,,从稳定性的角度来看,目前我也是把他作为旁路网关,主路由还是我的小米AX3000T。
2、docker的载体,我选用的ubuntu的服务器版,之所以选用这个版本,也没什么特别的原因,只是linux的桌面版比较喜欢ubuntu而已,但据说centos服务器版跟稳定一下,不过无所谓吧,我觉得差不多。另外不选择把docker直接安装到PVE里主要还是处于稳定性考虑。
之前已经将12300T核显虚拟了3个分身
计划
在PVE虚拟机模式下, Linux系统使用宿主机基于SR-IOV虚拟的核显. Ubuntu22.04LTS服务器版系统的虚拟机。
虽然近期发布了24.04LTS,但我还是先用旧的吧。
安装 Ubuntu 22.04 LTS
- 安装 Ubuntu 22.04 LTS
手工下载 Ubuntu 22.04 LTS ISO 镜像,阿里云 ISO 镜像下载地址。手工上传到 PVE 系统。
我选择通过 PVE 自动下载 ISO(推荐)
虚拟机创建
在pve节点下新建虚拟机
如图二到十, 虚拟机配置设置
准备在pve节点下新建虚拟机
常规设置页面, 填入虚拟机的名字, 然后点击下一步
选择引导镜像, 首先选择镜像所在存储节点, 然后在镜像列表中选择目标镜像; 之后点击下一步
磁盘设置, 选择存储节点, 磁盘大小64gb后, 点击下一步
CPU设置页面, 修改要分配的核心数, 类别选择host, 然后点击下一步(6)
内存设置, 根据需要调整大小, 然后点击下一步(6144 6144)
络设置, 取消勾选防火墙, 避免远程访问的一些问题; 选择默认的半虚拟化, 然后点击下一步
确认配置无误后, 点击完成
调整虚拟机引导顺序配置, 将系统镜像设置为第一引导选项,之后点击控制台, 启动虚拟机开始系统安装
在控制台页面, 点击start now开始运行虚拟机
虚拟机运行后, 后面是正常的Ubuntu系统安装过程,按提示进行
安装完会提示要移除cd设备
点击左侧工具栏, 电源按钮, Hard Stop强制关机
系统安装完毕后, 需要先停止虚拟机, 修改引导选项, 取消使用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: [192.168.31.104/24] # static ip
nameservers:
addresses: [192.168.31.2] # 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
升级内核到6.5.0-35-generic
sudo apt-cache search linux-image | grep '6.5.0'|grep 'generic'
存在 linux-image-6.5.0-35-generic
sudo apt-get install linux-headers-6.5.0-35-generic
sudo apt-get install linux-image-6.5.0-35-generic
sudo apt-get install linux-modules-6.5.0-35-generic
sudo apt-get install linux-modules-extra-6.5.0-35-generic
update-grub #更新配置,默认最新的kernel会第一顺序启动
重启
uname -r
#验证显示
6.5.0-35-generic
成功。
APT软件源索引更新与必要工具软件安装
sudo apt update
sudo apt install -y git build-* dkms # 必要编译工具安装
# 可选
# apt install -y vim
核显虚拟化驱动项目的源码下载与配置修改(需要切换root执行)
设置环境变量
# 切换到root
sudo -i
KERNEL=$(uname -r); KERNEL=${KERNEL%-generic}
echo ${KERNEL}
# 进入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
DKMS添加驱动源码管理并安装部署
# 链接内核源代码,并检查状态。确认内核显示已添加。
sudo cp -r ~/i915-sriov-dkms /usr/src/i915-sriov-dkms-$KERNEL
ls /usr/src # 查看
cd /usr/src/i915-sriov-dkms-$KERNEL
dkms add .
dkms status
# 构建新内核并检查状态。验证是否显示已安装。
# 安装内核扩展, 会触发MOK相关设置.
sudo dkms install -m i915-sriov-dkms -v $KERNEL -k $(uname -r) --force -j 4
构建安装内核扩展, 提示需要安全引导已启用,需要设置MOK,此处随意设置一个不太简单密码备用, 正常只会再使用一次.
再输入一遍,确认。
GRUB 配置
# 解释: i915.max_vfs=7 表示最多虚拟成3个设备
cp -a /etc/default/grub{,.bak}
# 会在第10行追加内容: intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=3
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
# 更新引导
update-grub
update-initramfs -u -k all
系统重启与引导项MOK配置
执行到此, 应该对该虚拟机系统进行重启, 但需要额外强调下:
因为当前版本系统启用了安全引导, 因此必须在安装驱动后, 重启进入系统前, 在引导页面进行MOK相关配置. 只需在第一次重启配置成功, 之后不在需要设置.
开机启动/引导项MOK配置过程: Enroll MOK, Continue, Yes,
# 重启机器, 在开机页面, 开机引导页面依次选择:
# * Enroll MOK, Continue, Yes, <password>, Reboot
# 如果错过, 需要进入终端, 重新运行 mokutil ... 命令并再次重启。
# 在完成此设置之前,DKMS 模块不会加载。
# Ubuntu重置MOK
# 参见: https://wiki.ubuntu.com/UEFI/SecureBoot
update-secureboot-policy --enroll-key
图片按钮如下:
密码就是刚才设置的mok密码,不是root ssh密码。
先关机
虚拟机配置调整
接下来我们需要调整虚拟机显示配置, 移除默认显示设别, 同时添加宿主机的虚拟PCI集显, 之后关闭系统, 使配置生效; 然后启动系统, 通过SSH远程登录系统, 通过如下命令行可以如下输出.
- 虚拟机关机
- 修改虚拟机配置2处
显示修改为无,添加pci虚拟的核显,勾选如图,添加。 - 开启虚拟机
ls /dev/dri
以上是正确添加了虚拟化核显。没有添加会少一个renderD128
效果验证
通过以上步骤完成虚拟化集显设备直通后, 下面我们基于Docker部署Jellyfen在线流媒体应用, 验证集显直通是否成功.
- 集显查询工具
为了了解集显的实时使用情况, 还需要在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输出
Docker部署
完成Docker环境安装以及portainer的安装
- 一键安装脚本
下载脚本依赖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
成功走了旁路网关拉取
管理
portainer是一款流行的web端docker管理工具, 简单易用且能够满足个人折腾的需要, 下面介绍如何部署。
- 官方版本(可以跳过)
参考链接
# 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
- 汉化版本(笔者用)
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:/data 6053537/portainer-ce:latest
http://虚拟机ip:9000/打开protainer.io
新安装设置用户名和密码 确定
- 设置节点IP
节点上部署的容器, 端口映射链接地址, 默认为 0.0.0.0:端口, 此处设置后打开为设定ip:端口
点击环境-local
设置虚拟机的ip保存
点击首页-选中local
再点击容器,就可以点击到所有容器各自的入口(ip和端口—)了
效果: 节点下容器的端口链接地址
jellyfen部署测试核显
http://虚拟机ip:9000/打开protainer.io
- 添加容器
- 设置容器名/镜像/端口映射
名称:Jellyfin
容器名: nyanmisaka/jellyfin:latest
主机80端口-docker8096端口
- 设置共享核显
找到分配给unbantu系统的虚拟化核显 /dev/dri
按图修改好,部署
等一分钟, 容器状态会由staring变为healthy, 着急可以手动刷新下查看变化;
确认变为healthy后, 此时可以通过lxc容器ip地址在浏览器访问http://ip端口, 开始Jellyfen的初始化
重启策略设置"除非停止"
- 准备工作
docker所在虚拟机已共享了pve的磁盘。其/mnt/sda1-16t/media目录存在测试视频wsb_B_02_r720P.mp4。
新建一个nfs存储卷,挂载到jellyfin上/video。
Jellyfen初始化应用
过程无特殊, 可以参考各类视频/博客
注意: 添加一个电影文件夹: 路径为前面设置的/media目录
验证实时转码
设置中启用了硬件加速
设置缩小影片分辨率或者选择不支持的音/视频编码视频播放
测试视频720p调低分辨率到360p 420kbps,触发转码, 实时集显使用情况
完美
后记
本次分享重点:
- pve独立了系统
- 网络独立了旁路网关
- 存储直接挂载nfs
- 硬解直通了,核显的虚拟化。
可以,AIO算是成了。
- 0
- 0
-
赞助
支付宝
微信
-
分享