Setkal jsem se s dosud neznámým problémem. Situace mě donutila po měsíci restartovat notebook (ASUS ZenBook Flip 13 UX362FA). Během měsíce jsem nedělal žádné velké úpravy, jenom průběžné aktualizace. Po restartu notebooku nebylo možné zavést jádro, na kterém jsem dosud běžel. Nešlo zavést ani jádro v recovery mode.
Začal jsem zkoušet i jiná jádra. Podařilo se mi zavést pouze jedno ze 3 a po dalším restartu se nepodařilo zavést ani to. Velmi zrádná a podivná chyba. Ve většině pokusů se žádné jádro nezavedlo a občas to náhodně vyšlo. Když už se mi při bootování podařil nějaký výpis, tak poslední hlášení bylo: „Loading initial ramdisk …“
Na vině je microcode procesoru Intel
Po delším zkoumání příčiny jsem přišel na to, že na vině je patrně chyba v microcode Intel. Je pravdou, že v rámci aktualizací jsem microcode během měsíce aktualizoval. Nicméně k pokusu o zavádění microcode došlo až po restartu počítače. Mikrokód lze stručně popsat jako firmware uvnitř procesoru. O aktualizaci by se měl postarat BIOS, ovšem ne vždy se lze na výrobce spoléhat. Proto umí linuxové jádro aktualizovat mikrokód při startu.
A právě tady došlo na mém počítači ke zradě. Chybu jsem v tuto chvíli zdokumentoval a nahlásil, nicméně počítač potřebuji dál používat.
Vypnutí zavádění microcode
Naštěstí vývojáři jádra implementovali parametr dis_ucode_ldr. Ten přidám v GRUBu před zaváděním jádra a nový mikrokód se nebude zavádět. Zavede se ten původní z BIOSu. Technicky to provedu tak, že při výběru jádra, které chci zavést stisknu klávesu „e“. Dohledám řádek, kde se zavádí linuxové jádro. Řádek, bude vypadat podobně jako tento:
linux /vmlinuz-5.0.0-15-generic root=/dev/mapper/zenbook-ubuntu_crypt ro quiet splash $vt_handoff
Zmiňovaný parametr přidám na konec řádku, který pak bude vypadat takto:
linux /vmlinuz-5.0.0-15-generic root=/dev/mapper/zenbook-ubuntu_crypt ro quiet splash $vt_handoff dis_ucode_ldr
Pak stačí stisknout F10 a jádro se zavede včetně nového parametru a bez problematického mikrokódu.
Závěr
Zmiňovaný parametr jádra je nutné přidat po každém restartu – respektive před zaváděním jádra a to až do té doby, dokud nebude mikrokód opraven. Druhou možností je editovat konfigurační soubor GRUBu (zavaděče) a nastavit nový parametr automaticky při bootování.
Automatické přidání parametru v rámci GRUBu lze provést editací souboru „/etc/default/grub„. Vyhledáte řádek
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash dis_ucode_ldr dis_ucode_ldr"
a rozšíříte ho o parametr dis_ucode_ldr
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash dis_ucode_ldr dis_ucode_ldr"
jako poslední krok je nutné provést aktualizaci nastavení zavaděče pomocí
update-grub