原始文章链接:https://iosre.com/t/big-sur/18051感谢带我入门调戏 APFS 快照的好朋友同时也是这个帖子的原作者:不会用的金手指(Halo-Michael)
[size=15.008px]更新到 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) [size=15.008px]很奇怪,其它分区都是 diskAsB 形式的,为什么系统分区会是 diskCsDsE 形式的呢
开始判断 disk1s5 是一个 APFS 容器,系统分区 disk1s5s1 是 APFS 容器内的一个分区,但是打开磁盘工具查看发现情况并不是这样 [size=15.008px]于是直接创建目录 /System/Volumes/Data/mnt2 ,并运行命令 mount_apfs /dev/disk1s5 /System/Volumes/Data/mnt2,竟然成功挂载上了。很明显 disk1s5 并不是容器而是分区。查看 /System/Volumes/Data/mnt2 下的内容,发现就是系统分区内的文件。猜想 disk1s5s1 实际上是 disk1s5 的快照,Big Sur 将快照作为系统分区挂载在根目录,怪不得无法将根目录直接挂载为读写。 [size=15.008px]比较屌的越狱玩家都知道,在 iOS11.3 或更高版本,如果内核找不到被它标记的系统分区快照,会转而将原始分区挂载在根目录上,利用同样的想法,我准备重命名系统分区快照
[size=15.008px]工具:snapUtil
源码:https://gist.github.com/Halo-Michael/882651e3d75765608d3c212e40e4cbe4
需要使用 ldid 签 entitiement 地址:https://github.com/sbingner/snappy/blob/master/entitlements.xml [size=15.008px]
同时你需要关闭 sip,将 amfi_get_out_of_my_way=1 添加到 boot-args 中 [size=15.008px]已挂载的快照无法直接删除,但是可以重命名(iOS12 上 patch 了这一点,但是 Big Sur 显然没有,*谁知道之后的 macos 呢)。 [size=15.008px]准备好 snaputil 后,使用命令 snapUtil -l /System/Volumes/Data/mnt2 查看快照名称,然后使用命令 snapUtil -n <old_name> orig-fs /System/Volumes/Data/mnt2 把它重命名掉,然后重启系统。之后使用 mount 命令,即可可以看到这样的输出: [size=15.008px]/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) [size=15.008px]此时默认快照名已经被修改成了 orig-fs,系统无法找到默认快照,从而挂载了真实文件系统 [size=15.008px]只需要切换 root 用户使用命令 mount -uw / 即可重挂载系统分区为读写
[size=15.008px]Tips:利用此特性可以自己创建快照回滚,大概(反正 iOS 我这么玩)
|