Skip to content

FreeBSD 15.1 驱动 + GNOME 桌面折腾全记录

🕒 Published at:

FreeBSD 15.1 驱动 + GNOME 桌面折腾全记录 ​

日期:2026-09-07 机器:PVE 虚拟机 FreeBSD 15.1-RELEASE-p3(vm 103),直通 NVIDIA Quadro P400 本文档记录从零到桌面可用的全部过程、踩坑点与解决方案


一、硬件与环境 ​

项目内容
系统FreeBSD 15.1-RELEASE-p3 amd64(ZFS 根)
CPUIntel Xeon E3-1260L v5(8 核,PVE 直通)
内存8GB
显卡NVIDIA Quadro P400 (GP107GL, 2GB GDDR5) — PVE PCIe 直通
网络静态 IP 192.168.31.191/24,网关 192.168.31.1
SSHroot 免密登录,别名 freebsd

二、网络配置踩坑(重要!) ​

坑 1:变量名写错导致开机没默认路由 ​

FreeBSD 的 rc.conf 里正确变量名是 defaultrouter,不是 defrouter!

bash
# ✅ 正确
echo 'defaultrouter="192.168.31.1"' >> /etc/rc.conf

# ❌ 错误(rc 脚本不认识,开机后没默认路由,外网不通)
echo 'defrouter="192.168.31.1"' >> /etc/rc.conf

排查方法:netstat -rn | grep default,没有 default 路由就是这个问题。 临时修复:route add default 192.168.31.1

坑 2:fstab 写 tmpfs 挂了导致开机进单用户 ​

FreeBSD tmpfs 挂载不支持 tmppath 选项!写错会导致 Mounting /etc/fstab filesystems failed, startup aborted,直接掉进单用户模式。

bash
# ✅ 正确写法
tmpfs /tmp tmpfs rw,size=2g,mode=01777 0 0

# ❌ 错误写法(tmppath 不存在这个选项)
tmpfs /tmp tmpfs rw,tmppath=/tmp,size=2g 0 0

单用户模式恢复命令:

bash
mount -u /
grep -v tmpfs /etc/fstab > /tmp/fstab.new && cp /tmp/fstab.new /etc/fstab  # 或修正那一行
reboot

坑 3:rc.conf 里的 nameserver 不是标准变量 ​

DNS 由 /etc/resolv.conf 管理(nameserver 192.168.31.1 写在里面),rc.conf 里加 nameserver= 是无效垃圾。系统自带 resolvconf。

正确的持久化网络配置(/etc/rc.conf) ​

bash
hostname="freebsd"
ifconfig_vtnet0="inet 192.168.31.191 netmask 255.255.255.0"
ifconfig_vtnet0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
defaultrouter="192.168.31.1"

三、SSH 配置 ​

  • root SSH 登录:sshd_config 加 PermitRootLogin yes + PasswordAuthentication yes
  • 免密:ssh-keygen 生成密钥,公钥放入 /root/.ssh/authorized_keys
  • 本地 ~/.ssh/config 加别名:
Host freebsd
    HostName 192.168.31.191
    User root
    Port 22
    IdentityFile ~/.ssh/id_ed25519

四、NVIDIA 驱动折腾(大坑!) ​

坑 4:NVIDIA 官网 tar 包在 FreeBSD 上编译必失败 ​

下载 NVIDIA-FreeBSD-x86_64-580.178.04.tar.xz 后 make install 报:

fatal error: '.../src/nvidia/opt_global.h' file not found

这是 tar 包缺文件的已知问题(NVIDIA 官方论坛 470/580 都有同款报告),tar 包里根本没有 opt_global.h,没有生成规则。FreeBSD 官方只支持 pkg/ports 方式装驱动。

坑 5:新驱动不一定支持你的卡! ​

pkg install nvidia-driver 装的是最新 595.84,结果 dmesg 明确报:

NVRM: The NVIDIA Quadro P400 GPU installed in this system is
NVRM:  supported through the NVIDIA 580.xx Legacy drivers.
NVRM:  The 595.84 NVIDIA driver will ignore

→ Quadro P400 只支持 580.xx Legacy 系列!595 会直接忽略这块卡(nvidia-smi 通信失败、无 /dev/nvidia0)。

✅ 正确安装方式(免编译) ​

bash
pkg install -y nvidia-driver-580 nvidia-settings   # 装 580 Legacy 系列
kldload nvidia-modeset                             # 加载内核模块
sysrc kld_list+=nvidia-modeset                     # 开机自动加载

支持的驱动版本对照 ​

驱动适用显卡
nvidia-driver(最新 595.x)较新卡
nvidia-driver-580 (Legacy)Pascal 系(P400/P600 等)
nvidia-driver-470 (Legacy)Maxwell/部分 Pascal
nvidia-driver-390 (Legacy)老卡

验证驱动工作 ​

bash
nvidia-smi    # 应显示 Quadro P400, Driver 580.173.02

五、X 配置 ​

nvidia-xconfig 不随包提供,手动写 /etc/X11/xorg.conf:

Section "Device"
    Identifier  "Device0"
    Driver      "nvidia"
    BoardName   "Quadro P400"
    BusID       "PCI:6:16:0"      # ← 关键!不加 X 报 No devices detected
EndSection

显卡 PCI 地址:pciconf -lv | grep -i vga → vgapci0@pci0:6:16:0


