发布于 ,更新于 

使用 ZFS 作为 macOS Applications 目录

最近折腾黑苹果,但是磁盘空间不够,更遗憾的是 ZFS 不支持缩小分区。所以采用 O3X(OpenZFS On OSX) 把 ZFS 分区挂载到 macOS 上实现扩展空间。

创建 dataset

之前的文章写过 zfs 安装 archlinux,创建数据集参考原文就行。

这里 ZFS 池是 zroot,打算把 Applications 目录放在 zroot/macOS/Applications 这个位置。

1
2
zfs create -o mountpoint=none zroot/macOS
zfs create -o mountpoint=/Applications zroot/macOS/Applications
复制

这样会在引入 zroot 的时候把这个数据集自动挂载到 /Applications,此前还有一个自动挂载到 /home 的数据集,没什么影响。Linux 没有 /Applications,macOS 没有 /home

然后进行进一步配置。我的 zroot 使用 blake3 作为 checksum 的选项,大量写入会导致 macOS 崩溃。由于我是 AMD 的 CPU,而 blake3 采用了很多指令集优化,猜测是指令集问题,所以换成了另一个参加了 SHA3 竞赛并取得不错成绩的 skein 算法。

1
2
zfs set checksum=skein zroot/macOS/Applications 
zfs set dedup=skein zroot/macOS/Applications
复制

配置 macOS

有三件事要干:

迁移数据

比较简单,为了方便我们先改一下挂载点:

1
zfs set mountpoint=legacy zroot/macOS/Applications
复制

mountpoint=legacy 意思就是不自动挂载,并且只能通过系统自带的 mount 命令挂载。

1
2
3
4
mkdir ~/test
sudo mount zroot/macOS/Applications ~/test
sudo rsync -a /Applications ~/test
sudo umount ~/test
复制

自动挂载

在这之前把挂载点改回去

1
sudo zfs set mountpoint=/Applications zroot/macOS/Applications
复制

我打算使用 launchd 实现自动挂载,原因是 OpenZFS on OS X 自己有一个自动挂载所有 zpool 的脚本挂在了 launchd 下面。

距离配置已经有半年多了,凭印象写()

/System/Library/LaunchDaemons 或者 /Library/LaunchDaemons 里面有一个 ZFS 相关的服务配置,复制一份下来(其实挺好读的),之后把里面要执行的命令做一下修改,比如:

1
2
3
4
5
6
<key>ProgramArguments</key>
<array>
<string>/path/to/zfs</string>
<string>mount</string>
<string>zroot/macOS/Applications</string>
</array>
复制

删除 /Applications

需要关闭系统完整性保护等操作。本来想直接链接到根目录,不过发现 ZFS 挂载到根目录不需要直接配置,就懒得整了。

具体忘了咋回事了,我猜把文件夹里面东西删干净就够用了。

高三文化课太紧迫了,然后没考好还要复读,估计这篇文章完整版得等明年高考完才能出现了。

只能提供一个操作思路了,我猜像我一样折腾 zfs 和黑苹果的同志看完应该能理解。

有一些缺点,比如偶尔挂载慢了,LaunchPad 会抽风。