解决mac根路径/只读问题

2023-01-20 16:51:50 浏览数 (1)

导语

macOS Catalina 对根路径(/)设置了只读保护机制,以防止意外覆盖关键的操作系统文件。然而,作为开发人员,我们的程序不可避免会有操作 /xxx/xxx 文件的需求,最常见的如写日志,日志要输出到 /data/log/,因为路径不可执行写操作,无法创建对应的日志路径,会报日志文件不存在,尝试手动创建,会提示:Read-only file system。关于该问题,网上有很多文章,但大多无法直接帮助我们解决问题,在此做个记录,希望有所帮助。

基本思路

  1. 关闭完整性保护机制(SIP)
  2. 将具有读写权限的文件夹软链到根路径指定文件夹

为什么关闭 SIP 后,还要创建 links,不应该是直接就能读写根路径?下文会介绍,关闭 SIP 后,大概率还是无法执行写操作,就算能够写,为了保证安全性,最后还是需要打开 SIP,因此,需要通过步骤2,长期解决问题。

下面介绍具体操作和踩坑点,看看为什么如此简单的问题会卡在许多程序员?

关闭完整性保护机制

  1. 重启 mac
  2. 进入 recovery 模式(关于这一点,网上千篇一律,开机时长按:command r,或者 command option r,或者 command option shift r,自己尝试了 n 次,无法生效,最后,在参考文献2中,找到了答案,Apple M1 Mac 进入recovery 模式的方式是,开机长按电源键,直至出现启动选项。
  3. 选择“磁盘工具”,在左上角,选择“实用工具”>“终端”
  4. 进入终端,执行 csrutil disable
  5. 重启 mac
  6. 查看 csrutil status,显示如下,即为关闭 SIP 成功。
代码语言:javascript复制
System Integrity Protection status: disabled.

看多数文章中的介绍,关闭 SIP 后,可以通过 sudo mount -uw /,重新以可读可写的方式挂载文件系统,它可以将分区挂载到linux的一个文件夹下,从而将分区和该文件夹关联起来,访问这个文件夹就相当于访问这个分区了。但是,重启挂载会失效,需要重新挂载。可以通过“修改/etc/fstab”,来解决重启失效的问题。

然而,在 mac 下,mount -uw /,并不能成功,提示如下:

代码语言:javascript复制
mount_apfs: volume could not be mounted: Operation not permitted
mount: / failed with 77

无法 mount,就尝试绕道 link 解决。

将具有读写权限路径link到/文件夹

关闭 SIP 后,在用户目录下 mkdir ~/data,尝试 sudo ln -s ~/data /data,发现仍然提示:Read-only file system。

查阅资料发现,mac link到根路径,需要通过修改 /etc/synthetic.conf 实现。例如,将 ~/data 连接到 /data。

sudo vim /etc/synthetic.conf,添加记录如下:

代码语言:javascript复制
data /Users/$用户名/data

$用户名 为自己的用户名。注意,中间要用 tab 分隔。保存后,查看 / 目录如下:

最后,别忘记重新打开 SIP,方法同步骤1,命令改为 csrutil enable 即可。

参考文献

  1. 关于苹果只读文件系统
  2. 如何解决 command r 不生效
  3. 解决关闭SIP后仍无法创建文件夹
  4. 如何在根路径创建links文件

0 人点赞