USL-5Pで遊ぶ話

IO-DATAのUSL-5Pという機械が、 ネットワークに繋がるLinuxマシンであるというのを聞いて、 遊んでみることにしました。

用意するもの

ここではシリアルコンソールなしで、 動かすことにトライしてみます。

USL-5Pの分解

ネジは裏に一本のみで、後は爪(合計3個所)で引っ掛けてあるだけです。

この爪のせいで、ちょっと開けにくいかも知れませんが、 少しねじるようにしてみるとまだ開けやすいです。 まあ自己責任の遊びなので、壊したとしても それはそれでしかたないとあきらめましょう。
開け方の図

内蔵データのコピーと修正

開けると、中身の基盤にCFのコネクタがあり、 (銀色無印刷の)CFメモリが刺さっています。 CFのメモリはテープで固定してありますが、気にせず外します。

このCFのメモリカードの中に、Linuxのカーネルや 必要なファイルを納めたファイルシステムがあるようです。 これを直接いじるのはちょっと怖いので、 別のCFメモリにコピーして、そちらをいじることにします。

  1. 取り出したCFメモリを、USBのリーダにつけて、Linuxデスクトップに差す。
    最近のLinuxは自動で認識してくれるので、 /proc/partitionsをみれば、デバイス(USBリーダ)の名前が分かる。
    (私の場合はsda)
  2. データを全部吸い出す。(マウント不要)
    # dd if=/dev/sda of=./dd.dat
  3. デスクトップ機からオリジナルのCFメモリは一旦外して、 64MB以上の完全に空いているCFメモリを差す。 (64MB以上あっても、今回は無駄)
  4. デスクトップ機で、 先ほど吸い出したデータを書き込む。 (やはりマウントは不要。ただし読み出しよりも5倍くらい時間が掛かる)
    # dd if=./dd.dat of=/dev/sda
  5. コピーのCFをUSL-5Pに差し、電源を入れます。

これで、オリジナルを差していたときと同様に動いたら、 とりあえずコピーは成功と言うことです。

次は、これにリモートログインできるようにしてみましょう。

  1. デスクトップ機で、 この人のページのusl5p-telnetd-update.tgzをダウンロードし、 指示の通りupdate.tgzに名前を変更します。
  2. デスクトップ機よりUSL-5Pに、WWWブラウザでアクセスし、 「管理者用」→「設定」→「メンテナンス」→「ファームウェアの更新」 で、参照より先ほど名前を変えたupdate.tgzを選択し、 更新ボタンを押します。
    次の「ファームウェアを更新しますか」も「OK」してください。
    再起動に掛かります。
  3. USL-5PのWWW画面で、「landisk」という名前のユーザを作成してください。 (パスワードは適当に)
  4. ID「landisk」でUSL-5Pにtelnetします。 パスワードは先ほど自分で設定したものを入れてください。
    (Exec format Errorのようなエラーが出てログインできない場合は、 再起動するとログインできるかも知れません。)
  5. ログイン後「sudo su」と打ち込み、 もう一度自分で設定したlandisk用のパスワードを入力してください。

これでroot権限が得られましたので、何でもし放題です。 (設定にはviもありますし、 ファイルの取り込みにはwgetがつかえるはずです)

新環境の構築

