Úvodem
Protože jsem schopen pracovat v příkazovém řádku GNU/Linuxu, který stále považuji za mocný a flexibilní nástroj, nahlížel jsem na tento EFI Shell jako na „ořezávátko“. Přiznávám, mýlil jsem se. EFI Shell sice manipuluje „pouze“ s UEFI hodnotami, ale dělá to bravurně a za jistých okolností s ním můžete brouzdat i po jiných oddílech než jen po EFI System Partition.
EFI Shell není pro každodenní používání, přesto může nastat situace, kdy jeho funkcí alespoň částečně využijete.
Tento Shell rozhodně není určen pro začátečníky. I pokročilým uživatelům doporučuji obezřetnost, protože jsem s tímto nástrojem dokázal tři měsíce starý notebook dovést na pokraj doby temna, ze které jsem jej vysvobodil až re-flashem UEFI.
EFI Shell skrývá jednu nepěknou vlastnost. Pravděpodobně záleží na výrobci, jak implementuje UEFI a další funkce do svého produktu, ale v mém případě je možné pomocí tohoto Shellu upravovat hodnoty v UEFI bez vyžádání hesla.
V normálním provozu se bez hesla nedostanu do nastavení UEFI a bez dalšího hesla nemohu manipulovat s pořadím bootování. EFI Shell ale nějaká hesla vůbec nezajímají (alespoň v mém případě) a klidně s ním mohu měnit čas, datum, a co je na pováženou, tak i bootovací pořadí (včetně vytváření/mazání) nebo konfiguraci síťového bootování. Nevím, zdali se jedná o vlastnost, nebo o „chybu v Matrixu“, ale snad to není standard.
Historie EFI-UEFI
- 2000 Intel vydává specifikaci EFI 1.02
- 2001 Intel vydává specifikaci EFI 1.10
- 2006 Intel uvolňuje specifikace EFI, a vzniká tak nezisková organizace Unified EFI Forum přebírající vývoj a správu nad Unified EFI (UEFI). Následuje uvolnění specifikace UEFI 2.0
- 2008 uvolněna specifikace UEFI 2.1
- 2010 uvolněny specifikace UEFI 2.2 a 2.3 (revize verze 2.3 jsou uvolňovány až do roku 2013)
- 2013 uvolněna specifikace UEFI 2.4
Schopnosti Shellu
- manipulace se soubory v EFI System Partition (za jistých podmínek nejen v ESP)
- spouštění dalších EFI aplikací (ovladače, aplikace, operační systémy)
- spouštění skriptů
- úprava těžko dostupných hodnot v UEFI
- získání informací o systému
Verze Shellu
EFI Shell ver. 1 by měl fungovat na všech EFI (UEFI) systémech od specifikace 1.02 (pouze některé příkazy jsou určeny až od EFI 1.10) a je k dispozici pro 64bit (x86_64) i pro 32bit (ia32) systémy.
EFI Shell ver. 2 bude nejlépe fungovat na UEFI 2.3.1 a výše. Oproti první verzi má možnost manipulovat s bootovacími záznamy a nápověda se používá trochu odlišným způsobem. Opět je k dispozici pro 64bit i pro 32bit systémy.
Spuštění Shellu
Někteří výrobci implementují Shell do svých výrobků a uživatelé jej tak mohou spouštět přímo z bootovací nabídky UEFI. Nenachází-li se Shell ve vašem UEFI, můžete jej spouštět z flash disku. Postačí pouze přejmenovat Shell.efi na bootx64.efi a uložit jej jako /EFI/BOOT/bootx64.efi na flash disk zformátovaný FAT32 souborovým systémem.
TIP: Pokud jste četli článek (Ne)upravujte UEFI a Secure Boot a vytvořili v něm zmíněný flash disk, vytvořte na prvním oddílu flash disku adresář /EFI/tools a zkopírujte do něj EFI Shell pod názvem shell.efi. Po nabootování rEFIndu se vám Shell zobrazí v menu a díky ovladačům, které rEFInd používá, budete moci s EFI Shellem brouzdat i po dalších oddílech než jen po EFI System Partition. Při ukončení Shellu (příkaz exit) se vrátíte do rodičovského systému, tedy do rEFIndu.
Dokumentace a nápověda
Pokud se často nudíte a zajímá vás specifikace UEFI, naleznete na stránkách (po zadání jména a e-mailu) www.uefi.org/specs/access pdf dokumenty jednotlivých verzí UEFI. Velikost souborů vás možná zaskočí, ale nejedná se o chybu. Například pdf dokument specifikace UEFI 2.4A (11 MB) obsahuje „pouze“ 2296 stran.
Na zmíněných stránkách naleznete i dokumentaci (jen 234 stran) pro Shell ver. 2, která je vhodná pro programátory, neboť obsahuje i návratové hodnoty příkazů.
Dokumentaci pro Shell ver. 1 lze stáhnout z http://sourceforge.net/projects/efi-shell/files/documents/, kde naleznete pdf dokumenty ShellCommandManual a Shell_UserGuide. Ze zmíněných dokumentů bylo čerpáno při testování EFI Shellu.
Obě verze Shellu však obsahují poměrně rozsáhlou nápovědu (i s příklady použití), pro jejíž zobrazení se používá příkaz help, nebo znak otazníku (?).
Následující příkaz je pro obě verze shodný a vypíše seznam použitelných příkazů.
Shell> help
Protože vám zcela určitě uniklo mnoho příkazů, použijte následující parametr, který zajistí postupný výpis příkazů po stránkách (jako příkaz more v Linuxu).
Shell> help -b
Parametr -b lze používat téměř u všech příkazů poskytujících nějaký rozsáhlejší výstup.
Pro nápovědu k jednotlivým příkazům se však používá rozdílný zápis. Příklad pro zobrazení nápovědy příkazu ls (výpis obsahu adresáře).
EFI Shell ver.1
Shell> help ls
UEFI Shell ver.2
Shell> ls -? -v
Seznam příkazů Shellu
Vzhledem k rozsáhlosti nápovědy přímo v Shellu (včetně příkladů použití) vám nabízím „pouze“ seznam dostupných příkazů s jednoduchým osvětlením jejich funkce. V kulatých závorkách ( ) budu uvádět verzi Shellu, pokud se daný příkaz nevyskytuje v obou verzích.
Při ovládání Shellu vám pomůže klávesa TAB, která bude dokončovat jednoznačné názvy adresářů/souborů.
Nevýhodou pro mě bylo používat v absolutní i relativní cestě k souboru zpětné lomítko ( \ ).
Shell má paměť zadaných příkazů, pomocí šipek nahoru/dolu můžete listovat historií.
alias
Zobrazí/vytvoří/odstraní aliasy, které se ukládají do NVRAM. Při novém startu jsou tak již vytvořené aliasy stále dostupné. Aliasem může být nový název pro příkaz nebo spouštění další EFI aplikace.
attrib
Zobrazí/nastaví atributy souborů/adresářů. Pomocí znaku plus/minus lze ovlivnit tyto atributy:
a = archiv
s = systémový
h = skrytý
r = pouze pro čtení
Atribut D poukazuje na adresář.
bcfg (2)
Manipuluje s bootovacími záznamy v UEFI (obdoba efibootmgr v Linuxu). V žádném případě nemanipulujte se systémovými záznamy (System Setup, Boot menu atd.)
cd
změna pracovního adresáře (klasika většiny příkazových řádků)
cls
smaže obsah obrazovky, nebo nastaví barvu pozadí (čísla barev v nápovědě)
comp
porovnává obsah dvou souborů v binárním režimu
connect
Připojí a spustí ovladače pro konkrétní zařízení. Pokud si nejste jisti, raději tuto funkci nechejte.
cp
kopíruje jeden nebo více zdrojů do místa určení
-r kopíruje i adresář (rekurzivně)
date
zobrazí/nastaví aktuální datum v UEFI
dblk
zobrazí obsah jednoho nebo více bloků z blokového zařízení
devices
vypíše seznam zařízení, která jsou spravována EFI ovladači
devtree
vypíše strom zařízení, jejichž ovladače spadají do EFI Model Driver
dh
zobrazí informace o všech zařízeních/protokolech připojená do EFI prostředí
Shell> dh -b
vypíše všechna zařízení/protokoly (po stránkách)
Shell> dh xxx
dosadíte-li za xxx číslo řádku z předchozího výpisu, zobrazí se podrobné informace zařízení/protokolu
disconnect
Odpojí ovladače pro konkrétní zařízení. Umožňuje odpojení zařízení (devicehandle), ovladačů (driverhandle), nebo potomků zmíněných (childhandle).
Parametr -r odpojí všechny ovladače od všech zařízení. Po zadání:
Shell> disconnect -r
vám nezbude nic jiného než fungující tlačítko Power a Reset.
dmem
vypíše obsah systémové paměti nebo paměť zařízení (shodný výpis obdržíte s příkazem mem)
dmpstore
uloží/nahraje/smaže proměnné v NVRAM (databáze certifikátů, aliasy atd.)
Shell> dmpstore -d MOKlist
smaže všechny certifikáty a hashe v MOKlistu
drivers
zobrazí informace o ovladačích podporující EFI Driver Model
drvcfg
Vyvolá konfiguraci ovladače. Máte k dispozici 4 stupně konfigurace. Safe (bezpečná), Manufacturing (výrobní), Custom (vlastní) a Performance (výkonná).
drvdiag
vyvolá diagnostiku ovladače
echo
zobrazí zprávu, nebo vykoná script (soubor nsh)
parametr -on vypíše zadaný text
parametr -off nebude vypisovat, ale provádět příkazy
edit
celoobrazovkový textový editor podporující Unicode a ASCII typy souborů
eficompress
používá se ke kompresi souboru pomocí EFI kompresního algoritmu (Shell je komprimován pomocí Tiano kompresního algoritmu, který není kompatibilní s EFI kompresním algoritmem)
efidecompress
používá se pro dekompresi souboru pomocí EFI kompresního algoritmu (Shell je komprimován pomocí Tiano kompresního algoritmu, který není kompatibilní s EFI kompresním algoritmem)
err (1)
nastaví aktuální úroveň chyb v systému, nastavením proměnné EFIDebug na hodnotu errorlevel, což je bitová maska pro různé chyby konkrétního zařízení
exit
ukončí Shell a navrátí se do rodičovského systému (bootovací nabídka UEFI nebo zavaděč ze kterého byl Shell spuštěn)
getmtc (2)
zobrazí MTC z BootServices
guid (1)
zobrazí seznam všech GUID, které byly registrovány v EFI prostředí
help
zobrazuje nápovědu k příkazům (shodný s příkazem ?)
hexedit
celoobrazovkový hexeditor pro soubory, blokové zařízení nebo oblasti paměti
ifconfig
zobrazí/změní výchozí IP adresu v UEFI IP4
ipconfig (1)
zobrazí/změní konfiguraci IP
Shell> ipconfig -r
restartuje PXE a DHCP nastavení
Shell> ipconfig 10.0.0.25 -m 255.255.255.0
nastaví uvedené hodnoty IP adresy a síťové masky
load
nahraje EFI ovladač do paměti, a není-li uveden parametr -nc, pokusí se ovladač připojit ke správnému zařízení
loadpcirom
nahraje do paměti PCI obraz ROM a bez parametru -nc jej spustí
ls
Vypisuje obsah adresáře a informace o souborech. Může spolupracovat s příkazem attrib a zobrazovat jen soubory splňující zadané atributy.
map
Při startu Shellu se automaticky mapují rozeznané souborové systémy (úvodní obrazovka Shellu).
Pomocí map však můžete definovat nové mapování mezi uživatelem a zařízením.
Shell> map f*
vypíše všechna mapovaná zařízení začínající písmenem f
Shell> map -d floppy
smaže mapování uvedeného zařízení
mem
zobrazí obsah systémové paměti nebo paměti zařízení
memmap
zobrazí mapu paměti, která je spravována EFI prostředím (EFI specifikace definuje sadu paměti pro EFI prostředí)
mkdir
vytvoří jeden nebo více adresářů
mm
zobrazí nebo změní MEM / MMIO / IO / PCI / PCIe adresový prostor
MEM – přistupuje k systémové paměti
MMIO – přistupuje k paměti zařízení
IO – přistupuje k Input/Output portům
PCI – přistupuje k PCI konfiguračnímu prostoru
PCIe – přistupuje k PCIexpress konfiguračnímu prostoru
mode
zobrazí/nastaví počet řádků a sloupců textu výstupní konzole
mount (1)
připojí souborový systém na blokovém zařízení
mv
přesune jeden nebo více souborů
openinfo
zobrazí informace o protokolech
parse (2)
načte hodnoty z konkrétního záznamu pro formátovaný výstup
pci
zobrazí seznam pci zařízení
ping
pro pingnutí sítě
reconnect
odpojí a poté znovu připojí ovladače pro konkrétní zařízení
-r provede znovuzavedení ovladačů pro všechna zařízení
reset
resetuje systém
rm
Maže soubory a adresáře. Při pokusu smazat read-only soubory se setkáte s neúspěchem. Takové soubory je potřeba nejprve upravit pomocí příkazu attrib.
sermode
zobrazí/nastaví hodnoty pro sériové porty
set
zobrazí/nastaví proměnné prostředí, které se ukládá do NVRAM
smbiosview
zobrazí informace ze SMBIOS (mnoho informací rozdělených do kategorií s možností uložení do souboru)
fs2:\> smbiosview -t 9 > info.log
uloží informace z vybrané kategorie (-t 9) do souboru na zařízení fs2 (v mém případě je to druhý oddíl flash disku)
stall
zastaví procesor po zadanou hodnotu v milisekundách
telnetmgmt (1)
nastaví typ terminálu pro systém
setsize (2)
upraví velikost souboru
setvar (2)
nastaví hodnoty v UEFI
time
zobrazí/nastaví aktuální čas v UEFI
timezone
zobrazí/nastaví aktuální časové pásmo systému
touch
u souborů a adresářů upraví čas a datum na aktuální hodnotu
type
odešle obsah souboru na standardní výstupní zařízení
-a soubor je odeslán jako proud ASCII znaků
-u soubor je odeslán jako proud Unicode znaků
unload
uvolní nahraný EFI ovladač z paměti
ver
zobrazí informace o UEFI
-s zobrazí informace o EFI Shellu
vol
zobrazí/změní název svazku (volume label)
Ostatní příkazy (for, goto, if, pause, shift atd.) slouží pro skriptování (soubor startup.nsh).