録箱

[last updated:2006/04/08] [since:2006/04/03]

Gentoo LinuxによるX端末化

この文書では、Dynabook SS/S5のX端末化の手順メモです。 当方では以下のような粗筋でX端末化に成功していますが、環境の違い、 この文書のバグ :-) などでうまくいかない可能性もあります。 この文書通りに行うなら自己責任で、読むだけならちょっとした参考程度に 考えて下さい。

経緯

よしなしごと続・よしなしごと でも書いてありますが、Dynabook SS/S5のHDDはトラブル続きです。 HDDのトラブルを回避するため、64MB CompactFlash Linux を作ってみたりもしています。 しかし、64MB CompactFlash Linuxでは、X環境が無いため、 デスクトップ環境としては力不足です。

そこで、Dynabook SS/S5をX端末として用いることを考えました。 他のマシンにLinuxを入れて、XDMCPで接続するわけです。

実のところ、64MB CompactFlash Linuxを作った時点で、同じ方法でX端末用の イメージを作る計画もあったのですが、面倒だったので放置していました。

面倒とは思っていたものの、連続起動していると数日でHDD異常が発生する (HDDアクセスランプが点きっ放しで動作がとてつもなく重くなる。多分、swapのせい) のに耐えられなくなり、X端末化することにしました。

方針

X端末化にあたって、以下の方針を立てました。

ネットワークからカーネルを取得する
64MB CompactFlash Linuxではコンパクトフラッシュにカーネルイメージと initrd入れています。この方法は、起動が遅いのが難点です。 ネットワーク上のデスクトップ環境を用いるのですから、 ネットワークからカーネルなどを取得した方が良いでしょう。
grubから起動する
いまどきはPXEブートで完全ディスクレスができそうなのですが、 家のネットワークではブロードバンドルータのDHCPでIPアドレスを 割り当てているので、ネットワークブートは無理であると判断しました。 grubでは、DHCPでIPアドレスを取得した上で、 tftpサーバを指定してネットワークからカーネルなどを取得できます。 HDDのgrubから起動しますが、いざとなれば、FDDなりCompactFlash から起動できます。 なお、家のほとんどのマシンはMACアドレスをDHCPサーバに登録して IPアドレスを固定しています。tftpサーバの指定は問題ありません。
ルートファイルシステムはRAM diskを用いる
64MB CompactFlash Linuxと同様、256MBのRAM diskにファイルシステムを 展開することにしました。イメージは ルートファイルシステムとして、NFSを利用する手もあります。 今回は、Dynabook SS/S5に十分なメモリがあることと(512MB)、 NFSサーバ起動の手間、ネットワークの負荷を考慮して、 RAM diskを選択しました。
既存のディストリビューションを流用する
64MB CompactFlash Linuxを作るのには手間がかかりました。 Xサーバを正常に起動できるようコンパイルするのは、更に骨が折れそうです。 そこで、今回は既存のディストリビューションを元にすることにしました。 今までDynabook SS/S5で使っていたのがGentoo Linuxだったことと、 偶然、テスト用にGentoo Linuxをデスクトップマシンにインストールしていたこと もあり、Gentoo Linuxを採用しました。
できれば音声出力も端末側に出力する
日常環境として、デスクトップ画面が端末側に転送できるのは当然ですが、 できれば音楽も再生したいところです。EsounDなどのサウンドサーバを 使えばできそうです。

ホスト側の準備

まずは、X端末がアクセスするホストの用意です。 ブートイメージなどもホスト側から提供することにしました。

デスクトップ環境

当然、必要です。私はデスクトップ環境としてはXfce4を使っています。 他、EmacsやらMozilla Firefoxやら、いろいろ入っています。

詳細は割愛します。Gentoo Linuxのドキュメントを参照して下さい。

ディスプレイマネージャ

ディスプレイマネージャを入れます。私の環境では、gnome-base/gdm を使っています。

一般に、セキュリティ上の理由で、XDMCPはデフォルトで無効となっています。 GDMの場合、gdmsetupで色々な設定ができます。XDMCPを有効にするためには、 まず、SecurityタブのEnable XDMCPをオンにする必要があります。

フォントサーバ

ルートファイルシステムにフォントを入れると、サイズが大きくなってしまいます。 フォントサーバを用いることにします。

