UEFI Shell の コマンド

概要

UEFI Shellについてのメモ。

目次

UEFI Shellとは

UEFI Firmware(BIOSに相当)上で動作するShellのこと。 簡単なファイル操作をはじめ、NW通信なども行うことができる。

UEFI Shell の動作環境構築

Ubuntu 20.04上のQEMU上でShellを試す

インストール方法

sudo apt install qemu-kvm

起動方法

qemu-system-x86_64 -bios OVMF.fd

Shell上からホスト上のディレクトリにアクセスできるようにする

-driveオプションで指定する。

qemu起動後、ホストからディレクトリの内容を書き換えても、UEFI Shell上からは認識できないので注意すること。

qemu-system-x86_64 -bios OVMF.fd -drive file=fat:rw:path/to/dir

リンク

ソース

この辺。 github.com

ユースケース

help

コマンドの一覧 や 各コマンドの内容について調べる

helpコマンドを使う。

引数無しの場合はサポートしているコマンド一覧を確認できる。

help

コマンド名を引数に与えることでそのコマンドのhelpを参照できる。

help ls

ファイル/ディレクト

ファイルパスについて

Windowsライク。 パスの区切りはバックスラッシュ'\'。 また、先頭にボリュームラベル名を付与することで、そのマップ以下のディレクトリやファイルを指定できる。(Windowsのドライブレターのよう)

下記はボリュームラベルfs0以下にマップされているhogeディレクトリを指定する絶対パス

fs0:\hoge

ワイルドカードもサポートされている。

マウント可能な一覧を確認する(map)

> map
Mapping table
      FS0: Alias(s):HD0a1:;BLK1:
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
     BLK2: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)

ファイルシステムをマウントする

下記のようにShell>という表示の場合はファイルシステムがマウントされていない。

Shell>

マウントしたい対象にコロンを加えた文字列を入力することでマウントできる。

下記はfs0をマウントする場合の例。

fs0:

マウントされた場合は、Shell>という表記が変わり、ボリュームラベル名:ディレクトリパスという表記になる。

fs0:\>

ディレクトリの一覧を表示する(ls/dir)

>ls
Directory of: FS0:\
05/29/2020  22:48              11,077  NvVars
05/29/2020  22:51                   2  ls.txt
          2 File(s)      11,079 bytes
          0 Dir(s)

dirコマンドもあるが、lsへのエイリアスとなっている。

ファイルのコピー(cp/copy)/消去(rm/del)/移動・リネーム(mv/move)

UNIXコマンドのように使用可能。

コピー操作。

cp src dst

リネーム操作。

mv aaa bbb

消去操作。

また、rmエイリアスとして、delが設定されている。

rm src

ディレクトリの作成(mkdir/md)/消去(rm)

hogeディレクトリの作成例は下記。

mkdir hoge

mkdirエイリアスとしてmdが用意されている。

ディレクトリの消去はrmdirでなく、rmコマンドを使用する。

rmdir hoge

ファイル内容を出力する(type/cat)

ファイル内容を標準出力に表示することができる。

type filepath

typeエイリアスとしてcatが設定されている。

タイムスタンプの更新(touch)

パス先のファイルのタイムスタンプを更新する。

なお、このコマンドで空ファイルの作成は行えないようだ。

touch filepath

ネットワーク

ネットワーク設定(ifconfig)

ifconfig コマンドを使う。 -lオプションでinterface名を取得して、-sコマンドと組み合わせてIPを割り当てる。

下記はeth0について、DHCPで割り当てる例。

ifconfig -s eth0 dhcp

設定の確認は-lオプション。

ifconfig -l

疎通確認(ping)

ping

ユーティリティ

テキストエディタ(edit)

フルスクリーンのエディタが立ち上がる。 ショートカットは下記の様子。

Ctrl+Tを押下することで、ASCIIかUNICODEかを切り替えることができる。

機能 ショートカット
終了 Ctrl+Q
ファイル保存 Ctrl+S
ファイルオープン Ctrl+O
検索 Ctrl+F
置換 Ctrl+R
カット Ctrl+K
ペースト Ctrl+U
行移動 Ctrl+G
文字コード切り替え Ctrl+T
ヘルプ Ctrl+E

バイナリエディタ(hexedit)

カット/ペーストがテキストエディタと異なるので注意。

ファイルのほか、-d でディスクを、-mでメモリもオープンできるらしい。

機能 ショートカット
終了 Ctrl+Q
バッファ保存 Ctrl+S
カット Ctrl+X
ペースト Ctrl+V
選択開始 Ctrl+T
選択終了 Ctrl+D
ファイルオープン Ctrl+O
ディスクオープン Ctrl+I
メモリオープン Ctrl+M
オフセット移動 Ctrl+G
ヘルプ Ctrl+E

システム情報

エイリアス設定(alias)

オプション無しで、現在のエイリアスを確認できる。

>alias
         cat:type
        cd..:cd ..
         cd\:cd \
        copy:cp
         del:rm
         dir:ls
          md:mkdir
         mem:dmem
       mount:map
        move:mv
         ren:mv

UEFI Shellや UEFIのバージョンを確認する(ver)

UEFI Shellのバージョンと、UEFI ShellがアクセスするUEFI 自体のバージョンを確認できる。

> ver
UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (EDK II, 0x00010000)

UEFI変数を操作する(dmpstore)

引数無しの場合、すべてのUEFI変数とその属性ならびに内容がダンプされる。

dmpstore

消去を行う場合は、-dオプション。

タイムゾーンの表示/変更(timezone)

オプションが無い場合、現在のタイムゾーンが表示される。

>timezone
LOCAL

