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

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. コンソール設定

netboot 用の tar アーカイブ (「ビルド済み netboot tar アーカイブ」) 及びインストーラのSDカード用イメージ (「インストーラでのビルド済みSDカードイメージの利用」) は U-Boot によりconsole変数で定義される (プラットフォーム特有の) デフォルトのコンソールを使います。ほとんどの場合これはシリアルコンソールなので、そういったプラットフォームでインストーラを利用するにはデフォルトでシリアルコンソールのケーブルが必要となります。

ビデオコンソールもサポートしているプラットフォームでは、インストーラをビデオコンソールで起動したければ U-Boot のconsole変数をそれに合わせて変更することもできます。

5.1.3. TFTP による起動

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

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

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

システムによっては読み込みに適するアドレスをセットした環境変数群を 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} パラメータは省略できます。

5.1.3.2. ビルド済み netboot tar アーカイブ

Debian は、tftp サーバ上で単純に展開でき、netboot に必要なファイルを全て収録しているビルド済みの tar アーカイブ ( .../images/netboot/netboot.tar.gz ) を提供しています。また、これにはインストーラを読み込む手順を全て自動化するブートスクリプトも収録しています。現在の U-Boot バージョンにはブート可能なローカルストレージ機器 (MMC/SD、USB、IDE/SATA/SCSI) がない場合には tftp の autoboot 機能が有効化されて tftp サーバからブートスクリプトを読み込むという機能があります。この機能を使うにはクライアントに tftp サーバのアドレスを提供する dhcp サーバがネットワークにあることが条件となります。

U-Boot のコマンドラインから tftp の autoboot 機能を作動させたい場合は以下のコマンドを使えます:

run bootcmd_dhcp

tar アーカイブにより提供されたブートスクリプトを手作業でロードするには、U-Boot プロンプトで以下のコマンドを実行する方法もあります:

setenv autoload no
dhcp
tftpboot ${scriptaddr} /debian-installer/armhf/tftpboot.scr
source ${scriptaddr}

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

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

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

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

The autoboot framework in modern U-Boot versions works similar to the boot ordering options in a PC BIOS/UEFI, i.e. it checks a list of possible boot devices for a valid boot image and starts the first one it finds. If there is no operating system installed, plugging in the USB stick and powering up the system should result in starting the installer. You can also initiate the USB-boot process any time from the U-Boot prompt by entering the run bootcmd_usb0 command.

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

5.1.5. インストーラでのビルド済みSDカードイメージの利用

いくつかのシステムでは U-Boot と debian-installer を両方とも収録したSDカード用のイメージを Debian で提供しています。SDカード用のイメージは2種類 - ソフトウェアパッケージをネットワークからダウンロードするタイプ ( .../images/netboot/SD-card-images/ から利用可) と Debian CD/DVD を使用してオフラインでインストールするタイプ ( .../images/hd-media/SD-card-images/ から利用可) を提供しています。容量とネットワーク帯域を節約するためにイメージは2部構成となっています - システムに依存する部分 (firmware.<system-type>.img.gz) とシステムに依存しない部分 (partition.img.gz) です。

Linux システムの2つの部分から完全なイメージを作成するには zcat を使って

zcat firmware.<system-type>.img.gz partition.img.gz > complete_image.img

のようにします。Windows システムでは2つをまず別個に伸張する必要があります。これには例えば 7-Zip を使えます。それから Windows CMD.exe ウィンドウでコマンド

copy /b firmware.<system-type>.img + partition.img complete_image.img

を実行してそれぞれ伸長したものを結合します。

出来上がったイメージを例えば Linux システムでは

cat complete_image.img > /dev/SD_CARD_DEVICE

を実行してSDカードに書き込みます。それから対象のシステムにSDカードを差し込んでシステムの電源を入れるとSDカードからインストーラが読み込まれます。hd-media 版を使ってオフラインでインストールする場合は、インストーラから例えばUSBメモリに書き込んだ CD/DVD のISOイメージ等、別個のメディアに置かれた1枚目の Debian CD/DVD にアクセスできないといけません。

インストールがパーティション作業 (「パーティションの分割とマウントポイントの選択」 参照) の段階まで進んだら、それまでカードにあったパーティションは削除、書き換えできます。インストーラは起動したら完全にシステムのメインメモリで動作し、以後SDカードにアクセスする必要はなくなるため、Debian のインストールにカード全体を使えます。SDカードに適切なパーティションレイアウトを作成する最も簡単な方法はインストーラに自動で作成させる方法です (「ガイドパーティション分割」 参照)。