# USE="font-server" emerge xorg-x11
# vi /etc/X11/fs/config
...
#no-listen  =  tcp    <- 削除
...
catalogue = ...       <- 適宜、パスを追加
...
# vi /etc/conf.d/xfs
...
XFS_PORT="7100"       <- "-1"から変更
...
# rc-update add xfs default

tftpサーバ

カーネルなどを供給するため、tftpサーバを設定します。

# emerge tftp-hpa
# mkdir /tftproot
# rc-update add in.tftp default

/tftproot以下に、カーネルなどを入れます。

iptablesを使っている場合、XDMCP(177/udp)、フォントサーバ(7100/tcp)、 tftp(69/udp)へのアクセスを許可する必要があります。 X端末のホストアドレスまたはネットワークアドレスに対して、 これらのポートを開けておきます。

X端末化するマシン側の準備

この辺りは、次の「X端末イメージの作成」と並行作業になるかもしれません (というか、私は試行錯誤で交互に作業してました)。

Xの設定

端末側でXが起動できるよう、設定ファイルを作成します。

私のケースでは、元々インストールしていたGentoo Linuxの /etc/X11/xorg.confのFontPathを編集して用いました。

# FontPath "/usr/share/..."             <- 削除
...
FontPath "tcp/[font-server host]:7100"  <- 追加

/etc/X11/xorg.confをホストに転送しておきます。

可能なら、ディスプレイマネージャやフォントサーバへの接続を 確認しておくことをお勧めします。

ミキサー設定

Linux起動直後はサウンド入出力のレベルが0となっているので、 起動時に適切に設定されるよう、ミキサー設定ファイルを作成します。 media-sound/alsa-utilsを使いました。

# emerge alsa-utils             <- インストール
# alsamixser                    <- cursesでの設定
# /etc/init.d/alsasound save    <- ミキサー設定ファイルのセーブ

/etc/asound.stateをホストに転送しておきます。

grub設定

grubをnetboot可能にします。

# USE="netboot" emerge grub
# grub --no-floppy
grub> root (hd0,0)
grub> install /boot/grub/stage1 (hd0) /boot/grub/stage2.netboot /boot/grub/menu.lst
grub> quit

(hd0,0)や/boot/grub/などは、環境に合わせて適宜読み替えて下さい。

menu.lstを編集します。

...
#splashimage=(hd0,0)/boot/grub/splash.xpm.gz         <- 削除
...
title=X Terminal
dhcp
ifconfig --server=[tftp server host]
root (nd)
kernel /kernel-2.6.15 root=/dev/ram0
initrd /xt.img.gz
...

splashimageに注意して下さい。削除し忘れると、grubがこけます。 なお、dhcp以下については、grubのinfoのNetworkの項目を参照して下さい。

X端末イメージの作成

以下の作業は、ホスト側での作業となります。

Gentoo Linuxの「インストール」

ホスト側の適当なディレクトリ以下に、Gentoo Linuxを「インストール」します。 この過程は、基本的には通常のインストールと同様です。但し、

/etc/make.confのUSEは次のようにしてあります:

USE="-apm -curl -arts -bonobo -bzip2 -calender -canna -cdr cjk -curl dga \
     -doc dri -emacs esd -examples -expat -fbcon -foomaticdb -freewnn -gb \
     -gnome -gnustep -gpm -gtk -gtk2 -gtkhtml -guile iconv -ipv6 -java -kde \
     -lesstiff -motif -mozilla -ncurses -nls nptl opengl -oss pcmcia -perl \
     -php -python -qt -samba -tcltk -tetex wifi -zlib"

この辺りは、適宜工夫してみて下さい。

カーネルの作成

インストールプロセスの一環として、カーネルを作成します。 ネットワーク、X関連、ALSA、USB HIDデバイス以外は、とことん外して 構わないと思います。私は、IDEドライバも全て外しました。 但し、RAM diskの容量(256MB/1つ)とinitrdで用いるファイルシステム (私の場合はext2)には気を付けて下さい。

サウンドについては、ALSAのGeneric Devices(Dummyなど)は外しておくべきです。 ミキサー設定に齟齬が生じる可能性があります(というか、嵌まりました)。

パッケージ追加

以下のパッケージを追加します。

インストールした後は、rc-updateをお忘れなく。

(chroot) # rc-update add pcmcia default
(chroot) # rc-update add esound default
(chroot) # rc-update add alsasound boot
(chroot) # rc-update add dhcpcd default

