2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BitVisorAdvent Calendar 2018

Day 22

UEFI環境でのBitVisor開発に便利なTFTP

Last updated at Posted at 2018-12-21

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が使用可能な環境のことは想定していません。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?