keropoの備忘録

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

qemuとbusyboxでhttpサーバ起動

qemu上にbusyboxhttpdで、簡易HTTPサーバを立ち上げた際のメモ。

前準備

qemu上にHTTPサーバを起動し、ホストOS又は別PCからhttpアクセスさせるには、qemuがネットワークにアクセスできるようにする為にホストOS側でTUN/TAPデバイスの使用するための設定をする必要がある。
まずは必要なツール(bridge-utils)がホストOSにインストールされているか確認

  #yum list installed | grep bridge-utils

インストールされていなければ、yumでインストールする。

  #yum -y install bridge-utils

/dev/net/tunというデバイスファイルが存在するか確認し、なければ作成する。

  #mknod /dev/net/tun c 10 200

ブリッジ接続設定

ホストOS側のネットワークにブリッジ接続の設定を行う。
まず、ブリッジさせたいNICスクリプトファイル(今回はeth0)をブリッジ用にコピーする。

  #cd /etc/sysconfig/network-scripts
 #cp ifcfg-eth0 ifcfg-br0

それぞれ修正

ifcfg-br0

下記の項目をブリッジ用に修正

 DEVICE=br0
 NM_CONTROLLED=no
 TYPE=Bridge
ifcfg-eth0

下記項目をコメントアウト

 IPADDR
 NETMASK
 GATEWAY
 DNS1
 DNS2
 DEFROUTE
 IPV4_FAILURE_FATAL
 IPV6INIT

下記項目を追加

  BRIDGE=br0

ネットワークをリスタート

  #service network restart

ブリッジが張れたことを確認。
brctl showと叩き、以下のように出力されていればOK。

 # brctl show
 bridge name     bridge id               STP enabled     interfaces
 br0             8000.000c29a4aec7       no              eth0

TAPの設定

qemu用にTAP起動スクリプトを作成する。

 $vi ~/qemu-ifup
  #!/bin/sh
  /sbin/ifconfig $1 0.0.0.0 promisc up
  /usr/sbin/brctl addif br0 $1 
 $chmod +x ~/qemu-ifup

qemu起動

作成したTAPスクリプト指定して、起動する。
TAPを設定してqemuを実行する場合、ルートユーザでないと起動が失敗するようなので、ルートになって実行

  $su
  #qemu-system-arm -M versatilepb -m 256 -kernel zImage -hda rootfs.img -serial stdio  -append "root=/dev/sda rw console=ttyAMA0 init=/sbin/init" -net nic -net tap,ifname=tap0,script=~/qemu-ifup

ゲストOS(qemu上の組込みLinux側)のネットワーク設定

qemuが起動し、組込みLinuxが起動したら、ネットワーク設定を行う。
ホストOSのIPが192.168.137.105でデフォルトゲートウェイが192.168.137.1なので、ゲスト側は以下に設定。

 #ifconfig eth0 192.168.137.100
 #route add default gw 192.168.137.1

HTTPサーバ起動(qemu側)

とりあえず、ブラウザからアクセスされたときの為に簡単なHTMLを作成

  #mkdir -p /var/www
 #vi /var/www/index.html
   <html>
   <body>
   <h1>hello linux</h1>
   </body>
  </html>

下記コマンドでHTTPサーバを起動

  #httpd -h /var/www

後は実際にホストOSや他のネットワークが繋がっているPCからアクセスすれば、index.htmlが参照できるはず。

  http://192.168.137.100/

一応、今回は、htmlを表示してみるだけだったが、busyboxhttpdにはリバースプロキシなどの機能もあるので、結構色々なことができるようです。
使い方はbusyboxのソース(networking/httpd.c)に書かれています。