ARMベースのシステムではほとんどの場合、ブート用イメージに2つのフォーマット: a) 標準的な Linux 初期RAMディスク (「initrd.gz」) と併用する標準的な Linux zImage フォーマットのカーネル (「vmlinuz」)、または b) 対応する初期RAMディスク (「uInitrd」) と併用する uImage フォーマットのカーネル (「uImage」) のどちらかを利用します。
uImage/uInitrd はARMベースのシステムの多く (ほとんどが32ビットシステムです) で利用されている U-Boot ファームウェア向けに設計されたイメージフォーマットです。古いバージョンの U-Boot でブートできるのは uImage/uInitrd フォーマットのファイルだけなので、古い armel システムではこの形式がよく利用されています。新しいバージョンの U-Boot では - uImage/uInitrd のブート以外に - 標準的な Linux カーネル及びRAMディスクイメージもブートできますが、そのためのコマンド書式は uImage のブートとはわずかに異なります。
複数プラットフォーム対応カーネルを利用するシステムでは、カーネルと初期RAMディスク以外にいわゆるデバイスツリーファイル (デバイスツリー blob 「device-tree blob, dtb」) が必要です。これはサポートする各システムごとに特有のもので、特定のハードウェアの概要が収録されています。dtb はファームウェアによってデバイスに提供されるはずですが、実際にはもっと新しい dtb をロードする必要があることはよくあります。
ネットワークからの起動には、ネットワーク接続と TFTP ネットワークブートサーバが (自動化でのネットワーク設定には恐らく DHCP, RARP, BOOTP も) 必要です。
ネットワーク起動をサポートするためのサーバ側の準備については、「TFTP ネットブート用ファイルの準備」 で説明します。
U-Boot ファームウェアを採用したシステムでのネットワークブートは3つの段階から構成されます: a) ネットワークの設定、b) イメージ (カーネル/初期RAMディスク/dtb) のメモリへの読み込み、c) 前段階で読み込んだコードを実際に実行。
最初にネットワークを設定する必要があります。DHCP により自動的に設定する場合:
setenv autoload no dhcp
あるいは手作業により複数の環境変数を設定する場合:
setenv ipaddr <クライアントのIPアドレス> setenv netmask <netmask> setenv serverip <tftp サーバのIPアドレス> setenv dnsip <名前サーバのIPアドレス> setenv gatewayip <デフォルトゲートウェイのIPアドレス>
希望により、恒久的な設定にすることもできます:
saveenv
その後はイメージ (カーネル/初期RAMディスク/dtb) をメモリに読み込む必要があります。これは tftpboot コマンドで行いますが、イメージが記憶されているメモリのアドレスを指定する必要があります。残念ながらメモリの割り当てはシステムにより異なる可能性があるため、どのアドレスを利用できるというような原則はありません。
システムによっては読み込みに適するアドレスをセットした環境変数群を U-Boot が事前に定義しているものがあります: kernel_addr_r、ramdisk_addr_r、fdt_addr_r。定義されているかどうかは、
printenv kernel_addr_r ramdisk_addr_r fdt_addr_r
を実行することで確認できます。定義されていない場合はシステムの文書で適切な値を確認して手作業によりセットする必要があります。Allwinner SunXi SOC ベースのシステム (例えば Allwinner A10、アーキテクチャ名「sun4i」や Allwinner A20、アーキテクチャ名「sun7i」) では、例えば以下の値を利用できます:
setenv kernel_addr_r 0x46000000 setenv fdt_addr_r 0x47000000 setenv ramdisk_addr_r 0x48000000
読み込むアドレスが定義されていれば
tftpboot ${kernel_addr_r} <カーネルイメージのファイル名> tftpboot ${fdt_addr_r} <dtbのファイル名> tftpboot ${ramdisk_addr_r} <初期RAMディスクイメージのファイル名>
を実行することにより、前に定義した tftp サーバからイメージをメモリに読み込めます。3つ目の部分はカーネルコマンドラインの設定で、読み込んだコードを実際に実行します。U-Boot は 「bootargs」 環境変数の内容をカーネルにコマンドラインとして渡すので、カーネルやインストーラーへの任意のパラメータ - 例えばコンソールデバイス (「シリアルコンソールを起動」 参照) や preseed のオプション (「Debian Installer パラメータ」 及び 付録B preseed を利用したインストールの自動化 参照) - を
setenv bootargs console=ttyS0,115200 rootwait panic=10
のようなコマンドでセットできます。前に読み込んだコードを実行する実際のコマンドは利用するイメージのフォーマットに依存します。uImage/uInitrd の場合、コマンドは
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
となり、ネイティブの Linux イメージの場合は
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
となります。注意: 標準的な linux イメージをブートする場合、カーネルとdtbを読み込んでから初期RAMディスクイメージを読み込むことが重要となります。U-Boot が最後に読み込んだファイルのサイズを filesize 変数にセットするのと bootz コマンドが正常に動作するためにはRAMディスクイメージのサイズが必要となるためです。プラットフォーム特有のカーネル、つまりデバイスツリー無しでカーネルをブートする場合には ${fdt_addr_r} パラメータは省略できます。