2010年02月19日
ARM QEMUのユーザーランドをUbuntuにさしかえる
前回はQEMUをアップデートしてLinuxカーネルを最新版にさしかえました。
さらに仮想ハードウェアもARM926のものからARM11MPcoreのものにさしかえました。
今回は残ったユーザーランドをDebianからUbuntuにさしかえてみます。
ARMのUbuntuについて
https://wiki.ubuntu.com/ARM に情報があります。
これによると、DebianとUbuntuはほぼ同じソースから作られているものの、DebianはARMv4tをターゲットとしているのに対して、Ubuntuは9.04(コードネームjaunty)でARMv5t, 9.10(コードネームkarmic)でARMv6向けに最適化されているそうです。
さらに次のリリースのlucidではARMv7専用になるということです。
Ubuntu 9.04(jaunty)を動かす
https://wiki.ubuntu.com/ARM/RootfsFromScratch
ここにARM Ubuntuのルートファイルシステムを作る方法が書いてあります。
PCのUbuntuが必要です。私の手元にUbuntu 9.04 (x86_64) があるのでそれでやってみました。
https://launchpad.net/project-rootstock/
ここからrootstock-0.1.3.tar.gzをダウンロードします。
$ sudo apt-get install debootstrap $ mkdir rootstock $ cd rootstock/ $ tar xvf ~/download/rootstock-0.1.3.tar.gz $ sudo ./rootstock-0.1.3/rootstock --fqdn arm-jaunty --login user --password user
これで armel-rootfs-時刻.tgz というtarアーカイブができます。
NFSでブートするためにNFSで公開しているディレクトリにこれを展開します。
$ mkdir -p /export/ubuntu_jaunty_armel/root $ sudo tar xvf armel-rootfs-201002171152.tgz -C /export/ubuntu_jaunty_armel/root
起動は以下のとおり。
$ qemu-system-arm -M realview-eb-mpcore -m 256 \ -kernel zImage.2.6.32.8_realview_eb \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/ubuntu_jaunty_armel/root ip=dhcp " \ -redir tcp:55555::22
/etc/fstabは編集しなくてもエラーになりませんでした。
なお、現在時刻が1970年1月1日になっていました。普通はネットワークの初期化時にntpdateが実行されて時刻が設定されるのですが、NFSrootのときにはカーネルのレベルでネットワークが初期化されるためにそれがスキップされているようです。
$ sudo /etc/netowrk/if-up.d/ntpdate
と手で実行すると正しく時刻が設定されます。
毎回の起動時にこれを行うようにするため、とりあえず /etc/rc.local にこの一行を追加しました。
Ubuntu 9.10(karmic)を動かす
せっかく今はARM11MPCore(= ARMv6k)のCPUが動いているのですから、ARMv6向けにチューニングされているkarmicを動かしてみたいです。
rootstockのスクリプトの中を読むとどうやらkarmic向けのルートファイルシステムを作るにはホストもkarmicになっているほうが簡単そうです。なので、VMware上にUbuntu 9.10のserver版をインストールして、そこで続きを行いました。
$ sudo apt-get install rootstock $ sudo rootstock --fqdn arm-karmic --login user --password user $ sudo mount 192.168.xx.xx:/export /mnt $ mkdir -p /mnt/ubuntu_karmic_armel/root $ sudo tar xvf armel-rootfs-201002171732.tgz -C /mnt/ubuntu_karmic_armel/root
起動するにはルートファイルシステムのディレクトリを変更するだけです。
$ qemu-system-arm -M realview-eb-mpcore -m 256 \ -kernel zImage.2.6.32.8_realview_eb \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/ubuntu_karmic_armel/root ip=dhcp " \ -redir tcp:55555::22
起動に成功しますが、カーネルのCONFIG_SYSFS_DEPRECATED をdisableにせよという警告メッセージがでてます。
make menuconfig で以下の変更をして、カーネルをリビルドします。
General setup ---> [ ] enable deprecated sysfs features which may confuse old usersp (マークを外す)
このカーネルで起動すると今度は大丈夫です。
先ほどと同様に /etc/rc.local で /etc/network/if-up.d/ntpdate を実行するように書き換えました。
9.04から9.10に変更してみて、すこしだけきびきびするようになったような気もしますが、すくなくとも9.10は起動時間がだいぶ短くなっているので快適です。
次回予告
今回使ったrootstockのスクリプトの中を見てみると、qemuが非常に巧妙に使われていました。次回はその技を紹介しようと思います。