5.1. 32-bit soft-float ARM でのインストーラの起動

5.1.1. ブート用イメージのフォーマット

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 をロードする必要があることはよくあります。

5.1.2. TFTP による起動

ネットワークからの起動には、ネットワーク接続と TFTP ネットワークブートサーバが (自動化でのネットワーク設定には恐らく DHCP, RARP, BOOTP も) 必要です。

ネットワーク起動をサポートするためのサーバ側の準備については、「TFTP ネットブート用ファイルの準備」 で説明します。

5.1.2.1. U-Boot での 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 コマンドで行いますが、イメージが記憶されているメモリのアドレスを指定する必要があります。残念ながらメモリの割り当てはシステムにより異なる可能性があるため、どのアドレスを利用できるというような原則はありません。

On some systems, U-Boot predefines a set of environment variables with suitable load addresses: kernel_addr_r, ramdisk_addr_r and fdt_addr_r. You can check whether they are defined by running

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

If they are not defined, you have to check your system's documentation for appropriate values and set them manually. For systems based on Allwinner SunXi SOCs (e.g. the Allwinner A10, architecture name sun4i or the Allwinner A20, architecture name sun7i), you can e.g. use the following values:

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} パラメータは省略できます。

5.1.3. U-Boot でのUSB メモリからの起動

現在の U-Boot バージョンの多くがUSBをサポートし、USBメモリ等のUSB大容量ストレージ機器からのブートができるようになっています。しかし残念ながら実際に必要な手順は機器によってかなり様々です。

U-Boot v2014.10 で一般的なコマンドラインの処理と autoboot フレームワークが導入されました。これによって、このフレームワークを実装したシステムであればどれでも機能する包括的なブートイメージを作れるようになりました。debian-installer はこういったシステムでのUSBメモリからのインストールをサポートしていますが、残念ながら全ての基盤でこの新しいフレームワークを採用するには至っていません。

ブート可能な Debian インストール用USBメモリをビルドするには、hd-media の tar アーカイブ (「どこでインストールイメージを探すか」 参照) をその機器の U-Boot バージョンでサポートしているファイルシステムでフォーマットしたUSBメモリに展開します。現在の U-Boot バージョンでは通常 FAT16 / FAT32 / ext2 / ext3 / ext4 のどれでも使えます。それから1枚目の Debian インストール CD/DVD の ISO イメージファイルをUSBメモリにコピーします。

現在の U-Boot バージョンの autoboot フレームワークは PC BIOS のブート順オプションと似た動作をします。つまり、ブート可能機器一覧から有効なブートイメージを確認して最初に見つけたものを起動します。OSがインストールされていなければ、USBメモリを差し込んでシステムの電源を入れればインストーラが起動するはずです。また、U-Boot のプロンプトでrun bootcmd_usb0コマンドを入力すればいつでもUSBの起動処理を始められます。

シリアルコンソールを使ってUSBメモリからブートした場合に起きる問題として、コンソールボーレートの不一致があります。console 変数が U-Boot で定義されている場合、debian-installer ブートスクリプトは第一のコンソールデバイスをセットするために、可能であればコンソールボーレートを含めて、それを自動的にカーネルに渡します。残念ながら console 変数の処理は基盤によって様々です - console 変数にボーレートまで含める (console=ttyS0,115200) 基盤もあれば console 変数には (console=ttyS0 のように) デバイスだけを含める基盤もあります。後者の場合に U-Boot とカーネルのボーレートのデフォルト値が異なっていると、コンソール出力が化ける原因となります。カーネルは未だに古い 9600 ボーをデフォルト値としていますが、U-Boot の現在のバージョンでは 115200 ボーがよく使われています。そうなった場合は、手作業で console 変数にシステムの正しいボーレートを指定して、run bootcmd_usb0 コマンドでインストーラを起動します。