今天拿到了一台无法启动的iPhone 5s (GSM, A1533),iOS 8.x。机主自述设备内部存储耗尽,然后出现严重卡顿,最后自动关机。再次尝试启动时,白苹果然后屏幕熄灭,没有观测到Springboard开始加载的迹象。由于机内有未备份数据,机主要求不要重置。拿到这台机子以后,鉴于没有什么可以做的,我准备试一试更新到最新版iOS。
进Recovery然后从iTunes更新固件,一切看起来都没问题(早期阶段进度条不动是正常现象,等等就好了),然后iTunes显示正在验证固件,在进度条走完之前弹了这么一个框:
重试一次,仍然如此。这时候iPhone停留在刷机进度条快结束的地方,强制重启会自动进入Recovery。
看起来似乎没有挽救的希望了?然而并不是。这时候其实iOS已经被正确写入系统分区,只是没有通过iTunes的刷机后完整性验证。而开机时自动进入Recovery并不代表iOS出现问题(如果真的有问题的话,应该死机或者自动关机)。经过对iOS的启动步骤的研究,自动进入Recovery其实是NVRAM中 auto-boot 字段被设为 false 导致的——iTunes在开始刷机之前先将这个字段设为 false 然后刷机(这样如果中途中断,设备重启后就会自动进入Recovery),在刷机步骤完成后,最后一次重启之前再将这一字段设为 true 。
那么既然iOS是完整的,我们怎么启动它呢?这时候就需要iBoot的USB调试功能了。首先在电脑上安装libirecovery:(以下命令适用于OS X 10.11,其余系统未做测试)
1 2 3 4 5 6 7 |
brew install libtool autoconf automake cd ~/Downloads git clone https://github.com/Chronic-Dev/libirecovery.git cd libirecovery ./autogen.sh make sudo make install |
然后,把Recovery模式下的设备通过USB连接到电脑。接下来有两种方法:
方法一:如果你想直接解决问题,运行:
1 |
irecovery -n |
方法二:或者如果你想手动完成操作,进入iBoot交互式shell:
1 |
irecovery -s |
如果连接正确,你会看到类似输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
======================================= :: :: iBoot for nxx, Copyright 2007-2015, Apple Inc. :: :: BUILD_TAG: iBoot-2817.20.26 :: :: BUILD_STYLE: RELEASE :: :: USB_SERIAL_NUMBER: ... :: ======================================= // ... Entering recovery mode, starting command prompt |
这时候我们就可以修改NVRAM了:
1 2 3 |
setenv auto-boot true saveenv reboot |
如果一切顺利的话,设备将会自动重启,然后正常开机。