25G固件在MAC下可能无问题。ikuai下无法联网,pve下可能无法联网
fushinn
-
CX4 华为SP333刷回官方10G固件 -
CX4 华为SP333刷回官方10G固件注意事项
网上下载的 SP380 固件可能存在 连接异常或无法联网的 Bug。
本文将教你 如何刷回官方固件 并保证设备可以正常使用。
升级操作说明
1. 文件准备
禁止直接打开下面的txt以免文件损坏
- 将升级包的文件后缀由
.txt改为.zip。 - 解压
.zip文件。
2. 赋予安装脚本执行权限
在解压后的目录中执行以下命令:
chmod +x install.sh
3. 执行升级命令
运行以下命令开始升级:
./install.sh upgrade
️ 注意:执行过程中 无回显打印,请耐心等待命令执行完成。
4. 查看升级结果
(1)查看升级结果状态
执行以下命令:
cat result.xml若输出中:
<Result>OK</Result>则表示 升级成功。
(2)查看升级日志
执行以下命令查看详细日志信息:
cat work.log或直接在当前目录中打开 work.log 文件,查看完整的升级过程日志。
- 将升级包的文件后缀由
-
修复开启Sriov开启后vmbr无法联网的问题复制粘贴到
/usr/bin/fix_vmbr然后
chmod 755 /usr/bin/fix_vmbr使用交互式脚本自动修复
fix_vmbr以下是脚本
#!/bin/bash # fix_vmbr - 为 VM/CT 添加 bridgefix 钩子脚本(自动创建/下载) set -euo pipefail HOOKSCRIPT_ID="local:snippets/bridgefix.sh" SNIPPETS_DIR="/var/lib/vz/snippets" HOOKSCRIPT_PATH="$SNIPPETS_DIR/bridgefix.sh" HOOKSCRIPT_URL="https://raw.githubusercontent.com/jdlayman/pve-hookscript-sriov/master/bridgefix.sh" # 检查 pvesh, jq, qm, pct for cmd in pvesh jq qm pct wget; do if ! command -v $cmd >/dev/null 2>&1; then echo "❌ 未找到命令: $cmd,请安装后重试。" exit 1 fi done # 创建目录并下载 bridgefix.sh(如果不存在) if [[ ! -f "$HOOKSCRIPT_PATH" ]]; then echo "📦 $HOOKSCRIPT_PATH 不存在,正在创建目录并下载..." mkdir -p "$SNIPPETS_DIR" wget -O "$HOOKSCRIPT_PATH" "$HOOKSCRIPT_URL" chmod +x "$HOOKSCRIPT_PATH" echo "✅ 下载完成:$HOOKSCRIPT_PATH" fi echo "==============================" echo " Proxmox VM / CT 列表" echo "==============================" RESOURCES=$(pvesh get /cluster/resources --type vm --output-format json) printf " %-6s | %-6s | %s\n" "ID" "类型" "名称" printf " %s\n" "-------------------------------------------------" echo "$RESOURCES" | jq -r '.[] | "\(.vmid)\t\(.type)\t\(.name // "-")"' | \ while IFS=$'\t' read -r vmid vtype name; do [[ "$vtype" == "qemu" ]] && vtype="VM" [[ "$vtype" == "lxc" ]] && vtype="CT" printf " %-6s | %-6s | %s\n" "$vmid" "$vtype" "$name" done echo "" read -r -p "请输入要修复的 VMID: " VMID TYPE=$(echo "$RESOURCES" | jq -r --arg id "$VMID" '.[] | select(.vmid == ($id|tonumber)) | .type') if [[ -z "$TYPE" || "$TYPE" == "null" ]]; then echo "❌ 找不到 VMID $VMID" exit 1 fi echo "" echo "检测到:VMID=$VMID 类型=$TYPE" echo "" if [[ "$TYPE" == "qemu" ]]; then echo "➡️ 为虚拟机设置 hookscript..." qm set "$VMID" --hookscript "$HOOKSCRIPT_ID" elif [[ "$TYPE" == "lxc" ]]; then echo "➡️ 为容器设置 hookscript..." pct set "$VMID" --hookscript "$HOOKSCRIPT_ID" else echo "❌ 未知类型:$TYPE" exit 1 fi echo "✅ 已成功为 $TYPE $VMID 设置 hookscript:$HOOKSCRIPT_ID" -
CX4开启Sriov一键脚本CX4一键开启Sriov并且开机自动启动脚本
# —— 直接复制整个下面块并运行 —— sudo mkdir -p /opt/enable-sriov sudo tee /opt/enable-sriov/enable-sriov.sh > /dev/null <<'EOF' #!/usr/bin/env bash # /opt/enable-sriov/enable-sriov.sh # 目的:在 enp7s0f0np0 上启用 8 个 VF 并为 VF 0..7 设置 MAC 00:80:00:00:00:00 .. 00:80:00:00:00:07 set -euo pipefail # 如需修改接口名,请编辑下方 IFACE 变量或通过 systemd 的 Environment 传入 IFACE="enp7s0f0np0" NUMVFS=8 SYS="/sys/class/net/${IFACE}/device" IP_BIN="$(command -v ip || echo /sbin/ip)" LOG_PREFIX="[enable-sriov ${IFACE}]" if [ "$(id -u)" -ne 0 ]; then echo "${LOG_PREFIX} must be run as root" >&2 exit 1 fi if [ ! -d "${SYS}" ]; then echo "${LOG_PREFIX} ERROR: sysfs path ${SYS} not found. Is ${IFACE} correct?" >&2 exit 1 fi ${IP_BIN} link set dev "${IFACE}" up 2>/dev/null || true current=0 if [ -r "${SYS}/sriov_numvfs" ]; then current=$(cat "${SYS}/sriov_numvfs" 2>/dev/null || echo 0) fi echo "${LOG_PREFIX} current sriov_numvfs=${current}, target=${NUMVFS}" if [ "${current}" -ne "${NUMVFS}" ]; then set +e echo "${NUMVFS}" > "${SYS}/sriov_numvfs" 2>/dev/null rc=$? set -e if [ $rc -ne 0 ]; then echo "${LOG_PREFIX} direct write ${NUMVFS} failed, trying reset to 0 then set ${NUMVFS}" echo 0 > "${SYS}/sriov_numvfs" || true sleep 0.1 echo "${NUMVFS}" > "${SYS}/sriov_numvfs" fi sleep 0.2 new=$(cat "${SYS}/sriov_numvfs" 2>/dev/null || echo 0) echo "${LOG_PREFIX} sriov_numvfs now ${new}" if [ "${new}" -ne "${NUMVFS}" ]; then echo "${LOG_PREFIX} ERROR: failed to set sriov_numvfs to ${NUMVFS}" >&2 exit 2 fi else echo "${LOG_PREFIX} sriov already set to ${NUMVFS}, skipping re-provision." fi for i in $(seq 0 $((NUMVFS - 1))); do last_octet=$(printf "%02x" "${i}") mac=$(printf "00:80:00:00:00:%s" "${last_octet}") echo "${LOG_PREFIX} set vf ${i} mac ${mac}" ${IP_BIN} link set dev "${IFACE}" vf "${i}" mac "${mac}" || { echo "${LOG_PREFIX} WARN: failed to set mac for vf ${i}" >&2 } # 可选:取消 spoofchk(若需要允许 VM 使用任意 MAC) # ${IP_BIN} link set dev "${IFACE}" vf "${i}" spoofchk off || true done echo "${LOG_PREFIX} done" exit 0 EOF sudo chmod 755 /opt/enable-sriov/enable-sriov.sh # 写 systemd unit 到 /etc/systemd/system/enable-sriov.service sudo tee /etc/systemd/system/enable-sriov.service > /dev/null <<'EOF' [Unit] Description=Enable SR-IOV (8 VFs) and configure MACs (generic) After=network-pre.target Before=network.target Wants=network-pre.target [Service] Type=oneshot # 如果想用不同接口,编辑 /opt/enable-sriov/enable-sriov.sh 中的 IFACE, # 或在这里添加 Environment=IFACE=othername ExecStart=/opt/enable-sriov/enable-sriov.sh RemainAfterExit=yes TimeoutStartSec=30 [Install] WantedBy=multi-user.target EOF # reload, enable and start sudo systemctl daemon-reload sudo systemctl enable --now enable-sriov.service # show recent logs for quick check sudo journalctl -u enable-sriov.service -n 200 --no-pager # —— 安装结束 —— -
常用单线程测速节点常用单线程测速节点
国内
wget -O /dev/null https://mirrors.huaweicloud.com/ubuntu-releases/25.04/ubuntu-25.04-desktop-amd64.iso海外
wget -O /dev/null "https://speed.cloudflare.com/__down?during=download&bytes=1073741824" -
WireGuard 多节点组网教程WireGuard 多节点组网教程
网络拓扑概述
本教程介绍如何使用WireGuard构建一个4节点的安全网络架构,实现多个网段间的互联互通。
网络拓扑图
┌─────────────────────────────┐ ┌─────────────────────────────┐ │ 节点A │◄──►│ 节点B │ │ OpenWrt路由器 │ │ OpenWrt路由器 │ │ │ │ │ │ 本地网段: 192.168.1.0/24 │ │ 本地网段: 192.168.2.0/24 │ │ WG IP: 10.0.0.1/32 │ │ WG IP: 10.0.0.2/32 │ │ 监听端口: 51820 │ │ 监听端口: 51821 │ │ 外部地址: nodeA.example.com │ │ 外部地址: nodeB.example.com │ └──────────────┬──────────────┘ └──────────────┬──────────────┘ │ │ │ ┌─────────────────────────────┐│ └───────────►│ 节点C │◄┘ │ 公网服务器 (中心节点) │ │ │ │ WG IP: 10.0.0.3/32 │ │ 监听端口: 51822 │ │ 外部地址: nodeC.example.com │ └──────────────┬──────────────┘ │ ┌─────────────────────────────┐ │ 节点D │ │ 内网服务器 │ │ │ │ 本地网段: 192.168.3.0/24 │ │ WG IP: 10.0.0.4/32 │ │ 无监听端口 (主动连接) │ └─────────────────────────────┘连接关系
- 节点A
节点B: 直连,实现两个局域网间的高速通信 - 节点B
节点C: 直连,提供优化的访问路径 - 节点A
节点C: 直连,确保网络连通性 - 节点C
节点D: 连接,节点D通过节点C访问其他网段
节点配置规划
节点基本信息
节点 类型 WireGuard IP 本地网段 监听端口 外部地址 角色 节点A OpenWrt路由器 10.0.0.1/32 192.168.1.0/24 51820 nodeA.example.com 边缘节点 节点B OpenWrt路由器 10.0.0.2/32 192.168.2.0/24 51821 nodeB.example.com 边缘节点 节点C 公网服务器 10.0.0.3/32 - 51822 nodeC.example.com 中心节点 节点D 内网服务器 10.0.0.4/32 192.168.3.0/24 - - 内网节点 密钥生成
每个节点需要生成自己的密钥对:
# 生成私钥 wg genkey > private.key # 生成公钥 wg pubkey < private.key > public.key # 生成预共享密钥(可选,用于增强安全性) wg genpsk > preshared.key公钥信息示例
节点 公钥 节点A [节点A的公钥] 节点B [节点B的公钥] 节点C [节点C的公钥] 节点D [节点D的公钥] 路由配置
网段访问路径
源网段 目标网段 路径 优化状态 192.168.1.0/24 192.168.2.0/24 节点A → 节点B (直连)
优化192.168.2.0/24 192.168.1.0/24 节点B → 节点A (直连)
优化192.168.1.0/24 192.168.3.0/24 节点A → 节点C → 节点D
正常192.168.2.0/24 192.168.3.0/24 节点B → 节点C → 节点D
正常192.168.3.0/24 192.168.1.0/24 节点D → 节点C → 节点A
正常192.168.3.0/24 192.168.2.0/24 节点D → 节点C → 节点B
正常AllowedIPs 配置原则
节点A 配置
- 到节点C:
10.0.0.3/32, 10.0.0.4/32, 192.168.3.0/24 - 到节点B:
10.0.0.2/32, 192.168.2.0/24 - 预共享密钥: 可选择与节点B使用
节点B 配置
- 到节点A:
10.0.0.1/32, 192.168.1.0/24 - 到节点C:
10.0.0.3/32, 10.0.0.4/32, 192.168.3.0/24 - 预共享密钥: 可选择与节点A使用
节点C 配置
- 到节点A:
10.0.0.1/32, 192.168.1.0/24 - 到节点B:
10.0.0.2/32, 192.168.2.0/24 - 到节点D:
10.0.0.4/32, 192.168.3.0/24
节点D 配置
- 到节点C:
10.0.0.0/24, 192.168.1.0/24, 192.168.2.0/24
网络参数配置
通用参数
- MTU: 1300 (所有节点统一,避免分片)
- PersistentKeepalive: 25秒 (保持NAT穿透)
- WireGuard骨干网: 10.0.0.0/24
安全配置建议
- 预共享密钥: 建议在关键连接上使用预共享密钥增强安全性
- 定期更换密钥: 建议定期更换WireGuard密钥
- 防火墙规则: 严格控制WireGuard端口访问
配置文件示例
节点A (OpenWrt) 配置
# /etc/config/network 配置 config interface 'wg0' option proto 'wireguard' option private_key '[节点A私钥]' option listen_port '51820' list addresses '10.0.0.1/32' config wireguard_wg0 option public_key '[节点B公钥]' option endpoint 'nodeB.example.com:51821' option preshared_key '[预共享密钥]' list allowed_ips '10.0.0.2/32' list allowed_ips '192.168.2.0/24' option persistent_keepalive '25' config wireguard_wg0 option public_key '[节点C公钥]' option endpoint 'nodeC.example.com:51822' list allowed_ips '10.0.0.3/32' list allowed_ips '10.0.0.4/32' list allowed_ips '192.168.3.0/24' option persistent_keepalive '25'节点C (Linux服务器) 配置
[Interface] PrivateKey = [节点C私钥] Address = 10.0.0.3/32 ListenPort = 51822 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # 节点A PublicKey = [节点A公钥] Endpoint = nodeA.example.com:51820 AllowedIPs = 10.0.0.1/32, 192.168.1.0/24 PersistentKeepalive = 25 [Peer] # 节点B PublicKey = [节点B公钥] Endpoint = nodeB.example.com:51821 AllowedIPs = 10.0.0.2/32, 192.168.2.0/24 PersistentKeepalive = 25 [Peer] # 节点D PublicKey = [节点D公钥] AllowedIPs = 10.0.0.4/32, 192.168.3.0/24 PersistentKeepalive = 25节点D (内网服务器) 配置
[Interface] PrivateKey = [节点D私钥] Address = 10.0.0.4/32 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # 节点C (中心节点) PublicKey = [节点C公钥] Endpoint = nodeC.example.com:51822 AllowedIPs = 10.0.0.0/24, 192.168.1.0/24, 192.168.2.0/24 PersistentKeepalive = 25防火墙和NAT配置
各节点NAT规则
OpenWrt节点 (节点A、B)
# 允许WireGuard转发 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # 本地网段NAT iptables -t nat -A POSTROUTING -s 192.168.x.0/24 -o wan -j MASQUERADELinux服务器节点 (节点C、D)
# 启用IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 防火墙规则 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 开放WireGuard端口 iptables -A INPUT -p udp --dport 51822 -j ACCEPT端口开放要求
节点 端口 协议 说明 节点A 51820 UDP WireGuard监听端口 节点B 51821 UDP WireGuard监听端口 节点C 51822 UDP WireGuard监听端口 节点D - - 无需开放端口 部署步骤
1. 准备工作
- 确保所有节点已安装WireGuard
- 为每个节点生成密钥对
- 规划IP地址分配
- 确认网络连通性
2. 部署顺序
- 节点C (中心节点) - 首先配置并启动
- 节点D (连接到节点C)
- 节点A (连接到节点B和节点C)
- 节点B (连接到节点A和节点C)
3. 启动服务
OpenWrt节点
# 重启网络服务 /etc/init.d/network restart # 检查接口状态 ifconfig wg0Linux节点
# 启动WireGuard sudo wg-quick up wg0 # 设置开机自启 sudo systemctl enable wg-quick@wg0验证和测试
基本验证命令
# 检查WireGuard状态 sudo wg show # 检查路由表 ip route show | grep wg # 测试连通性 ping -c 3 10.0.0.3 # 测试到中心节点 ping -c 3 192.168.2.1 # 测试跨网段连通性 # 检查握手状态 sudo wg show wg0 latest-handshakes # 查看流量统计 sudo wg show wg0 transfer连通性测试脚本
#!/bin/bash # 连通性测试脚本 echo "测试WireGuard骨干网连通性..." for ip in 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4; do if ping -c 1 -W 3 $ip > /dev/null 2>&1; then echo "✅ $ip 连通" else echo "❌ $ip 不通" fi done echo "\n测试跨网段连通性..." for subnet in 192.168.1.1 192.168.2.1 192.168.3.1; do if ping -c 1 -W 3 $subnet > /dev/null 2>&1; then echo "✅ $subnet 连通" else echo "❌ $subnet 不通" fi done网络架构优势
- 高效路由: 边缘节点直连,减少中转延迟
- 负载分散: 避免中心节点成为瓶颈
- 路径冗余: 多条路径确保网络可靠性
- 安全加固: 支持预共享密钥增强安全性
- 易于扩展: 中心节点架构便于添加新节点
- 灵活配置: 支持不同类型设备和操作系统
故障排除
常见问题及解决方案
1. 连接建立失败
- 检查防火墙端口是否开放
- 验证endpoint地址和端口配置
- 确认公钥配置正确
2. 路由不通
- 检查AllowedIPs配置
- 验证系统路由表
- 确认IP转发已启用
3. 性能问题
- 调整MTU设置
- 检查网络路径和延迟
- 优化路由配置
4. 握手失败
- 确认时间同步
- 检查网络连通性
- 验证密钥配置
监控要点
- WireGuard服务运行状态
- 握手时间和频率
- 网络延迟和丢包率
- 流量统计和带宽使用
- 系统资源使用情况
日志分析
# 查看系统日志 journalctl -u wg-quick@wg0 -f # 查看内核日志 dmesg | grep wireguard # OpenWrt日志 logread | grep wireguard安全建议
- 定期更换密钥: 建议每6个月更换一次WireGuard密钥
- 使用预共享密钥: 在关键连接上启用预共享密钥
- 限制访问: 通过防火墙限制WireGuard端口访问
- 监控连接: 定期检查异常连接和流量
- 备份配置: 定期备份配置文件和密钥
- 更新软件: 保持WireGuard软件版本最新
扩展配置
添加新节点
- 为新节点生成密钥对
- 在中心节点添加新的Peer配置
- 配置新节点连接到中心节点
- 更新相关节点的AllowedIPs配置
- 测试连通性
高可用配置
- 部署多个中心节点
- 配置节点间的冗余连接
- 实现自动故障切换
- 使用负载均衡
- 节点A
-
使用DG1显卡在裸机Linux上打造高性能NAS服务器:完全解码指南前言
Intel DG1 显卡凭借其优秀的解码性能和低功耗,成为打造高性能NAS服务器的理想选择。然而,在Linux系统上驱动DG1显卡并实现最佳性能并非易事。本文档旨在分享DG1显卡在裸机Linux系统上的驱动经验,并提供详细的配置指南,帮助用户打造高性能NAS服务器。
最终方案是Fedora41 +内核6.12.11 + i915
至于为什么用Fedora,相对Arch稳定且新,占用也小,pve直通的话得更换第三方内核,esxi貌似只能发挥dg1一半的性能,飞牛的话用的魔改驱动(不是说不好,只不过为了考虑以后更新方便,主线驱动更方便更新,DG1 hang的问题6.13内核中已经包含了补丁,Fedora虽然没有Arch那么激进但是过不了多久也会更新6.13内核,这也是一个原因),Ubuntu夹带私货一生黑,对,说的就是你,snap狗皮膏药。Debian内核有点老了但是听说最新的Debian也有反向修复的i915驱动,可以自行尝试
测试环境
硬件: 12100F+H610+Intel DG1 显卡
操作系统: Ubuntu、Fedora、Arch Linux
内核版本: 6.8、6.12、6.12.11
驱动类型: Xe 内核驱动、intel-i915-dkms,主线i915
应用软件: Jellyfin
测试方法: 裸机安装、虚拟机直通(ESXi、PVE)
测试结果虚拟机直通:
ESXi: DG1直通给Windows,可正常输出显示信号和解码,但性能减半。
PVE: 加载皮蛋熊修改后的内核,直通DG1给飞牛OS,飞牛OS加载皮蛋熊的i915驱动,可正常解码,AI相册可正常调用显卡,但系统资源占用显示异常。
裸机Ubuntu24.04 Server LTS(内核6.8 + Xe):
使用Xe内核驱动,添加i915.force_probe=!4908 xe.force_probe=4908内核参数,使用nyanmisaka/jellyfin,无需替换iHD驱动,可正常解码,DP信号输出正常,但无法使用intel_gpu_top,据称6.8内核Xe驱动存在OpenCL bug。
裸机Ubuntu24.04 Server LTS(内核6.8 + i915-dkms):
使用官方反向移植的intel-i915-dkms驱动,需替换iHD驱动,可正常解码,但不输出显示信号(内核屏蔽)。
Fedora 41/Arch Linux(内核6.12):
使用Xe内核,可正常输出显示,但无法正常解码,出现卡屏和花屏现象。
Fedora 41(内核6.12.11):
根据@NyanMisaka在jellyfin论坛的帖子,Jellyfin 10.10.5官方已支持DG1,但需满足以下条件:
内核版本:6.1.124+/6.6.70+/6.12.9+/6.13+(Xe内核需要6.9/6.10/6.13+)
内核启动参数:根据实际情况添加i915/xe.force_probe=4908或i915/xe.force_probe=4905
实测添加i915.force_probe=4908可正常显示输出和解码播放,且占用率显示正常
教程部分
安装Fedora41 Server版本
使用sudo dnf update更新系统(默认的内核是6.11),并重启
修改/etc/default/grub的GRUB_CMDLINE_LINUX部分,类似GRUB_CMDLINE_LINUX=“rhgb quiet selinux=0 i915.force_probe=4908”
使用sudo grub2-mkconfig -o /boot/grub2/grub.cfg,更新grub配置,并重启
输入sudo lspci -vvn | grep “i915”,如果出现Kernel driver in use: i915则驱动初步成功
使用nyanmisaka/jellyfin最新镜像启动服务器,并且开启硬解,播放测试视频,观察帧率等是否正常
输入sudo dmesg -w,并且开启硬解,播放视频,查看内核有无报错
输入sudo dnf install intel-gpu-tools,安装工具包,播放视频时,输入intel_gpu_top查看显卡占用




