Big sur挂载系统分区为读写

由于全程都是直接干了 因此过程没有截图 我直接文字描述一下好了

更新到Big sur之后,发现root用户使用命令mount -uw /无法重挂载系统分区,使用mount命令查看分区挂载情况,可以看见大概这样的输出:
/dev/disk1s5s1 on / (apfs, sealed, local, read-only, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk1s4 on /System/Volumes/VM (apfs, local, noexec, journaled, noatime, nobrowse)

很奇怪,其它分区都是diskAsB形式的,为什么系统分区会是diskCsDsE形式的呢
开始判断disk1s5是一个容器,系统分区disk1s5s1是容器内的一个分区,但是打开磁盘工具查看发现情况并不是这样

于是直接创建目录/System/Volumes/Data/mnt2,运行命令mount_apfs /dev/disk1s5 /System/Volumes/Data/mnt2,竟然成功挂载上了。很明显disk1s5并不是容器而是分区。查看/System/Volumes/Data/mnt2下的内容,发现就是系统分区内的文件。猜想disk1s5s1实际上是disk1s5的快照,Big Sur将快照作为系统分区挂载在根目录,怪不得无法将根目录直接挂载为读写。我们知道,在iOS11.3及更高版本,如果内核找不到被它标记的系统分区快照,会转而将原始分区挂载在根目录上,利用同样的想法,我准备重命名系统分区快照

工具:snapUtil
源码:https://gist.github.com/Halo-Michael/882651e3d75765608d3c212e40e4cbe4
需要使用ldid签entitiement 地址:https://github.com/sbingner/snappy/blob/master/entitlements.xml
因此你需要关闭sip,将amfi_get_out_of_my_way=1添加到boot-args中

已挂载的快照无法直接删除,但是可以重命名(iOS12上patch了这一点,但是Big Sur显然没有)。使用命令snapUtil -l /System/Volumes/Data/mnt2查看快照名称,然后使用命令snapUtil -n <old_name> orig-fs /System/Volumes/Data/mnt2把它重命名掉,然后重启系统。之后使用mount命令,可以看到这样的输出:
/dev/disk1s5 on / (apfs, sealed, local, read-only, journaled)
devfs on /dev (devfs, local, nobrowse)
/dev/disk1s4 on /System/Volumes/VM (apfs, local, noexec, journaled, noatime, nobrowse)

切换root用户使用命令mount -uw / 即可重挂载系统分区为读写

需要注意的是 Big Sur引入了另一个缓解系统分区被篡改的机制signed system volume (SSV),有关它的作用之类请自行Google。

(题外话:我虚拟机Big Sur b6无法检测到更新(before remount rootfs),用了seedutil以及删除重新安装描述文件也没用 该怎么办 难道要重装系统吗?)

3 Likes

对于一个小白有点难顶啊,不懂咋操作,唉 :sweat_smile:

snapUtil -n com.apple.os.update-779BDF1556C6F688504E24FB29C75AFFABFCB91E701806FFFF35235E19914F1E orig-fs /System/Volumes/Data/mnt2
卡在这一步了
fs_snapshot_rename: Operation not permitted
不知道是不是“需要使用ldid签entitiement ”这步的问题。。我直接gcc了snapUtil的.c文件生成的snapUtil,没有“需要使用ldid签entitiement ”这步

还是说因为我是正式版,apple修复了这个修改镜像名称的bug。。

你先百度一下entitiement是啥吧

怎么签名 有点没看懂意思

是呀,希望大佬能够给咱小白整明白一些,今天折腾半天也没整明白,没编程基础

这个方法全网最简单 但是就是没折腾明白

大佬 有没有方法讲一下具体的使用方法

已解决,参考:https://zhangzi.life/articles/1605255382000

除了用第三方工具,是否可以尝试用diskutil工具,比如:
diskutil apfs listSnapshots /
列出当前的snapshot的信息
然后用diskutil apfs deleteSnapshot -xid “…” 来删除呢?

正式版已经无法挂载;
mount_apfs:volmue could not be mounted :Resource busy
mount :/System/volumes/Data/mnt2 failed with 75

重命名后重启无限五国 :joy:

发现关了SSV能进系统了,但是好像并没有效果,还是显示
/dev/disk1s5s1 on / (apfs, sealed, local, read-only, journaled)