由于全程都是直接干了 因此过程没有截图 我直接文字描述一下好了
更新到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 地址:snappy/entitlements.xml at master · sbingner/snappy · GitHub
因此你需要关闭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以及删除重新安装描述文件也没用 该怎么办 难道要重装系统吗?)