UbuntuとVMwareでThin Clientを作ってみた

手元に5世代前位のノートPCがある。Dynabook SS 3480 (PORTEGE 3480 DS60P/1N2T)。Mobile Pentium III 600MHz、搭載メモリ192MB。企業向けDynabookの2000年のモデルだから10年位前に売られていたもの。今のところ動いてはいるので捨てるのもモッタイナイのでとってある。しかしStandaloneで使うにはCPUパワーもメモリもない。そこでUbuntuVMwareを使ってシンクライアントというか、リモートデスクトップ端末として使えるようにしてみた。

一応、20GBのHDDにWindows 2000が動いているのでWindows+vmplayerでも同じ構成は組めるが、いっそのことHDDを使わず、OSをLinuxにしてネットワークブートしメモリだけを使い、その上でVMware Playerを動かしてリモートコンソールとして使えるようにと考えた。

実は数日前にUbuntuのライブCD(Ubuntu Desktop版)をPXEでネットワークブートして、このDynabookで動かしてみたが、やはり死ぬほど遅かった(“Ubuntuライブ環境をディスクレスクライアントして使う考察”参照)。ブートに10分以上かかった挙句にGNOMEが固まってしまう。(キーボード、マウスのイベントを受け付けなくなる。)たぶんメモリが不足しているのだろう。(swap領域を設定せず仮想記憶は使っていないので、実メモリを喰い尽したら、そこでおしまい。)

それでは!ということで、とにかく要らないサービスやパッケージを削って、何とか利用メモリを120MBバイトまで落としてみた。Linuxの起動は大分速くなったがvmplayerを立ち上げようとすると遅くなる。多分、この辺りが負荷なくメモリ管理できる限界のようだ。
更にサービスやパッケージを削ろうとしたが、Desktop版をベースにするとパッケージの依存関係が複雑過ぎて、誤ってパッケージを削除すると必要なパッケージまで無くなって大変なことになる。そこで、Desktop版から削るのではなく、Server版に必要な機能を追加するアプローチに変えた。

Server版は軽い。サーバ機能としてSSHだけを指定してインストールした直後は、消費メモリ量約18MB、HDDは約500MBしかない。DynabookSS 3480でもそこそこ軽快に起動する。Ubuntuが標準としているRun Level 2で起動するサービスは

ubuntu@ubuntu:~$ ls /etc/rc2.d/
README        S11klogd  S20rsync  S89cron      S99rmnologin
S10sysklogd   S16ssh    S89atd    S99rc.local

しか無い。S99は常駐サービスではないので、実質的に起動されるサービスは6つしかない。

さて、これにどのような機能(パッケージ)を追加するか、だが。最終目標は“電源を入れて自動的にvmplayerが起動して、VMware Serverへ接続する。仮想マシン(ゲストマシン)をシャットダウンするとノートPCもシャットダウンして作業終了となる”だ。従って必要な機能はvmplayerの他はX windowだけでいいハズ。GNOMEは要らない。metacityやtwmのようなウィンドウマネージャも必要ない。Xが立ち上がったら自動的にvmplayerが立ち上がるようにすればいい。

そこで次のような手順で自作Thin Clientを作った。この作業はシンクライアント化するPCで行う必要はない。もっと早いマシンで作業して、最終的に作ったファイルをサーバに置き、Thin Clientからネットワークブートする。効率良く作業するため私は仮想マシンを使って行った(が、もちろん実マシンでも作成は可能)。なお、ベースとしたOSはUbuntu 8.04.2 LTS Server i386

1:OSをクリーンインストールする。

後でISOイメージ化するのでHDDの大きさは幾らでも構ない。2GBあればお釣りがくる。インストールするときのユーザ名は“ubuntu”。初回のブートでuid:gidを999:999に変更する。(“ライブDVD用の雛型Linuxをクリーンインストールする”あたりを参照のこと。)
インストールが終わったら、パッケージを最新版に更新しておく。

$ sudo -s
# apt-get update
# apt-get dist-upgrade

そして、リブート。
上の作業で大体500MB位のHDDを使う。*1

2:カーネルの変更

Dynabook SS 3480 ではなく、現役で使っているDynabook SS 1610で動かそうとして気がついたのだが、Ubuntu Serverのカーネルlinux-server)は幾つかのモバイルCPUでは起動できないらしい。(名前を変え、パッケージを変えてリリースしているのだから、当然サーバ用にコンフィグしてあるのだろう。)従って、色々なノートPCや低消費電力PCを想定するとgenericカーネルを使うのが良さそうだ。そこで、先ずはカーネルを変更する。

# apt-get install linux-generic
# reboot

