AI-NAS-工作站 搭建实录 二:系统准备与基础环境配置和简单测试
本文是《个人 AI-NAS-工作站 搭建实录》系列第二篇。上一篇
讲了为什么折腾、买了啥,这一篇进入实操:系统准备与基础环境配置和简单测试——飞牛 fnOS 怎么装、雷电3 显卡坞怎么让系统正确认到 Tesla P100、驱动和 Docker 环境怎么配。先把基础搞定,后面才能顺利部署模型。
先说结论:这套组合能跑通,但飞牛定制内核对雷电热插拔设备的兼容性必须手动加内核参数,这是整套配置里最重要的一步。
前言
上一篇结尾说好了,这一篇讲系统准备和基础环境配置外加简单测试。硬件全家福就不重复了,直接进正题。
先说一下环境:
小主机:零刻 ME Pro i5-13500H,32GB DDR4
显卡坞:开源宇宙 M70T(雷电3,JHL6340 桥接芯片)
显卡:Tesla P100 16GB(PCIe 接口版,被动散热 + 自配涡轮风扇)
系统:飞牛 fnOS 1.2.0505(基于 Debian 12,定制内核 6.18.18)
为什么选飞牛 fnOS?界面和群晖很像、对硬件更开放、Docker 生态完善,系统和硬件解绑,正是这次升级最想要的。
第一步:飞牛 fnOS 安装
飞牛 NAS 官网有详细教程,这里按我自己的实际安装流程走一遍:
1. 官网[飞牛 fnOS - Powerful NAS OS](飞牛NAS官网)下载 fnOS 镜像,用 Rufus(Rufus官网) 或 balenaEtcher(balenaEtcher官网)写入 U 盘
2. 开机进 BIOS,选 U 盘启动
3. 安装时选 M.2 NVMe 盘做系统盘(别选 SATA 盘,留给数据)
4. 装完进 Web 管理界面,初始化磁盘:
- 我自己原来的 2×8TB HDD 没有组 RAID1,直接组 RAID0 做数据空间。机械硬盘速度慢,目前只适合用来做冷数据备份。
- 2×SATA SSD 做常用数据盘,包括后续的 models 模型文件存放。模型文件都比较大,不经常用的放在这里,经常用的放 M.2 NVMe 盘上。
- 零刻 ME Pro i5-13500H 支持 4 个 M.2 NVMe 固态盘,可以根据自己情况规划。
系统盘用 120GB 的 M.2 NVMe 是硬需求,主要使用的模型文件放其他 M.2 NVMe,I/O 速度直接影响模型加载时间。包括后期一些推理引擎需要用到速度快的固态硬盘放模型权重。
制作启动 U 盘:



写入时选"以 DD 镜像模式写入",兼容性更好:

注意 U 盘上的数据会被清除,开始前请确保 U 盘数据已备份(写入过程会格式化 U 盘):



飞牛启动 U 盘做好后,插入小主机,启动并开始安装。我生产环境实际装的是 1.2.0505,下面演示安装用的是目前最新的 1.2.0800 版本,两者设置方法完全一样:









记住出现的 IP 地址,远程电脑登录这个 IP 地址开始设置:

登录飞牛 fnOS 界面开始初始化设置:



到这里飞牛 fnOS 就初步安装完了。接下来是怎么让飞牛 fnOS 识别到雷电3/4 显卡坞上的 Tesla P100 并正常使用——下面以我实际安装的 1.2.0505 为例,新版本 1.2.0800 的设置完全一样。
第二步:内核参数配置(最关键,必须做)
这是整套配置里最容易翻车的一步。 飞牛默认启动参数对热插拔的雷电设备——显卡坞不是很友好,系统通过 lspci -tv 可以看到 Tesla P100,但是一装驱动就报错,无法激活 P100。

问题原因
雷电3/4 显卡坞本质是 USB4 桥接 PCIe(M70T 用的是 JHL6340 桥接芯片)。默认内核参数下,桥接芯片下游的 PCIe 设备(也就是 Tesla P100 显卡)不会被正确分配总线编号和 MMIO 空间,lspci -tv看到,但是无法绑定驱动和使用。
解决方法
编辑 /etc/default/grub,编辑前注意保存备份一份,在 GRUB_CMDLINE_LINUX_DEFAULT 里加上:
pcie_ports=native pci=assign-busses,hpbussize=0x33,realloc,hpmmiosize=128M,hpmmioprefsize=16G
然后执行 sudo update-grub,重启。
参数说明:
- pcie_ports=native:让内核原生管理 PCIe 端口
- pci=assign-busses:重新分配总线编号,让 JHL6340 正确上报下游设备
- hpbussize=0x33:预留 PCIe 高端总线号范围
- hpmmiosize=128M:预留 MMIO
- hpmmioprefsize=16G:预取 MMIO 空间给热插拔设备
这些参数在雷电/USB4 桥接显卡坞场景下是必加的,不是可选项。
验证
重启后执行 lspci | grep -i nvidia,能看到 Tesla P100 就说明桥接通了。

