UEFI環境でのBitVisor開発ではTFTPが便利です。TFTPといえばPXEブートで、これはすでに紹介記事があります:
https://qiita.com/n_kane/items/0f55218371f2b1b6bb9f
https://qiita.com/nvsofts/items/62f96dff5340b9d7c851
しかし、PXEブートにはDHCPサーバーの準備が必要で面倒くさいです。DHCPは使っていても、単にアドレスを配る目的であって、PXEブートの設定を入れられないという環境も多いことでしょう。PXEブートでなくても、オペレーティングシステムの起動前に単にファイル転送ができるだけでもだいぶ便利になります。
UEFI Shell
EDK IIに含まれるUEFI Shellには、tftpコマンドが実装されているようです。残念ながらバイナリのほうには含まれていないみたいですが、ビルドしてできあがったShell.efiを使うとtftpコマンドが使えるようです。以下のように簡単にファイルを持ってくることができます。
Shell> fs0:
FS0:\> ifconfig -s eth0 dhcp
FS0:\> tftp 192.168.0.21 test
Downloading the file 'test'
[=======================================>] 0 Kb
FS0:\> type test
test
FS0:\>
しかし、某A社製のコンピューターでは簡単には使用することができません。UEFI ShellのifconfigコマンドはEFI IPv4 Configuration II Protocolを要求しますが、2006年からEFIファームウェアを採用し続けてきた某A社製のコンピューターは、同プロトコルをサポートしていないようです。対策として、もともとロードされているIp4Dxeドライバーをunloadし、EDK IIをビルドしてできあがったIp4Dxe.efiをloadすることで使えるようになりますが、非常に手間です。
なお、某A社製のちょっと古いコンピューターでは、新しいUEFI Shellは起動すらせずハングアップする、なんてこともあるみたいです。古いShellが欲しい場合はrEFItから入手するのが簡単です。逆に某L社製PCでは古いShellが動かない、なんてこともあった気がします。
Mtftpc
というわけで、EFI IPv4 Configuration II Protocolを使わない簡単なTFTPクライアントを適当に作ってみました:
UEFI Shellからこのmtftpc getコマンドを叩けば、DHCPでクライアントのIPアドレスを取得した上で、指定されたIPアドレスにTFTPで接続してファイルを持ってきます。(保存先はmtftpc.efiがあるのと同じファイルシステムのルートディレクトリからのパスになります。)
Shell> fs0:
FS0:\> mtftpc
Usage:
mtftpc.efi get <IPv4 address> <remote filename> [<local filename>]
mtftpc.efi put <IPv4 address> <local filename> [<remote filename>]
mtftpc.efi exec <IPv4 address> <remote filename> [<arguments>]
mtftpc.efi load <IPv4 address> <remote filename>
FS0:\> mtftpc get 192.168.0.21 test
Download 5
FS0:\> type test
test
FS0:\>
コマンドにexecというのがありますが、残念ながらloadvmm.efiをこれで実行してもBitVisorは起動できませんので、今のところファイルをget(ダウンロード)してから実行する必要があります。試していませんが、Linuxを起動しようとする場合もinitrdの読み込みができないのではないかと思います。
おまけでput(アップロード)機能も付けてあります。UEFI Shell上でdmemコマンドなどを実行した結果を、リダイレクトでファイルに保存して、TFTPでアップロードすれば、他のコンピューターで簡単にチェックできて便利かと思います。
某A社製のコンピューターでは無線LANのドライバーも組み込まれており、接続されていない場合はDHCPに失敗してエラーが出ることがありますが、有線LANが使用可能であれば自動的に見つけ出すようになっているので気にしないでください。複数のネットワークデバイスでDHCPが使用可能な環境のことは想定していません。