常用调优建议使用ufw替代系统默认的防火墙(更简单,而且不会和docker冲突)
使用sudo turbostat --Summary --quiet --show Busy%,Bzy_MHz,IRQ,PkgWatt,PkgTmp,查看cpu功耗等信息
如果遇到btrfs报错,可尝试sudo dnf install btrfs-progs udisks2-btrfs
免责声明本文档仅供参考,不构成任何形式的保证。用户在使用DG1显卡和Linux系统时,应自行承担相关风险。
感谢
感谢@NyanMisaka @皮蛋熊笨熊,分享的宝贵经验,为本文档的编写提供了重要参考。
感谢https://icarusradio.github.io/guides/ubuntu-dg1-jellyfin.html
提供的经验 -
MSI-Z690-A主板上在Linux或PVE上的温控传感器驱动教程使用DKMS模块
https://github.com/Fred78290/nct6687d安装命令
git clone https://github.com/Fred78290/nct6687d cd nct6687d make dkms/install查看温度
这里有些传感器(比如DRAM)还是有点问题。忽视就好
apt install lm-sensorssensors
-
英特尔12-14代大小核在Proxmox上的最优调度策略探究先说结论
12-14代大小核CPU在最新的PVE环境下基本不需要做任何更改。不需要绑定aff核心亲和度。这样会适得其反。大小核在Linux上(测试宿主机内核为pve的6.8和6.14两个版本)会自动调度,优先使用P Core,然后使用E Core,最后使用HT Core(超线程)。由于AFF实际上是破坏了这种调度策略。实际上的效果甚至不如自动调度。另外在使用VGPU的情况可能会遇到单核跑分下降很多的情况如下图。不知道是由于什么引起的。
总结就是,除了LXC之外。放开手让Linux内核自动分配吧LXC测试结果
LXC会自动随机分配核心。这里需要手动调整核心绑定。这是和虚拟机调度不同的地方。也需要避免跨核心的情况。参考添加参数:
lxc.cgroup2.cpuset.cpus: 14-15
调整之后:

