跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

GPU技术交流论坛

F

fushinn

@fushinn
administrators
关于
帖子
16
主题
15
分享
0
群组
1
粉丝
0
关注
0

帖子

最新 最佳 有争议的

  • CX4 华为SP333刷回官方10G固件
    F fushinn

    25G固件在MAC下可能无问题。ikuai下无法联网,pve下可能无法联网

    运维部署交流

  • CX4 华为SP333刷回官方10G固件
    F fushinn

    注意事项

    网上下载的 SP380 固件可能存在 连接异常或无法联网的 Bug。
    本文将教你 如何刷回官方固件 并保证设备可以正常使用。


    升级操作说明

    1. 文件准备

    禁止直接打开下面的txt以免文件损坏

    1. 将升级包的文件后缀由 .txt 改为 .zip。
    2. 解压 .zip 文件。

    2. 赋予安装脚本执行权限

    在解压后的目录中执行以下命令:

    chmod +x install.sh
    

    3. 执行升级命令

    运行以下命令开始升级:

    ./install.sh upgrade
    

    ⚠️ 注意:执行过程中 无回显打印,请耐心等待命令执行完成。


    4. 查看升级结果

    (1)查看升级结果状态

    执行以下命令:

    cat result.xml
    

    若输出中:

    <Result>OK</Result>
    

    则表示 升级成功。


    (2)查看升级日志

    执行以下命令查看详细日志信息:

    cat work.log
    

    或直接在当前目录中打开 work.log 文件,查看完整的升级过程日志。


    NIC-SP333-CX4Lx-FW_14.32.1010_X86.txt

    运维部署交流

  • 修复开启Sriov开启后vmbr无法联网的问题
    F fushinn

    复制粘贴到

    /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一键脚本
    F fushinn

    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
    
    # —— 安装结束 —— 
    
    
    运维部署交流

  • 常用单线程测速节点
    F fushinn

    常用单线程测速节点

    国内

    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 多节点组网教程
    F fushinn

    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 MASQUERADE
    

    Linux服务器节点 (节点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. 准备工作

    1. 确保所有节点已安装WireGuard
    2. 为每个节点生成密钥对
    3. 规划IP地址分配
    4. 确认网络连通性

    2. 部署顺序

    1. 节点C (中心节点) - 首先配置并启动
    2. 节点D (连接到节点C)
    3. 节点A (连接到节点B和节点C)
    4. 节点B (连接到节点A和节点C)

    3. 启动服务

    OpenWrt节点

    # 重启网络服务
    /etc/init.d/network restart
    
    # 检查接口状态
    ifconfig wg0
    

    Linux节点

    # 启动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. 高效路由: 边缘节点直连,减少中转延迟
    2. 负载分散: 避免中心节点成为瓶颈
    3. 路径冗余: 多条路径确保网络可靠性
    4. 安全加固: 支持预共享密钥增强安全性
    5. 易于扩展: 中心节点架构便于添加新节点
    6. 灵活配置: 支持不同类型设备和操作系统

    故障排除

    常见问题及解决方案

    1. 连接建立失败

    • 检查防火墙端口是否开放
    • 验证endpoint地址和端口配置
    • 确认公钥配置正确

    2. 路由不通

    • 检查AllowedIPs配置
    • 验证系统路由表
    • 确认IP转发已启用

    3. 性能问题

    • 调整MTU设置
    • 检查网络路径和延迟
    • 优化路由配置

    4. 握手失败

    • 确认时间同步
    • 检查网络连通性
    • 验证密钥配置

    监控要点

    • WireGuard服务运行状态
    • 握手时间和频率
    • 网络延迟和丢包率
    • 流量统计和带宽使用
    • 系统资源使用情况

    日志分析

    # 查看系统日志
    journalctl -u wg-quick@wg0 -f
    
    # 查看内核日志
    dmesg | grep wireguard
    
    # OpenWrt日志
    logread | grep wireguard
    

    安全建议

    1. 定期更换密钥: 建议每6个月更换一次WireGuard密钥
    2. 使用预共享密钥: 在关键连接上启用预共享密钥
    3. 限制访问: 通过防火墙限制WireGuard端口访问
    4. 监控连接: 定期检查异常连接和流量
    5. 备份配置: 定期备份配置文件和密钥
    6. 更新软件: 保持WireGuard软件版本最新

    扩展配置

    添加新节点

    1. 为新节点生成密钥对
    2. 在中心节点添加新的Peer配置
    3. 配置新节点连接到中心节点
    4. 更新相关节点的AllowedIPs配置
    5. 测试连通性

    高可用配置

    • 部署多个中心节点
    • 配置节点间的冗余连接
    • 实现自动故障切换
    • 使用负载均衡
    运维部署交流

  • 使用DG1显卡在裸机Linux上打造高性能NAS服务器:完全解码指南
    F fushinn

    前言

    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查看显卡占用
    05a702be-d3ad-4167-af7a-48736224e86c-image.png
    41680d3a-98b0-42d4-800c-d49ccab15be0-image.png
    b2cf6c7f-ba33-424a-98f6-acb4cc78badb-image.png
    dcc693d6-aaa5-43d3-b3fb-bdcfaa98bb0b-image.png
    常用调优建议

    使用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上的温控传感器驱动教程
    F fushinn

    使用DKMS模块

    https://github.com/Fred78290/nct6687d
    

    安装命令

    git clone https://github.com/Fred78290/nct6687d
    cd nct6687d
    make dkms/install
    

    查看温度

    这里有些传感器(比如DRAM)还是有点问题。忽视就好

    apt install lm-sensors
    
    sensors
    

    35cdf4ec-752a-4390-8e1c-ab9ce94f39d9-image.png

    硬件知识分享

  • 英特尔12-14代大小核在Proxmox上的最优调度策略探究
    F fushinn

    先说结论

    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
    

    1fb00697-7de4-43a7-9278-d16a8ca377de-image.png
    调整之后:
    330ee024-d5d0-4043-86c6-299b3f3f5fb2-image.png

    虚拟机测试结果

    测试环境

    • i5-14400 6P4E
    • MSi Z690-A
    • Nvidia Tesla T10

    系统环境

    • 物理Windows11
    • 虚拟机Windows 10 - VGPU - 8 VCore
      23bf67d7-c983-4fed-b935-b568e172c8ad-image.png
    • 虚拟机Windows10 - IGPU
      ef346a2e-8509-42e4-be87-ebb427dd91e8-image.png

    测试结果

    • 虚拟机Windows10 - IGPU - 4 VCore
      ef561e0e-3a2e-408b-b5ef-980464ddfef7-image.png
    • 虚拟机Windows10 - VGPU - 8 VCore
      fbd8439e-831c-4636-a12b-3d40b087b370-image.png
    • 虚拟机Windows10 - VGPU - 8 VCore (AFF绑定大核心偶尔出现的情况)
      a0cfb57b-7f64-4b0d-89f7-72aa59c78294-image.png
    技术调优探讨

  • 为Linux RDP添加核显加速简明指南
    F fushinn

    xrdp_vaapi 项目 - 带硬件加速的远程桌面服务

    项目描述

    本项目自动构建支持Intel VA-API硬件加速的xrdp远程桌面服务器,并为Debian/Ubuntu系统配置可用的虚拟机环境。

    虽然主要设计用于配合libvirt/qemu虚拟机和i915-sriov-dkms驱动使用,但也适用于其他场景。

    30adb9d4-b0c7-4a2e-b905-dcaee41cafe3-image.png

    系统源配置要求

    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-firmware
    

    Ubuntu系统源

    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
    

    使用指南

    基础使用

    1. 克隆项目仓库:
    git clone https://github.com/tabletseeker/xrdp_vaapi -b master
    
    1. 进入项目目录:
    cd xrdp_vaapi
    
    1. 执行安装脚本:
    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教程
    F fushinn

    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)

    1. 安装构建工具:apt install build-* dkms
    2. 安装指定版本的内核和头文件:apt install proxmox-headers-6.8 proxmox-kernel-6.8 (适用于未签名内核)
    3. 从发布页面下载 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"
      
    4. 使用 dpkg 安装 deb 包:dpkg -i /tmp/i915-sriov-dkms_2025.05.18_amd64.deb
    5. 安装完成后,需要调整内核命令行参数:编辑 nano /etc/default/grub,将 GRUB_CMDLINE_LINUX_DEFAULT 修改为 intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe,如果已有其他参数则追加
    6. 执行 update-grub 和 update-initramfs -u 更新 grub 和 initramfs
    7. 可选:通过 proxmox-boot-tool 固定内核版本并更新启动配置
    8. 要启用 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 总线
    9. 重启系统
    10. 系统重新启动后,您应该能在 02:00.1 - 02:00.7 下看到 VF 数量(假设 iGPU 位于 00:02 总线)
    11. 您可以将 VF 直通给 LXC 或 VM。但切勿将 PF (02:00.0) 直通给 VM,否则会导致所有其他 VF 崩溃

    Linux 客户机安装步骤 (测试 Ubuntu 24.04/内核 6.8)

    需要在 Linux 客户机中运行相同的驱动程序

    1. 安装构建工具

      apt install build-* dkms linux-headers-$(uname -r) linux-modules-extra-$(uname -r)
      
    2. 下载并安装 .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
      
    3. 更新内核参数
      编辑 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"
      
    4. 完成后,更新 grub 和 initramfs 并重启

      update-grub
      update-initramfs -u
      
    5. 虚拟机重新启动后,执行 dmesg | grep i915 查看内核是否识别到 VF。也可以通过 lspci -nnk 检查 xe 是否被正确屏蔽,确认 VF 使用的驱动程序

    6. 可选:安装 vainfo (apt install vainfo),执行 vainfo 查看 VAAPI 是否识别到 iGPU

    7. 如需 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 固件

    1. 下载 UEFITools (Windows 使用 UEFITool_NE_A68_win64,也提供 Linux 和 Mac 版本)
    2. 下载主板 BIOS (我认为任何适用于 Alder/Raptop Lake 桌面平台的 BIOS 都可以)
    3. 解压 BIOS
    4. 使用 UEFITools (管理员身份运行) 加载 BIOS (通常是 .cap 文件)
    5. 选择 Action - Search 或使用快捷键 ctrl+F 搜索十六进制字符串 49006e00740065006c00280052002900200047004f0050002000440072006900760065007200
    6. 双击搜索结果,BIOS 中匹配项会高亮显示
    7. 右键点击高亮结果选择 Extract body...
    8. 保存文件,文件名和扩展名无关紧要。我使用 intelgopdriver_desktop 会保存为 intelgopdriver_desktop.bin
    9. 您可以校验文件哈希:
      1. Windows 终端命令:Get-FileHash -Path "path-to-rom" -Algorithm SHA256
      2. 适用于 UHD730 和 UHD770 桌面版:131c32cadb6716dba59d13891bb70213c6ee931dd1e8b1a5593dee6f3a4c2cbd
      3. 适用于 ADL-N:FA12486D93BEE383AD4D3719015EFAD09FC03352382F17C63DF10B626755954B
    10. 需要将此文件复制到 Proxmox 主机的 /usr/share/kvm 目录。我通过 NAS 上传后使用 wget 下载

    Windows 虚拟机创建

    1. 设置机器时,将 CPU 类型设为 host
    2. 提示:在首次设置界面按 Shift+F10 输入 OOBE\BYPASSNRO 可跳过 Microsoft 账户设置。虚拟机会重启,您可以选择"我没有 Internet 连接"选项来设置本地账户。或者,您也可以从 Windows VM 中移除网络设备
    3. 设置完成进入桌面后,启用远程桌面并确保本地账户用户有访问权限。此时可以关闭虚拟机
    4. 虚拟机关机后,编辑配置文件:
    # 直通 02.1 VF,指定 romfile。ROM 路径是相对的
    hostpci0: 0000:00:02.1,pcie=1,romfile=Intelgopdriver_desktop.efi,x-vga=1
    
    1. 在 Hardware 选项卡中,将 Display 设为 none
    2. 启动虚拟机。您将无法通过控制台访问,唯一方式是远程桌面。连接后从 Intel 下载显卡驱动,任何版本都应正常工作
    3. 安装过程中,当实际安装显卡驱动时可能会出现黑屏。此黑屏将持续到重启虚拟机。建议等待几分钟让其完成操作。您可以通过观察 Proxmox 中的 VM CPU 使用率来判断进度
    4. 重启后再次通过 RDP 连接。检查设备管理器确认结果。您应该看到 Intel 显卡已安装并正常工作

    CleanShot 2025-01-27 at 12 26 28

    另见:https://github.com/strongtz/i915-sriov-dkms/issues/8#issuecomment-1567465036

    手动安装步骤

    1. 安装构建工具:apt install build-essential dkms git / pacman -S base-devel dkms git
    2. 安装指定版本的内核和头文件:apt install linux-headers-$(uname -r) / pacman -S linux-headers
    3. 克隆仓库:git clone https://github.com/strongtz/i915-sriov-dkms.git
    4. 将模块添加到 DKMS:dkms add ./i915-sriov-dkms
    5. 使用 DKMS 安装模块:dkms install i915-sriov-dkms/2025.05.18
    6. 完成后,需要调整内核命令行参数:编辑 nano /etc/default/grub,将 GRUB_CMDLINE_LINUX_DEFAULT 修改为 intel_iommu=on i915.enable_guc=3 i915.max_vfs=7,如果已有其他参数则追加
    7. 执行 update-grub 和 update-initramfs -u / Arch Linux 使用 grub-mkconfig -o /boot/grub/grub.cfg 和 mkinitcpio -P
    8. 可选:使用 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 总线
    9. 重启系统

    卸载

    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
    F fushinn

    前提条件

    1. 请确保你已经安装好Nvidia驱动
    2. 是Linux服务器
    3. 安装好了Docker
    4. Debian12系统
    5. 良好的国际化网络环境

    参考:

    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.list
    
    sudo apt-get update
    
    export 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=docker
    
    sudo 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 风扇智能控制程序-Rust
    F fushinn

    GPU 风扇智能控制程序-Rust

    这是一个用于 NVIDIA T10 GPU 的智能风扇控制程序,可以根据 GPU 温度自动调节风扇转速。

    特性

    • 全线性温控算法
    • 低温静音运行(25℃以下 30%转速)
    • 高温全速保护(60℃以上 100%转速)
    • 优化的整数计算,资源占用极低
    • 支持 systemd 服务自动启动
    • 详细的日志记录和异常处理
    • 优雅的程序退出恢复默认设置

    使用方法

    直接运行

    • 其实直接从releases里面下载编译好的二进制就可以运行了
    gpu-fan-controller /sys/class/hwmon/hwmonX/pwmX
    

    参数说明:

    • pwm_path: 风扇 PWM 控制文件路径(必需)

    Systemd 服务安装(Linux)

    1. 复制程序到指定位置:
    sudo mkdir -p /opt/gpu-fan-control
    sudo cp gpu-fan-controller /opt/gpu-fan-control/
    
    1. 创建服务文件(需要自行配置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
    
    1. 启用并启动服务:
    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)
      • 保留一周日志

    故障排除

    1. 找不到 PWM 控制文件

      • 检查文件路径是否正确
      • 确认用户权限
    2. 无法读取 GPU 温度

      • 检查 NVIDIA 驱动是否正确安装
      • 确认 NVML 库可用
    运维部署交流

  • Tesla T10 PVE 服务器配置指南
    F fushinn

    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.bak
    

    2. 安装系统依赖

    apt-get install -y git build-essential dkms mdevctl
    apt install pve-headers-6.8.12-8-pve
    

    3. 网卡配置

    将网卡 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/interfaces
    

    4. 存储配置(可选)

    将 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-vm
    

    5. 内核管理(可选)

    # 安装指定版本内核
    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 refresh
    

    6. NVIDIA 驱动安装

    bash NVIDIA-Linux-x86_64-550.144.02-vgpu-kvm-custom.run -m kernel
    

    7. 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 nouveau
    

    8. 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.conf
    

    9. 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许可教程
    F fushinn

    本方法适用于在消费级显卡上开启 vGPU 功能,或使用特定的云游戏 (Cloud Gaming) 驱动。请确保安装好了Host驱动

    注意:19.0以上驱动使用(mbilker/vgpu_unlock-rs暂未适配19.0)

    https://github.com/rbqvq/vgpu_unlock-rs
    

    重要工具和资源

    相关驱动下载地址:

    https://alist.homelabproject.cc/foxipan/vGPU
    

    vGPU 解锁工具 (vgpu_unlock-rs):

    https://github.com/mbilker/vgpu_unlock-rs
    

    DLS补丁工具

    https://hub.docker.com/r/bncfbb/fastapi-dls-ui
    

    DLS在线补丁工具

    https://hub.docker.com/r/bncfbb/fastapi-dls-ui
    

    FastAPI-DLS

    https://git.collinwebdesigns.de/oscar.krause/fastapi-dls
    

    1. 安装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:latest
    

    NVIDIA 客户机驱动安装

    驱动链接

    https://alist.homelabproject.cc/foxipan/vGPU
    
    https://cloud.google.com/compute/docs/gpus/grid-drivers-table?hl=zh-cn
    

    Windows

    点击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.run
    
    sh NVIDIA-Linux-x86_64-570.133.20-grid.run
    

    4. 重启实例

    安装完成后,重启实例使驱动生效:

    sudo reboot
    

    5. 验证驱动安装

    重启后,登录实例,执行:

    nvidia-smi
    

    如果显示 GPU 信息和驱动版本,说明安装成功。


    驱动DLS补丁

    补丁程序支持Windows和Linux虚拟机:
    对于Windows虚拟机,GRID守护进程是Display.Driver/nvxdapix.dll
    对于Linux虚拟机,执行which nvidia-gridd以查找您的GRID守护进程。它可能位于/bin/

    Linux

    查找gridd

    which nvidia-gridd
    

    Patch nvidia-gridd和CA

    浏览器打开

    https://<your-dls-url>/
    
    admin/admin
    

    修改设置

    97675364-007d-4da5-a9ea-2b06fc6e383a-image.png

    打补丁

    812378a1-58d9-465f-8f83-51703b3346e9-image.png

    使用脚本或者命令激活

    31afdcc7-31a3-499e-856f-2797a1afe1ad-image.png

    3. 检查授权状态:

    & 'nvidia-smi' -q | Select-String "License"
    

    输出应类似如下内容:

    vGPU Software Licensed Product
        License Status                    : Licensed (Expiry: YYYY-M-DD hh:mm:ss GMT)
    

    ✅ 完成!

    5444660DD0FFE24C2F769EB76D893F47.png

    运维部署交流
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组