作者:亞馬遜的蝴蝶(Butterfly_of_Amazon)
小米公司于2015年11月推出小米平板2,至今已經(jīng)5年多,該款平板雖然已可歸為老機(jī)型,但以高分辨率的屏幕、美觀大方的外形、支持雙系統(tǒng)的x86架構(gòu),以及硬件可魔改升級(jí)的特點(diǎn),至今依然得到大批粉絲的喜愛(ài)。
我去年開(kāi)始與一群愛(ài)好者共同研究小米平板2雙系統(tǒng)刷機(jī)方法,研制的刷機(jī)包和配套教程成為網(wǎng)上傳播最廣、用戶最多的的雙系統(tǒng)安裝工具。在這個(gè)過(guò)程中,我對(duì)小米平板2的啟動(dòng)過(guò)程和雙系統(tǒng)切換機(jī)制有了一定的了解,通過(guò)這篇文章進(jìn)行簡(jiǎn)單的總結(jié)。
我將結(jié)合遇到問(wèn)題、解決問(wèn)題的過(guò)程來(lái)講述,沒(méi)有什么專業(yè)術(shù)語(yǔ)。關(guān)注我的公眾號(hào)的朋友們中,有很多是小米平板的用戶,你們既然花了這么多時(shí)間來(lái)刷機(jī),那就再花點(diǎn)兒時(shí)間來(lái)了解你手中的這臺(tái)機(jī)器吧。
小米平板2采用了目前主流的 UEFI 引導(dǎo)管理機(jī)制,具備安全、靈活的特點(diǎn),也為用戶自行定制提供了基礎(chǔ)。
一、啟動(dòng)過(guò)程
小米平板2加電后完成硬件自檢與 BIOS 引導(dǎo),然后將控制權(quán)交給 UEFI 。UEFI 的運(yùn)行過(guò)程可以簡(jiǎn)單理解為:訪問(wèn) U盤(pán)或硬盤(pán)里 Fat32 格式的EFI系統(tǒng)分區(qū)(ESP),調(diào)用后綴為 .efi 的系統(tǒng)啟動(dòng)文件(OS Loader),通過(guò)啟動(dòng)文件加載 MIUI 或 Win10 等操作系統(tǒng),最后把控制權(quán)交給新啟動(dòng)的系統(tǒng),完成啟動(dòng)過(guò)程。
但是平板中可能有很多啟動(dòng)文件,UEFI 怎么知道該調(diào)用哪個(gè)呢?原來(lái),調(diào)用過(guò)程遵守“按啟動(dòng)序列中的順序依次調(diào)用啟動(dòng)項(xiàng)”的原則。
平板中有兩個(gè)全局變量,一個(gè)存放所有啟動(dòng)項(xiàng),一個(gè)存放啟動(dòng)順序,這兩個(gè)變量共同定義了啟動(dòng)序列。UEFI 獲得控制權(quán)后會(huì)先訪問(wèn)這兩個(gè)變量,以決定下一步的操作。用戶可以修改這兩個(gè)變量的內(nèi)容,增加自己的啟動(dòng)項(xiàng),調(diào)整啟動(dòng)順序,以達(dá)到優(yōu)先調(diào)用用戶的啟動(dòng)文件,啟動(dòng)用戶想要的系統(tǒng)的目的。
但有個(gè)問(wèn)題:如果由于用戶失誤,設(shè)置了無(wú)法正常啟動(dòng)的文件,那么每次開(kāi)機(jī)時(shí)平板都先調(diào)用有問(wèn)題的啟動(dòng)項(xiàng),導(dǎo)致系統(tǒng)無(wú)法正常進(jìn)入操作系統(tǒng),那豈不進(jìn)入了無(wú)法控制的狀態(tài),導(dǎo)致所謂的“變磚”?
小米平板2設(shè)計(jì)者充分考慮了這個(gè)情況,內(nèi)置了另一個(gè)機(jī)制:只要平板識(shí)別到 U盤(pán),就會(huì)檢查 U盤(pán)中是否有 Fat32 格式的分區(qū),如果有,則在這個(gè)分區(qū)中查找 \EFI\Boot\Bootx64.efi 文件。如果找到了,就會(huì)自動(dòng)把這個(gè)文件添加到啟動(dòng)項(xiàng)中,并把它設(shè)置為啟動(dòng)順序中的第一個(gè),然后啟動(dòng)該啟動(dòng)項(xiàng)。因此,只要 U盤(pán)的這個(gè)啟動(dòng)文件正常,你就可以以它為入口,進(jìn)入某個(gè)系統(tǒng),比如PE,獲得控制權(quán)去修正之前犯下的錯(cuò)誤。因?yàn)閷?duì) U盤(pán)的控制權(quán)在你的手里,你可以隨時(shí)重做 U盤(pán),甚至更換 U盤(pán),因此只要你把 U盤(pán)做好,你就一定能取回對(duì)平板的控制權(quán)。
這就是我經(jīng)常安慰機(jī)友的原因:“小米平板2變磚并不容易,只要屏幕能亮,U口沒(méi)壞,平板就變不了磚”。平板啟動(dòng)失敗后一般會(huì)不斷嘗試重啟,即使有時(shí)剛開(kāi)機(jī)或強(qiáng)行重啟時(shí)不識(shí)讀 U盤(pán),也沒(méi)有關(guān)系,等它自動(dòng)重啟(不通過(guò)按電源鍵重啟)后,一般都能恢復(fù)識(shí)讀。
二、安全機(jī)制
使用 UEFI 的計(jì)算機(jī)普遍啟用了安全啟動(dòng)選項(xiàng)(UEFI Secure Boot),用于避免非授權(quán)啟動(dòng)文件的運(yùn)行。小米平板2也不例外,并且更甚一步,不但啟用了安全啟動(dòng),而且即使用戶進(jìn)入 BIOS 手工把安全啟動(dòng)關(guān)閉,一段時(shí)間后平板會(huì)把它自動(dòng)打開(kāi)。
因此,小米平板2的安全啟動(dòng)機(jī)制是做得比較嚴(yán)格的,但在保證安全的同時(shí),也降低了用戶 DIY 的靈活度。也就有了那個(gè)梗:有用戶對(duì)“游戲塵間”(最早制作小米平板2雙系統(tǒng)切換功能的那位高手)吐槽切換操作不方便時(shí),“游戲塵間”建議用戶“致電雷軍”。
UEFI Secure Boot 的存在,導(dǎo)致只有兩種 efi 文件可以成為小米平板2的啟動(dòng)文件:一種是小米公司自己制作的 efi,它可以使用小米平板2最底層的一些機(jī)制獲得合法運(yùn)行權(quán),這個(gè)文件就是我們?cè)诎惭b MIUI 后,在 ESP 分區(qū)中看到的那個(gè) \EFI\Boot\Bootx64.efi 文件;另一種就是獲得了微軟CA認(rèn)證的文件。因?yàn)?Secure Boot 最初是由微軟公司推出的,多年來(lái)微軟利用其自身地位強(qiáng)行推廣,已經(jīng)形成廣泛使用的既成事實(shí),目前基本上所有使用 UEFI 的計(jì)算機(jī)主板都集成了微軟的 CA 證書(shū),主流的 Linux(如:Ubuntu、Redhat)等操作系統(tǒng)通過(guò)取得微軟的證書(shū)簽名,得以在使用 UEFI 的計(jì)算機(jī)上合法運(yùn)行。
目前各大操作系統(tǒng)廠商之所以甘于屈居微軟的認(rèn)證體系之下,一是由于反抗即成事實(shí)的代價(jià)太大,二是微軟用實(shí)力和信譽(yù)做擔(dān)保,至少到目前做到了公平。但在極端情況下,比如中美脫鉤,微軟是否還能保證公平,UEFI 是否會(huì)成為中國(guó)公司的一個(gè)軟肋,已經(jīng)成為國(guó)內(nèi)業(yè)界的熱門(mén)話題。這個(gè)留到以后再說(shuō)。
在小米平板2雙系統(tǒng)刷機(jī)過(guò)程中,共涉及三個(gè)啟動(dòng)文件,第一個(gè)是前面說(shuō)到的MIUI 的 Bootx64.efi,第二個(gè)是 Win10 的啟動(dòng)文件 Bootmgfw.efi,第三個(gè)是 Shimx64.efi。后面這兩個(gè)屬于取得微軟證書(shū)簽名的第二種文件,但 Shimx64.efi 不是操作系統(tǒng)的啟動(dòng)文件,它與 rEFInd 共同為用戶提供選擇界面,讓用戶決定下一步啟動(dòng)哪個(gè)系統(tǒng)。關(guān)于 Shimx64.efi 我會(huì)在后面詳細(xì)講解。
看到這里,你大概能明白小米平板2的雙系統(tǒng)開(kāi)機(jī)切換功能為什么不容易實(shí)現(xiàn)了:由于安全啟動(dòng)的存在,導(dǎo)致第三方開(kāi)發(fā)者的選擇非常有限,只能在狹窄的縫隙中尋找騰挪空間。
三、選擇機(jī)制
在小米平板2上安裝雙系統(tǒng),實(shí)現(xiàn)雙系統(tǒng)切換功能,實(shí)際就是要給用戶以選擇權(quán),讓用戶能自主決定進(jìn)入哪個(gè)系統(tǒng)。我們使用了 rEFInd 提供的選擇機(jī)制來(lái)實(shí)現(xiàn)這個(gè)目標(biāo)。
rEFInd 是一個(gè)被廣泛用于 UEFI 多系統(tǒng)啟動(dòng)場(chǎng)景的解決方案,最大特點(diǎn)是平臺(tái)無(wú)關(guān)和操作簡(jiǎn)便。它最初被“游戲塵間”用于實(shí)現(xiàn)小米平板2刷機(jī)和雙系統(tǒng)切換,我們繼承了“游戲塵間”的思路,將其用于目前這版廣泛流傳的刷機(jī)工具和雙系統(tǒng)開(kāi)機(jī)切換方案中。
rEFInd 與 Shimx64.efi 相結(jié)合,完美地在刷機(jī)和開(kāi)機(jī)時(shí)給用戶提供了美觀、易操作的選擇界面,并在一定程度上減少了 UEFI Secure Boot 對(duì)用戶 efi 的限制。
Shimx64.efi 使用了 Secure Boot 的鏈?zhǔn)秸J(rèn)證機(jī)制。前面已經(jīng)說(shuō)過(guò),Shimx64.efi 已經(jīng)取得微軟CA認(rèn)證簽名,可以在小米平板2開(kāi)機(jī)時(shí)合法運(yùn)行,鏈?zhǔn)秸J(rèn)證機(jī)制允許 Shimx64.efi 對(duì) rEFInd 的 grubx64.efi 進(jìn)行合法性認(rèn)證,只要認(rèn)證通過(guò)就可以被 Shimx64.efi 調(diào)用。grubx64.efi 的主要功能是給用戶提供選擇菜單(圖1),用戶選擇某一菜單的操作實(shí)際也是調(diào)用某個(gè) efi 文件,grubx64.efi 對(duì)用戶選擇的 efi 認(rèn)證通過(guò)后授權(quán)其運(yùn)行。通過(guò)這種鏈?zhǔn)绞跈?quán)方式,減少了 UEFI Secure Boot 對(duì) efi 的限制,未直接獲得微軟認(rèn)證的軟件只要能由這種鏈?zhǔn)绞跈?quán)認(rèn)證通過(guò),也將被允許運(yùn)行,因此簡(jiǎn)化了認(rèn)證過(guò)程,用戶可以使用的 efi 大為增加。
那么什么樣的 efi 能通過(guò)這種方式獲得授權(quán)呢?Shimx64.efi 調(diào)用 grubx64.efi 時(shí),會(huì)對(duì)比小米平板2主板中存放的個(gè)人證書(shū)(注意:是個(gè)人證書(shū),不是微軟發(fā)布的正式證書(shū)),如果 grubx64.efi 已經(jīng)獲得該證書(shū)的簽名,則認(rèn)證通過(guò)予以運(yùn)行,否則彈出“驗(yàn)證失敗,拒絕訪問(wèn)”的報(bào)錯(cuò)。
然后要求用戶導(dǎo)入 cer 證書(shū),如果用戶能導(dǎo)入對(duì)應(yīng)的 cer 證書(shū)文件,則允許 grubx64.efi 運(yùn)行,否則退出。
用戶在 grubx64.efi 提供的選擇菜單調(diào)用的某個(gè) efi 文件,也是通過(guò)這種方法進(jìn)行認(rèn)證。因此,用戶如果能保證 cer 證書(shū)正確導(dǎo)入平板,并且除 Bootx64.efi、Bootmgfw.efi 和 Shimx64.efi 這三個(gè)文件外的所有其它 efi 都經(jīng)過(guò)該證書(shū)簽名,就可以在小米平板2上通過(guò)這種鏈?zhǔn)秸J(rèn)證方式得以合法運(yùn)行。
我們制作的刷機(jī)包中提供了個(gè)人證書(shū),也就是上圖中的 Butterfly_of_Amazon.cer,刷機(jī)包中的各個(gè) efi 文件也用該證書(shū)進(jìn)行了簽名,因此只要按教程把這個(gè)證書(shū)導(dǎo)入平板,就可以正常使用刷機(jī)包和它提供的開(kāi)機(jī)切換功能。
第一次使用刷機(jī)包進(jìn)行刷機(jī)時(shí),由于證書(shū)尚未導(dǎo)入,所以需要進(jìn)入 BIOS 手工關(guān)閉安全啟動(dòng)選項(xiàng),等完成證書(shū)導(dǎo)入后就可以省略這個(gè)步驟了。
證書(shū)是存放在主板上的,導(dǎo)入一次永久有效,哪怕將硬盤(pán)中所有分區(qū)都刪除,也不會(huì)影響已導(dǎo)入的證書(shū)。但重刷 BIOS 會(huì)清除證書(shū),因此每次刷完 BIOS 都會(huì)出現(xiàn)藍(lán)色窗口讓用戶重新導(dǎo)入。
四、雙系統(tǒng)切換功能的實(shí)現(xiàn)
前面講了小米平板2的啟動(dòng)過(guò)程、安全機(jī)制和選擇機(jī)制,有了這些基礎(chǔ),下面說(shuō)說(shuō)我們是怎么實(shí)現(xiàn)雙系統(tǒng)切換功能的。
我們制作的刷機(jī)工具提供了兩種雙系統(tǒng)切換方法:一鍵切換和開(kāi)機(jī)切換。
1. 一鍵切換
一鍵切換的原理相對(duì)簡(jiǎn)單:(1)用戶在 MIUI 系統(tǒng)中運(yùn)行 And2Win,這個(gè) APP 會(huì)將 Win10 的 Bootmgfw.efi 改名為 Bootx64.efi,復(fù)制到平板的 ESP 分區(qū)中替換 MIUI 啟動(dòng)文件 \EFI\Boot\Bootx64.efi,然后重啟平板。平板啟動(dòng)時(shí)調(diào)用 \EFI\Boot\Bootx64.efi,而此時(shí)這個(gè)文件實(shí)際是 Bootmgfw.efi,因此實(shí)際啟動(dòng)的將是 Win10;(2)由 Win10 切換到 MIUI 系統(tǒng)的過(guò)程類似,用戶在 Win10 中運(yùn)行 Android 快捷方式,它將 MIUI 啟動(dòng)文件 Bootx64.efi 復(fù)制回 ESP 分區(qū)的 \EFI\Boot\ 中,替換掉 Bootmgfw.efi,然后重啟平板,平板啟動(dòng)還是調(diào)用 \EFI\Boot\Bootx64.efi,而此時(shí)這個(gè)文件是 MIUI 的啟動(dòng)文件,因此平板將啟動(dòng) MIUI 系統(tǒng)。
原理詳見(jiàn)下圖:
2. 開(kāi)機(jī)切換
如果你安裝的是開(kāi)機(jī)切換功能,那么每次啟動(dòng)平板時(shí),會(huì)出現(xiàn)下圖的系統(tǒng)選擇菜單:
左邊大圖標(biāo)為進(jìn)入 Win10 系統(tǒng),右邊大圖標(biāo)為進(jìn)入MIUI 系統(tǒng)。
原理詳見(jiàn)下圖:
理論這層窗戶紙捅破后,其實(shí)很簡(jiǎn)單。我動(dòng)筆前覺(jué)得這篇文章需要寫(xiě)好幾天,可寫(xiě)了3500 字后,卻發(fā)現(xiàn)畫(huà)完上面兩張流程圖后就可以收尾了。
實(shí)際在刷機(jī)包的研發(fā)過(guò)程中,我和小伙伴們克服了無(wú)數(shù)的困難,比如:PE 分辨率太高字體太小問(wèn)題、安裝 Win10 經(jīng)常異常問(wèn)題、Win10 映像的驅(qū)動(dòng)集成問(wèn)題、Remix 和 Lineage、RR 的硬盤(pán)克隆問(wèn)題、第三方 REC 刷入 zip升級(jí)包問(wèn)題、安卓系統(tǒng)下如何自動(dòng)恢復(fù) rEFInd 啟動(dòng)文件問(wèn)題、個(gè)人證書(shū)更換問(wèn)題、BIOS 刷入工具移植問(wèn)題、Win10 啟動(dòng)序列自動(dòng)更改問(wèn)題、開(kāi)機(jī)切換圖標(biāo)用戶DIY問(wèn)題、ESP 序號(hào)變化導(dǎo)致一鍵切換失效問(wèn)題、開(kāi)機(jī)切換多按一下確認(rèn)鍵問(wèn)題、啟動(dòng)分區(qū)過(guò)小導(dǎo)致 Win10 引導(dǎo)文件生成失敗問(wèn)題、Win10 啟動(dòng)分區(qū)容量不足導(dǎo)致升級(jí)失敗問(wèn)題,等等。每一個(gè)問(wèn)題的解決都花費(fèi)了我們諸多的心血。由這個(gè)項(xiàng)目,我深深體會(huì)了將理論知識(shí)轉(zhuǎn)換為工程成果需要經(jīng)歷多少艱苦的工作,但這些工作卻又無(wú)法寫(xiě)進(jìn)文章,否則顯得太過(guò)瑣碎和龐雜。
現(xiàn)在這個(gè)刷機(jī)包雖然得到這么多用戶的喜歡,但我知道遠(yuǎn)沒(méi)有達(dá)到完美,比如:安裝 Win10 時(shí)對(duì)異常情況的提示和處理還很不完善,存在很多個(gè)例情況不能自動(dòng)處理,初次使用者容易感到困惑,等等。限于精力,只能以后有時(shí)間再慢慢完善了。有愿意進(jìn)一步了解的朋友歡迎加我微信探討。