macOS 的 SIP 是内核级强制防护机制,非权限问题;它锁死 /System、/usr(除 /usr/local)、/bin、/sbin、/private/etc 等路径,即使 root 也无法读写或遍历,内核直接拦截系统调用并返回 “Operation not permitted”。

macOS 的 SIP(系统完整性保护)不是权限设置问题,而是内核级强制防护机制。它让 /System、/usr(除 /usr/local)、/bin、/sbin、/private/etc 等关键路径对所有进程(包括 root)都不可写、不可删、甚至不可遍历——哪怕加了 sudo,也会报 Operation not permitted。
哪些目录真正受 SIP 锁死?
SIP 不是“整个系统只读”,而是精准围住操作系统运行所依赖的根基:
- /System:含内核、驱动、系统框架和预装应用二进制(如 Finder.app 内部可执行文件)
- /bin 和 /sbin:基础命令如 ls、cp、launchctl
- /usr(但 /usr/local 完全开放,Homebrew 默认就装这里)
- /private/etc、/private/tmp、/private/var:这些是 /etc、/tmp、/var 的真实挂载点,符号链接本身也受保护
- /Applications/Utilities 中的系统工具(如 Console.app、Activity Monitor.app 的可执行体)
为什么 sudo ls /System 还失败?
因为 SIP 在内核调用层拦截,绕过传统 Unix 权限检查。你执行 ls 时触发的是 readdir() 系统调用,内核一看到路径在 rootless.conf 列表里,直接拒绝,不查 UID/GID,也不看 chmod 权限位。扩展属性 com.apple.rootless 和静态配置文件共同生效,不是靠磁盘只读实现的。
安全可行的绕过方式(按推荐顺序)
绝大多数需求根本不需要碰 SIP,优先走用户空间或授权路径:
- 开发工具装到 /opt/homebrew(Apple Silicon)或 /usr/local(Intel),它们天然可写
- 自定义脚本放 ~/bin 或 /usr/local/bin,再把该路径加入
$PATH - 系统级服务配置写入 /Library/LaunchDaemons(需管理员密码),而非 /System/Library/LaunchDaemons
- 字体统一放 ~/Library/Fonts(当前用户)或 /Library/Fonts(全系统),无需动 /System/Library/Fonts
- 用 mdfind 查找系统文件元数据,或用 defaults read、system_profiler 获取配置,避免直接读受保护目录
必须修改系统文件时的操作要点(仅限调试/恢复场景)
若确需替换 launchd、调试内核扩展或定制启动资源,流程必须严格闭环:
- Apple Silicon Mac:重启进恢复模式(长按电源键 → 选“选项” → 继续),终端中依次运行:
csrutil disable和csrutil authenticated-root disable(缺一不可) - Intel Mac:只需
csrutil disable - 重启后,用
diskutil apfs list找出系统宗卷(如disk1s1),再挂载到临时目录:sudo mkdir /mnt && sudo mount -o nobrowse -t apfs /dev/disk1s1 /mnt - 所有修改在 /mnt 下进行;完成后运行:
sudo bless --folder /mnt/System/Library/CoreServices --bootefi --create-snapshot - 立即重启进恢复模式,运行
csrutil enable和csrutil authenticated-root enable恢复保护


















