跳到主要内容

Ollama

方案:把 RTX 3060 12GB 整卡直通给一台 Ubuntu 虚拟机,NVIDIA 驱动与 Ollama 全部运行在 guest 内。核心收益是独占隔离——从根本上规避宿主机 NVIDIA 驱动与虚拟机争抢同一张卡时的 PCIe 复位(Reset)冲突(消费级卡的通病,详见文末边界)。代价是这张卡被该虚拟机独占,宿主机 Docker 及其它虚拟机都无法再使用。

整体分两侧:宿主机侧负责把显卡从内核剥离并直通进虚拟机;guest 侧负责装驱动、装 Ollama。下文以 Unraid 为例,Proxmox 思路一致(仅界面/命令位置不同)。

宿主机侧:显卡直通准备(Unraid)

  1. 开启 IOMMU:主板 BIOS 打开 VT-d/AMD-Vi,再在 Unraid 的 syslinux 引导参数追加:

    /boot/syslinux/syslinux.cfg(append 行末尾)
    intel_iommu=on iommu=pt # Intel 平台
    # amd_iommu=on iommu=pt # AMD 平台
  2. 绑定 vfio-pci:进入 Tools -> System Devices,勾选 RTX 3060 的 VGA 功能与**同组的 Audio 功能(HDMI 音频)**一并绑定到 vfio-pci,重启后该卡即从宿主机内核剥离,专供直通。

    • 显卡的 VGA 与 Audio 通常在同一 IOMMU 分组,必须一起直通,否则虚拟机无法正常初始化设备。
    • 若 3060 与其它关键设备落在同一分组无法拆分,才考虑 pcie_acs_override=downstream,multifunction(有安全代价,非必要不用)。
  3. 创建 Ubuntu 虚拟机MachineQ35BIOSOVMFGraphics Card 选直通的 3060,Sound Card 选其对应 Audio 功能。消费级卡建议在此提供该卡的 vBIOS(ROM 文件),以缓解直通首次点亮或复位后的黑屏。

Ubuntu 虚拟机侧:驱动与 Ollama

  1. 确认识别到显卡(应能看到 NVIDIA ... GA106 [GeForce RTX 3060]):

    lspci | grep -i nvidia
  2. 安装 NVIDIA 驱动(apt 方式最省心,会自动屏蔽 nouveau):

    sudo ubuntu-drivers install # 自动选择推荐驱动
    # 或指定版本:sudo apt install nvidia-driver-550
    sudo reboot

    重启后执行 nvidia-smi,能正确读出 RTX 3060 与显存信息即为成功。

  3. 安装 Ollama(官方脚本会自动检测 NVIDIA GPU 并启用 CUDA,同时注册 ollama systemd 服务并设为开机自启):

    curl -fsSL https://ollama.com/install.sh | sh
  4. 通过 virtiofs 持久化模型目录(强烈推荐):把 Unraid 共享 /mnt/user/Downloads/Ollama 用 virtiofs 挂进虚拟机,作为 Ollama 的模型目录。模型 blob 实际落在宿主机,这样重装 Ubuntu 虚拟机后已下载的模型无需重新拉取

    先在 Unraid 虚拟机模板中添加 virtiofs 共享:Source Path/mnt/user/Downloads/OllamaMount tag 设为 Ollama(主机侧设置参见 Ubuntu 笔记的 VirtIOFS 一节)。

    这里直接把共享挂到 Ollama 的默认模型路径 /usr/share/ollama/.ollama/modelsollama 服务用户的HOME目录在 /usr/share/ollama)。guest 内确认模块已加载、建好挂载点并校正属主,再写入 /etc/fstab 开机自动挂载:

    lsmod | grep virtiofs # 确认 virtiofs 模块已加载
    sudo mkdir -p /usr/share/ollama/.ollama/models
    sudo chown -R ollama:ollama /usr/share/ollama/.ollama # 挂载点属主需为 ollama
    /etc/fstab
    Ollama /usr/share/ollama/.ollama/models virtiofs defaults,nofail,_netdev 0 0
    sudo systemctl daemon-reload
    sudo mount -a # 先测试挂载,切勿直接重启
    sudo chown -R ollama:ollama /usr/share/ollama/.ollama/models # 确保 ollama 对共享内文件可读写

    virtiofs 挂载的属主来自宿主机共享,ollama 用户可能无写入权限。若上面的 chown 因宿主机侧限制无效,需在 Unraid 上把该共享/目录的属主调成 ollama 的 UID/GID(以 guest 内 id ollama 查到的为准)可写。

  5. 配置服务:局域网监听 + 模型目录:通过 systemd override 把监听改到全网卡(默认仅 127.0.0.1);模型目录虽已挂在默认路径上,仍显式声明 OLLAMA_MODELS 以自证落点,并声明服务依赖该挂载,避免挂载就绪前启动导致在本地磁盘重建空目录:

    sudo systemctl edit ollama
    [Unit]
    RequiresMountsFor=/usr/share/ollama/.ollama/models

    [Service]
    Environment="OLLAMA_HOST=0.0.0.0:11434"
    Environment="OLLAMA_MODELS=/usr/share/ollama/.ollama/models"
    sudo systemctl daemon-reload
    sudo systemctl restart ollama

