OpenBlockS266 をハードディスクから起動させる
HARDWARE REPORT
OpenBlockS266
Plat'Home 社から販売されている、手のひらサイズのコンパクトサーバ OpenBlockS266 をだいぶ前に購入しました。
それをとりあえず起動してみた具合は EZ-NET レポート: 手のひらサイズのコンパクトサーバ OpenBlockS266 を使ってみる にて以前にお話ししたのですけど、今回はシステムの起動を標準のフラッシュ ROM ではなく、ハードディスクへ変更してみることにしました。
ただし以前にもお話ししたことですけど、ハードディスクを用いる場合は、次のことに注意する必要があります。
OpenBlockS266 に 2.5 インチハードディスクを装着した場合、10 日に一回は電源を切ってください。1 日(24 時間)の内、アクセス時間を 5 時間程度としてください。(24 時間 365 日稼動はしないでください。)
これは 2.5 インチハードディスクの仕様なども関係しているそうで、これを守らないと機械的に故障する確率が高まるとのことです。
この仕様ではたしてサーバとして実用的な運用が見込めるのかどうかは疑問が残るところですけど、ハードディスクによる起動にしないと、OpenBlockS266 に標準で搭載されている以外のソフトウェアを利用する場合には何かと苦労が伴いそうだったので、とりあえずやってみることにしました。
ハードディスクを搭載して初期化する
ハードディスクを取り付ける
OpenBlockS266 のふたを開けて CF メモリカードスロットを取り外します。
どちらとも、プラス型のネジで止められていますので、ドライバを使ってネジをはずして取り外します。OpenBlockS266 のケースカバーはネジさえはずせば簡単に開くことが出来ますけど、CF メモリカードスロットは側面側のコネクタにしっかりと差し込まれていますので、少し力が必要でした。
CF メモリカードスロットを取り外したら、その基盤が載っていたところに、OpenBlockS266 に付属していた絶縁シートを載せます。そしてインターフェイスの部分へ 2.5 インチハードディスクを取り付けます。これにもなかなか力が必要で、僕はハサミを平行に差し込んでてこの原理でなんとか差し込むことが出来ました。
2.5 インチハードディスクを取り付けたら、それを CF カードスロットを固定していたネジで止めて、あとは OpenBlockS266 のカバーをもとに戻せば、ハードディスクの搭載作業は完了です。
ハードディスクを構成する
ハードディスクの取り付けが終わったら、OpenBlockS266 に AC アダプタを接続して ROM からシステムを起動します。
そしてハードディスクを起動ディスクにするための準備として、まずはハードディスクの初期化作業を行います。ハードディスクは "/dev/hda として認識されるようです。
初期化にあたって、まずは "fdisk" を使用してパーティションの切り分けです。
今回は 40GB のハードディスクなので、とりあえず、20GB をルートパーティションに、さらにスワップ領域を 1 つ作ったうえで、残りの領域を /var にでも割り当ててみましょうか…。
最初はスワップ領域を最初に作成してみたのですけど、OpenBlockS266 はどうやら /dev/hda1 を起動ディスクにしないといけないみたいなので、最初をルートパーティションにしました。スワップ領域はどれくらい取るのが適切なのか判らないですけど、メモリが 64MB なのでとりあえず、その倍の 128MB とでもしてみることにします。
次のように fdisk を起動します。
fdisk /dev/hda
そしてまずは、ルートパーティションの作成から。
Command (m for help): n
"n" と入力して、新規パーティションの作成に入ります。するとプライマリパーティションか拡張パーティションかの選択となりますけど、今回は 4 つ以内のパーティション分割になりますので、普通にプライマリパーティションを作成するために "p" を入力します。
そして、作成するプライマリパーティションの番号を尋ねられるので、まずは 1 を入力して、1 番目のパーティションとします。これで構築した区画は、後に /dev/hda1 として利用することが出来るようになります。
First cylinder (1-4864, default 1):
そして、パーティションに割り当てる開始シリンダ番号を指定します。特に隙間を空ける必要もないでしょうから、ディフォルトの 1 を使用することにします。
Last cylinder or +size or +sizeM or +sizeK (1-4864, default 4864): +20480M
続いて、パーティションに割り当てる終了シリンダ番号を指定します。今回はルートパーティションとして 20GB を割り当てようと思うので、"+20480M" としました。これでパーティション 1 の登録完了です。
同様にしてスワップ領域用の /dev/hda2 と /var ディレクトリ用の /dev/hda3 を登録します。
そしてそれらの登録が終わったら、スワップ領域に使用する /dev/hda2 のパーティションの種類を "Linux" から "Linux swap" に変更します。それには fdisk にて "t" コマンドを使用します。
Command (m for help): t
"t" コマンドを実行すると、パーティションの種類を変更したいパーティションの番号を尋ねられるので、今回の場合は 2 と入力します。続いてパーティションタイプを尋ねられますので、Linux swap を示す "82" を入力します。
Hex code (type L to list codes): 82
ついでに、ルートファイルシステムに割り当てるつもりのパーティションへ起動フラグを設定しておきましょう。これは "a" コマンドを実行して、起動フラグを設定したいパーティション番号を指定すれば完了です。今回は 1 番がそれとなりました。
これで、パーティションの準備は完了しました。
あとは "w" コマンドを実行して fdisk を終了して Linux を再起動すれば、今回作成したパーティション設定が有効になります。Linux の再起動を行わないとおかしなことになる場合もあるので気をつけましょう。
ハードディスクを初期化する
今回は最終的に次のようなパーティション構成となりました。
Device | Boot | Start | End | Blocks | Id | System |
---|---|---|---|---|---|---|
/dev/hda1 | * | 1 | 2491 | 20008926 | 83 | Linux |
/dev/hda2 | 2492 | 2508 | 136552 | 82 | Linux swap | |
/dev/hda3 | 2509 | 4864 | 18924570 | 83 | Linux |
上記の様な区画分割が終わったら、それらを初期化しておきます。
通常パーティションの初期化には mke2fs を使います。今回は /dev/hda1 と /dev/hda3 が通常パーティションとなりますので、次のようにしてそれらの初期化作業を行います。
mke2fs /dev/hda1
mke2fs /dev/hda3
さらにスワップ領域の作成には mkswap を使います。今回は /dev/hda2 がスワップ領域用のパーティションとなりますので、次のようにしてその初期化作業を行います。
mkswap /dev/hda2
ハードディスクから起動できるようにする
最新のハードディスクイメージを入手する
ハードディスクから起動できるようにするためには、起動パーティションへハードディスクイメージを展開する必要があります。
付属の CD-ROM にもハードディスクイメージが含まれていますけど、今回は ぷらっとオンライン - サポート - 技術情報 - OpenBlockS266 より、最新のハードディスクイメージを入手することにします。
現時点での最新版は 2005/01/01 に提供された RELEASE-20050119 のようですので、この中から必要なアーカイブをとりあえずローカルコンピュータへダウンロードしてみました。
base.tgz | 48,542 kB | 基本コマンド |
---|---|---|
etc.tgz | 317 kB | 設定ファイル |
comp.tgz | 60,708 kB | 開発用ツール |
kern.tgz | 246 kB | SystemMap |
man.tgz | 3,628 kB | オンラインマニュアル |
src.tgz | 3,106 kB | ソースファイル |
他にも "contrib.tgz" (891 kB) というものも有りますけど、これは openblocks.conf による設定を行う場合に必要なアーカイブのようです。個人的な好みの問題ですけど、今回はこれを用いた設定は行わないようにしようと思うので使用しないことにしました。
アーカイブを展開する
ハードディスクイメージを展開するにあたって、まずはハードディスクをマウントします。
マウントするポイントは /mnt として、これを使ってハードディスクを展開して行くことにします。そのために、次のようにしてルートパーティション用の /dev/hda1 をマウントします。
mount /dev/hda1 /mnt
そうしたら、そこへ FTP を用いてアーカイブを転送します。
OpenBlockS266 は標準では root による FTP 転送が出来ないようになっているので、作業を簡単にするために、まずは一時的に root にてアップロードを行えるように設定を調整します。それには "/etc/ftpusers" を編集して、root の行の "deny" に設定されている値を "allow" に変更してあげれば大丈夫です。
そして root アカウントでログインしたら、/mnt ディレクトリへ接続して、"RELEASE-20050119" ディレクトリでも作成して、そこへハードディスクイメージをアップロードしました。
転送が終わったら、続いてアーカイブの展開です。
今回は、準備完了後の /var ディレクトリには別のパーティションを割り当てる予定ですので、まずはそれを想定して環境を整えておきます。具体的には /mnt ディレクトリ内に /var ディレクトリを作成し、そこへ /dev/hda3 をマウントします。
mkdir /mnt/var
mount /dev/hda2 /mnt/var
そうしたら次のように "/mnt" ディレクトリへ移動して、必要なアーカイブを展開します。このとき tar コマンドの p オプションは、パーミッション情報を正しく設定 (復元) するのに必要なようなので、忘れないように気をつけましょう。
cd /mnt
tar xvzpf RELEASE-20050119/base.tgz
tar xvzpf RELEASE-20050119/etc.tgz
tar xvzpf RELEASE-20050119/comp.tgz
tar xvzpf RELEASE-20050119/kern.tgz
tar xvzpf RELEASE-20050119/man.tgz
tar xvzpf RELEASE-20050119/src.tgz
これで、ハードディスクイメージの展開は完了です。
起動できるように調整する
ハードディスクイメージの展開が終わったら、起動に必要な微調整を行います。
まずはデバイスファイルの作成です。これには /mnt/dev ディレクトリへ移動したら MAKEDEV コマンドを実行します。こうすることで、たとえば hda1 とか null とか tty とか、そういったデバイスファイルが生成されます。
cd /mnt/dev
./MAKEDEV generic
そして、起動時にマウントするパーティション情報を /mnt/etc/fstab へ準備します。
/dev/hda1 / ext2 defaults 1 1
/dev/hda3 /var ext2 defaults 1 1
/dev/hda2 swap swap defaults 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=4,mode=620 0 0
devpts というファイルシステムは、端末エミュレータなどが正常に動作するために必要なものだそうです。OpenBlockS266 の説明書には、スワップパーティションを使用する場合には登録せよと記載されていましたので、今回もそうしておきました。
そして起動時の状態に関わるファイルを調整します。
これには /mnt/etc/rc.conf を調整することになるのですけど、今回は contrib.tgz を展開していないのでそれを指定することと、ルータ機能を有効にすることと、そのあたりの調整としました。
このとき、/mnt/etc/rc.conf は読み取り専用となっているようでしたので、まずは書き込み可能とします。
chmod u+w /mnt/etc/rc.conf
そうした上で、最後の行に次のように記載します。
do_contrib_rc=NO
iptables=YES
そして再び、/mnt/etc/rc.conf を読み取り専用に戻しておきます。ROM に入っている /etc/rc.conf を見る限りは、root 権限による書き込みが可能な設定となっていましたので、わざわざ戻す必要はないのかも知れませんけど。
chmod u-w /mnt/etc/rc.conf
そして、iptables=YES を指定した場合は、次のようにしてあらかじめ /mnt/etc/rc.iptables ファイルを作成しておく必要があるようです。
touch /mnt/etc/rc.iptables
そのほかにも、必要に応じて /mnt/etc/inetd.conf を調整して、稼動するサービスを調整したりといった作業を行います。
ハードディスクイメージを展開したばかりの状態だと、inetd による TELNET および FTP の起動はしないような設定となっていますので、それらを利用したい場合は気をつけましょう。また、それらの利用を許可するための /mnt/etc/hosts.allow や /mnt/etc/hosts.deny もあわせて調整する必要がありそうです。
起動ディスクに設定する
調整が終わったら、次のようにしてハードディスクをアンマウントします。
umount /dev/hda3
umount /dev/hda1
そうしたら、次のようにしてハードディスクからの起動を行えるようにします。
flashcfg -c harddisk
あとは再起動を行えば、いよいよハードディスクからの起動となります。
設定の失敗による起動不良の調整
これは /dev/hda2 をルートパーティションとして指定したときのお話しなのですけど、ハードディスクを起動ディスクとしてさっそく起動してみると、なにやら停止してしまいました。
Kernel panic: VFS: Unable to mount root fs on 03:01
どうやら、ルートファイルシステムのマウント指定が間違ってしまっていたみたいです。いったん AC アダプタを抜いて再起動してみましたけど、やはり同じところでエラーとなってしまいました。
設定を確認するためにも、まずは初期状態で OpenBlockS266 を起動します。それには INIT ボタンを押しながら電源を起動し、インジケーターが 1 → 2 → 4 → 2 → 1 と点滅して行くまで押し続けます。こうすると ROM からの起動となります。これは一時的なものなので、そのまま再起動するとまたハードディスクからの起動となります。
そして ROM から起動したシステムで /dev/hda2 をマウントして fstab の内容を再確認してみたのですけど、なんとなくですけど、特に間違っている感じはしませんでした。
そして調べてみると、ターミナルに送られてきた文字の中で気になったのは、最初の方のメッセージで "Linux/PPC load: root=/dev/hda1" と表示されていたことでした。
これはもしかすると /dev/hda1 しか起動パーティションに出来ないのかと思い、それまでは /dev/hda2 を想定していた起動ディスクを /dev/hda1 にて最初から準備しなおしてみたところ、問題なく起動できるようになりました。
上記の説明は /dev/hda1 にて設定しなおした場合の記録ですので、何かミスがなければ、上記の方法で大丈夫だと思います。
最終確認
ハードディスクからの起動になると、ディスクイメージにさまざまなアプリケーションが備わっているため、ROM からの起動よりもいろいろな機能が出来るようになります。
特に大きいなって思ったのが、[TAB] キーによるファイル名の補完でしょうか。ROM 起動の場合はファイル名の最初の方を入力して [TAB] キーを押しても補完できなかったのが、ハードディスク起動で出来るようになって、想像以上に便利でした。また、ROM 版では無かった "less" コマンドや "free" コマンドなども使えるようになりました。
他にも、わざわざ "flashcfg" コマンドを使って更新を有効にするなどの手間が要らなくなるので、そこも非常にありがたいところです。
なお、ディスクイメージを展開するには、アーカイブを含めて 500MB くらいのディスク容量が必要な感じです。
マウント状態の確認
とりあえず、意図したとおりにパーティションがマウントされているかを調べてみます。確認は簡単で、コマンドラインから "mount" コマンドを実行して、fstab に指定したのと同じものがマウントされていれば大丈夫です。
サービスの調整
起動時のサービスはほとんどが起動されないようになっていました。
けれど多くのサービスがインストールされているようですので、必要に応じて起動しましょう。起動には、rc.conf を調整します。たとえば SSH を起動したい場合には、このファイルに "sshd=YES" を記載します。
記載できるものについては、/etc/defaults/rc.conf の内容を参照すれば、ある程度は判ると思います。
ネットワーク情報の設定
サーバ名は、標準では指定されていませんでした。ホスト名を指定するには、/etc/myname というファイルを作成して、そこへコンピュータ名を記載することで、再起動後に自動的にその名前が設定されるようになっていました。
他にも、ディフォルトルート情報を /etc/mygate に設定したり、ドメイン名を /etc/defaultdomain に設定したり出来るようです。
DNS 名前解決を行うには
名前解決を行うための DNS の指定は /etc/resolv.conf を編集します。
このファイルは用意されていないみたいですけど、新たに作成すれば大丈夫です。作成しない場合には、127.0.0.1 ( localhost ) を DNS として利用しようとするようでした。
なお、resolv.conf ファイルは次のような感じになります。
search .
nameserver 192.168.0.1
IP アドレスの設定
"contrib.tgz" を展開して OpenBlockS266 の設定ツールをインストールしてあれば話は簡単なのでしょうけど、今回はそれを展開しなかったため、IP アドレスの設定にちょっと手間取ってしまいました。
自分なりに考えた方法なのですけど、この場合は /etc/netstart.local ファイルを作成して、次のような感じに記載しておくと良さそうな感じがしました。
ETH0_ADDR="192.168.253.254"
ETH0_MASK="255.255.255.0"
ETH0_NET="192.168.253.0"
ETH0_BCAST="192.168.253.255"
ETH1_ADDR="192.168.254.254"
ETH1_MASK="255.255.255.0"
ETH1_NET="192.168.254.0"
ETH1_BCAST="192.168.254.255"
GATEWAY="192.168.253.1"
/sbin/ifconfig eth0 ${ETH0_ADDR} broadcast ${ETH0_BCAST} netmask ${ETH0_MASK}
/sbin/ifconfig eth1 ${ETH1_ADDR} broadcast ${ETH1_BCAST} netmask ${ETH1_MASK}
/sbin/route add default gw ${GATEWAY} netmask 0.0.0.0 metric 1
/etc/netstart.local ファイルは、/etc/netstart ファイルから自動的に読み込まれるようになっていますので、このようなファイルを用意するだけで自動的に、起動時に IP アドレスの設定が有効になります。
ハードディスクが壊れてみる
ハードディスクを搭載してルータ程度に利用していた OpenBlockS266 でしたけど、二週間しないうちにハードディスクが壊れました。
しばらく運用していたときに書き込みエラーが連発してしまって、カッカッというハードディスクが故障したときにありがちな、引っかかるような機械音が聞こえる感じです。原因はただの運なのか、それとも 1 年ほど前に買ったままのハードディスクがたたったのか。
とりあえず、その間一度だけ訪れた日曜日には OpenBlockS266 の注意書きの通りにいったんシャットダウンして数秒間だけですけどハードディスクを休ませてはみましたけど、エラーが発生したときにはハードディスクはけっこう熱くなってました。普段からも、秋の 23 度くらいの室温の部屋でもけっこう暖かい感じです。
そんなハードディスクでしたけど、数時間ほど休ませてみるとまた正常に読み取れるようになったので、しばらくまた運用させてみたのですけど、また、今度は一日と持たずして同様の症状が発生してしまったので、ハードディスクを交換することにしました。
今回購入したハードディスクは次の通りです。
メーカー | TOSHIBA |
---|---|
型番 | MK4025GAS |
規格 | UltraATA/100 |
サイズ | 2.5 インチ |
容量 | 40 GB |
バッファ | 8 MB |
回転数 | 4,200 rpm |
OpenBlockS266 用と銘打たれたハードディスクではありませんけど、通常の 2.5 インチ ATA ハードディスクで問題ないでしょうからこれにしました。
購入する上で気にした点といえば、個人的な好みの問題ではありますけど、容量は 4GB もあれば十分だったので、売っている中での最小の容量だった 40GB のものにしました。このサイズは壊れたハードディスクともちょうど同じ感じです。もう少し回転数の早いディスクもあったのですけど、遅い方が熱を持たないのだろうかとか、根拠は無いながらも安直にそんなことを考えてみて、今回のディスクとなりました。
交換は基本的にははじめからのやり直しという感じなのですけど、今回は以前の壊れたディスクもまだ問題なく読み取ることができたので、SSD/Linux が小容量の Linux だったこともあって、移行はとても簡単でした。
まず、壊れたディスクのまま ROM から起動して、/dev/hda1 の全データを /dev/hda3 にパーミッション情報も含めて圧縮して、そのデータを /dev/hda1 へ移動したら、今度は /dev/hda3 の全データを /dev/hda1 に圧縮して。
ただ、念のため /dev のデータは MAKEDEV スクリプト以外は削除しておきます。これが面倒な場合は、アーカイブに /dev を含めないでおいて、まず最初に SSD/Linux を展開してから、続いて今回作成したアーカイブを展開するという感じでよさそうです。
この手順の例をコマンドの流れで挙げるならば、次のような感じでしょうか。
自分の時には /dev ディレクトリ以外を明示的に指定してアーカイブを作成してみたので、--delete による削除と -r による追加は試していないのでちゃんと動作するかはわかりませんけど。
mkdir /mnt/hda1
mkdir /mnt/hda3
mount /dev/hda1 /mnt/hda1
mount /dev/hda3 /mnt/hda3
cd /mnt/hda1
tar cvzpf /mnt/hda3/archive.hda1.tar.gz .
mv /mnt/hda3/archive.hda1.tar.gz .
tar vf archive.hda1.tar.gz --delete dev
tar rvf archive.hda1.tar.gz ./dev/MAKEDEV
cd /mnt/hda3
tar cvzpf /mnt/hda1/archive.hda3.tar.gz .
アーカイブが出来上がったら、これをいったんネットワーク経由でローカル PC などへ退避しておきます。
これらの準備が終わったら、OpenBlockS266 の電源を落としてハードディスクを交換します。
交換が終わったら ROM から起動して、新たに設定しなおす要領で fdisk を用いてパーティションを分割し、アーカイブを転送、展開、そして MAKEDEV スクリプトを実行して環境を整えれば完成です。
そんな感じで復旧を終え、すぐにもとの状態にもどりました。
ところでひとつ気になったこととして、OpenBlockS266 用の 24 時間稼動対応のハードディスクというものも販売されているのを知ったのですけど、これってどうなのでしょうね。
注意事項を見ると表面温度が 40 度までに保たれている必要があると書かれていますけど、FAQ にあった 2.5 インチのハードディスクは電源を切ることを想定して…というような記載が見られないのが少し不思議な感じがしました。長時間運用に耐えられないのはつまり熱の問題なのでしょうか。それともそのあたりが改善されているから、熱意外には触れていないということなのでしょうか。
改良点があるとそればかりしか大々的に打ち出さないような風潮の世の中なので、まったく触れられていないところになんだか疑問を持ってしまいますけど、故障の主な原因って、もしかすると熱の問題なのかも知れないですね。もしそうだとすると、週一回くらいは回転を止めるというだけではなくて、冷めるのも待たないといけないのかなとかも思ってみたり。
OpenBlockS266 をハードディスクで実用的に運用できるのか、なんだか少し不安なところです。今回交換したハードディスクがどれくらいの耐久性を見せるのか、とりあえずはじっくり見守って行かなくてはです。