虚拟机测试结果
测试环境
- i5-14400 6P4E
- MSi Z690-A
- Nvidia Tesla T10
系统环境
- 物理Windows11
- 虚拟机Windows 10 - VGPU - 8 VCore

- 虚拟机Windows10 - IGPU

测试结果
- 虚拟机Windows10 - IGPU - 4 VCore

- 虚拟机Windows10 - VGPU - 8 VCore

- 虚拟机Windows10 - VGPU - 8 VCore (AFF绑定大核心偶尔出现的情况)

-
为Linux RDP添加核显加速简明指南xrdp_vaapi 项目 - 带硬件加速的远程桌面服务
项目描述
本项目自动构建支持Intel VA-API硬件加速的xrdp远程桌面服务器,并为Debian/Ubuntu系统配置可用的虚拟机环境。
虽然主要设计用于配合libvirt/qemu虚拟机和i915-sriov-dkms驱动使用,但也适用于其他场景。

系统源配置要求
Debian/Ubuntu用户必须确保
/etc/apt/sources.list包含完整源配置:Debian系统源
deb https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware deb-src https://deb.debian.org/debian bookworm main contrib non-free non-free-firmware deb https://deb.debian.org/debian trixie main contrib non-free non-free-firmware deb-src https://deb.debian.org/debian trixie main contrib non-free non-free-firmwareUbuntu系统源
deb http://de.archive.ubuntu.com/ubuntu noble main restricted universe multiverse deb-src http://de.archive.ubuntu.com/ubuntu noble main restricted universe multiverse使用指南
基础使用
- 克隆项目仓库:
git clone https://github.com/tabletseeker/xrdp_vaapi -b master- 进入项目目录:
cd xrdp_vaapi- 执行安装脚本:
bash xrdp_vaapi.sh参数与环境变量说明
xrdp_vaapi.sh 脚本参数
参数/变量 说明 默认值/可选值 DRIVER_NAME LIBVA_DRIVER_NAME环境变量 默认: iHD BUILD_DIR 构建源代码目录 默认: 当前目录($PWD) –sriov 或 -s 编译安装i915_sriov_dkms驱动 默认: false (不安装) buildyami.sh 脚本参数
参数 说明 默认值/可选值 –prefix 安装目录 默认: /usr/local –disable-x11 禁用X11支持编译 默认: 启用 –latest 自动获取最新版本 默认: 使用预设版本 注意:若不使用
--latest参数,将使用xrdp_vaapi/yami/omatic/buildyami.sh文件中243-247行指定的固定版本号。 -
Linux i915 SR-IOV 驱动-英特尔核心显卡vGPU教程Linux i915 驱动 (dkms 模块) 支持 SR-IOV 功能 (适用于 Linux 6.8-6.15(-rc5))
警告
此软件包是高度实验性的,仅建议清楚了解操作风险的用户使用。
您需要同时在宿主机和客户机中安装此 dkms 模块!
已测试的内核版本:6.12.10-zen1/6.11.9-arch1/6.10.9-arch1/6.9.10-arch1/6.8.9-arch1 (基于 ArchLinux)
必需的内核参数
intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe除
intel_iommu=on外,其他三个参数可以通过modprobe方式应用,将以下内容添加到/etc/modprobe.d/i915-sriov-dkms.conf:blacklist xe options i915 enable_guc=3 options i915 max_vfs=7创建虚拟功能(VF)
echo 1 > /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs在 Intel UHD Graphics 上最多可创建 7 个 VF
Arch Linux 安装步骤 (测试内核 6.12.6-zen1)
Arch Linux 用户可通过 AUR 获取:i915-sriov-dkms
也可从发布页面下载软件包,使用
pacman -U安装。PVE 宿主机安装步骤 (测试内核 6.8)
- 安装构建工具:
apt install build-* dkms - 安装指定版本的内核和头文件:
apt install proxmox-headers-6.8 proxmox-kernel-6.8(适用于未签名内核) - 从发布页面下载 deb 包
wget -O /tmp/i915-sriov-dkms_2025.05.18_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2025.05.18/i915-sriov-dkms_2025.05.18_amd64.deb" - 使用 dpkg 安装 deb 包:
dpkg -i /tmp/i915-sriov-dkms_2025.05.18_amd64.deb - 安装完成后,需要调整内核命令行参数:编辑
nano /etc/default/grub,将GRUB_CMDLINE_LINUX_DEFAULT修改为intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe,如果已有其他参数则追加 - 执行
update-grub和update-initramfs -u更新 grub 和 initramfs - 可选:通过
proxmox-boot-tool固定内核版本并更新启动配置 - 要启用 VF,必须设置
sysfs属性。安装sysfsutils后执行echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf,假设您的 iGPU 位于 00:02 总线。如果不是,请使用lspci | grep VGA查找 iGPU 所在的 PCIe 总线 - 重启系统
- 系统重新启动后,您应该能在 02:00.1 - 02:00.7 下看到 VF 数量(假设 iGPU 位于 00:02 总线)
- 您可以将 VF 直通给 LXC 或 VM。但切勿将 PF (02:00.0) 直通给 VM,否则会导致所有其他 VF 崩溃
Linux 客户机安装步骤 (测试 Ubuntu 24.04/内核 6.8)
需要在 Linux 客户机中运行相同的驱动程序
-
安装构建工具
apt install build-* dkms linux-headers-$(uname -r) linux-modules-extra-$(uname -r) -
下载并安装
.deb包wget -O /tmp/i915-sriov-dkms_2025.05.18_amd64.deb "https://github.com/strongtz/i915-sriov-dkms/releases/download/2025.05.18/i915-sriov-dkms_2025.05.18_amd64.deb" dpkg -i /tmp/i915-sriov-dkms_2025.05.18_amd64.deb -
更新内核参数
编辑nano /etc/default/grub,将GRUB_CMDLINE_LINUX_DEFAULT修改为i915.enable_guc=3 module_blacklist=xe,如果已有其他参数则追加示例:
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on i915.enable_guc=3 module_blacklist=xe" -
完成后,更新
grub和initramfs并重启update-grub update-initramfs -u -
虚拟机重新启动后,执行
dmesg | grep i915查看内核是否识别到 VF。也可以通过lspci -nnk检查xe是否被正确屏蔽,确认 VF 使用的驱动程序 -
可选:安装
vainfo(apt install vainfo),执行vainfo查看 VAAPI 是否识别到 iGPU -
如需 OpenCL 支持:
apt install intel-opencl-icd apt install clinfo clinfo
Windows 客户机 (测试环境:Proxmox 8.3 + Windows 11 24H2 + Intel 驱动 32.0.101.6460/32.0.101.6259)
感谢 resiliencer 在 #225 中的贡献
以下步骤可确保所有驱动版本的兼容性。理论上您可以安装任何版本而不会遇到烦人的
Code 43错误提取显卡 EFI 固件
- 下载 UEFITools (Windows 使用
UEFITool_NE_A68_win64,也提供 Linux 和 Mac 版本) - 下载主板 BIOS (我认为任何适用于 Alder/Raptop Lake 桌面平台的 BIOS 都可以)
- 解压 BIOS
- 使用 UEFITools (管理员身份运行) 加载 BIOS (通常是
.cap文件) - 选择
Action - Search或使用快捷键ctrl+F搜索十六进制字符串49006e00740065006c00280052002900200047004f0050002000440072006900760065007200 - 双击搜索结果,BIOS 中匹配项会高亮显示
- 右键点击高亮结果选择
Extract body... - 保存文件,文件名和扩展名无关紧要。我使用
intelgopdriver_desktop会保存为intelgopdriver_desktop.bin - 您可以校验文件哈希:
- Windows 终端命令:
Get-FileHash -Path "path-to-rom" -Algorithm SHA256 - 适用于 UHD730 和 UHD770 桌面版:
131c32cadb6716dba59d13891bb70213c6ee931dd1e8b1a5593dee6f3a4c2cbd - 适用于 ADL-N:
FA12486D93BEE383AD4D3719015EFAD09FC03352382F17C63DF10B626755954B
- Windows 终端命令:
- 需要将此文件复制到 Proxmox 主机的
/usr/share/kvm目录。我通过 NAS 上传后使用wget下载
Windows 虚拟机创建
- 设置机器时,将
CPU类型设为host - 提示:在首次设置界面按
Shift+F10输入OOBE\BYPASSNRO可跳过 Microsoft 账户设置。虚拟机会重启,您可以选择"我没有 Internet 连接"选项来设置本地账户。或者,您也可以从 Windows VM 中移除网络设备 - 设置完成进入桌面后,启用远程桌面并确保本地账户用户有访问权限。此时可以关闭虚拟机
- 虚拟机关机后,编辑配置文件:
# 直通 02.1 VF,指定 romfile。ROM 路径是相对的 hostpci0: 0000:00:02.1,pcie=1,romfile=Intelgopdriver_desktop.efi,x-vga=1- 在
Hardware选项卡中,将Display设为none - 启动虚拟机。您将无法通过控制台访问,唯一方式是远程桌面。连接后从 Intel 下载显卡驱动,任何版本都应正常工作
- 安装过程中,当实际安装显卡驱动时可能会出现黑屏。此黑屏将持续到重启虚拟机。建议等待几分钟让其完成操作。您可以通过观察 Proxmox 中的 VM CPU 使用率来判断进度
- 重启后再次通过 RDP 连接。检查设备管理器确认结果。您应该看到 Intel 显卡已安装并正常工作
另见:https://github.com/strongtz/i915-sriov-dkms/issues/8#issuecomment-1567465036
手动安装步骤
- 安装构建工具:
apt install build-essential dkms git/pacman -S base-devel dkms git - 安装指定版本的内核和头文件:
apt install linux-headers-$(uname -r)/pacman -S linux-headers - 克隆仓库:
git clone https://github.com/strongtz/i915-sriov-dkms.git - 将模块添加到 DKMS:
dkms add ./i915-sriov-dkms - 使用 DKMS 安装模块:
dkms install i915-sriov-dkms/2025.05.18 - 完成后,需要调整内核命令行参数:编辑
nano /etc/default/grub,将GRUB_CMDLINE_LINUX_DEFAULT修改为intel_iommu=on i915.enable_guc=3 i915.max_vfs=7,如果已有其他参数则追加 - 执行
update-grub和update-initramfs -u/ Arch Linux 使用grub-mkconfig -o /boot/grub/grub.cfg和mkinitcpio -P - 可选:使用
sysfsutils在启动时设置 VF 数量。安装sysfsutils后执行echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf,假设您的 iGPU 位于 00:02 总线。如果不是,请使用lspci | grep VGA查找 iGPU 所在的 PCIe 总线 - 重启系统
卸载
dpkg
使用
dpkg -P i915-sriov-dkms移除软件包pacman
使用
pacman -R i915-sriov-dkms移除软件包手动
使用
dkms remove i915-sriov-dkms/2025.05.18移除 dkms 模块致谢
- @strongtz 创建初始 dkms 模块
- @zhtengw 基于 linux-intel-lts (v5.15, v6.1) 重构,支持 v6.1~v6.4,参与 15+ 问题
- @bbaa-bbaa 基于 mainline-tracking linux/v6.12 分支重构,支持 v6.8~v6.13,参与 10+ 问题
- @pasbec 对仓库进行重大重构,支持 (v6.2, v6.5, v6.8),参与 20+ 问题
- @shenwii 支持 (v6.7, v6.9)
- @MotherOfTheGracchi 支持 v6.5.3
- @michael-pptf 多次更新 README.md,参与 20+ 问题
- 安装构建工具:
-
Sglang简明部署教程-Qwen3前提条件
- 请确保你已经安装好Nvidia驱动
- 是Linux服务器
- 安装好了Docker
- Debian12系统
- 良好的国际化网络环境
参考:
Nvidia vGPU 18.0以上 GRID或CloudGame驱动Patch许可教程
Tesla T10 PVE 服务器配置指南安装NVIDIA 容器运行时
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.listsudo apt-get updateexport NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1 sudo apt-get install -y \ nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \ libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}sudo nvidia-ctk runtime configure --runtime=dockersudo systemctl restart docker配置docker compose(需要自行配置相关内容)
services: sglang: image: lmsysorg/sglang:latest container_name: sglang volumes: #- /home/fushinn/sglang/cache/huggingface:/root/.cache/huggingface # If you use modelscope, you need mount this directory - ${HOME}/.cache/modelscope:/root/.cache/modelscope - ./jinja:/root/jinja restart: always network_mode: host # required by RDMA privileged: true # required by RDMA # Or you can only publish port 30000 # ports: # - 30000:30000 environment: HF_TOKEN: "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" # if you use modelscope to download model, you need set this environment SGLANG_USE_MODELSCOPE: true entrypoint: python3 -m sglang.launch_server command: --model-path Qwen/Qwen3-4B --host 127.0.0.1 --port 30000 --tool-call-parser qwen25 --reasoning-parser qwen3 #--chat-template /root/jinja/qwen3_nonthinking.jinja ulimits: memlock: -1 stack: 67108864 ipc: host healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:30000/health || exit 1"] deploy: resources: reservations: devices: - driver: nvidia device_ids: ["0"] capabilities: [gpu]
配置jinja(可选内容)
{%- if tools %} {{- '<|im_start|>system\n' }} {%- if messages[0].role == 'system' %} {{- messages[0].content + '\n\n' }} {%- endif %} {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }} {%- for tool in tools %} {{- "\n" }} {{- tool | tojson }} {%- endfor %} {{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }} {%- else %} {%- if messages[0].role == 'system' %} {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} {%- for message in messages[::-1] %} {%- set index = (messages|length - 1) - loop.index0 %} {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %} {%- set ns.multi_step_tool = false %} {%- set ns.last_query_index = index %} {%- endif %} {%- endfor %} {%- for message in messages %} {%- if message.content is string %} {%- set content = message.content %} {%- else %} {%- set content = '' %} {%- endif %} {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} {%- elif message.role == "assistant" %} {%- set reasoning_content = '' %} {%- if message.reasoning_content is string %} {%- set reasoning_content = message.reasoning_content %} {%- else %} {%- if '</think>' in content %} {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %} {%- set content = content.split('</think>')[-1].lstrip('\n') %} {%- endif %} {%- endif %} {%- if loop.index0 > ns.last_query_index %} {%- if loop.last or (not loop.last and reasoning_content) %} {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }} {%- else %} {{- '<|im_start|>' + message.role + '\n' + content }} {%- endif %} {%- else %} {{- '<|im_start|>' + message.role + '\n' + content }} {%- endif %} {%- if message.tool_calls %} {%- for tool_call in message.tool_calls %} {%- if (loop.first and content) or (not loop.first) %} {{- '\n' }} {%- endif %} {%- if tool_call.function %} {%- set tool_call = tool_call.function %} {%- endif %} {{- '<tool_call>\n{"name": "' }} {{- tool_call.name }} {{- '", "arguments": ' }} {%- if tool_call.arguments is string %} {{- tool_call.arguments }} {%- else %} {{- tool_call.arguments | tojson }} {%- endif %} {{- '}\n</tool_call>' }} {%- endfor %} {%- endif %} {{- '<|im_end|>\n' }} {%- elif message.role == "tool" %} {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} {{- '<|im_start|>user' }} {%- endif %} {{- '\n<tool_response>\n' }} {{- content }} {{- '\n</tool_response>' }} {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} {{- '<|im_end|>\n' }} {%- endif %} {%- endif %} {%- endfor %} {%- if add_generation_prompt %} {{- '<|im_start|>assistant\n<think>\n\n</think>\n\n' }} {%- endif %}启动Compose
docker compose up -d测试
curl http://127.0.0.1:30000/v1 -
GPU 风扇智能控制程序-RustGPU 风扇智能控制程序-Rust
这是一个用于 NVIDIA T10 GPU 的智能风扇控制程序,可以根据 GPU 温度自动调节风扇转速。
特性
- 全线性温控算法
- 低温静音运行(25℃以下 30%转速)
- 高温全速保护(60℃以上 100%转速)
- 优化的整数计算,资源占用极低
- 支持 systemd 服务自动启动
- 详细的日志记录和异常处理
- 优雅的程序退出恢复默认设置
使用方法
直接运行
- 其实直接从releases里面下载编译好的二进制就可以运行了
gpu-fan-controller /sys/class/hwmon/hwmonX/pwmX参数说明:
pwm_path: 风扇 PWM 控制文件路径(必需)
Systemd 服务安装(Linux)
- 复制程序到指定位置:
sudo mkdir -p /opt/gpu-fan-control sudo cp gpu-fan-controller /opt/gpu-fan-control/- 创建服务文件(需要自行配置ExecStart)
[Unit] Description=GPU Fan Control Service After=network-online.target Wants=network-online.target Requires=network-online.target [Service] Type=simple User=root ExecStart=gpu-fan-controller /sys/class/hwmon/hwmonX/pwmX Restart=always RestartSec=3 StandardOutput=append:/var/log/gpu-fan.log StandardError=append:/var/log/gpu-fan.log [Install] WantedBy=multi-user.target写入到
/etc/systemd/system/gpu-fan-control.service- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable gpu-fan-control sudo systemctl start gpu-fan-control配置说明
- MIN_TEMP = 25 # 最低温度阈值
- MAX_TEMP = 60 # 最高温度阈值
- MIN_SPEED = 77 # 最低转速(30%)
- MAX_SPEED = 255 # 最高转速(100%)
日志
- 控制台输出: 彩色实时日志
- 文件日志: gpu_fan.log
- 自动轮转(超过 10MB)
- 保留一周日志
故障排除
-
找不到 PWM 控制文件
- 检查文件路径是否正确
- 确认用户权限
-
无法读取 GPU 温度
- 检查 NVIDIA 驱动是否正确安装
- 确认 NVML 库可用
-
Tesla T10 PVE 服务器配置指南Tesla T10 PVE 服务器配置指南
1. 配置 APT 源
cat >/etc/apt/sources.list<<EOF deb http://mirrors.ustc.edu.cn/debian/ bookworm main non-free-firmware deb-src http://mirrors.ustc.edu.cn/debian/ bookworm main non-free-firmware deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main contrib deb http://mirrors.ustc.edu.cn/debian/ bookworm-updates main non-free-firmware deb-src http://mirrors.ustc.edu.cn/debian/ bookworm-updates main non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian bookworm pve-no-subscription EOF # 备份原有源文件 mv /etc/apt/sources.list.d/ceph.list /etc/apt/sources.list.d/ceph.list.bak mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak2. 安装系统依赖
apt-get install -y git build-essential dkms mdevctl apt install pve-headers-6.8.12-8-pve3. 网卡配置
将网卡 MAC 地址绑定到固定接口名称:
# 替换 xxx 为实际的 MAC 地址 echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xxx", NAME="eth0"' | tee /etc/udev/rules.d/71-net-name-by-mac.rules echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xxx", NAME="eth1"' | tee /etc/udev/rules.d/72-net-name-by-mac.rules # 编辑网络配置文件 vim /etc/network/interfaces4. 存储配置(可选)
将 LVM 转换为目录存储:
lvremove pve/data lvextend -l +100%FREE -r pve/root pvesm remove local-lvm mkdir /local-vm pvesm add dir local-vm --content images,iso,vztmpl,backup,rootdir,snippets -preallocation off --path /local-vm5. 内核管理(可选)
# 安装指定版本内核 apt-get update && apt-get install proxmox-kernel-6.8.12-8-pve proxmox-boot-tool kernel list proxmox-boot-tool kernel pin 6.8.12-8-pve proxmox-boot-tool refresh6. NVIDIA 驱动安装
bash NVIDIA-Linux-x86_64-550.144.02-vgpu-kvm-custom.run -m kernel7. IOMMU 配置
# 启用 IOMMU if [ `grep -c "intel_iommu=on" /etc/default/grub` -ne '1' ];then sed -i 's/quiet/quiet intel_iommu=on/' /etc/default/grub update-grub fi # 启用 vfio 并禁用 nouveau echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf update-initramfs -u -k all rmmod nouveau8. vGPU 解锁配置
# 克隆必要的仓库 git clone https://gitlab.com/polloloco/vgpu-proxmox.git cd /opt git clone https://github.com/mbilker/vgpu_unlock-rs.git # 安装 Rust 环境 curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal source $HOME/.cargo/env # 编译 vGPU 解锁工具 cd vgpu_unlock-rs/ cargo build --release # 配置系统服务 mkdir /etc/vgpu_unlock touch /etc/vgpu_unlock/profile_override.toml mkdir /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d} echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf9. vGPU 配置文件
cat >/etc/vgpu_unlock/profile_override.toml<<EOF [profile.nvidia-256] #1G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 frl_enabled = 0 [profile.nvidia-257] #2G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 frl_enabled = 0 [profile.nvidia-258] #3G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 frl_enabled = 0 [profile.nvidia-259] #4G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 frl_enabled = 0 [profile.nvidia-261] #8G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 frl_enabled = 0 [profile.nvidia-262] #16G num_displays = 1 display_width = 1920 display_height = 1080 max_pixels = 2073600 framebuffer = 0x3BC000000 framebuffer_reservation = 0x44000000 frl_enabled = 0 EOF其他工具
风扇控制
- T10 风扇控制工具: https://github.com/Xingsandesu/t10-fan-control
- T10 风扇控制工具-Rust: [https://github.com/Xingsandesu/gpu-fan-controller)
作者致谢
- Nanyo
- Fushinn
- https://github.com/Xingsandesu/
-
Nvidia vGPU 18.0以上 GRID或CloudGame驱动Patch许可教程本方法适用于在消费级显卡上开启 vGPU 功能,或使用特定的云游戏 (Cloud Gaming) 驱动。请确保安装好了Host驱动
注意:19.0以上驱动使用(mbilker/vgpu_unlock-rs暂未适配19.0)
https://github.com/rbqvq/vgpu_unlock-rs重要工具和资源
相关驱动下载地址:
https://alist.homelabproject.cc/foxipan/vGPUvGPU 解锁工具 (vgpu_unlock-rs):
https://github.com/mbilker/vgpu_unlock-rsDLS补丁工具
https://hub.docker.com/r/bncfbb/fastapi-dls-uiDLS在线补丁工具
https://hub.docker.com/r/bncfbb/fastapi-dls-uiFastAPI-DLS
https://git.collinwebdesigns.de/oscar.krause/fastapi-dls1. 安装FastAPI-DLS-UI
在 Docker 主机上运行以下命令
WORKING_DIR=/opt/fastapi-dls-ui mkdir -p $WORKING_DIR/cert openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout $WORKING_DIR/cert/webserver.key -out $WORKING_DIR/cert/webserver.crt docker run -d --name=fastapi-dls-ui \ -e DATABASE="sqlite:////app/database/db.sqlite" \ -p 443:443 \ -v $WORKING_DIR/cert:/app/cert \ -v $WORKING_DIR/db:/app/database \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ --restart=always bncfbb/fastapi-dls-ui:latestNVIDIA 客户机驱动安装
驱动链接
https://alist.homelabproject.cc/foxipan/vGPUhttps://cloud.google.com/compute/docs/gpus/grid-drivers-table?hl=zh-cnWindows
点击exe安装即可
Linux
前提条件
- 实例运行的是支持 NVIDIA 驱动的操作系统(如 Debian、Ubuntu、CentOS 等)
- 已连接到实例的 SSH 终端
1. 确认 GPU 类型
在 SSH 终端执行:
lspci | grep -i nvidia如果返回 NVIDIA 设备信息,表示实例已识别 GPU。
2. 更新操作系统
执行系统更新,确保依赖库最新:
sudo apt-get update sudo apt-get upgrade -y注:针对不同系统,更新命令可能不同。
3. 安装 NVIDIA 驱动
使用安装脚本
curl -O https://storage.googleapis.com/nvidia-drivers-us-public/GRID/vGPU18.1/NVIDIA-Linux-x86_64-570.133.20-grid.runsh NVIDIA-Linux-x86_64-570.133.20-grid.run4. 重启实例
安装完成后,重启实例使驱动生效:
sudo reboot5. 验证驱动安装
重启后,登录实例,执行:
nvidia-smi如果显示 GPU 信息和驱动版本,说明安装成功。
驱动DLS补丁
补丁程序支持Windows和Linux虚拟机:
对于Windows虚拟机,GRID守护进程是Display.Driver/nvxdapix.dll
对于Linux虚拟机,执行which nvidia-gridd以查找您的GRID守护进程。它可能位于/bin/Linux
查找gridd
which nvidia-griddPatch nvidia-gridd和CA
浏览器打开
https://<your-dls-url>/admin/admin修改设置

打补丁

使用脚本或者命令激活

3. 检查授权状态:
& 'nvidia-smi' -q | Select-String "License"输出应类似如下内容:
vGPU Software Licensed Product License Status : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)
完成!