64MBのファイルシステム、 しかも空き容量が5MB程度では満足できないという人は、 もう少し遊んでみましょう。

  1. まず256MB以上のCFメモリを用意して、デスクトップ機に繋ぎます。
  2. パーティションを切ります。
    私の場合、デバイスはsdaでしたが、 これを全部一つのルートパーティションにします。
    # fdisk /dev/sda
    
    コマンド (m でヘルプ): p
    Disk /dev/sda: 512 MB, 512483840 bytes
    16 heads, 62 sectors/track, 1009 cylinders
    Units = シリンダ数 of 992 * 512 = 507904 bytes
     デバイス ブート   始点      終点  ブロック   ID  システム
    
    コマンド (m でヘルプ): n
    コマンドアクション
       e   拡張
       p   基本領域 (1-4)
    p
    領域番号 (1-4): 1
    最初 シリンダ (1-1009, 初期値 1): 
    初期値 1 を使います
    終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1009, 初期値 1009): 
    初期値 1009 を使います
    
    コマンド (m でヘルプ): p
    Disk /dev/sda: 512 MB, 512483840 bytes
    16 heads, 62 sectors/track, 1009 cylinders
    Units = シリンダ数 of 992 * 512 = 507904 bytes
     デバイス ブート   始点      終点  ブロック   ID  システム
    /dev/sda1             1      1009    500433   83  Linux
    
    コマンド (m でヘルプ): w
    領域テーブルは交換されました!
    ioctl() を呼び出して領域テーブルを再読込みします。
    ディスクを同期させます。
    
  3. ルートとなるパーティションをフォーマットします。
    とりあえずext3にしました。
    # mke2fs -j /dev/sda1
    
  4. フォーマットされたパーティションをマウントします。
    (既にディレクトリ/mnt/cfが存在するものとします。 別のディレクトリを使用する場合は、以降の記述を適宜読み替えてください。)
    # mount /dev/sda1 /mnt/cf
    
    (フォーマット後リブートや抜き差しするなどして、 既にマウントされている場合は、 一旦アンマウントしてマウントしてください)
    # umount /dev/sda1
    # mount /dev/sda1 /mnt/cf
    
  5. デスクトップ機に、 sourceforgeの iohackのサイトから、 バイナリ(この時点でbase-sh4-for-landisk-20050712.tar.bz2) をダウンロードしておきます。
  6. 先ほどマウントした場所に移動し、 このダウンロードしたバイナリを展開します。
    # cd /mnt/cf
    # tar jxpf /tmp/base-sh4-for-landisk-20050712.tar.bz2
    
  7. 外部からログインできるように設定します。
  8. アンマウントしてからCFメモリを取り外します。
    # umount /mnt/cf
    

とりあえずこれでカーネル以外の部分の準備ができました。

  1. これまで書き込んできたCFをUSB-CFリーダに接続し、 それをtelnetログインできるようにしたUSL-5Pに差します。
  2. USL-5Pにログインし、rootになります。
  3. mountコマンドで現在ファイルがどのようにマウントされているか分かります。
    # mount
    rootfs on / type rootfs (rw)
    /dev/root on / type ext2 (rw)
    /proc on /proc type proc (rw)
    /dev/ram0 on /mnt/ram0 type ext2 (rw)
    /dev/ram1 on /mnt/ram1 type ext2 (rw)
    usbdevfs on /proc/bus/usb type usbdevfs (rw)
    /dev/sda1 on /mnt/usb1 type ext2 (rw,nosuid,nodev,noexec)
    
  4. カーネルその他をコピーします.
    # cp -a /boot/* /mnt/usb1/boot/
    
  5. カーネルモジュールをコピーします。
    # cp -a /lib/modules /mnt/usb1/lib/
    
  6. そのままではブートローダを書き込みにくいので、マウントしなおします。
    # umount /mnt/usb1/
    # mount /dev/sda1 /mnt/usb1
    
  7. liloの設定ファイル「/mnt/usb1/etc/lilo_cross.conf」を作成します。
    (認識したUSBリーダのデバイスがsda以外ならそのように変更してください)
    linear
    boot=/dev/sda
    disk=/dev/sda
    bios=0x80
    timeout=50
    default=linux
    image=/boot/zImage
            label=linux
            root=/dev/hda1
            read-only
    
    
  8. liloを実行します。
    # /sbin/lilo -r /mnt/usb1 -C /etc/lilo_cross.conf 
    

usl-5pを一旦shutdownした後、ここまで設定してきたCFに内蔵の場所に差し直し、 もう一度電源を入れます。 sshでrootのログインを試み成功したなら、後はお好きにどうぞ。

まあ、ログインしたら最初に「apt-get update」と 「apt-get upgrade」をやっておくと 良いかもしれません。

その他

base-sh4-for-landiskでは、デフォルトのrunlevelが2であることに注意

参考URL

USL-5PのUSBデバイスで遊ぶ話

(2005/9/5作成)
(2005/9/16typo等修正)