カーネルの組み込み

最終的にUSBメモリに、上でマシンにインストールしたカーネルとinitrdを組み込みます。
単純にコピーして、さらにinitrdはgzipすればいいでしょう。
$ cp /boot/vmlinuz-2.6.23 /dev/sda1/linux26
$ cp /boot/initrd.img-2.6.23 /dev/sda1/initrd26
$ gzip /dev/sda1/initrd26
以上で、できあがりのハズです。

:USBメモリでインストールの手順

ただし、実際に試したわけではないので、やってみた方、正誤についてコメント頂けるとうれしいです。
なお、ブートシーケンスに関しては、別の機会に詳しく記述したいと思います。


インストーラ作成マシンの準備

インストーラを作るには、インストールするマシンとは別に、そのメディアをマウントできる、debianがインストールされているマシンが必要です。


USBメモリの準備

最初にUSBメモリにインストールするためのイメージを作るディスクを用意しておきます。
次にcfdiskなどでUSBメモリ上にディスクイメージのパーティション(ディスクラベル:/dev/sda1など)を用意します。パーティションはbootableにしておいてください。
このパーティションext2でフォーマットします。
# /sbin/mkfs.ext2 /dev/sda1


USBメモリをマウントします。
# mount -t ext2 /dev/sda1 /mnt


grubをインストールします。
# grub-install --install-directory=/mnt/ /dev/da1
(かなり時間がかかるようです。)


grubのmenu.lstを編集
カーネルとinitrdをきちんと設定しましょう。
  title Debian installer kernel 2.6
  root (hd0,0)
  kernel /linux26 ramdisk_size=10396 root=/dev/rd/0 init=/sbin/init devfs=mount,dall rw
  initrd /initrd26.gz
  boot


イメージの作成

hd-medhiaなどからboot.img.gzをダウンロードして、解凍しループバックでマウントします。
マウントポイントは/usbbootとしました(適当なものにしてください。)。
$ gunzip boot.img.gz
# mkdir /usbboot
# mount -o loop boot.img /usbboot


次にマウントした/usbbootから必要なファイルを抜き出し、USBメモリーにコピーします。
必要なファイルは
initrd.gz initrd.list initrd26.gz linux linux26
だと思います。
カーネルがこれではうまくない場合は、linux linux26を差し替えてください。
(差し替え用カーネルの作成方法は後述します。)


最後に事前にダウンロードしておいたnetinstのisoイメージをコピーします。
# cp sarge-i386-netinst.iso /mnt/


なお、念のためにmbrをインストールします。(grubが動くので、必要ないはずですが・・・)
# /sbin/install-mbr /dev/sda


USB デバイスをumountして、できあがりです。
# umount /mnt
eject で外せるようにします。
# eject /dev/sda
書き込み禁止のロックのスイッチがついていれば禁止にしておくといいでしょう。


参考情報:USBメモリーのファイル配置
  .
  |-- boot
  | `-- grub
  | |-- device.map
  | |-- e2fs_stage1_5
  | |-- fat_stage1_5
  | |-- jfs_stage1_5
  | |-- menu.lst
  | |-- minix_stage1_5
  | |-- reiserfs_stage1_5
  | |-- stage1
  | |-- stage2
  | `-- xfs_stage1_5
  |-- initrd.gz
  |-- initrd.list
  |-- initrd26.gz
  |-- linux
  |-- linux26
  |-- lost+found
  `-- sarge-i386-netinst.iso
3 directories, 16 files


USBメモリの容量:113M


今回は netinst を利用しましたが、インストール用のisoならなんでも使えると思います。

差し替え用のカーネルの作り方

現状のdebianカーネルはlenny(次期stable)まで調べた範囲では、2.6.18がベースになっています。
しかし、2.6.18は、最新のハードウェアへの対応が相当手薄です。
実際の最新カーネルソースは現在(2007.10.12)で2.6.23です。こちらであれば、core2-duoほか、新しいサウスブリッジのICH9やrealtekの1000〜10000Mネットワークカード、新しいGPU等に対応しています。
したがって、新しいハードを使ったPCの場合は、debian-stableやtestingではカーネルがうまくない場合が多いことになります。


そこで、最新カーネルソースをコンパイルして最新カーネルインストーラのブートカーネル及びインストールするカーネルを差し替える方法を以下に示したいと思います。

手順概要

対象ディストリビューションdebianなのですから、カーネルインストール用のdebパッケージを作成すればいいことになります。
カーネルdebパッケージ作成には、以下のものが必要です。
最新カーネルソース:当たり前ですね。
カーネル作成用パッケージ:kernel-package
これをコンパイルしてdebファイルをつくり、実際にインストーラー作成マシンにインストールするとカーネルとinitrdが作られますので、これをインストールメディアに書き込めばOKです。


さて、実際の使い方は次の通りです。

最新カーネルソース取得

真のカーネルの最新情報はhttp://www.kernel.org/にあるのですが、ここはそんなに速くないし、そもそも総本山からダウンロードは避けるべきです。
ringを探すのが一番でしょう。
今回は、こちらhttp://ring.nict.go.jp/archives/linux/kernel.org/kernel/v2.6/からダウンしました。
バージョンは上記の通り2.6.23で、linux-2.6.23.tar.bz2というファイル名ですね。
近頃のカーネルソースは非常に容量が大きいです。まぁ、対象となっているハードウェアが多くなっていて、機能も豊富なので仕方ありませんが、43MBって、すごい大きさですね。展開すると100MBを楽々越えます。
コンパイル環境を揃えるのも一苦労ですね。

ソースの解凍とconfig

どこかコンパイルしてもいいディレクトリに展開します。bz2イメージなので、以下のコマンドが簡単でしょう。(gnu-tarでないとjオプションはありませんので、ご注意ください。)
$ tar jxf linux-2.6.23.tar.bz2
展開している中身が見たい人はvオプションもつけてください。
次にconfig作業を行います。trillimicはnursesベースのmenuconfigが好きなので、これでやってます。
$ cd linux-2.6.23
$ make menuconfig
必要なデバイスをモジュールまたはカーネル組み込みで指定していきます。
ブートするときにinitrd以降でマウントするディスクのファイルシステムは、ブートカーネルカーネル組み込みされていないとマウントできず、rootイメージに切り替わるところでpanicしますので、ご注意ください。(経験済み:2時間ぐらい悩みました。)

コンパイル

いよいよコンパイルですが、最後のdebファイルの作成はスーパーユーザでないとできないみたいなので、以下のようにsudoで行います。
今回はinitrdでないと、とても収まり切れそうもない大きなカーネルとルートファイルシステムになりそうですので、initrdのオプションもつけます。
$ sudo make-kpkg --initrd kernel_image
あとは自動的にカーネルパッケージができます。パッケージ名を工夫したいときは、--revisionオプションを使ってください。

インストール

インストールは簡単です。
$ sudo dpkg -i linux-image-2.6.23_2.6.23-10.00.Custom_i386.deb
で、質問が出たら適当に答えてください。再インストールか現行動作カーネルと同じバージョンでなければ質問は出ないはずです。
grubを使っている場合は、grubのmenu.lstも編集してくれます。よくできてますね。