FreeBSD 15 最小化系统调优:用户、TTY、pkg 缓存与 tmpfs

FreeBSD 15 最小化安装后的轻量化整理:修正用户、关闭多余 TTY、配置 pkg 自动清理、添加 Swap 文件、用 tmpfs 加速 pkg 缓存,并保留必要的系统服务。

这篇记录 FreeBSD 15 最小化安装后的基础整理。目标不是盲目砍服务,而是在 VPS、小内存机器上保留可救援能力,同时减少不必要的后台进程和磁盘写入。

建议按下面顺序做:

  1. 修正误创建的用户。
  2. 保留 ttyv0,关闭多余本地控制台。
  3. 配置 pkg 自动清理缓存。
  4. 小内存机器添加 Swap 文件。
  5. tmpfs 加速 /var/cache/pkg
  6. 只关闭确认不用的服务。

修正误创建的用户

如果安装阶段把用户名写错了,例如把 felix 写成了 fexil,可以先删除错误用户,再重新创建正确用户。

确认要删除的用户确实是错误账号后,在 root 下执行:

pw userdel -n fexil -r

参数含义:

  • -n fexil 指定要删除的用户名。
  • -r 会同时删除该用户的家目录,例如 /home/fexil

然后重新创建正确的普通用户,并加入 wheel 组:

pw useradd felix -m -G wheel -s /bin/sh
passwd felix

创建后检查用户和组:

id felix

看到输出中包含 wheel,说明这个用户后续可以使用 su 切换到 root。

su - felix

如果普通用户不能 su 到 root,常见原因有两个:

  • 用户名拼写错了,实际登录的不是预期用户。
  • 创建用户时没有加入 wheel 组。

为什么别人的最小化系统进程更少

FreeBSD 最小化安装后,htop 里看到的进程数量会受几个因素影响:

FreeBSD 15 最小化环境的进程状态

  • FreeBSD 默认会开启多个本地控制台,也就是多个 getty 进程。
  • 不同版本默认服务略有差异,例如 FreeBSD 15-CURRENT 和 14.x RELEASE 的默认进程数量可能不同。
  • 机器内存、虚拟化模板和服务商镜像也会影响默认后台服务。
  • syslogdcronsshddevd 等是常见基础服务。

不要为了追求进程数量最低而一口气关掉所有服务。VPS 上更稳妥的做法是:关闭明显用不到的多余 TTY,保留日志、SSH 和基础设备管理能力。

关闭多余 TTY

TTY 是本地虚拟控制台。在 VPS 上,它通常通过服务商的 VNC / noVNC / IPMI 控制台访问。SSH 登录使用的是 pts/0pts/1 这类伪终端,不占用 ttyv1ttyv7

建议保留 ttyv0 作为救援入口,关闭 ttyv1ttyv7

sed -i '' '/ttyv[1-7]/s/on/off/' /etc/ttys
kill -HUP 1

也可以手动编辑:

vi /etc/ttys

修改前类似:

ttyv0  "/usr/libexec/getty Pc"  xterm  on  secure
ttyv1  "/usr/libexec/getty Pc"  xterm  on  secure
ttyv2  "/usr/libexec/getty Pc"  xterm  on  secure

修改后保留 ttyv0

ttyv0  "/usr/libexec/getty Pc"  xterm  on   secure
ttyv1  "/usr/libexec/getty Pc"  xterm  off  secure
ttyv2  "/usr/libexec/getty Pc"  xterm  off  secure

执行后,htop 中会少掉多个 getty 进程,但不会影响 SSH 登录。

是否关闭 cron 和 syslogd

极限精简时可以关闭 cronsyslogd,但一般不建议。

cron 负责定时任务,syslogd 负责系统日志。服务器一旦出现网络、SSH、pkg 或启动问题,日志往往是排障入口。

如果确认完全不需要定时任务,可以关闭 cron

sysrc cron_enable="NO"
service cron stop

如果确认不看本地日志,才考虑关闭 syslogd

sysrc syslogd_enable="NO"
service syslogd stop

更稳妥的建议是:cron 可按需关闭,syslogd 默认保留。

配置 pkg 自动清理缓存

pkg 的全局配置文件是:

/usr/local/etc/pkg.conf

如果文件不存在,先创建:

touch /usr/local/etc/pkg.conf

写入自动清理配置:

echo "AUTOCLEAN: true" >> /usr/local/etc/pkg.conf

以后执行 pkg installpkg upgrade 时,旧版本缓存包会自动清理,减少磁盘残留。

验证配置:

pkg -vv | grep AUTOCLEAN

常用维护命令:

pkg clean
pkg autoremove

安装基础工具

精简系统装好后,可以先补一组轻量常用工具:

pkg install -y vim-tiny tmux curl fastfetch