リブートする際に grubの画面が出てきたらESCキーを押してメニューを表示し、“linux-2.6.24-23-generic”というカーネルを選択してブートする。(もちろんカーネルのバージョン番号はその時々で変わる。)リブートしたら古いカーネルlinux-server)を削除する。

# apt-get purge linux-image-image-2.6.24-23-server
# apt-get autoremove

これでOK。カーネルの変更によりHDDの消費量が50MB程増えた。

なお、この作業は以下の手順の前に行っておく。

3:必要なパッケージを追加。

VMware Playerを動かすために必要なパッケージは以下の通り。

# apt-get install xinit
# apt-get install xauth
# apt-get install xserver-xorg-core
# apt-get install xfonts-base
# apt-get install gtk2-engines
# apt-get install gcc
# apt-get install make
# apt-get install linux-headers-`uname -r`

make、gcclinux-headersはvmplayerのインストールに必要。

さらに、今インストールしているファイルシステムをライブ環境化するためにcasperを追加する。

# apt-get install lupin-casper

ついでに、不必要と思われるパッケージを削除しておく。

# apt-get purge xserver-xorg-input-wacom
# apt-get purge ppp
# apt-get purge manpages
# apt-get purge apparmor

wacomドライバは、これが存在すると起動時にrcが動くので起動時間短縮のため。pppはLAN環境では要らないだろう。manpagesも使わない。apparmorは今回インストールしたソフトウェアに関しては監視対象にしていないので、これも削除。

4:vmplayerのインストール

VMware社のホームページからLinux i386用のインストールパッケージ“VMware-Player-2.5.1-126130.i386.bundle”をダウンロードして、インストールする。しかし、ブラウザは使えないので、予め他のマシンでダウンロードして、sshなどで持ってくる。

# ssh adsaria@server cat /tmp/VMware-Player-2.5.1-126130.i386.bundle > /tmp/VMware-Player-2.5.1-126130.i386.bundle

そしてインストール。

# bash /tmp/VMware-Player-2.5.1-126130.i386.bundle

VMware PlayerをCUIでインストールしているところ:

以上で大体のインストールは終わり。約970MBのHDDを使っている。

5:vmplayerの起動

これでvmplayerが動くはずである。次のようにして起動したいところなのだが....。

$ startx vmplayer -X -h vmhost:8333 -u user -p passwd \"[standard] Guest/Guest.vmx\"

ところが“startx”に致命的な欠陥があった(ちょっと大げさか)。vmplayerの最後の引数で仮想マシンを指定するが、その中に空白がある。そして何とstartxでは空白のある引数を正しくxinit経由でアプリケーションへ渡せない。startxは何十年も使われて来たコマンドなのに、何でこんなことが出来ないの?とチョットびっくり。(UNIXでは空白のあるパス名とかは基本的使っていなかったので気がつかなかったのだろう。)
仕方ないので、startx(シェルスクリプト)のxinitを呼び出すところを次のように変更。
変更前

xinit $client $clientargs -- $server $display $serverargs

変更後

eval xinit $client $clientargs -- $server $display $serverargs

これでvmplayerが画面イッパイに起動され、シンクライアントの出来上がりとなる。

後は、電源起動後にubuntuで自動ログインしたら、vmplayerが動く様に .profileを変更するれば良い。(私はここで接続するサーバやゲストマシンを指定できるような簡単なシェルスクリプトを組んでおいた。)

6:環境の最適化

快適に使える様に環境を最適化する。例えば、
ローカルではvmplayerを使わないのでvmwareの仮想ネットワーク(vmnet)を止めておく:

# vi /etc/vmware/config
NETWORKING = "no"

IPv6を使わないのであれば、止めておく(“UbuntuでIPv6を無効化”参照):

# vi /etc/modprobe.d/blacklist
install ipv6 /sbin/modprobe -n -i ipv6

motdを消す:

# rm /etc/motd; touch /etc/motd

コンソール(tty1)のみにする:

rm /etc/event.d/tty[2-9]

などなど。

7:ライブイメージの作成

以上までの作業で作成したシンクライアント用のファイルシステムをISOイメージファイル化して、サーバからネットワークブートできるようにする。まずは、ファイルシステム全体をISOイメージに変換する必要がある、これについては“UbuntuでカスタムライブDVDを作る”を参照のこと。

8:ネットワークブートする

最後に作成したISOイメージをネットワークブートできるようにPXEの環境を整える。これについては“ライブUbuntuをネットワークブートする − ディスクレスサーバ構築”を参照のこと。


さて、これで電源を入れればディスクレスとしてネットワークブートして自動的にVMware Server等で動いてる仮想マシンの端末として動作するようになった。

*1:しかし、一番ベーシックな構成で500MBというのも随分多いような気もするが。OSも肥大化したものだ