Kenshi Muto (Debian Project)
OpenMicroServerは、ぷらっとホーム株式会社が設計・販売しているマイクロサーバである。フラッシュメモリにはSSD/LinuxというBSD風のLinuxがプリインストールされており、これを使って簡単なネットワークサーバを実現できる。
また、本製品は、フラッシュメモリ(の書き換え)/CFカード/USB/TFTPからもシステムを起動できるので、SSD/Linuxの代わりに別のOSを使うことも可能である。本Wikiでは、OSとして完成度・安定度・利便性の高いDebian GNU/Linux 3.1 Sargeのシステムを本製品で運用する方法を説明する。
今回の説明の対象製品は、OMS-AL400/128である。今後新製品が登場するにせよ、アーキテクチャが同種であれば本Wikiの説明は流用できると思われる。
Linuxからは、次のように見える。
Debian GNU/Linux 3.1 Sargeはmipsel版インストーラも用意しているので、TFTP経由のインストールがおそらく動くのではないかと思われるが、今回は既存のSSD/Linux環境を流用したインストールと配備を行うこととした。
別途、UNIX系のNFSサーバマシンが必要となるのでご用意されたい。また、コンソールにはシリアルコンソールを使うので、このコンソールを表示できる環境も必要だ。今回はCFにインストールするが、USBディスクでもほぼ同様の手続きで可能だ。CFへの書き込みの前に最初にNFSルート環境上で十分に設定とサイズ調整を済ませることにする。
/home/oms XXX.XXX.XXX.XXX(rw,no_root_squash,insecure_locks,sync)
一般的には、debootstrap(perl+binutilsを使った簡易インストーラ)を使って配備するのだが、debootstrapの構造上、同一アーキテクチャでこれを実行しないと途中でエラーになり、かなりの苦労をしつつ手動で完了まで持っていくことになる。apt-getのぬるま湯ではなく生のdpkgやarコマンドをがりがりといじるのもそれはそれで面白いのかもしれないが、さっさとインストールできる方法を紹介したほうがよいだろう。
Debian Projectの大沢氏の協力を得て、debootstrap配備後のディレクトリ構成のtar+gzファイルを http://kmuto.jp/debian/oms/sarge-root.tgz (38209808 bytes, MD5: 9331326da217a58dc67af9fbcf58469f) として取得可能にした。
これをNFSサーバのエキスポートディレクトリに配備する。
# cd /home/oms # tar zxpvf /tmp/sarge-root.tgz . ./var ./var/lib ... #
続いて、NFSディレクトリをOpenMicroServerからマウントして実際にDebianを動作させてみることにしよう。
OpenMicroServerにシリアル経由でログインし、IPアドレスがNFSサーバのexportsで許可しているアドレスと合致していることを確認したら(ifconfigで設定変更できるし、dhclient NICインターフェイス名 でDHCP取得することもできる)、次のようにマウントしてみる(NFSSERVERIPにNFSサーバのIPアドレスを指定)。
# mount -t nfs -o nolock NFSSERVERIP:/home/oms /mnt
NFSマウントできたら、procも設定しておこう。
# mount -t proc proc /mnt/proc
Debian GNU/Linux 3.1 Sargeでは以下のコマンドに問題があるため、親環境から/mntの同ディレクトリにコピーしておくのがよい。まじめにやるならdivertする。
あとはchrootコマンドでDebian環境に入ることができる。
# chroot /mnt
おなじみの動作(dpkg、lsなど)がだいたいできることを確認できるだろうか。
さらに、chroot環境で以下のファイルを修正する。
none /proc proc defaults 0 0 /dev/hda1 / ext3 defaults,errors=remount-ro,noatime 0 1
T0:123:respawn:/sbin/agetty 115200 ttyS0 vt100 T1:123:respawn:/sbin/agetty 115200 ttyS1 vt100
auto lo iface lo inet loopback # eth0を使う場合 auto eth0 iface eth0 inet dhcp
NFSルート環境での実験が終わったら、いよいよCFのスタンダローン環境に書き込みをしていく。
一度NFSを解除して(exitでchrootを抜け、umount /mnt/proc; umount /mnt)、NFSサーバ側では既存のNFSルート環境のバックアップを取っておこう。
再びNFSマウントして、NFSサーバ側ではdu -smでディレクトリサイズ(MB単位)を見ながらCFの容量に収まるよう不必要なファイルを削除していく。日本語環境は大きいので英語のみとするのがよいだろう。
では、CFに書き込みを行う。chrootから抜けて、CFをフォーマットし、新たに作成した/targetディレクトリにこれをマウントする。CFの書き込み回数を制限するため、noatimeオプションを付けることにした。CFは/dev/hda1としてすでにパーティション作成済み(今回のものはVFATフォーマットされていた)とする。パーティションがない、あるいは過去に別の構成になっていたときには、fdiskコマンドで1パーティションに作り直す必要がある。USBディスクの場合には/dev/hda→/dev/sdaに適宜読み変えされたい(/etc/fstabに注意)。
# mke2fs -j /dev/hda1 # mkdir /target # mount -o noatime /dev/hda1 /target
/mntにあるNFSルートを、この/targetにコピーする。
# cd /mnt # tar cf - .| tar xCp /target
chroot /targetで一応動作することを確認できたら、次は起動時のルートパーティションを変更する。
# flashcfg -c /dev/hda1
祈りながらrebootを実行し、Debianがブートすることを確認する。以降は普通のDebian GNU/Linuxとほとんど変わらない。
起動に失敗してしまったときには、ブートローダで/dev/ram (フラッシュ)をルートディスクとして読むように設定するか、INITボタンを押しながら電源を入れ直してフラッシュから起動し、修正を行う。
フラッシュの内容は/initrdにマウントされているので、ここから必要なツールを拾い出すこともできる。
debug #デバッグ用 plugin rp-pppoe.so # カーネルPPPoE eth2 # eth2をモデムに接続している場合 ipcp-no-address # リモートからのIP提示を使わない(unnumbered環境の場合) ipcp-no-addresses noipdefault XXX.XXX.XXX.XXX: # unnumbered環境の場合にネットワークアドレスではなく # このアドレスを本機に設定する defaultroute hide-password lcp-echo-interval 20 lcp-echo-failure 3 noauth persist mtu 1492 noaccomp default-asyncmap user "XXXX@XXXX" # 接続ID(/etc/ppp/pap-secretsにパスワードは記述)カーネルPPPoE経由でNATする場合、以下のようにFORWARD時のMSS値を変える。
# iptables -A FORWARD -p tcp --tcp-flag SYN,RST SYN -m tcpmss --mss 1413: \ -j TCPMSS --set-mss 1412