跳转到内容

目录结构与只读系统卷 ​

访达里看到的「Macintosh HD」其实不是一个卷。从 macOS Catalina 开始,系统被拆成两个:一个只读的系统卷装 macOS 自身,一个可写的数据卷装你的文件和第三方软件。

访达把它们显示成一个整体,所以你看不出边界。但一旦开始用终端,这个设计会解释很多「为什么写不进去」的疑问。

开始之前 ​

本文全部命令只读,不会修改任何内容。需要能在终端执行命令。

主要目录都装什么 ​

sh
ls /

ls 列出目录内容,/ 是根目录。你会看到这些:

路径内容你会动它吗
/Applications应用程序会,装卸软件时
/Users所有用户的主目录会,你的文件都在这里
/Library所有用户共享的支持文件、字体、配置偶尔
/SystemmacOS 自身不会,只读
/usr、/bin、/sbinUnix 命令与库不会,只读
/private/var、/private/tmp系统运行数据与临时文件不直接动
/opt/homebrew 或 /usr/localHomebrew 安装的内容会,由 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/Data

df -h 显示磁盘使用情况(-h 用易读单位)。两个卷的容量与可用空间应当相近——因为它们共享同一个 APFS 容器的空间。

sh
ls -ld /Users /System/Volumes/Data/Users

-l 长格式,-d 表示显示目录本身而不是它的内容。两行的权限、所有者和大小应当一致,说明是同一份内容。

动手练习 ​

不修改任何东西,回答三个问题:

  1. 用 mount 确认根目录是只读挂载,把那一行抄下来。
  2. 用 which brew 找出 Homebrew 装在哪个前缀下,据此判断这台机器是 Apple 芯片还是 Intel。
  3. 尝试 touch /test.txt,读懂报错;再尝试 sudo touch /test.txt,观察它同样失败。

成功标准是能解释第 3 步为什么加了 sudo 也不行。这和权限无关——是卷本身只读。理解这一点,你就不会再去搜索「如何获取 root 权限修改系统文件」,那条路在现代 macOS 上已经关闭,相关背景见SIP 与公证。

返回系统内部