タイムゾーンの一覧は-lオプションで確認できる。

timezone -l

タイムゾーンの設定は、-sオプションとUTCからのオフセットで設定できる。

timezone -s -9:00

時刻の確認/変更(time)

オプションが無い場合、現在時刻とUTCのオフセットが表示される。

>time
00:34:52 (UTC-09:00)

時刻設定は引数にhh:mm:ssのフォーマットで指定できる。

time 12:00:59

日付の確認/変更(date)

オプションが無い場合、現在の日付が表示される。フォーマットは、MM/DD/YYYY

> date
05/29/2020

引数で日付情報を与えることで変更できる。

date 06/30/2020

文字列や環境変数の表示(echo)

UNIXのように、文字列や環境変数の表示を行える。

また、スクリプトファイル実行時の出力制御の設定変更を行うことができる。

> echo hoge
hoge

環境変数表示の例は下記。変数名を%でくくる。

> echo %lasterror%
0xE

引数無しの場合は、スクリプト実行時の出力設定を確認できる。 この設定は、-on もしくは -offオプションで変更できる。

> echo
Echo is on.

環境変数の確認/設定(set)

オプション無しの場合、現在の環境変数一覧を確認できる。

> set

変数名と内容を下記のように指定できる。

set key val

ディスク容量を確認する(vol)

引数無しで、現在のボリュームラベル上の使用量や空き容量を確認できる。

> vol

ボリュームラベル名を付与することで、そのボリューム以下の情報を確認できる。

> vol fs0
Volume QEMU VVFAT (rw)
528171008 bytes total disk space
528056320 bytes available on disk
8192 bytes in each allocation unit

ハードウェア

PCIバイスの一覧表示(pci)

何もオプションがない場合、簡素な一覧が表示される。

> pci
   Seg  Bus  Dev  Func
   ---  ---  ---  ----
    00   00   00    00 ==> Bridge Device - Host/PCI bridge
             Vendor 8086 Device 1237 Prog Interface 0
    00   00   01    00 ==> Bridge Device - PCI/ISA bridge
             Vendor 8086 Device 7000 Prog Interface 0
    00   00   01    01 ==> Mass Storage Controller - IDE controller
             Vendor 8086 Device 7010 Prog Interface 80
    00   00   01    03 ==> Bridge Device - Other bridge type
             Vendor 8086 Device 7113 Prog Interface 0
    00   00   02    00 ==> Display Controller - VGA/8514 controller
             Vendor 1234 Device 1111 Prog Interface 0
    00   00   03    00 ==> Network Controller - Ethernet controller
             Vendor 8086 Device 100E Prog Interface 0

バス番号、デバイス番号、ファンクション番号を付与することで、対象のコンフィグ空間の情報を確認できる。 さらに-iオプションを付与することで人が読みやすい情報を付与して表示してくれる。

> pci 00 00 00 -i
  PCI Segment 00 Bus 00 Device 00 Func 00 [EFI 0000000000]
  00000000: 86 80 37 12 07 00 00 00-02 00 00 06 00 00 00 00  *..7.............*
  00000010: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000020: 00 00 00 00 00 00 00 00-00 00 00 00 F4 1A 00 11  *................*
  00000030: 00 00 00 00 00 00 00 00-00 00 00 00 FF 00 00 00  *................*

  00000040: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000050: 00 00 00 00 00 00 00 10-00 00 01 00 00 00 00 00  *................*
  00000060: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000070: 00 00 02 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000080: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  00000090: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000A0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000B0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000C0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000D0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000E0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*
  000000F0: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  *................*

Vendor ID(0): 8086     Device ID(2): 1237
Command(4): 0007
  (00)I/O space access enabled:       1  (01)Memory space access enabled:    1
  (02)Behave as bus master:           1  (03)Monitor special cycle enabled:  0
  (04)Mem Write & Invalidate enabled: 0  (05)Palette snooping is enabled:    0
  (06)Assert PERR# when parity error: 0  (07)Do address/data stepping:       0
  (08)SERR# driver enabled:           0  (09)Fast back-to-back transact...:  0

Status(6): 0000
  (04)New Capabilities linked list:   0  (05)66MHz Capable:                  0
  (07)Fast Back-to-Back Capable:      0  (08)Master Data Parity Error:       0
  (09)DEVSEL timing:               Fast  (11)Signaled Target Abort:          0
  (12)Received Target Abort:          0  (13)Received Master Abort:          0
  (14)Signaled System Error:          0  (15)Detected Parity Error:          0

Revision ID(8): 02 BIST(0F):  Incapable
Cache Line Size(C): 00                 Latency Timer(D): 00
Header Type(0E):    00, Single function, PCI device
Class: Bridge Device - Host/PCI bridge - 

終了/シャットダウン/再起動

UEFI Shell を終了する(exit)

exit

シャットダウン/再起動する(reset)

引数無しの場合、再起動処理が実行される。

reset

シャットダウンを行う場合は、-sオプションを付与する。

reset -s

汎用的な情報

コマンドの出力をページ毎にいったん止める

おおよそのコマンドは -b オプションを付与することで、 一ページ単位で表示を止めてくれるようになる。 表示が止まったのち、Enterで改ページ、qでキャンセルを行うことができる。

エスケープシーケンス

^特殊文字エスケープできる。

下記はスペースを含むディレクトリ生成の例。

mkdir aaa^ bbb

ファイルへのリダイレクト

> によってファイルにリダイレクトできる。

dmpstore > dmpstore.txt

シェルスクリプト

シェルスクリプトの拡張子は.nshである。 UEFI Shell起動後、一定時間が経過した際に、startup.nsh というファイルが存在する場合は、そのファイルが自動実行される。