keropoの備忘録

しらべたことをメモるブログ

qemuで組込みLinuxを起動

BusyBoxのコンパイル - keropoの備忘録で作成したコマンドを使って、実際にルートファイルシステムを作成し、qemu上で実際にコマンドが打てる状態にするための手順。
カーネルlinuxカーネルのコンパイル - keropoの備忘録で作成したものを使用。

ルートフォルダの作成

とりあえず、適当な場所にqemuで起動するLinuxのルートフォルダを作成する。
一応、自分の環境では以下に設定

  $export ROOTFS=~/rootfs
  mkdir -p $ROOTFS

BusyBoxをコピー

作成したルートフォルダにBusyBoxのコマンド類をコピーする。

  $cp -Rp ${BusyBoxフォルダ}/_install/* ${ROOTFS}

ツールチェーンからライブラリ群をコピー

カーネルBusyBoxをクロスコンパイルしたツールチェーンからライブラリ群をコピーする。

  $cp -Rp ${CROSS}/arm-unknown-linux-guneabi/sysroot/lib ${ROOTFS}
  $cp -Rp ${CROSS}/arm-unknown-linux-guneabi/sysroot/usr/lib ${ROOTFS}/usr

その他、必要なフォルダ作成

  $mkdir -p ${ROOTFS}/dev/input
  $mkdir -p ${ROOTFS}/etc/init.d
 $mkdir proc
 $mkdir sys

デバイスファイルの作成

とりあえず、最低限必要そうなデバイスファイルを作成しておく。
スーパーユーザでないとmknodeコマンドは叩けないので注意

    #mknod dev/null c 1 3
    #mknod dev/zero c 1 5
    #mknod dev/fb0 c 29 0
    #mknod dev/sda b 8 0
    #mknod dev/sda1 b 8 1
    #mknod dev/sda2 b 8 2
    #mknod dev/sda3 b 8 3
    #mknod dev/sda4 b 8 4
    #mknod dev/sr0 b 11 0
    #mknod dev/tty c 5 0
    #mknod dev/tty0 c 4 0
    #mknod dev/tty1 c 4 1
    #mknod dev/tty2 c 4 2
    #mknod dev/tty3 c 4 3
    #mknod dev/tty4 c 4 4
    #mknod dev/ttyAMA0 c 204 64
    #mknod dev/ttyAMA1 c 204 65
    #mknod dev/ttyS0 c 4 64
    #mknod dev/ttyS1 c 4 65
    #mknod dev/input/mouse0 c 13 32
    #mknod dev/input/mouse1 c 13 33
    #mknod dev/input/mouse2 c 13 34
    #mknod dev/input/mouse3 c 13 35
    #mknod dev/input/misc c 13 63
    #mknod dev/input/event0 c 13 64
    #mknod dev/input/event1 c 13 65
    #mknod dev/input/event2 c 13 66
    #mknod dev/input/event3 c 13 67
    #mknod dev/input/event4 c 13 68

inittabの作成

initプロセスで参照されるinittabをとりあえず、下記のように作成

vi etc/inittab
  ::sysinit:/bin/mount -t proc proc /proc
  ::sysinit:/bin/mount -t sysfs sysfs /sys
  ::sysinit:/etc/init.d/rcS
  ::respawn:/bin/sh
  ::ctrlaltdel:/sbin/reboot

起動スクリプト作成

inittabで定義した起動スクリプト(/etc/init.d/rcS)を作成

vi etc/init.d/rcS
  #!/bin/ash

  export PATH=/bin:/sbin/usr/bin:/usr/sbin
  export LD_LIBRARY_PATH=/lib:/usr/lib

  echo "==================================="
  echo "  Linux system initialize         "
  echo "==================================="

  exit 0

スクリプトを作成したら、実行権限をつけておくこと。

ディスクイメージを作成

ディクスイメージを作成して、ルートフォルダをまるっとコピー。

  ##125Mのイメージを作成
  #dd if=/dev/zero of=rootfs.img bs=1M count=125

 ##ext2ファイルシステムでフォーマット
 #mkfs.ext2 -F rootfs.img

  ##適当にマウントしてルートフォルダをコピー
 #mount -text2 -o loop rootfs.img /mnt/sd
  #cp -Rp ${ROOTFS}/* /mnt/sd
  #umount /mnt/sd

qemuを起動し、動作を確認

以下のコマンドで動作を確認してみる。

 $qemu-system-arm -M versatilepb -m 256 -kernel zImage -hda rootfs.img -serial stdio  -append "root=/dev/sda rw console=ttyAMA0 init=/sbin/init"

起動の様子は以下。モニタ側にはペンギンロゴのみ出力され、起動ログはシリアル側(ここでは、ターミナル側)に出力されるようにしている。
f:id:keropo:20130422225614j:plain