前面我已经在 PVE 上陆续装过 Debian、Arch Linux、Windows 11 等系统。既然虚拟化环境已经搭好,这次干脆换个口味:在 PVE 上安装一套FreeBSD 15.1 + XFCE,看看这个老牌 Unix-like 系统现在作为桌面系统是什么体验。
FreeBSD 和 Linux 乍一看非常相似:都有 shell、SSH、包管理器、Xorg,也能安装 XFCE、KDE 等桌面环境。
但真正用起来以后,会发现很多细节并不一样。
例如 FreeBSD 默认使用 BSD 用户空间工具,系统管理依赖rc.conf、service和sysrc;第三方软件通常安装到/usr/local;默认的vi也不是 Linux 用户熟悉的 Vim。
更明显的差异,则出现在虚拟桌面这一层。
这次最终使用的环境是:
PVE └── FreeBSD 15.1 ├── UEFI ├── VirtIO SCSI ├── VirtIO Network ├── UFS ├── QEMU Guest Agent ├── Xorg ├── XFCE ├── LightDM └── SCFB下面从安装开始。
一、创建 FreeBSD 虚拟机
首先下载 FreeBSD 15.1 amd64 安装 ISO,并上传到 PVE 的 ISO Storage。
这次我创建的 VM 配置大致如下:
| 项目 | 配置 |
|---|---|
| 系统 | FreeBSD 15.1 amd64 |
| Machine | q35 |
| BIOS | OVMF / UEFI |
| CPU | 2 Core |
| 内存 | 4 GB |
| 硬盘 | 约 64 GB |
| 磁盘控制器 | VirtIO SCSI |
| 网卡 | VirtIO |
| Bridge | vmbr0 |
| 文件系统 | UFS |
| 桌面 | XFCE |
这台 FreeBSD VM 使用频率不会太高,所以我把虚拟磁盘放到了机械硬盘上。
对于这种以体验系统、SSH、偶尔打开桌面为主的 VM,机械硬盘其实已经够用了。
启动 VM,进入 FreeBSD Installer。
选择:
InstallHostname 我设置为:
pve-freebsd1501创建普通用户时,需要特别注意把用户加入:
wheel例如:
Username: pveuser Other groups: wheelFreeBSD 默认只有wheel组成员能够通过su切换为 root。如果忘记加入,之后执行:
su -就可能出现:
BAD SU pveuser这种情况下可以使用 root 登录控制台,再执行:
pw groupmod wheel -m pveuser把用户补进wheel。
二、磁盘直接使用 UFS
FreeBSD 很多人会联想到 ZFS,不过这次我没有使用 ZFS,而是直接选择:
Auto (UFS)原因很简单。
这只是一台 4GB 内存的小型实验 VM,而且主要目的并不是研究 ZFS。对于这种场景,UFS 足够简单,也能减少一些不必要的内存和 I/O 开销。
安装器里依次选择整块虚拟磁盘、GPT,然后确认写入即可。
安装完成以后重启,FreeBSD 基础系统就已经可以使用。
三、先确认网络和 SSH
FreeBSD 的 VirtIO 网卡通常会显示为:
vtnet0可以执行:
ifconfig检查 IP。
这台 VM 在我的 PVE NAT 网络中使用:
192.168.100.0/24因此可以直接从主力 Ubuntu 电脑 SSH 登录。
FreeBSD 的 OpenSSH 默认行为和很多 Linux 发行版也略有不同。
例如使用 Tabby 时,我发现:
Password认证方式会被拒绝,而选择:
Interactive却可以正常登录。
原因是 FreeBSD 默认更倾向于使用:
keyboard-interactive + PAM进行密码认证。
如果普通命令行:
ssh pveuser@192.168.100.x可以连接,而某个 SSH 客户端不行,可以优先检查客户端选择的认证方式。
四、配置全局代理
因为这台 VM 需要通过代理访问外网,我直接把代理配置写入:
/etc/profile先进入 root:
su -编辑:
vi /etc/profile加入:
export https_proxy=http://PROXY_IP_ADDRESS:PROXY_PORT export http_proxy=http://PROXY_IP_ADDRESS:PROXY_PORT export ftp_proxy=http://PROXY_IP_ADDRESS:PROXY_PORT export all_proxy=http://PROXY_IP_ADDRESS:PROXY_PORT export no_proxy=127.0.0.1,localhost export no_proxy="${no_proxy},$(jot -s, -w '192.168.31.%d' 255 1)"这里有一个很典型的 FreeBSD 和 Linux 差异。
在 Bash 中,我们可能会习惯这样写:
192.168.31.{1..255}但 FreeBSD 默认/bin/sh并不支持 Bash 的这种 brace expansion。
FreeBSD 自带了一个很有 BSD 风格的工具:
jot因此这里使用:
jot -s, -w '192.168.31.%d' 255 1生成:
192.168.31.1,192.168.31.2,...,192.168.31.255保存以后:
. /etc/profile检查:
env | grep -i proxy然后更新软件仓库:
pkg update pkg upgrade顺便说一下,FreeBSD 自带的vi实际是比较传统的nvi。
如果刚开始不习惯,最实用的操作是:
Esc x 删除当前字符 dd 删除整行等网络正常以后,我直接安装了 Vim。
五、安装 sudo 和 Vim
FreeBSD 基础系统默认并不包含sudo。
安装:
pkg install sudo然后:
visudo开启:
%wheel ALL=(ALL:ALL) ALL如果希望sudo pkg ...时继续保留代理环境变量,可以加入:
Defaults env_keep += "HTTP_PROXY HTTPS_PROXY http_proxy https_proxy NO_PROXY no_proxy"以后就可以像 Linux 一样:
sudo pkg update sudo pkg upgrade我还顺手安装了 Vim:
sudo pkg install vim之后编辑配置文件就舒服很多了。
六、安装 QEMU Guest Agent
PVE 中先确保:
Options → QEMU Guest Agent → EnabledFreeBSD 里面安装:
sudo pkg install qemu-guest-agent启用:
sudo sysrc qemu_guest_agent_enable="YES"启动:
sudo service qemu-guest-agent start检查:
sudo service qemu-guest-agent status在我的 FreeBSD 15.1 环境中,并不需要手工向:
/boot/loader.conf加入:
virtio_console_load="YES"系统已经能够自动处理 VirtIO Console。
可以检查:
ls -l /dev/vtcon/我这里已经可以看到:
org.qemu.guest_agent.0 -> ../ttyV0.1所以 Guest Agent 直接就能正常使用。
七、安装 XFCE 桌面
FreeBSD 官方安装完成以后默认只有基础系统,并不会像 Ubuntu Desktop 那样直接给你一套 GUI。
桌面需要自己安装。
这次选择的是 XFCE:
sudo pkg install xorg xfce这个过程比想象中要大不少。
我的环境里,仅 XFCE/Xorg 相关依赖就拉进来了三百多个 package。
接下来安装 LightDM:
sudo pkg install lightdm lightdm-gtk-greeter注意这里不能只安装:
lightdm还需要:
lightdm-gtk-greeter否则 LightDM 即使启动了 X Server,也可能没有实际登录界面。
然后启用 D-Bus:
sudo sysrc dbus_enable="YES"启用 LightDM:
sudo sysrc lightdm_enable="YES"重启:
sudo reboot八、黑屏:FreeBSD 虚拟桌面的第一个坑
第一次重启以后,我遇到的是:
黑屏,左上角只有一个鼠标光标。
查看:
sudo service lightdm status发现:
lightdm is not running再看:
sudo tail -100 /var/log/lightdm/lightdm.log发现 LightDM 本身已经尝试启动 X Server,但 Xorg 直接退出。
继续查看 Xorg 日志,关键错误是:
Cannot run in framebuffer mode. Please specify busIDs for all framebuffer devices这台 VM 使用的是:
UEFI因此最终使用 FreeBSD 的:
scfb驱动。
首先确认虚拟显卡 PCI 地址:
pciconf -lv | grep -B3 -A2 display我的环境中是:
vgapci0@pci0:0:1:0因此对应:
PCI:0:1:0创建:
sudo mkdir -p /usr/local/etc/X11/xorg.conf.d然后:
sudo vim /usr/local/etc/X11/xorg.conf.d/20-scfb.conf写入:
Section "Device" Identifier "Card0" Driver "scfb" BusID "PCI:0:1:0" EndSection再启动 LightDM:
sudo service lightdm start这一次终于正常出现 XFCE 登录界面。
九、FreeBSD + XFCE 实际资源占用
桌面启动以后,我看了一下内存。
FreeBSD 没有 Linux 常见的:
free -h可以直接使用:
top当时看到:
Mem: 193M Active, 85M Inact, 364M Wired, 216M Buf, 3207M Free Swap: 3072M Total, 3072M Free如果简单按:
Active + Inactive + Wired计算,大约是:
193 + 85 + 364 ≈ 642 MB也就是说,FreeBSD 15.1 + XFCE 冷启动以后,非 Free 内存大约 640MB 左右。
当然 FreeBSD 和 Linux 的内存分类方式并不完全一致,因此这个数字不能直接和 Linuxfree -h的used做严格等价比较。
但从整体规模看,XFCE 确实很轻。
硬盘则直接可以使用熟悉的:
df -h我的环境里:
Filesystem Size Used Avail Capacity Mounted on /dev/da0p2 59G 7.1G 47G 13% /也就是说:
FreeBSD 15.1 + Xorg + XFCE + LightDM,磁盘已经使用约 7.1GB。
这倒比我预想中大一些。
XFCE 虽然运行时内存不高,但完整的 Xorg、GTK、字体、主题和桌面依赖装下来,磁盘并不算特别省。
十、为什么 PVE 显示内存接近 90%?
还有一个很容易误判的问题。
PVE Web UI 中,这台 4GB FreeBSD VM 一度显示:
Memory Usage ≈ 90%但 FreeBSD 自己的top明明显示:
3207M Free也就是说 guest 内部实际上还有 3GB 多内存完全空闲。
所以在 FreeBSD VM 上,PVE 的 RAM 使用百分比不能简单当成 guest 真实内存使用量。
更可靠的还是进入 FreeBSD 后查看:
top或者:
vmstat -h十一、桌面虽然能跑,但图形性能一般
到这里,FreeBSD + XFCE 已经完整跑起来了。
但实际桌面体验还有一个明显问题:
PVE Console 里面拖动窗口非常卡。
原因不在 CPU,也不在内存。
当时 VM:
CPU 99%+ idle Free RAM 3GB+真正的问题是:
XFCE ↓ Xorg ↓ scfb ↓ UEFI framebuffer ↓ QEMU Standard VGA ↓ PVE noVNCscfb本质上是一个没有图形加速的 framebuffer 驱动。
窗口移动时大量像素需要由 CPU 绘制,再经 noVNC 传到浏览器,因此桌面刷新性能明显比 Linux VM 差。
一个比较实际的优化方法是关闭 XFCE compositor。
检查:
~/.config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml确保:
<property name="use_compositing" type="bool" value="false"/>另外降低分辨率也会明显减轻 framebuffer 刷新压力。
但本质上属于:
用画面效果换流畅度。
十二、顺便测试了一下 SPICE / QXL
既然之前 Debian、Arch、Windows VM 都测试过 SPICE,我也顺手试了一下 FreeBSD。
FreeBSD 仓库里确实有:
pkg install xf86-video-qxlPVE 也可以把 Display 改成:
SPICE / QXLFreeBSD 能正确识别:
Red Hat QXL paravirtual graphic cardXorg 也能成功加载:
qxl_drv.so甚至 LightDM 登录界面都能正常显示。
但是进入完整 XFCE session 后,我这里的 Xorg 会直接出现:
Bus error Caught signal 10 Server aborting于是表现就是:
输入密码 → 登录 → 黑一下 → Xorg 崩溃 → 又回 LightDM因此最终没有继续折腾 QXL。
这里需要强调:
不能简单说 FreeBSD 完全“不支持 SPICE”。
FreeBSD 确实存在 QXL 驱动和相关组件。
但至少在我这次:
PVE / QEMU + FreeBSD 15.1 + XFCE + xf86-video-qxl的组合里,QXL 稳定性并不理想。
另外 FreeBSD 的 SPICE guest 集成也远不如 Linux 和 Windows 完整,例如共享剪贴板、动态分辨率这类依赖 guest agent 的功能并没有形成成熟的使用体验。
所以最终还是回到了:
Standard VGA + SCFB十三、FreeBSD 和 Linux:很像,但又明显不同
折腾完整套系统以后,我最大的感觉是:
FreeBSD 和 Linux 很相似,但它又明显不是 Linux。
很多命令看起来熟悉:
ssh top df mount ifconfig vi但继续往下走,就会遇到越来越多差异。
例如:
| Linux 常见习惯 | FreeBSD |
|---|---|
| systemctl | service / sysrc |
| ip | ifconfig |
| free -h | top / vmstat |
| lsblk | gpart / geom |
| GNU sed | BSD sed |
| seq | jot |
| sudo 常见预装 | sudo 属于第三方 package |
| /etc 放大量第三方配置 | 第三方软件大量放在 /usr/local/etc |
| Vim 经常作为 vi | 默认 vi 是 nvi |
这些差异并不是谁好谁坏,而是两个 Unix-like 系统经过几十年独立演化后的结果。
十四、这套 FreeBSD XFCE 值不值得用?
如果只是问:
PVE 上能不能安装一套 FreeBSD XFCE?
答案当然是:
可以。
而且 FreeBSD 基础系统很轻,XFCE 的内存占用也不高。
但如果问题变成:
它适不适合当现代虚拟桌面长期使用?
我的答案就保守很多。
这次实际体验下来:
FreeBSD Base 很轻 SSH / CLI 很舒服 pkg 好用 XFCE 能正常运行 SCFB 稳,但图形性能较低 QXL / SPICE 本次实测稳定性不理想 桌面集成 明显不如 Linux所以这台 FreeBSD VM 最后我还是把它定位成:
一个带 GUI 的 FreeBSD 实验环境,而不是日常桌面。
真正需要使用时,大部分操作还是通过 SSH 完成。
XFCE 更像是偶尔需要图形界面时的辅助工具。
写在最后
这次最大的收获,反而不是把 XFCE 跑起来。
而是第一次比较完整地感受到了 FreeBSD 的使用方式。
它没有 Linux Distribution 那么强烈的“桌面发行版”感觉,而更像:
一个完整的 Unix 操作系统 + 自己选择需要的第三方软件安装完基础系统以后,你得到的是一个非常干净的 FreeBSD。
想要 Vim,就安装 Vim。
想要 sudo,就安装 sudo。
想要 Xorg,就安装 Xorg。
想要 XFCE,再安装 XFCE。
这种边界非常清晰。
不过到了现代桌面、GPU、SPICE、虚拟显卡这些领域,Linux 的生态优势也同样非常明显。
所以最后,我还是保留了这台:
FreeBSD 15.1 + XFCE + SCFB偶尔开机玩一下。
至于把它折腾成一套“像 Ubuntu 一样好用的桌面系统”——
到这里就差不多了。
继续投入时间,收益已经不高。