initramfsの作り方概略

  1. 新しいディレクトリを作る
  2. /devを作る
    1. /dev/consoleなどは必須
    2. 何が必須で必須でないのかを判定するのは面倒なので、必要っぽいデバイスノードは全部作っておく
    3. 作りすぎで困ることはあまりない
  3. /binを作る
    1. スタティックリンクしてコンパイルしたbusyboxをインストールしておく
    2. busyboxはとっても多機能なので、変わったことをやろうとしない限りはbusyboxだけで事足りる
    3. 古いbusyboxだと圧縮されたカーネルモジュールに対応していないかも知れない(最新のバージョンでも対応していないかも知れない) (スキップ可。基本的に圧縮は不要)
    4. /bin/shや/bin/mount、/bin/modprobeなどのシンボリックリンクを/bin/busyboxに向けて作っておく。busyboxのドキュメントに作り方が書いてあった気がする
  4. /lib/modulesを作る
    1. 利用するカーネルカーネルモジュールを /lib/modules/`uname -r` に全部コピーする
    2. find -name "*.ko" | xargs gzip -9 でカーネルモジュールを圧縮する (スキップ可。基本的に圧縮は不要)
    3. 圧縮しなくても動くならそれで問題ないので、最初は圧縮しないで試した方がいいかもしれない (スキップ可。基本的に圧縮は不要)
    4. 圧縮したら modprobe -b /path/to/the/directory/lib/`uname -r` が必要かもしれない (スキップ可。基本的に圧縮は不要)
  5. /initファイルを書く
    1. 実行権限を付けておく
  6. cd /path/to/the/directory && find | cpio --quiet -c -o | gzip -9 -c > initrd.img

/initファイルの内容は腕の見せ所。

#!/bin/sh

# 何はなくとも/procをマウント
mkdir -p /proc
mount -t proc proc /proc

# /sysをマウント
mkdir -p /sys
mount -t sysfs sysfs /sys

# 1行でできるハードウェア自動検出
for mod in /sys/bus/pci/devices/*/modalias; do modprobe `cat $mod`; done

# 種々のカーネルモジュールはキメ打ちでロード
modprobe sd_mod  # ストレージをマウントしたいとき
modprobe sr_mod  # CD/DVDをマウントしたいとき
modprobe usb-storage  # USBストレージをマウントしたいとき
modprobe ext3  # ファイルシステムのモジュールなど

# ブロックデバイスのデバイスノードの自動生成
for dev in /sys/block/*/dev /sys/block/*/*/dev;do
  line=`cat $dev`
  major=`echo $line | cut -d ":" -f 1`
  minor=`echo $line | cut -d ":" -f 2`
  name=`dirname $dev`; name=`basename $name`
  mknod /dev/$name b $major $minor
done

# いろいろやる

# switch_rootする