纪念绕过的一个EFI引导bug

@vrqq  February 2, 2019

Problems

One day, A person want to try the new RAID Controller card, but the power problem is a big trouble. Meanwhile the windows boot manager is crashed with a mistake.

这块raid卡性能猛如虎,但是始终不能让硬盘转起来(老电源,贴了PIN3 SATA PWDIS)依然不转。
接下来,出于好奇,进入了bios的启动项这一栏,不小心手滑,把windows那条删了。
不要紧,加回来就是了。。
在bios里选浏览文件,直接卡死。。
手敲了一条/efi/boot/bootx64.efi
然后。。重启。。不能开机。。

补充一句,这个bios自带一个bug(feature):但凡进了bios,无论是否保存,退出时候必然会整机直接断电一样突然halt,然后再开机,好硬的重启。

继续胡乱一通试
先想会不会是efi分区的问题呢,fsck扫了扫,进bios时候选文件依然会卡死。。
很奇怪,会不会文件本身就坏的呢。。
于是找了个好的windows系统,把EFI分区粘出来贴到有问题的电脑里,除了BCD(bootmgr的配置类似boot.ini)都盖掉。。
再进bios,依然卡死。

思前想后,会不会分区格式不对,比如fatxx变种,或者sector size不太合适呢。。
于是重新格式化了一下EFI分区,然后把文件复制进去了。。
重启进bios,可以流畅的浏览目录了,大喜!
引导一下试试。。接下来是无限重启。。

一通分析
突然回忆到之前用解wim包装系统时候,遇到过装完重启丢文件的bug,最后一步是用bcdboot加引导。。于是以后都是 最后复制几个巨大的文件,为了把磁盘缓存清掉。。
想到刚才进bios时候,退出来时候是主板直接楞断电了啊,会不会磁盘缓存没写进去。。
说试就试,再重新复制一份EFI分区里面的文件,覆盖原来的文件。然后重启(不会断电),finally进入了windows。。

因为此时bios里已经写好了那条efi的引导记录,所以不会触发“bios保存时halt”这个bug,也就不会清掉磁盘缓存。写好以后通过ctrl+alt+delete温柔重启,磁盘不掉电,文件安全。

觉得上文长直接看着里

  • MLC也会出坏块,正好出在文件系统上,bios读到那里会卡住,删除分区再新建,触发磁盘主控自动映射,把坏块跳开。
  • 有的bios修改设置以后会power halt,导致硬盘断电,磁盘缓存丢失。
  • 装完系统or写入磁盘文件以后,直到正常关机(触发flush-cache)前,缓存里没写入到存储颗粒的文件,都会在断电时候随着丢失。(如果必须经历突然断电,可以通过复制大文件清缓存。)
  • 上一条的例子:解压wim然后bcdboot配置引导,配置完不要着急重启电脑,复制一个大文件,例如install.wim。等复制完了再重启,断电也不怕丢数据了。。
  • 高级点的SSD带掉电保护。。

后记

耗时5小时。。如此这般下去,总是不得要领,只能成为经验丰富的电脑城装机大师,并不能成为一个Engineer,时光真的短暂。
经济危机到来不必惊慌,多读书便是了。


添加新评论