在苹果Intel版Mac上安装FreeBSD

我在 MacBook Pro 15" Late 2013MacBook Air 11" Late 2010选择FreeBSD 实现个人开发学习环境,原因是:

  • 旧版本苹果笔记本(Intel架构)硬件已经很陈旧了,无法运行最新的 macOS ,但是能够很好支持 Linux 和 FreeBSD,能够充分发挥硬件性能

  • FreeBSD是非常独特的操作系统,在网络和存储方面有着深厚的技术积累,和Linux各有千秋

备注

我之前是在 MacBook Pro 15" Late 2013 安装FreeBSD,实践中尝试先安装macOS后安装FreeBSD,希望构建双启动系统。不过,我实践时选择ZFS文件系统,结果自动抹除了macOS(失败)。

第二次实践是在 MacBook Air 11" Late 2010 上安装单FreeBSD系统,力图构建一个轻量级图形 移动工作 环境,以便我在旅途中能够继续完成工作。

FreeBSD版本

已知 FreeBSD 有如下版本(或阶段): current --> alpha(进入 stable 分支)--> beta --> rc --> release

  • alpha: alpha 是 current 进入 release 的第一步

  • rc

  • beta

  • release

  • current: current相对稳定后会推送到 stable,但是不保证二者没有大的 bug

  • stable: stable 的真实意思是该分支的 ABI(Application Binary Interface,应用程序二进制接口)是稳定的(但和Linux发行版的"稳定版"概念不同,反而是一种 不稳定 的 "开发版" )

备注

只有 alpha、rc、beta 和 release(且是一级架构)才能使用命令 freebsd-update 更新系统,其余版本系统均需要通过源代码编译的方式(或使用二进制的 pkgbase)更新系统。

FreeBSD 开发计划准备删除命令 freebsd-update ,一律改用 pkgbase

参见 FreeBSD Manual Pages freebsd-update

安装准备

Intel架构的Mac设备提供了一个名为 bootcamp 的工具来帮助在Mac设备上并列安装Windows操作系统,实际上这个工具也可以用来服务于Linux/FreeBSD。本质上这个工具就是将磁盘重新分区(缩小macOS占用的磁盘分区),这样启动时只要使用Mac的 alt/option 按键就可以切换不同分区的操作系统。不过,我发现这个 Boot Camp Assistant 工具实际上并不仅仅是调整分区,而是完成一连串下载Windows支持文件以及创建Windows安装盘。这个过程是强制完成,所以如果没有Windows安装镜像,这个流程无法走通。

所以,我实际上是直接使用 Disk Utility 添加一个分区,添加分区会缩小当前完整占用磁盘的 macOS 卷。这个过程是自动化的,但是非常缓慢(需要缩小macOS文件系统,过程中无法操作Mac设备)。我通过 Disk Utility 将磁盘后半部分空出 924GB 给FreeBSD,仅为macOS保留100G空间。

警告

我原本以为能够像很久以前我在MacBook上双启动并列安装macOS和Linux一样,将FreeBSD安装在macOS调整让出的磁盘分区里。但是实践是失败的,FreeBSD Installer中我选择了ZFS root,结果整个磁盘数据被抹除(原先系统中的macOS)。

备注

BSD and Linux on an Intel Mac 使用 rEFIt 来作为启动管理器,这个工具我之前在 在MacBook Pro上安装Gentoo Linux 实践过。rEFIt是一种可选的启动管理器,可以免除启动时按 alt/option 选择启动分区的麻烦。不过,实际上不安装启动器采用 alt/option 选择启动分区也行,所以我实际跳过这步。

BSD and Linux on an Intel Mac 也提到了和我相同的经历:现在 bootcamp 确实不再支持只划分分区,而是必须实际插入Windows安装光盘,否则 bootcamp 不允许对地盘分区。原文建议当Windows开始安装时,直接强制终止安装(保留新划分出的分区)。