虚拟机的网络、QEMU Guest Agent 等基础配置参见 Ubuntu 部署笔记

常用操作示例

拉取并进入模型交互(以 huihui_ai/qwen3.5-abliterated:9b 为例,9B 参数量对 RTX 3060 的 12GB 显存运行效率相对平衡):

ollama run huihui_ai/qwen3.5-abliterated:9b

运行时另开终端观察 GPU 利用率与显存占用,确认推理确实跑在显卡上:

watch -n 1 nvidia-smi

模型默认存放在 /usr/share/ollama/.ollama/models——本方案已把 virtiofs 共享直接挂在该路径上(并用 OLLAMA_MODELS 显式指向自证),实际落在宿主机的 /mnt/user/Downloads/Ollama,重装虚拟机后可直接复用。可执行 ollama list 与检查该目录下的 blobs/manifests/ 确认模型确实写入了共享。

适用边界与注意事项

  • 整卡独占,二选一:显卡一旦绑定 vfio-pci 直通给虚拟机,宿主机的 Docker 与其它虚拟机都无法再使用它。若更看重宿主机 Docker 直接加速,应改用「宿主机 NVIDIA 插件 + 容器」的路线(本方案与之互斥)。
  • 复位缺陷仍需警惕:本方案把驱动关进 guest,已避开「宿主机驱动残留导致复位失败锁死总线」的最坏情况;但消费级卡的 Reset Bug 在反复重启/关闭虚拟机时仍可能触发黑屏或直通失败。务必配好 vBIOS ROM;万一卡死,冷重启宿主机通常可恢复。
  • 显存瓶颈(VRAM):RTX 3060 通常为 12GB 显存。当模型体积超出显存,Ollama 会把溢出部分卸载到系统 RAM 交由 CPU 计算,推理速度断崖式下跌。建议优先运行 7B~8B 级别的量化模型(如 llama3qwen2 等)。
  • 驱动与内核联动:guest 内核升级后 NVIDIA 内核模块需重新编译,建议使用带 DKMS 的 apt 驱动包,避免升级后 nvidia-smi 失效。
  • 模型持久化的属主坑:模型目录放在 virtiofs 共享上,重装虚拟机后新系统里 ollama 用户的 UID/GID 可能变化,导致对旧模型无写权限。重装后按需重新 chown 或校正共享目录权限即可,模型 blob 本身无需重新下载。
  • 防火墙/端口:确认放行 11434(对局域网监听时),并注意 Ollama 无内置鉴权,不要直接暴露到公网。

后续思路方向

  • 交互界面接入:额外部署 Open WebUI 或 Lobe Chat,通过 API 连接该 Ollama 实例,获得图形化多轮对话体验。
  • 容器化等效路线:也可在该 Ubuntu 虚拟机内用 Docker + nvidia-container-toolkit 跑 Ollama 容器,与直接安装等效,便于版本隔离与迁移。
  • 自定义与量化模型:按上下文需求通过 Modelfile 构建模型,或寻找高压缩比的 GGUF 模型来适配 12GB 显存上限。

评论

如果内容有勘误、补充或不同看法,可以直接写在这里。

正在加载留言板…