生信人

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

0

收听

12

听众

319

主题
发表于 2024-8-19 16:01:07 | 查看: 1132| 回复: 2

背景

之前弄了allinone,是时候上docker了。

配置

首先先说一下我的配置吧, 1.png 配置大概就是这样,下面说一下主要思路吧,以PVE为基础,做五个虚拟系统,nas、旁路网关、docker载体、桌面OS(linux+win)。

1、旁路网关(已搭建)。我用的是istoreos,,从稳定性的角度来看,目前我也是把他作为旁路网关,主路由还是我的小米AX3000T。

2、docker的载体,我选用的ubuntu的服务器版,之所以选用这个版本,也没什么特别的原因,只是linux的桌面版比较喜欢ubuntu而已,但据说centos服务器版跟稳定一下,不过无所谓吧,我觉得差不多。另外不选择把docker直接安装到PVE里主要还是处于稳定性考虑。

之前已经将12300T核显虚拟了3个分身 2.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节点下新建虚拟机 4.png 常规设置页面, 填入虚拟机的名字, 然后点击下一步 5.png 选择引导镜像, 首先选择镜像所在存储节点, 然后在镜像列表中选择目标镜像; 之后点击下一步 6.png 磁盘设置, 选择存储节点, 磁盘大小后, 点击下一步 7.png CPU设置页面, 修改要分配的核心数, 类别选择host, 然后点击下一步(6) 8.png 内存设置, 根据需要调整大小, 然后点击下一步(8192 4096) 9.png 络设置, 取消勾选防火墙, 避免远程访问的一些问题; 选择默认的半虚拟化, 然后点击下一步 10.png 确认配置无误后, 点击完成

调整虚拟机引导顺序配置, 将系统镜像设置为第一引导选项,之后点击控制台, 启动虚拟机开始系统安装

在控制台页面, 点击start now开始运行虚拟机 11.png 虚拟机运行后, 后面是正常的Ubuntu系统安装过程,按提示进行

安装完会提示要移除cd设备

点击左侧工具栏, 电源按钮, Hard Stop强制关机 12.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: [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

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

57.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,此处随意设置一个不太简单密码即可, 正常只会使用一次. 58.png 59.png 再输入一遍,确认。

收藏回复 显示全部楼层 道具 举报

发表于 2024-8-19 16:21:34

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

成功走了旁路网关拉取 19.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
  1. 汉化版本(笔者用)
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

新安装设置用户名和密码 确定

  1. 设置节点IP 节点上部署的容器, 端口映射链接地址, 默认为 0.0.0.0:端口, 此处设置后打开为设定ip:端口

点击环境-local 20.png 设置虚拟机的ip保存 21.png

点击首页-选中local 22.png 23.png 再点击容器,就可以点击到所有容器各自的入口(ip和端口—)了

效果: 节点下容器的端口链接地址 !24.png

jellyfen部署测试核显

http://虚拟机ip:9000/打开protainer.io

  1. 添加容器 !25.png
  2. 设置容器名/镜像/端口映射 名称:Jellyfin

容器名: nyanmisaka/jellyfin:latest

主机80端口-docker8096端口

26.png

  1. 设置共享核显

找到分配给unbantu系统的虚拟化核显 /dev/dri !66.png 按图修改好,部署

等一分钟, 容器状态会由staring变为healthy, 着急可以手动刷新下查看变化;

确认变为healthy后, 此时可以通过lxc容器ip地址在浏览器访问http://ip端口, 开始Jellyfen的初始化

  1. 设置磁盘卷映射 准备工作

docker所在虚拟机已共享了pve的磁盘。其/mnt/nfs/media目录存在测试视频wsb_B_02_r720P.mp4。

复制到jellyfen的存储卷 35.png 记下目录

cp /mnt/nfs/media/wsb_B_02_r720P.mp4 /var/lib/docker/volumes/47d310fb79b8501a7c6c08ac114408cdd2902fa1ac32d6fa1ef9dff2979316c0/_data

重启策略设置"除非停止"

!38.png

Jellyfen初始化应用

过程无特殊, 可以参考各类视频/博客 注意: 添加一个电影文件夹: 路径为前面设置的/media目录

验证实时转码

设置中启用了硬件加速

设置缩小影片分辨率或者选择不支持的音/视频编码视频播放

39.png

测试视频720p调低分辨率到360p 420kbps,触发转码, 实时集显使用情况 67.png 完美

后记

本次分享重点:

  1. pve独立了系统
  2. 网络独立了旁路网关
  3. 存储直接挂载nfs
  4. 硬解直通了,核显的虚拟化。

可以,AIO算是成了。

回复 显示全部楼层 道具 举报

发表于 2024-8-19 16:02:40

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

图片按钮如下: 60.png 61.png 62.png 63.png

密码就是刚才设置的mok密码,不是root ssh密码。

虚拟机配置调整

接下来我们需要调整虚拟机显示配置, 移除默认显示设别, 同时添加宿主机的虚拟PCI集显, 之后关闭系统, 使配置生效; 然后启动系统, 通过SSH远程登录系统, 通过如下命令行可以如下输出.

  1. 虚拟机关机
  2. 修改虚拟机配置2处 64.png 显示修改为无,添加pci虚拟的核显,勾选如图,添加。
  3. 开启虚拟机 ls /dev/dri 64.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输出 16.png

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|生信人 ( 萌ICP备20244422号 )

GMT+8, 2024-12-4 02:26 , Processed in 0.085919 second(s), 33 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表