六、GNOME 桌面安装 ​

bash
pkg install -y gnome          # GNOME 47 meta 包(约 380 个依赖包)

必备服务 ​

bash
sysrc gdm_enable="YES"     # 后来换成 lightdm(见下)
sysrc dbus_enable="YES"

坑 6:鼠标键盘不能用 —— 缺输入驱动 ​

装了 gnome 后 X 日志全是 No input driver specified, ignoring this device,键鼠全没反应(键盘灯都不亮)。 光装 gnome 不够,还要装输入驱动:

bash
pkg install -y xf86-input-libinput

坑 7:GDM 47 登录卡死(已知 bug!) ​

FreeBSD 上 GDM 47 有已知 bug(Bugzilla #287955):登录界面能看到,输入密码后卡死,日志:

Gdm: GdmDisplay: Session never registered, failing

官方无修复,建议用 LightDM 替代:

bash
pkg install -y lightdm lightdm-gtk-greeter
sysrc gdm_enable="NO"
sysrc lightdm_enable="YES"

# /usr/local/etc/lightdm/lightdm.conf 里设置:
greeter-session=lightdm-gtk-greeter
user-session=gnome-xorg

坑 8:root 无法通过图形界面登录 ​

LightDM 的 PAM 配置 /usr/local/etc/pam.d/lightdm 里有:

account  requisite  pam_securetty.so   ← 禁止 root 图形登录!

注释掉这行即可让 root 登录桌面。


七、桌面授权与用户管理 ​

  • GDM/LightDM 登录界面显示的用户全名来自 GECOS 字段(root 默认 "Charlie &",可用 pw usermod root -c "root" 改)
  • GNOME 对普通用户支持更好,可创建专用账户:
    bash
    pw useradd a1 -m -s /usr/local/bin/bash -G wheel,video -c "a1"
    echo "123456" | pw usermod a1 -h 0
    video 组是访问 GPU 必须的!
  • AccountsService 配置 /var/db/AccountsService/users/<用户名>:
    [User]
    Languages=zh_CN.UTF-8
    Session=gnome-xorg
    SystemAccount=false
  • 删用户彻底清理:pw userdel a1 -r + 从 wheel/video 组移除(pw groupmod wheel -d a1)

八、中文环境 ​

bash
# 字体 + 拼音输入法
pkg install -y noto-sc zh-ibus-libpinyin

# 系统默认 locale(/etc/login.conf 的 default 类是核心!)
# 在 default: 段加:
#   :lang=zh_CN.UTF-8:\
#   :charset=UTF-8:\
cap_mkdb /etc/login.conf      # ← 必须重建数据库

# 用户环境 /home/<user>/.profile
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus

中文输入法使用:GNOME 设置 → 键盘 → 输入源 → 添加"智能拼音",Super+空格 切换。

注意:改 /etc/login.conf 别用 sed 插多行(BSD sed 不支持 \n 转义),用 perl 或文本编辑器。


九、性能优化(卡顿解决) ​

Quadro P400 是入门专业卡(约 GT 1030 性能),GNOME 47 全特效会卡。关闭动画后流畅:

bash
# 通过 root 桌面会话的 dbus 执行(先找到会话 dbus socket)
# 找到 root 会话 socket:ls /tmp/dbus-*(owner 为 root 的最新一个)

DBUS_SESSION_BUS_ADDRESS="unix:path=/tmp/dbus-XXX" \
  gsettings set org.gnome.desktop.interface enable-animations false   # 关动画(大头)
DBUS_SESSION_BUS_ADDRESS="unix:path=/tmp/dbus-XXX" \
  gsettings set org.gnome.desktop.interface enable-hot-corners false  # 关热角
DBUS_SESSION_BUS_ADDRESS="unix:path=/tmp/dbus-XXX" \
  gsettings set org.gnome.mutter check-alive-timeout 0                # 关存活检查

其他 GPU 优化:

bash
nvidia-smi -pm 1    # 开启持久化模式,GPU 响应更快(P400 默认 P8 待机 139MHz)

验证硬件加速(不是软件渲染):

bash
XAUTHORITY=/var/run/lightdm/root/:0 DISPLAY=:0 glxinfo | grep -i renderer
# 应显示: Quadro P400 (NVIDIA),如果是 llvmpipe 就是软件渲染

十、最终成果清单 ​

项目状态
FreeBSD 15.1 + 静态 IP + root SSH 免密✅
Quadro P400 直通 + nvidia-driver-580 驱动✅
OpenGL 4.6 硬件加速✅
GNOME 47 桌面(LightDM 登录)✅
键鼠输入(xf86-input-libinput)✅
中文界面 + 拼音输入法✅
桌面流畅(已关动画)✅

关键命令速查 ​

bash
# 常用
pkg install -y <pkg>          # 装包
sysrc <var>="<val>"           # 持久化配置
service <name> restart        # 重启服务
kldload nvidia-modeset        # 加载 N 卡模块
kldstat | grep nvidia         # 查看模块
nvidia-smi                    # 显卡状态
cap_mkdb /etc/login.conf      # 重建 login 数据库
pw useradd / userdel          # 用户管理

# 查问题
netstat -rn | grep default    # 默认路由
dmesg | grep -i nvidia        # 显卡内核日志
tail -f /var/log/messages     # 系统日志
ls -lt /var/log/Xorg*         # X 日志
ls /var/log/gdm/              # GDM 日志