用途:

  • vim-tiny:轻量编辑器。
  • tmux:SSH 断线后保留会话,也方便分屏。
  • curl:下载脚本和访问 API 常用。
  • fastfetch:快速查看系统信息。

如果 root 默认 shell 是 /bin/sh,可以把常用别名写入 ~/.shrc

echo 'alias ll="ls -GFahl"' >> ~/.shrc
echo 'alias vi="vim"' >> ~/.shrc
. ~/.shrc

为了让登录 shell 自动加载:

grep -q "ENV=" ~/.profile || echo 'export ENV=$HOME/.shrc' >> ~/.profile

为 1GB 内存机器添加 Swap 文件

小内存 VPS 建议增加 Swap 文件作为缓冲,避免突发内存占用导致系统卡死。

创建 2GB Swap 文件:

dd if=/dev/zero of=/usr/swap0 bs=1M count=2048
chmod 0600 /usr/swap0

写入 /etc/fstab

echo "md99 none swap sw,file=/usr/swap0,late 0 0" >> /etc/fstab

立即激活:

swapon -aL

验证:

pstat -s

md99 是内存磁盘设备编号,可以换成不冲突的编号。late 表示等文件系统挂载完成后再启用这个 Swap 文件。

用 tmpfs 加速 pkg 缓存

tmpfs 是把一部分内存当临时文件系统使用。对 /var/cache/pkg 这种临时缓存目录来说很合适:安装包下载和解压更快,安装完成后又会自动清理。

先开启 tmpfs 支持:

sysrc tmpfs_enable="YES"

/var/cache/pkg 挂载一个 200MB 上限的 tmpfs:

echo 'tmpfs /var/cache/pkg tmpfs rw,mode=1777,size=200M 0 0' >> /etc/fstab
mount /var/cache/pkg

验证挂载:

df -h /var/cache/pkg

查看 pkg 缓存目录的 tmpfs 挂载状态

预期类似:

Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs         200M     0B    200M     0%     /var/cache/pkg

如果只是临时测试,不写入 /etc/fstab,也可以单次挂载:

mount -t tmpfs -o rw,mode=1777,size=200M tmpfs /var/cache/pkg

重启后不需要手动挂载,只要已经写入 /etc/fstab,FreeBSD 启动时会自动挂载。注意 tmpfs 里的内容重启后会消失,这对 pkg 缓存目录没有问题。

验证 pkg 缓存加速和自动清理

安装一个稍大的包,同时观察缓存目录:

pkg install -y vim

另开一个窗口观察:

while true; do du -sh /var/cache/pkg; sleep 0.1; done

观察 pkg 缓存目录占用变化

通常会看到缓存占用从 0B 增加到几 MB,再在安装完成后回到 0B。这说明:

  • /var/cache/pkg 已经走 tmpfs。
  • AUTOCLEAN: true 生效。
  • 安装缓存没有长期留在磁盘上。

pkg 安装后缓存自动清理结果

可选:关闭 Sendmail

如果系统没有安装或启用 Sendmail,可以忽略这一节。

如果不需要本地邮件服务,可以彻底禁用:

sysrc sendmail_enable="NONE"
sysrc sendmail_submit_enable="NO"
sysrc sendmail_outbound_enable="NO"
sysrc sendmail_msp_queue_enable="NO"
service sendmail stop

可选:减少 Swap 依赖

如果负载很低,又希望内核尽量少把内存页换出到磁盘,可以临时设置:

sysctl vm.defer_swapspace_pageouts=1

永久写入:

echo "vm.defer_swapspace_pageouts=1" >> /etc/sysctl.conf

这个选项适合低负载 VPS。高负载或不确定用途时,建议先观察一段时间再决定。

rc.conf 示例

一个偏精简但仍保留基础能力的 /etc/rc.conf 可以类似这样:

hostname="freebsd15mini"
ifconfig_vtnet0="DHCP"
sshd_enable="YES"
ntpd_enable="YES"
dumpdev="NO"
sendmail_enable="NONE"
tmpfs_enable="YES"

其中网卡名 vtnet0 要按实际环境调整。常见还有 em0igb0re0 等。

日常检查命令

优化后,可以用下面几条命令检查当前状态:

ps ax
df -h /var/cache/pkg
pstat -s
top -bn 1 | head -n 5

如果想装轻量流量监控工具:

pkg install -y bmon

小结

这套配置的思路是:

  • 用户:普通用户加入 wheel,避免长期直接使用 root。
  • 控制台:保留 ttyv0 救援,关闭多余 TTY。
  • 缓存:pkg 自动清理,/var/cache/pkg 使用 tmpfs。
  • 内存:1GB 小内存机器用 2GB Swap 做缓冲。
  • 服务:保留 SSH、NTP、日志等基础能力,谨慎关闭系统服务。

这样 FreeBSD 15 会更轻、更干净,但仍然保留可维护性。