Ollama
方案:把 RTX 3060 12GB 整卡直通给一台 Ubuntu 虚拟机,NVIDIA 驱动与 Ollama 全部运行在 guest 内。核心收益是独占隔离——从根本上规避宿主机 NVIDIA 驱动与虚拟机争抢同一张卡时的 PCIe 复位(Reset)冲突(消费级卡的通病,详见文末边界)。代价是这张卡被该虚拟机独占,宿主机 Docker 及其它虚拟机都无法再使用。
整体分两侧:宿主机侧负责把显卡从内核剥离并直通进虚拟机;guest 侧负责装驱动、装 Ollama。下文以 Unraid 为例,Proxmox 思路一致(仅界面/命令位置不同)。
宿主机侧:显卡直通准备(Unraid)
-
开启 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 平台 -
绑定 vfio-pci:进入
Tools -> System Devices,勾选 RTX 3060 的 VGA 功能与**同组的 Audio 功能(HDMI 音频)**一并绑定到vfio-pci,重启后该卡即从宿主机内核剥离,专供直通。- 显卡的 VGA 与 Audio 通常在同一 IOMMU 分组,必须一起直通,否则虚拟机无法正常初始化设备。
- 若 3060 与其它关键设备落在同一分组无法拆分,才考虑
pcie_acs_override=downstream,multifunction(有安全代价,非必要不用)。
-
创建 Ubuntu 虚拟机:
Machine选Q35、BIOS选OVMF;Graphics Card选直通的 3060,Sound Card选其对应 Audio 功能。消费级卡建议在此提供该卡的 vBIOS(ROM 文件),以缓解直通首次点亮或复位后的黑屏。- vBIOS 可用 GPU-Z 从物理机 dump,或到 TechPowerUp VGA BIOS 库 按型号获取。
Ubuntu 虚拟机侧:驱动与 Ollama
-
确认识别到显卡(应能看到
NVIDIA ... GA106 [GeForce RTX 3060]):lspci | grep -i nvidia -
安装 NVIDIA 驱动(apt 方式最省心,会自动屏蔽 nouveau):
sudo ubuntu-drivers install # 自动选择推荐驱动# 或指定版本:sudo apt install nvidia-driver-550sudo reboot重启后执行
nvidia-smi,能正确读出 RTX 3060 与显存信息即为成功。 -
安装 Ollama(官方脚本会自动检测 NVIDIA GPU 并启用 CUDA,同时注册
ollamasystemd 服务并设为开机自启):curl -fsSL https://ollama.com/install.sh | sh -
通过 virtiofs 持久化模型目录(强烈推荐):把 Unraid 共享
/mnt/user/Downloads/Ollama用 virtiofs 挂进虚拟机,作为 Ollama 的模型目录。模型 blob 实际落在宿主机,这样重装 Ubuntu 虚拟机后已下载的模型无需重新拉取。先在 Unraid 虚拟机模板中添加 virtiofs 共享:
Source Path填/mnt/user/Downloads/Ollama,Mount tag设为Ollama(主机侧设置参见 Ubuntu 笔记的 VirtIOFS 一节)。这里直接把共享挂到 Ollama 的默认模型路径
/usr/share/ollama/.ollama/models(ollama服务用户的HOME目录在/usr/share/ollama)。guest 内确认模块已加载、建好挂载点并校正属主,再写入/etc/fstab开机自动挂载:lsmod | grep virtiofs # 确认 virtiofs 模块已加载sudo mkdir -p /usr/share/ollama/.ollama/modelssudo chown -R ollama:ollama /usr/share/ollama/.ollama # 挂载点属主需为 ollama/etc/fstabOllama /usr/share/ollama/.ollama/models virtiofs defaults,nofail,_netdev 0 0sudo systemctl daemon-reloadsudo mount -a # 先测试挂载,切勿直接重启sudo chown -R ollama:ollama /usr/share/ollama/.ollama/models # 确保 ollama 对共享内文件可读写virtiofs 挂载的属主来自宿主机共享,
ollama用户可能无写入权限。若上面的chown因宿主机侧限制无效,需在 Unraid 上把该共享/目录的属主调成ollama的 UID/GID(以 guest 内id ollama查到的为准)可写。 -
配置服务:局域网监听 + 模型目录:通过 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-reloadsudo 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 级别的量化模型(如
llama3、qwen2等)。 - 驱动与内核联动: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 显存上限。