外观
目录结构与只读系统卷
访达里看到的「Macintosh HD」其实不是一个卷。从 macOS Catalina 开始,系统被拆成两个:一个只读的系统卷装 macOS 自身,一个可写的数据卷装你的文件和第三方软件。
访达把它们显示成一个整体,所以你看不出边界。但一旦开始用终端,这个设计会解释很多「为什么写不进去」的疑问。
开始之前
本文全部命令只读,不会修改任何内容。需要能在终端执行命令。
主要目录都装什么
sh
ls /ls 列出目录内容,/ 是根目录。你会看到这些:
| 路径 | 内容 | 你会动它吗 |
|---|---|---|
/Applications | 应用程序 | 会,装卸软件时 |
/Users | 所有用户的主目录 | 会,你的文件都在这里 |
/Library | 所有用户共享的支持文件、字体、配置 | 偶尔 |
/System | macOS 自身 | 不会,只读 |
/usr、/bin、/sbin | Unix 命令与库 | 不会,只读 |
/private/var、/private/tmp | 系统运行数据与临时文件 | 不直接动 |
/opt/homebrew 或 /usr/local | Homebrew 安装的内容 | 会,由 Homebrew 管理 |
最后一行有芯片差异:Apple 芯片的 Homebrew 默认装在 /opt/homebrew,Intel 装在 /usr/local。这是 PATH 相关问题的常见来源,见zsh 启动文件与加载顺序。
主目录里还有一个默认隐藏的 ~/Library,装着你个人的应用配置、缓存和容器数据。在访达里按住 Option 键点「前往」菜单可以看到它。
系统卷是只读的
试着看一下卷的挂载情况:
sh
mount | grep -E "^/dev"mount 列出当前挂载的文件系统,grep -E "^/dev" 只保留以 /dev 开头的行(-E 启用扩展正则,^ 表示行首)。
输出里能看到根目录挂载时带 read-only 标记,而 /System/Volumes/Data 是可读写的。这就是那对卷。
macOS Big Sur 起,系统卷还带有密封签名——系统内容在启动时会被校验,任何改动都会被发现。所以「改一个系统文件试试」在现代 macOS 上不是权限问题,而是根本不可写,即使用 root 也不行。
那些目录其实在数据卷上
既然 /Users 在数据卷、/System 在系统卷,为什么它们看起来在同一个目录树里?
macOS 用一种叫 firmlink 的机制把数据卷上的目录「接」进根目录树的对应位置。你在 /Users 下读写,实际访问的是数据卷。
想看真实位置:
sh
ls /System/Volumes/Data这里能看到 Users、Applications、Library 等——它们和根目录下同名目录是同一批内容,只是换了一条路径访问。
这解释了两个常见困惑:
- 磁盘工具里为什么有两个卷。 它们属于同一个 APFS 容器,共享空间。
- 有些工具报告的路径带
/System/Volumes/Data前缀。 那是真实路径,不是出错。
根目录下不能随便建目录
sh
mkdir /mystuff这条命令会失败,即使加 sudo 也一样——根目录由只读系统卷提供。
确实需要在根目录下有一个自定义入口时,正规做法是 /etc/synthetic.conf,它让系统在启动时创建指向其他位置的符号链接。这个需求很少见,通常出现在某些需要固定路径的开发工具上。多数情况下,把东西放在主目录或 /usr/local 下即可。
检查结果
三条只读命令确认你理解了结构:
sh
df -h / /System/Volumes/Datadf -h 显示磁盘使用情况(-h 用易读单位)。两个卷的容量与可用空间应当相近——因为它们共享同一个 APFS 容器的空间。
sh
ls -ld /Users /System/Volumes/Data/Users-l 长格式,-d 表示显示目录本身而不是它的内容。两行的权限、所有者和大小应当一致,说明是同一份内容。
动手练习
不修改任何东西,回答三个问题:
- 用
mount确认根目录是只读挂载,把那一行抄下来。 - 用
which brew找出 Homebrew 装在哪个前缀下,据此判断这台机器是 Apple 芯片还是 Intel。 - 尝试
touch /test.txt,读懂报错;再尝试sudo touch /test.txt,观察它同样失败。
成功标准是能解释第 3 步为什么加了 sudo 也不行。这和权限无关——是卷本身只读。理解这一点,你就不会再去搜索「如何获取 root 权限修改系统文件」,那条路在现代 macOS 上已经关闭,相关背景见SIP 与公证。