
この節ではcoLinuxの導入を行う。導入したマシンはwindows 2000の動いているLibretto L1で、VMware playerを動かすには非力なマシンである。VMware playerはハードウェアエミュレーションであるために、PC-AT互換機上で動くOSなら何でも動くが、結構重量級。どうにかして、Linuxを導入するために色々とやってきたが、ここにきてかなりクールなソリューションに行き着いた気がする。coLinuxはかなり前から人気が出てきているandLinuxの基盤技術を提供しているものらしい。andLinuxはcoLinux+Ubuntuだが、ここでは、coLinux+Debianにする。
とりあえず最新のドライバとかをインストールしておく。dynabook.com | サポート情報 | 検索結果
導入の目的としては、「とにかく非力なコンピュータ上でどうやってLinux用に書かれたプログラムを走らせるか」である。ハードとの距離でいえば、もちろん直にインストールするのが最短だと思うが、windows上で動くアプリケーションと同時にlinux上で動くプログラムを使わねばならないという要請があった場合にどうするか。その場合は、VMware player, cygwin, coLinuxの3つの方法があると思うのだけれど、それぞれに欠点と利点がある。アプリケーションのスピードという観点からすれば、VMware playerはハードウェアエミュレーションであるために(実際のマシン - windows - windows API - windows仮想マシンアプリケーション - Linux - アプリケーション)最も効率が悪い、cygwinはwindows APIエミュレーションであるために(実際のマシン - windows - windows API - cygwin.sys - cygwinアプリケーション)2番目に効率が悪い。coLinuxはカーネルエミュレーションであるために(実際のマシン - windows - colinux - linuxアプリケーション)なので最も効率がよい。括弧のなかは嘘。このあたりはCoLinuxインストール導入編 - Silicon Linux Wikiに詳しい。
今回は1からセットアップする。つまり、coLinux本家から提供されているイメージファイルを使わない。必要なもを下に上げる。
手順的には、colinuxのセットアップ、qemuでディスクイメージの作成、coLinux上にdebianをインストールのための設定ファイルの作成、debianのインストーラを起動、インストーラからAlt+F2で仮想コンソールを移動、移動先の仮想コンソールからログインしてインストーラが作った*nix上でdebianをクロスインストール(debootstrap)、システムの設定、である。気づかねばならない重要な視点は、debian netinstallerはdebianをインストールするためのかませ犬でしかないことに気づくこと。このことに対する重要な示唆がD.3. Unix/Linux システムからの Debian GNU/Linux のインストールとcoLinuxでDebian etchを使うを比べてみるとよくわかる。
つまり、あえてdebian installerを使わずとも、クロスインストール出来るようなLinux環境があればよいということだ。つまり、クロスインストールするのに必要な最低限のLinux環境を作るためにdebian instalerを使用したということなのである。ゆえに、いくつかのイメージがcoLinux本家から手に入るので、これを使ってcoLinuxを起動し、其の上でクロスインストールすることもOKなのである。
ただし、debootstrapはこれを導入するためにarとwgetとが使えなければいけない。残念なことに、coLinuxに添付されているinitrd.gzに含まれるbusyboxはarコマンドが無い。そんな訳で、非常に残念なことに、余分なものが必要になる。とにかく、arとwgetが使えるinitrd.gzがあればいいのだが。
ここでは、coLinux本家が提供しているetchイメージからdebootstrapをつかってインストールを行う。まずはダウンロードしたetchのイメージからcoLinuxを起動。
> d: > cd d:\coLinux > del etch.img swap.img etch.conf > "d:\bin\qemu-0.9.1-windows\qemu-img.exe" create -f raw etch.img 1G > "d:\bin\qemu-0.9.1-windows\qemu-img.exe" create -f raw swap.img 128M > echo kernel="c:\Program Files\coLinux\vmlinux"> etch.conf > echo cobd0="d:\coLinux\Debian-4.0r0-etch.ext3.1gb\Debian-4.0r0-etch.ext3.1gb">> etch.conf > echo cobd1="d:\coLinux\swap.img">> etch.conf > echo cobd2="d:\coLinux\etch.img">> etch.conf > echo cofs0="d:\coLinux\">> etch.conf > echo root=/dev/cobd0>> etch.conf > echo vga=nomal>> etch.conf > echo ramdisk_size=1024>> etch.conf > echo rw>> etch.conf > echo -->> etch.conf > echo initrd="c:\Program Files\coLinux\initrd.gz">> etch.conf > echo mem=64>> etch.conf > echo eth0=tuntap,"TAP">> etch.conf > "c:\Program Files\coLinux\colinux-daemon.exe" @etch.conf
で、Cooporative Linux Consoleが立ち上がる。username:root、passwd:rootでログインする。セットアップ用のシェルスクリプトを走らせる。やっていることは大まかに言って、ネットワーク構成、現在のシステムのアップデート、スワップ領域の確保、セットアップ用のファイルシステムの作成とフォーマットとマウント、クロスインストール、シャットダウン。
debian~# mkdir -p /mnt/modules debian~# mount -t cofs cofs0 /mnt/modules/ debian~# cat /mnt/modules/setup.sh #!/bin/sh cd / ifconfig eth0 inet 192.168.0.2 netmask 255.255.255.0 up ifconfig lo up ifconfig route add -net 192.168.0.2 netmask 255.255.255.255 eth0 route add -net 127.0.0.0 netmask 255.0.0.0 lo route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.0.1 eth0 route echo nameserver 192.168.0.1> /etc/resolv.conf apt-get update apt-get upgrade apt-get dist-upgrade apt-get install debootstrap mkswap /dev/cobd1 sync;sync;sync swapon /dev/cobd1 mke2fs -j /dev/cobd2 mkdir /target mount /dev/cobd2 /target debootstrap --arch i386 etch /target shutdown -h now debian~# sh /mnt/modules/setup.sh
coLinuxが終了してプロンプトに戻ってくるので、今作ったシステムで起動する。
> echo kernel="c:\Program Files\coLinux\vmlinux"> etch.conf > echo cobd0="d:\coLinux\etch.img">> etch.conf > echo cobd1="d:\coLinux\swap.img">> etch.conf > echo cofs0="d:\coLinux\">> etch.conf > echo root=/dev/cobd0>> etch.conf > echo vga=nomal>> etch.conf > echo ramdisk_size=1024>> etch.conf > echo rw>> etch.conf > echo -->> etch.conf > echo initrd="c:\Program Files\coLinux\initrd.gz">> etch.conf > echo mem=64>> etch.conf > echo eth0=tuntap,"TAP">> etch.conf > "c:\Program Files\coLinux\colinux-daemon.exe" @etch.conf
どのようなシステムをからセットアップを行ったとしても、debootstrapを使った場合はセットアップ直後はまっさらな状態でほぼ何もされていないので、使える状態まで持っていくにはいくつかの設定が必要である。設定のいろはについてはD.3. Unix/Linux システムからの Debian GNU/Linux のインストールに詳しい。
まずは/etc/default/rcSを編集してハードウェアクロック(マザーボードにあるCMOSの時間)の1秒の基準(GMT or UTC)をマシンに伝える。ハードウェアクロックの基準は不明だったがUTCと考えることにしよう。また、上のようにインストールした場合はデフォルトでUTC=yesなので、編集する必要は無かった。しかし、debianのクロスインストールの手引きには書いてあるので一応確認。古めの情報だが、Linux Debian 2.0 でのrcS.dの動作についてによれば、/etc/default/rcSは起動時にS10checkroot.shから呼ばれて環境変数の初期設定を行うためのファイルのようだ。
# echo UTC=yes >> /etc/default/rcS # grep -n UTC /etc/default/rcS 13:UTC=yes 18:UTC=yes
本来、この作業にはコンピュータのハードウェアクロックがUTCとGMTのどちらの基準で1秒を刻んでいるか知っていなければならない。ただ実際問題として、どこにでもある汎用のコンピュータこの設定を行う場合は、ハードウェアクロックがGMTとUTCのどちらを基準にしているかを知る必要は無く、単純にUTCを採用すればよいと思われる。なぜなら、どちらにしてもハードウェアクロックが基準に対してずれずに動くのはかなり難しそうな気がするからだ。GMTの場合は地球の自転を考慮して、UTCの場合はセシウム原子時計を基準にして、1秒を決めねばならず現実的ではない。どこかにあるGMTやUTC基準の時計から情報をもらうにしても、そのためのデバイス(電波時計)と汎用コンピュータの価格の比較から、現実的でない選択肢となってしまうと思うからである。
初期状態ではタイムゾーンがUnknownなので、dateコマンドで表示される時間やlsのタイムスタンプも日本時間の9時間後。使いにくいかもしれないので、日本時間に変えておく。
# tzconfig
coLinuxからどのネットワークに接続したいのかによって設定は変化する。eth0に割り当てるアドレスを192.168.0.2とし、
まずは、eth0に割り振ったIPアドレスが所属するネットワークの外のネットワークにパケットを送るための出口(デフォルトゲートウェイ)を設定しなければ外のネットワークと通信できない。ここでは、192.168.0.1をデフォルトゲートウェイとした。一時的にゲートウェイを設定するには下のようにコマンドを打つ。この場合、再起動後に設定は消える。
# route add -net 0.0.0.0 network 0.0.0.0 gw 192.168.0.1 eth0
永続的にゲートウェイを設定するには下のように/etc/network/interfacesを編集して、eth0のブロックにgateway 192.168.0.1を追加する。このようにすると起動時に自動的にルーティングテーブルにデフォルトゲートウェイが追加される。このあたりの解説はデフォルトゲートウェイの設定が詳しい。
# vi /etc/network/interfaces >auto eth0 >iface eth0 inet static > address 192.168.0.2 > network 255.255.255.0 > gateway 192.168.0.1
下のようにしてupとpre-downを使って設定することも可能だが、煩雑。
# vi /etc/network/interfaces >auto eth0 >iface eth0 inet static > address 192.168.0.2 > network 255.255.255.0 > up route add -net 0.0.0.0 network 0.0.0.0 gw 192.168.0.1 eth0 > pre-down route add -net 192.168.0.0 network 255.255.255.0 eth0
ルーティングテーブルの確認は下のようにして行う。ルーティングテーブルの読み方は、他のネットワークのコンピュータとはどうやって通信しているの?が詳しい。gateway 192.168.0.1を追加したことで、一番下の行が追加され、192.168.0.0/255.255.255.0のネットワークに所属しないアドレスを宛先に持つパケットは全て、eth0を通して192.168.0.1へ送られることになった。
# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
「外のネットワークにパケットを送ることができる」とかいたが、注意がある。この場合なら、自分の所属するネットワーク192.168.0.0/255.255.255.0に属するアドレスを持つコンピュータがデフォルトゲートウェイの外にあってもパケットを送ることが出来ないということだ。ということで、最終的な設定ファイルは下のようになる。
# vi /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.2 network 255.255.255.0 gateway 192.168.0.1
まずはインストール。
# apt-get install locales
其の後、設定。とりあえずja_JP.UTF-8のロケールを作成して、システムのデフォルトをこれにしておく。
# dpkg-reconfigure locales
coLinuxにXアプリケーションをインストールして使うためには、XサーバとXアプリケーションが必要だ。Xサーバはユーザの使うキーボードが直接繋がったマシンでXアプリケーションからの接続を待機して、Xアプリケーションは別のどこかにあるマシンで走っている。このあたりについて上手く説明できていない(よくわかっていない)感じがする。XmingとXming-fontsをインストールする。で、Xmingをインストールしたディレクトリ(c:\Program Files\Xming\)中のX0.hostsを編集して、coLinuxマシンのIPアドレスを入れておく。
まずは、下のようにしてcoLinuxで割り当てられたIPアドレスをチェックする。この場合は192.168.0.2がcoLinuxに割り当てたIPアドレス。Windowsマシンで動いているXサーバ(Xming)にこのIPアドレスからの接続を許可する設定を追記する。
coLinux:~# ifconfig eth0 | grep inet
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
で、現状の確認。Xmingをインストールしたディレクトリ内のX0.hostsというファイルに接続を許可するIPアドレスが書いてあるので、これを見てみるとlocalhostからの接続のみが許可されている。
> type "C:\Program Files\Xming\X0.hosts" localhost
coLinuxはlocalhostで動いているわけではないのでこのままではcoLinuxから起動したXアプリケーションはwindowsで動いているXmingから接続拒否されるはずだ。ためしに下のようにしてcoLinuxでxeyesを起動してみる。
coLinux:~# xeyes Xlib: connection to "192.168.0.1:0.0" refused by server Xlib: No protocol specified Error: Can't open display 192.168.0.1:0.0
ということで、拒否された。Xmingのログにも下のように拒否したとある。
reject from IP 192.168.0.2
ということで、X0.hostsにcoLinuxのIPアドレスを追記してcoLinuxからXmingへの接続を許可してみる。
> echo 192.168.0.2>> "C:\Program Files\Xming\X0.hosts" > type "C:\Program Files\Xming\X0.hosts" localhost 192.168.0.2
これで設定ファイルはOKのはずだ。この設定を反映させるためにXmingを終了して起動する。
最後にcoLinux側でDISPLAY変数をセットすれば、coLinuxでxeyesを起動出来るはずだ。
coLinux:~# export DISPLAY=192.168.0.1:0.0 coLinux:~# xeyes
そもそも、coLinuxでXアプリケーションを使うのにわざわざsshdを立てたり、sshコネクションを貼る必要は一切ない。それどころか、sshの暗号変換処理を挟むことで、体感速度が遅くなるようなきがする。