esoundについては、/etc/conf.d/esoundのコメントに従って設定ファイルを 編集する必要があります。また、/etc/esd/esd.confについては、 spawn_optionsの-terminateを削除した方が良いでしょう。

各種の設定

/etc/inittabを編集します。

...
# TERMINALS
c1:12345:respawn:/sbin/agetty 38400 tty1 linux         <- c1を除き、削除
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux
# X terminal
x1:345:respawn:/usr/bin/X -query [XDMCP server host]   <- X端末化
...

X端末化のための X -query の実行については、 他のファイルを編集する手もあるかと思います。

以下は、インストール環境から抜けてから設定します。

X端末にするマシンで作成したXとミキサーの設定をコピーします。 ターゲット名を付加したファイル名に変更しておいて、シンボリックリンク にすると、流用するときに便利かもしれません。

以下、gentoo以下にインストールしたものとします。

(chroot) # exit                                 <- インストール環境から抜ける
# umount gentoo/proc gentoo/dev                 <- まず、アンマウントする
# cp xorg.conf gentoo/etc/X11/xorg.conf.xxx
# ln -s xorg.conf.xxx gentoo/etc/X11/xorg.conf
# cp asound.state gentoo/etc/asound.state.xxx
# ln -s asound.state.xxx gentoo/etc/asound.state

コピー

不要なファイルの削除で失敗したり、カーネルを設定しなおす羽目になったりする かもしれないので、インストールしたファイルをコピーしておきます。

# cp -a gentoo/ base/

なお、作成したカーネルは、/tftproot以下にコピーします。

# cp gentoo/usr/src/linux/arch/i386/boot/bzImage /tftproot/kernel-2.6.15

不要パッケージ削除

base/以下にchrootします。

# chroot base/ /bin/bash
# mount -t proc none /proc

まず、システム全体を再emergeします。

# emerge -uD --newuse world

depcleanします。

# emerge --depclean

以下のパッケージをunmergeしていきます。

もし設定ファイルをX端末側から転送する必要があるなら、net-misc/opensshは 残しておいた方が良いかもしれません。

最後に、以下のパッケージを削除します。

警告が大量に出ますが、構わず削除します。なお、Gentoo Linuxの パッケージシステムであるportageを削除してしまうため、やり直しはききません。 なので、コピーをしたわけです。

不要ファイル削除

不要なファイルを削除していきます。

# rm -r boot/ opt/ home/
# rm -r var/cache/* var/db/* var/tmp/*
# rm -r var/log/emerge.log var/log/sandbox/ var/log/news/
# rm -r usr/portage usr/src/ usr/local/ usr/libexec/
# rm -r usr/i386-pc-linux-gnu/*bin usr/i386-pc-linux-gnu/lib/*.{a,la}
# rm -r usr/lib/perl5 usr/lib/portage
# rm -r usr/share/{aclocal,automake*,binutils-data,bison,dict,doc,fonts,\
                   gcc-data,info,libtool,man,sandbox}
# find usr/lib \( -name '*.a' -o -name '*.la' \) -a ! -name '*_nonshared.a' \
       -print | grep -v modules | grep -v opengl | xargs rm

findの行は判りづらいですが、要はシェアードオブジェクト以外のライブラリを 削除します。但し、以下を除きます。

initrdイメージ作成

chroot環境から抜けます。

# umount proc
# exit

イメージファイルを作成します。

# dd if=/dev/zero of=xt.img bs=1024 count=240
# mke2fs -F xt.img
# tune2fs -i 0 -c 0 xt.img
# mount -o loop xt.img /mnt
# cp -a base/* /mnt/
# umount /mnt
# gzip xt.img.gz

できたファイルを/tftprootにコピーします。

# cp xt.img.gz /tftproot

おしまい

これで、設定はおしまいです。

私の手元では、上記のような手順でホスト-X端末を構成し、 今までDynabook SS/S5のスタンドアローンでやってきた日常作業 (メール、Web閲覧など)ができ、XMMSでの音楽再生もできています。

64MB CompactFlash Linuxで作成したCF-Linuxのブートローダを ネットワークブート可能なgrubに差し替えて、menu.lstも書き換えました。 これを使えばHDDともオサラバできます。ただ、CFからだと起動に一手間かかるので、 今のところはHDDを使っています。

録箱

anraku@lemon.plala.or.jp