使用hdiutil转换iso文件到镜像文件dmg
hdiutil convert -format UDRW -o FreeBSD-14.3-RELEASE-amd64-disc1.img FreeBSD-14.3-RELEASE-amd64-disc1.iso
使用dd命令将img文件写入U盘
sudo dd if=FreeBSD-14.3-RELEASE-amd64-disc1.img.dmg of=/dev/rdisk2 bs=10m
  • 如果下载的是 mini-memstick.img 则使用如下命令:

最小化安装镜像
sudo dd if=FreeBSD-14.2-RELEASE-amd64-mini-memstick.img of=/dev/rdisk2 bs=10m

备注

如果可以还是下载完整版本镜像,因为最小化镜像虽然下载快,但是安装过程所有内容都需要从网上下载,导致安装非常花时间。

安装

重新启动MacBook Pro设备,启动时按住 alt/option 键,这样就能选择启动磁盘。选择FreeBSD安装启动U盘启动,进行安装。

  • 之前我是使用macOS划分了一个磁盘分区给FreeBSD,但是macOS划分的磁盘默认格式化成APFS,也就是说虽然分区有了,但是只是我知道有,而FreeBSD Installer看来整个磁盘没有任何空闲。此时FreeBSD Installer的 Guided Root-on-ZFS 选择 nvd0 (NVMe磁盘)会提示报错 gpart: geom 'nvd0': File existes

  • 我发现我不熟悉FreeBSD默认的 gpart 工具,所以改为用 Arch Linux 的启动U盘,借助Linux的 fdisk 工具删除掉macOS上空出的分区(即完全使得一部分磁盘空白)。此时再次从FreeBSD安装U盘启动,就可以正常运行Installer的 Guided Root-on-ZFS 设置。但是很不幸,Installer的 Guided Root-on-ZFS 设置会整个将磁盘数据抹去(也就是Installer首先确认磁盘有空间,有空间就可以运行 Guided Root-on-ZFS 设置,然而 Root-on-ZFS 设置是占据整个磁盘)

在ZFS自动部署中,能够自动完成ZFS的RAID构建根文件系统 zroot 存储池,非常自动化非常方便

MacBook Air 11" Late 2010 上的 zroot 存储池磁盘分布
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default    457G    821M    457G     0%    /
devfs                 1.0K      0B    1.0K     0%    /dev
/dev/gpt/efiboot0     260M    1.3M    259M     1%    /boot/efi
zroot/var/log         457G    160K    457G     0%    /var/log
zroot/var/audit       457G     96K    457G     0%    /var/audit
zroot                 457G     96K    457G     0%    /zroot
zroot/usr/ports       457G     96K    457G     0%    /usr/ports
zroot/home            457G     96K    457G     0%    /home
zroot/var/crash       457G     96K    457G     0%    /var/crash
zroot/var/mail        457G     96K    457G     0%    /var/mail
zroot/var/tmp         457G     96K    457G     0%    /var/tmp
zroot/usr/src         457G     96K    457G     0%    /usr/src
zroot/tmp             457G    104K    457G     0%    /tmp
zroot/home/admin      457G    136K    457G     0%    /home/admin

并且由于FreeBSD内置支持 ZFS ,还可以在安装过程中组建 ZRAID ,例如以下案例是我在自己组建的工作站上使用4块 铠侠KIOXIA EXCERIA G2 NVMe SSD存储 ( 2TB )构建 ZRAID1 ,能够在保证系统数据冗余安全情况下获得 5.2TB 使用空间:

