2013年6月3日月曜日

PogoPlug MobileでSDブート + Arch Linux


PogoPlug Mobile
SD x1。USB 2.0 x1。

Arch Linux
KISS: Keep It Simple, Stupid

シンプル、ゴキゲンな高性能コンピュータが手のひらに。:-)

Arch Linux ARM
USBメモリから起動するなら、この手順のとおり。
でも、USBポートはひとつしかないので、かわりにSDカードからブートしたい…

活発に情報交換されていて、流れを追うのに少し時間がかかりました。
bodhiさんのまとめ
davygravyさんのSDブート用U-Boot
Arch LinuxのSDブート


【レシピ】
  • NAND flashバックアップ
  • Arch Linuxインストール(USBブート)
  • SDブート用U-Bootインストール

NAND flashツール
http://download.doozan.com/uboot/nanddump
http://download.doozan.com/uboot/nandwrite
http://download.doozan.com/uboot/flash_erase

 U-Boot環境設定ツール
http://download.doozan.com/uboot/fw_printenv
http://download.doozan.com/uboot/fw_env.config
http://download.doozan.com/uboot/blparam

SDブート用U-Boot
https://www.dropbox.com/sh/nwt2kbvetvgvroo/sm-hZ0B4jU/Kirkwood/uboot/Pogoplug4Series

Debian起動用U-Boot環境設定
http://download.doozan.com/uboot/files/environment/uboot.environment


NAND flashバックアップ
工場出荷状態のまま起動してWebサイトで登録。SSHログインを許可します。
NAND flashの使用領域を確認。
===
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00200000 00020000 "u-boot"
mtd1: 00300000 00020000 "uImage"
mtd2: 00300000 00020000 "uImage2"
mtd3: 00800000 00020000 "failsafe"
mtd4: 07000000 00020000 "root"
===

このあと書き換えるmtd0の領域をバックアップしておきます。
===
# nanddump --noecc --omitoob -l 0x200000 -f uboot-mtd0-dump-0x200000 /dev/mtd0
===
ただし、書き戻してホントにもとどおり動くのか未確認です。


Arch Linuxインストール
ここでUSB3.0とSATAポートのある上位機種が紹介されています。
同じ手順で無事起動できました。

起動できたら、USBメモリにインストールした時と同じように、SDカードをフォーマットして、Arch Linuxをダウンロード、インストールしておきます。


SDブート用U-Bootインストール

自己責任
U-Bootの更新に失敗すると、最悪の場合、なにも起動しなくなります
PogoPlug Mobileくんはけっこう軽いので、文鎮としての活用もややキビシイかと…

【Note.1】
通常の手順に従ったArch Linuxインストールでは、再びPogoPlugオリジナルのFirmwareを起動するための手段(alarm_revert)が用意されています。また、Debianインストールでは、うまく起動できなかった時のための工夫(rescue_bootcmd)がされているようです。ここでインストールするSDブート用U-Bootとその環境設定では、こういった手段が考慮されていません。
ただし、環境設定だけの問題であれば、U-Bootが起動し、netconsoleが使えれば、対処できるかもしれません。netconsoleの設定はこちらを参考に。IPアドレスは環境に合わせて変更が必要です。

【Note.2】
USBメモリからのブートは可能です。USBメモリ→SDカードの順で起動を試みます。
また、PogoPlugオリジナルのFirmware自体はそのまま残っているので、U-Bootの環境設定を書き換えれば、起動できるかもしれません。(未確認

【Note.3】
ethaddrとcesvcidは、SDブート用U-Bootをインストールするまえに、blpparamで確認しておきます。すべての環境設定を保存しておくことをオススメ。
===
# blparam
...
ethaddr=XX:XX:XX:XX:XX:XX
cesvcid=XXXXXXXXXXXXXX
...
===

【Note.4】
工場出荷状態、および、Arch LinuxでインストールされるU-Bootでは、環境設定ツールとしてblparamを使用します。いっぽう、Debian起動用、SDブート用のU-Bootでは、fw_setenv、fw_printenvを使用します。U-Boot環境が保存されるNAND flashのアドレスは/etc/fw_env.configに記述されています。

【Note.5】
ブートできないSDカードもあるようです。大容量(2GBより大きい?)のSDカードだとダメなのかも。起動できないときのU-Bootのエラーはこんなかんじでした。
===
mmc block read error
bad MBR sector signature 0x0000
** Bad partition - mmc 0:1 **
===

bodhiさんのまとめを熟読。このとおり作業を進めます。
- Flash uboot.environment to 0xC0000
で、Debian用のU-Boot環境設定を一括して書き込み、さらに、SDブート用の環境設定をfw_setenvで書き足していく手順になっています。
Arch Linuxを起動するためにはこちらを参考に少し変更が必要でした。
再起動する前に、fw_printenvで、すべての設定が正しく行われているか、慎重に確認。

===for netconsole===
===serverip、ipaddrは環境に合わせて修正===
# fw_setenv serverip 192.168.1.2
# fw_setenv ipaddr 192.168.1.100
# fw_setenv if_netconsole 'ping $serverip'
# fw_setenv start_netconsole 'setenv ncip $serverip; setenv bootdelay 10; setenv stdin nc; setenv stdout nc; setenv stderr nc; version;'
# fw_setenv preboot 'run if_netconsole start_netconsole'

===etc.===
===ethaddr、 cesvcidはblparamで確認===
===ethaddr設定が無いと起動のたびにMACアドレスが変わる===
===machid設定が無いとLEDが使えない===
# fw_setenv mtdparts 'mtdparts=orion_nand:2M(u-boot),3M(uImage),3M(uImage2),8M(failsafe),112M(root)'
# fw_setenv usb_rootfstype ext3
# fw_setenv ethaddr XX:XX:XX:XX:XX:XX
# fw_setenv cesvcid XXXXXXXXXXXXXX
# fw_setenv ceboardver PPV4A1
# fw_setenv arcNumber 3960
# fw_setenv machid F78

===for SD/USB uboot===
# fw_setenv mmc_root /dev/mmcblk0p1
# fw_setenv mmc_rootfstype ext3
# fw_setenv mmc_rootdelay 10
# fw_setenv mmc_set_bootargs 'setenv bootargs console=$console root=$mmc_root rootdelay=$mmc_rootdelay rootfstype=$mmc_rootfstype $mtdparts'
# fw_setenv mmc_bootcmd 'mmc init; mmc init; run mmc_set_bootargs; run mmc_boot'
# fw_setenv mmc_boot 'mw 0x800000 0 1; ext2load mmc 0:1 0x00800000 /boot/uImage; if ext2load mmc 0:1 0x01100000 /boot/uInitrd; then bootm 0x800000 0x1100000; else bootm 0x800000; fi'
# fw_setenv bootcmd 'usb start; run force_rescue_bootcmd; run ubifs_bootcmd; run usb_bootcmd; usb stop; run mmc_bootcmd'
===

Thanks,

hiro