GLAN TANK

今年のGWはGLAN TANKでNASを作ること。

ということでGLAN TANKと、IDEなHDDを2つ、秋葉原で買ってきました。

いや、秋葉原で迷う迷う。地図を見て歩いていたわけですが、どうも東京は「縮尺が非常に小さい」ようで、少ししか歩いていないと思っていても、地図上では、ものすごく先に進んでいると。

つくば感覚で歩いているとすぐに目的地を通り過ぎてしまうので、注意注意。

解析

NASと言っても、要するにPCにLinuxを入れてファイルサーバーにしたものとなんら変わらない。アーキテクチャがARMなだけで。

とはいえ、GLAN TANKにはVGA出力は無いし、CDから起動できないし、キーボードもつながってないので、まずは適当なマシンにHDDを繋げて、そのHDDにいろいろインストールした後、GLAN TANKに繋げるわけです。
(ただ、GLAN TANKにはUSB端子があるので、VGA出力もできるとかできないとか)

マニュアルによれば、HDDを接続したマシンを付属してきたCDで起動して、インストーラの指示に従えとあるので、とりあえずVMwareの仮想HDDでテストしてみる。

と、どうもHDDを3パーティションに切り、/dev/hda1をext3でフォーマットした後、インストールCDのinst/ディレクトリ以下にある、boot-glantank.tarを/dev/hda1に展開しているだけの模様。
MBRの設定とかもしてる)

boot-glantank.tarの中身↓

barbara-base.tgz (Debianなルートファイルシステム全体の模様)
base.20051219RC2.md (空ファイル)
debian-base.tgz (見てない)
initrd (名前からしてinitrd)
initrd.hdb
zImage (名前からしてカーネル)


この状態でGLAN TANKに接続して起動すれば、インストーラがMBRに仕込んだブートローダがメモリ上にカーネル(zImage)とinitrdを展開し、カーネルに処理を引渡した後、そのままカーネルがinitrdの中の/linuxrcを実行するであろう。

ということでinitrdの中をのぞく。

bin/busybox
bin/シンボリックリンクたくさん  ->  busybox
linuxrc
…

linuxrcはシェルスクリプト。よくあるパターンである。

linuxrcをのぞくと、procをマウントしたり、カーネルもジュールをロードしたりとお約束のパターンののち、/dev/hda3のパーティションIDによって処理を分岐している。

c1 -> SINGLEモード
c4 -> MIRRORモード
c6 -> SPANNINGモード
82 -> RECOVERモード
fd -> NORMALモード
83 -> Degianモード
それ以外 -> ERRORモード

ERRORとNORMALモード以外は、最終的には/dev/hda3のパーティションIDをfd(NORMALモード)に変更している。つまり、1回目の起動時に何やら初期化処理を行い、2回目以降はNORMALモードで起動している。

で、その初期化処理はと言うと、mdadmで/dev/md0にRAIDを作り(作り方はモードによって違う)、ext3でフォーマットし、/mnt/md0マウントして、barbara-base.tgzをそこに展開しているだけである。MIRRORモードならRAID1、SPANNINGモードならlinearなRAIDを作っている。SINGLEモードではRAIDを作る必要はないわけだが、RAID1の相方がいない状態のRAIDを作っている。ルートファイルシステムを/dev/md0に統一したいのであろう。

初期化処理が終わると、/proc/sys/kernel/real-root-devに0x0900を出力し、procをアンマウントして終了している。0x0900は/dev/md0であるとコメントしてある。

この後、カーネルはおそらくinirdのメモリをフラッシュし、/dev/md0を/にマウントして、/bin/initを起動するであろう。

HDDにLinuxをインストール

まずは物理的にHDDをMyマシンに接続(ジャンパーの設定を忘れずに)。いつものLinuxを起動して、VMwareを起動。新しいVMを作成し、これに接続したHDDをつなぐ。インストールCDを入れて、VMを起動。インストーラ開始。この方法なら、HDDをIDEでつないでも、USBでつないでも、IEEE1394でつないでも問題ない。
(そもそもインストーラを起動せずに、自分でパーティションを切ってもたぶん良い)

せっかくHDDを2台買ってきたので、MIRRORモードを選択。(/dev/hda3のパーティションIDはc4に設定されるはず) ちなみに、このあとの手順では、ここでどのモードを選択しても結果は同じ。自分で/dev/md0を作って、/dev/hda3のパーティションIDをfd(NORMALモード)にするから。

インストールが完了したら、おもむろにVMのCD-ROMにVIVERで作ったディスクを指定。VIVER起動。
※後で思ったけど、VMwareはIOでオーバーヘッドがあるので、直のLinux(ホストOS)でRAID初期化処理した方がたぶん早い。

fdisk /dev/hdaを見ると、/dev/hda1がext3、/dev/hda2がswap、/dev/hda3がパーティションID c4になっている。

で、自分で初期化処理をする。

modprobe raid1
mknod /dev/md0 b 9 0
mkdadm --zero-superblock /dev/hda3
fdisk /dev/hda   #=> /dev/hda3のパーティションIDをfdにする

dd if=/dev/zero of=/dev/hdb bs=1024 count=1000  # hdbのMBRを削除
fdisk /dev/hda  #=> パーティションテーブルをfdaと同一にする。hda3とhdb3の容量をぴったり同じにした方が良いのかな。

mkfs.ext3 /dev/hdb1
mkswap /dev/hdb2

# hdb1にhda1の内容をコピーし、hda1が壊れた場合にhdb1から起動できるようにする処理。たぶん。
mkdir -p /mnt/hda1
mount /dev/hda1 /mnt/hda1
mkdir -p /mnt/hdb1
mount /dev/hdb1 /mnt/hdb1

cp /mnt/hda1/zImage /mnt/hdb1
cp /mnt/hda1/initrd.hdb /mnt/hdb1/initrd

touch /mnt/hda1/raid1  # この処理の意味はよくわからない

umount /mnt/hda1
umount /mnt/hdb1

# RAID作成
mdadm --create /dev/md0 --level=1 --raid-devices=2 --run /dev/hda3 /dev/hdb3
# ここからRAIDの初期化を始めるので、HDDがガリガリ言い始めて、処理速度が落ちる。初期化が終わるまで待っていた方が良いけど、待たなくても良い。
# cat /proc/mdstatで進捗状況がわかる
# とりあえずお昼ごはんを食べつつ待ってみる


#---------待つ---------


mkfs.ext3 /dev/md0   # ソースコードが入った付属CDにはカーネルのソースコードも入っていたから、再構築すればReiserFSとかXFSとかも使えるはず。別にext3で良いけど。

# /dev/md0にルートファイルシステムを展開
mount /dev/hda1 /mnt/hda1
mount /dev/mnd0 /mnt/md0

cd /mnt/md0 && tar zxvf /mnt/hda1/barbara-base.tgz

umount /mnt/hda1
umount /mnt/md0

cat /proc/dmstat によると、62500K/sec (61MB/s) くらいのスピードでHDDに書き込んでいた。


ところで、付属してきたソースコードCDに入っているカーネルのソースコードを見ると、どうもNFS4も(もちろんv3も)有効になっている模様。これは使うしかないでしょう。