第三步:NVIDIA 驱动安装
版本选择(踩坑点)
飞牛 1.2.0505 的定制内核 6.18.18,和 575 及更早版本的驱动有兼容问题——装了也加载不了。所以必须安装飞牛 fnOS 自带的驱动,就在飞牛 fnOS 的"应用中心"驱动里:

580.142 是飞牛官方仓库里 P100 显卡能稳定用的版本。注意飞牛 fnOS 1.2.0800 的驱动列表里还有 610.57.04,这个版本已经不支持 Tesla P100 了。

安装

看到"卸载"按钮,就是装好了:

装完最好重启 fnOS,然后验证:
nvidia-smi
正常输出应该能看到:
- Tesla P100-PCIE-16GB
- 显存 ~16GB
- 驱动版本 580.142
注意输出里的 CUDA Version: 13.0 是驱动支持的最高 CUDA 版本,与你装的工具包无关(详见第四步)。

第四步:CUDA 工具包
装 `cuda-toolkit`,别装 `cuda` 全量包
这里有个大坑:cuda-12-6 和 cuda-toolkit-12-6 是两个东西。
- cuda-12-6:会替换驱动,你的 580.142 会被覆盖,前面白装
- cuda-toolkit-12-6:只装工具包,不动驱动
所以一定装后者。先配 NVIDIA CUDA 仓库源(fnOS 基于 Debian 12):
wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
再安装工具包:
sudo apt install cuda-toolkit-12-6
nvcc --version # 显示 release 12.6
装完 nvcc 在 /usr/local/cuda-12.6/bin 下。如果 nvcc 命令找不到,把它加进 PATH:ln -s /usr/local/cuda-12.6/bin/nvcc /usr/local/bin/nvcc。

一个吓人的"假报错"
装完后 nvidia-smi 会显示 CUDA Version: 13.0,而你的工具包是 12.6——这不是错误。
CUDA Version 显示的是驱动支持的最高 CUDA 版本,不是你装的工具包版本。工具包版本以 nvcc --version 为准。
我第一次看到 13.0 的时候以为驱动没装好,查了半天。别慌,正常现象。

第五步:Docker GPU 支持
fnOS 自带 Docker,但默认容器里用不了 nvidia GPU。要装 nvidia-container-toolkit:

点击安装,会自动下载安装,非常方便:

看到"卸载"按钮,就是安装好了:

装完后,Docker Compose 里给容器加上 runtime: nvidia 就能把 Tesla P100 透传给容器。
第六步:先拿核显跑个轻量模型,和外接显卡坞的 P100 比较一下
Tesla P100 驱动全配好之前,可以先用核显(Intel Iris Xe)跑个 2B-4B 的小模型,确认 Docker + 容器网络是通的。
小主机有 32GB 内存,Intel Iris Xe 核显可以用内存来当显存(共享显存大小以 BIOS 里允许的上限为准,一般能到十几 GB),跑小模型够用。我实际测试下来,跑本地模型推荐 llama.cpp,支持最广。就是配置起来有点折腾,建议在飞牛的 docker 环境里跑——飞牛的 docker 环境优化得不错,不像群晖镜像仓库基本无法打开、无法下载镜像。
llama.cpp 官方没在(Docker Hub) 上放可以下载的镜像,官方镜像在 (llama.cpp)。好在 docker 官网有同步拉取官方镜像的,比如这个 beclab/ggml-org-llama.cpp:

我选 server-intel-b11459,就可以支持 Intel Iris Xe 核显:

当然也可以选 vulkan 版本的,比如 ai/llmman:

vulkan 版本有时比 intel SYCL 版本性能更好:

上述都选 server 版本,这样可以对外提供 API 服务,还有 web 页面,类似网页版的大模型聊天界面。
这一步的意义不是性能(核显跑 AI 只能算"能亮机"),而是把 Docker 环境先跑通,后面接 P100 时少一个变量。这里我拿最新的 llama.cpp-server b11723 的 intel 版本和 vulkan 版本,在 Intel Iris Xe 核显跑一下 Qwen3.5-2B 带 MTP 的模型(Qwen3.5-2B-UD-Q4_K_XL.gguf 和投影文件 mmproj-F16.gguf)测试一下。
Intel Iris Xe 核显测试
compose.yaml 如下:
version: '3.8'
services:
llama-cpp:
image: llama-cpp-intel-iris-xe-server-intel-b11723
container_name: llama-cpp-intel-iris-xe-Qwen3.5-2B
restart: no
ports:
- "9547:8080"
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
- /dev/dri/card0:/dev/dri/card0
volumes:
- /vol5/1000/VOL5_500GB/models:/models #这里需要替换你自己宿主机上放大模型的目录
command:
- --model
- /models/Qwen/Qwen3.5-2B-MTP-GGUF/Qwen3.5-2B-UD-Q4_K_XL.gguf
- --mmproj
- /models/Qwen/Qwen3.5-2B-MTP-GGUF/mmproj-F16.gguf
- --jinja
- --host
- 0.0.0.0
- --port
- "8080"
- --n-gpu-layers
- "99"
- --flash-attn
- "on"
- --load-mode
- none
- --threads
- "8"
- --repeat-last-n
- "128"
- --ctx-size
- "32768"
- --batch-size
- "1024"
- --ubatch-size
- "512"
- --temperature
- "0.7"
- --top-p
- "0.95"
- --top-k
- "20"
- --cont-batching
- --log-verbosity
- "4"