安装过程中使用4块磁盘构建RAIDZ
# df -h
Filesystem            Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default    5.2T    855M    5.2T     0%    /
devfs                 1.0K      0B    1.0K     0%    /dev
/dev/gpt/efiboot0     260M    1.3M    259M     1%    /boot/efi
zroot/home            5.2T    140K    5.2T     0%    /home
zroot                 5.2T    140K    5.2T     0%    /zroot
zroot/tmp             5.2T    152K    5.2T     0%    /tmp
zroot/var/log         5.2T    221K    5.2T     0%    /var/log
zroot/var/audit       5.2T    140K    5.2T     0%    /var/audit
zroot/usr/src         5.2T    140K    5.2T     0%    /usr/src
zroot/var/crash       5.2T    140K    5.2T     0%    /var/crash
zroot/usr/ports       5.2T    140K    5.2T     0%    /usr/ports
zroot/var/mail        5.2T    140K    5.2T     0%    /var/mail
zroot/var/tmp         5.2T    140K    5.2T     0%    /var/tmp
zroot/home/admin      5.2T    204K    5.2T     0%    /home/admin

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot                859M  5.15T   140K  /zroot
zroot/ROOT           856M  5.15T   140K  none
zroot/ROOT/default   855M  5.15T   855M  /
zroot/home           355K  5.15T   140K  /home
zroot/home/admin     215K  5.15T   215K  /home/admin
zroot/tmp            151K  5.15T   151K  /tmp
zroot/usr            418K  5.15T   140K  /usr
zroot/usr/ports      140K  5.15T   140K  /usr/ports
zroot/usr/src        140K  5.15T   140K  /usr/src
zroot/var            924K  5.15T   140K  /var
zroot/var/audit      140K  5.15T   140K  /var/audit
zroot/var/crash      140K  5.15T   140K  /var/crash
zroot/var/log        227K  5.15T   227K  /var/log
zroot/var/mail       140K  5.15T   140K  /var/mail
zroot/var/tmp        140K  5.15T   140K  /var/tmp

# zpool status
  pool: zroot
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	 raidz1-0  ONLINE       0     0     0
	   nda0p4  ONLINE       0     0     0
	   nda1p4  ONLINE       0     0     0
	   nda2p4  ONLINE       0     0     0
	   nda3p4  ONLINE       0     0     0

默认安装选择的安装组件推荐:

  • 在默认基础上,额外选择 src 即可,因为驱动需要内核源代码编译安装

  • 不要选择 kernel-dbglib32src 以外的组件,这3个组件外的其他程序都需要联网安装,非常缓慢。其他软件包可以在操作系统安装完成后安装

  • 我的安装取消了 lib32 是因为我想构建一个完全64位系统

问题记录

我在 MacBook Air 11" Late 2010 遇到一个问题,键盘使用存在断断续续的问题,我不确定是不是我更换的第三方键盘硬件问题还是FreeBSD的兼容问题,系统日志显示:

系统日志中关于键盘的报错
ums0: 3 buttons and [XY] coordinates ID=2
ums1 on uhub4
ums1: <vendor 0x05ac product 0x820b, class 0/0, rev 2.00/1.00, addr 5> on usbus0
ums1: 3 buttons and [XY] coordinates ID=2
ubt0 on uhub4
ubt0: <Apple Inc. Bluetooth USB Host Controller, rev 2.00/0.42, addr 6> on usbus0
ugen0.4: <vendor 0x05ac product 0x820a> at usbus0 (disconnected)
ukbd1: at uhub4, port 1, addr 4 (disconnected)
ukbd1: detached
ugen0.5: <vendor 0x05ac product 0x820b> at usbus0 (disconnected)
ums1: at uhub4, port 2, addr 5 (disconnected)
ums1: detached
Security policy loaded: MAC/ntpd (mac_ntpd)
ugen0.2: <Apple Inc. Apple Internal Keyboard / Trackpad> at usbus0 (disconnected)
ukbd0: at uhub3, port 3, addr 2 (disconnected)
ukbd0: detached
atp0: at uhub3, port 3, addr 2 (disconnected)
atp_set_device_mode: Failed to read device mode (19)
atp0: detached
ums0: at uhub3, port 3, addr 2 (disconnected)
ums0: detached
ugen0.2: <Apple Inc. Apple Internal Keyboard / Trackpad> at usbus0
ukbd0 on uhub3
ukbd0: <Apple Inc. Apple Internal Keyboard / Trackpad, class 0/0, rev 2.00/1.07, addr 2> on usbus0
kbd1 at ukbd0
atp0 on uhub3
atp0: <Apple Inc. Apple Internal Keyboard / Trackpad, class 0/0, rev 2.00/1.07, addr 2> on usbus0
ums0 on uhub3
ums0: <Apple Inc. Apple Internal Keyboard / Trackpad, class 0/0, rev 2.00/1.07, addr 2> on usbus0
ums0: 3 buttons and [XY] coordinates ID=2

参考