macOS Catalina 对根路径(/)设置了只读保护机制,以防止意外覆盖关键的操作系统文件。然而,作为开发人员,我们的程序不可避免会有操作 /xxx/xxx 文件的需求,最常见的如写日志,日志要输出到 /data/log/,因为路径不可执行写操作,无法创建对应的日志路径,会报日志文件不存在,尝试手动创建,会提示:Read-only file system。关于该问题,网上有很多文章,但大多无法直接帮助我们解决问题,在此做个记录,希望有所帮助。
为什么关闭 SIP 后,还要创建 links,不应该是直接就能读写根路径?下文会介绍,关闭 SIP 后,大概率还是无法执行写操作,就算能够写,为了保证安全性,最后还是需要打开 SIP,因此,需要通过步骤2,长期解决问题。
下面介绍具体操作和踩坑点,看看为什么如此简单的问题会卡在许多程序员?
System Integrity Protection status: disabled.
看多数文章中的介绍,关闭 SIP 后,可以通过 sudo mount -uw /,重新以可读可写的方式挂载文件系统,它可以将分区挂载到linux的一个文件夹下,从而将分区和该文件夹关联起来,访问这个文件夹就相当于访问这个分区了。但是,重启挂载会失效,需要重新挂载。可以通过“修改/etc/fstab”,来解决重启失效的问题。
然而,在 mac 下,mount -uw /,并不能成功,提示如下:
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,添加记录如下:
data /Users/$用户名/data
$用户名 为自己的用户名。注意,中间要用 tab 分隔。保存后,查看 / 目录如下:
最后,别忘记重新打开 SIP,方法同步骤1,命令改为 csrutil enable 即可。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。