核显跑 2B 模型,回一句"你好"要等两分钟左右(prefill 就占了 1 分 42 秒),纯体验,别当真。
llama.cpp-server 自带的 web 界面可以进行简单的聊天:

问了一下"你好,介绍一下你自己",prefill 要 1 分 42 秒,回答用了 18 秒,平均 12.43 t/s:


测试图片识别:prefill 33 秒,52.52 tokens/s,decode 14 秒,12.33 t/s。图片识别个人感觉还行:

Intel Iris Xe 核显比较繁忙,温度也上来了:

同样的参数,换 vulkan 版本跑一下。vulkan 版本消耗内存比 intel SYCL 版本小一些:

同样的提示词"你好,介绍一下你自己",vulkan 版本明显快很多:prefill 4.1 秒,108.13 tokens/s,回答用了 9.1 秒,平均 15.89 t/s:

图片识别:prefill 22 秒,52.52 tokens/s,decode 13 秒,16.30 t/s。比 intel SYCL 快一些,不过 vulkan 版本的回答内容稍微简单了一点。
Tesla P100 测试
Tesla P100 我用的是自己编译的专用 llama.cpp-server 版本,compose.yaml 只是 docker 镜像和显卡驱动两处不同,其他启动参数都一样。
完整 compose.yaml:
version: '3.8'
services:
llama-cpp:
image: llama-cpp-p100-sm_60_fix-b11696-p100
container_name: llama-cpp-p100-Qwen3.5-2B
restart: no
ports:
- "9547:8080"
ipc: host # 关键:避免多线程/CUDA 共享内存不足导致的非法访存
environment:
NVIDIA_VISIBLE_DEVICES: "0"
NVIDIA_DRIVER_CAPABILITIES: "compute,utility"
GGML_CUDA_DISABLE_GRAPHS: "1" # 禁用 CUDA Graphs
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
volumes:
- /vol5/1000/VOL5_500GB/models:/models #这里需要替换你自己宿主机上放大模型的目录
command:
- --model
- /models/Qwen/Qwen3.5-2B-MTP-GGUF/Qwen3.5-2B-UD-Q4_K_XL.gguf
- --mmproj
- /models/Qwen/Qwen3.5-2B-MTP-GGUF/mmproj-F16.gguf
- --jinja
- --host
- 0.0.0.0
- --port
- "8080"
- --n-gpu-layers
- "99"
- --flash-attn
- "on"
- --load-mode
- none
- --threads
- "8"
- --repeat-last-n
- "128"
- --ctx-size
- "32768"
- --batch-size
- "1024"
- --ubatch-size
- "512"
- --temperature
- "0.7"
- --top-p
- "0.95"
- --top-k
- "20"
- --cont-batching
- --log-verbosity
- "4"
与 Intel 版的区别:
- image:用 P100 专用编译版(sm_60)
- 去掉 devices 里的 /dev/dri/*,改为 deploy/reservations GPU 透传
- 加上 ipc: host、NVIDIA_VISIBLE_DEVICES、GGML_CUDA_DISABLE_GRAPHS 等环境变量
- 其余启动参数完全相同
Tesla P100 的显存占用比 Intel SYCL 版少,和 Vulkan 版一样:

还是同样的提示词和图片,这速度确实是核显没法比的,不但速度快,回答的内容也比上面两个版本多。回答"你好,介绍一下你自己":prefill 0.5 秒,880.17 tokens/s,decode 1.3 秒,90.99 t/s。图片识别:prefill 1.7 秒,677.49 tokens/s,decode 8.2 秒,91.10 t/s:


验证清单
按顺序检查,全部通过才算基础环境就绪:

踩坑记录

本篇小结
到这里基础环境全部就绪:飞牛装好、雷电3 显卡坞桥接的 P100 被系统识别、驱动 580.142 + CUDA 12.6 就位、Docker GPU 透传可用。硬件、系统、驱动三件套齐了。
下一篇:模型部署实战——本地大模型知识库检索部署实测、语音和图片生成模型部署实测、intel iris Xe核显和P100 16GB 显存到底能跑多大的模型都会在下一篇展开。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
