LinkStation mini に Debian を入れる

[戻る]

はじめに

とある実験のため LinkStation mini (LS-WS500GL/R1) を Debian 化しなくては ならなくなり調べてみました. NAS の Linux-Box 化は IODATA系 の経験はありましたが, 玄箱やら LinkStation 等の Buffalo 系は弄ったことがありませんでした.

そのため噂で

程度の知識しかありませんでした. いろいろ調べて成功したので, その結果を書いておきます. なお, 本来 LinkStation mini は HDD 2 個で raid を構成するものですが, 今回は実験の目的上電力消費や質量を下げる必要があったため HDD 1 個で構築しました.

分かったこと

簡単に箇条書きしてまとめてみます.

以下のページが参考になる.

手順

この手順は, いろいろ試行錯誤した結果を思い出しつつ書いているので, より効率の良い手段や, 重要な記述漏れがあるかもしれません. その辺はご了承ください.

用意する物

手順

  1. Windows PC で, FreeLink_arm9-1.0rev2.zip を展開する.
  2. hddrootfs.img を hddrootfs.zip にリネームする
  3. hddrootfs.zip を展開する.
  4. 中に hddrootfs.buffalo.updated というファイルがあるので, 取り出す. その際, パスワードを聞かれるが, ここ に書いてある(一番下).
  5. 取り出した hddrootfs.buffalo.updated を hddrootfs.tgz にリネームし, Linux-PC に持って行く (ここではホームディレクトリに置いたとする).
  6. Linux-PC で u-boot を展開し, mkimage を作る.
    # bzcat u-boot-1.1.4.tar.bz2 | tar xvf -
    # cd u-boot-1.1.4
    # export TOPDIR=`pwd`
    # cd tools
    # make mkimage
    いろいろ文句を言われるけど mkimage が出来てれば成功. できた mkimage を適当な所に放る (例えば /usr/local/bin とか).
  7. マイナスドライバを用いて, LS-WSGL をこじ開け, HDD を取り外す. (手順は この辺 に書いてある).
  8. 取り外した HDD を Linux-PC に取り付ける (sdb とする).
  9. 第一パーティションをマウントし (sdb とする) 必要なファイルを取り出す.
    # cd ~
    # mkdir sdb1
    # cd sdb1
    # mount -t ext3 /dev/sdb1 /mnt
    # cp /mnt/uImage.buffalo /mnt/initrd.buffalo .
  10. initrd.buffalo を編集しやすいようにしておく
    # mkdir /loop
    # dd if=initrd.buffalo of=initrd.gz bs=64 skip=1
  11. 10. で作った initrd.gz をマウントし, 起動時に必要な動きを定義する.
    # gunzip initrd.gz
    # mount -o loop initrd /loop
    # vi /loop/linuxrc
  12. とりあえず, という方針で次のような感じにした (ポイントは HddRoot の 0x802 0x801).
    #!/bin/sh
    
    export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
    
    echo "---- in linuxrc ---"
    
    mount proc /proc -t proc
    mount sysfs /sys -t sysfs
    
    . /usr/local/bin/libbuffalo
    . /usr/local/lib/libsys
    . /usr/local/lib/libmsg
    
    export DEV_BOOT=/dev/sda1
    export DEV_ROOTFS1=/dev/sda2
    fsck_disks()
    {
      FSCK_RES=0
      PadPrint "Starting :fsck_disks(boot) ... "
      fsck.ext2 -pyf /dev/${DEV_BOOT} > /dev/null 2>&1 > /dev/null
      if [ $? -ne 0 ] ; then
        echo "[Failed. ]"
      else
        echo "[Success.]"
      fi
      PadPrint "Starting :fsck_disks(rootfs) ... "
      case ${ROOTFS_FS} in
      ext3)
        FsckEXT3 /dev/${DEV_ROOTFS1} > /dev/null 2>&1 > /dev/null
        RET=$?
        ;;
       ext2)
        FsckEXT2 /dev/${DEV_ROOTFS1} > /dev/null 2>&1 > /dev/null
        RET=$?
        ;;
      *)
        FsckXFS /dev/${DEV_ROOTFS1} > /dev/null 2>&1 > /dev/null
        RET=$?
        ;;
      esac
      if [ ${RET} -ne 0 ] ; then
        echo "[Failed. ]"
      else
        echo "[Success.]"
      fi
    }
    
    HddRoot()
    {
      echo "-HddRoot-"
      fsck_disks
      echo "0x801" > /proc/sys/kernel/real-root-dev
    }
    
    RamdiskRoot()
    {
      echo "-RamdiskRoot-"
      echo "0x100" >/proc/sys/kernel/real-root-dev
    }
    
    CommandMode()
    {
      echo "-CommandMode-"
      mount -a
      /sbin/getty -L ttyS0 115200 vt100
      ##/bin/sh
    }
    
    reset_date()
    {
      TMP=`date "+%s"`
      if [ ${TMP} -lt 1133362800 ] || [ ${TMP} -ge 1606748400 ] ; then
        date ${INITIAL_DATE}
        if [ -L "${HW_CLOCK}" ] ; then
          hwclock --systohc --localtime
        else
          hwclock -w 
        fi
      fi
    }
    
    # set the system time from the hardware clock 
    HW_CLOCK=`which hwclock`
    if [ -L "${HW_CLOCK}" ] ; then
      # not busybox hwclock version
      hwclock --hctosys --localtime
    else
      # busybox hwclock version
      hwclock -s
    fi
    reset_date
    date
    
    echo ${DEV_BOOT}
    ldconfig
    depmod
    
    ## Setup Micon communication port and send flash-boot complete message.
    miconapl -b -a boot_flash_ok > /dev/null
    
    echo ${DEV_BOOT}
    echo "linuxrc:choose operation (timeout 4[s])"
    echo -n "1:RamRoot other: HDDRoot  ? "
    ANSWER=`/usr/local/bin/keyinput -t 4`
    case "$ANSWER" in
      1) RamdiskRoot ;;
      9) CommandMode ;;
      *)
      HddRoot
      ;;
    esac
    
    umount /sys
    umount /proc
    umount -a
    exit 0
    
  13. 作った linuxrc を元に戻す
    # umount /loop
    # gzip initrd
    # mkimage -A ARM -O Linux -T ramdisk -C gzip -a 0x00000000 -e 0x00000000 -n initrd -d ./initrd.gz ./initrd.buffalo
  14. 2.6.16 のモジュール群を取り出す.
    # umount /mnt
    # mount -t xfs /dev/sdb2 /mnt
    # cd /mnt/lib/modules
    # cp -R 2.6.16.16-arm1 ~
    # cd ~
    # umount /mnt
  15. Knoppix を起動する (なぜか以下の 16, 17 の手順は Debian 5.0 では 上手くいかず Kinoppix 5.11 だと上手くいったため ⇒注1)
  16. 好きなようにパーティションを切る. 例えば次のような感じ.
    sdb1112583 (Linux)
    sdb21263027583 (Linux)
    sdb3302763040182 (Swap)
  17. フォーマットする
    # su
    # mk2fs.ext3 /dev/sdb1
    # mk2fs.ext3 /dev/sdb2
    # mkswap /dev/sdb3
  18. Debian PC に取り付け, 必要ファイルを展開する
    # cd ~/sdb1
    # mount -t ext3 /dev/sdb1 /mnt
    # cp uImage.buffalo initrd.buffalo /mnt
    # umount /mnt
    # mount -t ext3 /dev/sdb2 /mnt
    # cd /mnt
    # zcat ~/hddrootfs.tgz | tar xvf -
  19. モジュール群をコピーする
    # cd /mnt/lib/modules
    # cp -R ~/2.6.16.16-arm1 .
  20. fstab を編集する
    # vi /mnt/etc/fstab
    内容は 16. のパーティションの切り方次第ですが, 16. に則ると次のような感じです.
    proc /proc proc defaults 0 0
    none /dev/pts devpts gid=5,mode=622 0 0
    tmpfs /tmp tmpfs size=10M,mode=1777 0 0
    /dev/sda3 swap swap defaults 0 0
    /dev/sda1 /boot ext3 defaults,noattime,errors=remount-ro 0 1
  21. ついでにネットワークの設定もしておく. 設定するファイルは などでしょうか.

後は umount して hdd を取り出し, LS-WSGL の基板に挿して電源を入れれば起動するはずです. ログイン名は admin, パスワードも admin, ルート様のパスワードは lspro だと 思います. HDD 一個ならばどっちのコネクタに挿しても動きます. 二個ならば SATA2 と書かれた 方に作った HDD を挿す必要があります.

その他の備忘録

顛末

こうやっていろいろ苦労したものの, 今時 BeagleBoard やら, Armadilloやらで 実験すればいいじゃないかという話になってきました. こりゃこりゃ

でも, 面白そうですね. 個人では現状借り物で Plamo 使った サーバ立ててますが, 返却しなくてはならなくなったらこいつに変更しようかな と思い出しました. あまり raid は必要性感じない (というか壊れた時の修復が面倒) んで, HDD 二連装にして, 定期的にrsync で バックアップするとかの運用がいいかなと思ってます.


注1: 未確認ですが i-node のサイズが違うのが原因との噂があります (手順 17 で "-j -I 128" スイッチを指定). 2010.12
2009.3