ジャンル不定の日記です。

SheevaPlugのNANDにArch Linux入れた

昨日SDブートでSheevaPlugにArch Linux入れて、NANDブートも余裕だと思ってたんだが、すごいハマった・・・
うまく行かなかったのは、ubifsのrootfs作成方法に問題あったかubootの設定に問題があるんだと思ってたんだが、uImageをSDブート中のArchの/boot/uImageをnandwriteしたのがまずかったような。
uImageを再度nandwriteしたらすんなり行った。

前回SDブートの環境作る際はSheevaPlugのインストーラーでubootの設定をしたが、
インストーラーはubootの再インストールと設定だけなんで、設定変更だけならインストーラーでuboot書きこまないほうが安全と思ったんで当初自分で設定してたが、
うまく行かなくて試行錯誤していて、最終的にインストーラーをnandで使ったんで、uboot設定はインストーラー通りのもの。


SDカードの時は、パーティションを2つに分けて、1番目がuImageで2番目がrootfsでファイルを置くだけなので母艦で作ればよかったが、
NANDは端末から外せないので、SDブートの環境から書き込んだ。

NANDのパーティションを確認
cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00100000 00020000 "u-boot"
mtd1: 00400000 00020000 "uImage"
mtd2: 1fb00000 00020000 "root"
と/proc/mtdを見てNANDのパーティションを確認する。
/dev/mtd1がuImageで/dev/mtd2がrootfsだとわかった。
SheevaPlugインストーラーは、sdにすると1番目のパーティションがu-bootになるが、nandにインストールするとu-boot領域はOSに見せない設定になる。
何故違うのかわからないが、誤ってu-boot領域壊しちゃったらまずいから、u-boot領域は見えない方が良いね。

uImageの書き込み
flash_eraseall /dev/mtd1
nandwrite -pm /dev/mtd1 uImage
flash_eraseallでnandパーティションを全消し。
nandwriteでuImageを書き込むが、-pオプションは余りを埋め。-mオプションは破損領域をマーク。らしい。
uImageは、母艦でapacheが使えるようになってるんで、apacheに置いてwgetで取得した。

rootfsの作成
pacman -S mtd-utils
ubiformat /dev/mtd2
ubiattach -p /dev/mtd2
ubimkvol /dev/ubi0 -m -N rootfs
mkdir /mnt/mtd2
mount -t ubifs /dev/ubi0_0 /mnt/mtd2
tar zxfvp ArchLinuxARM-kirkwood-latest.tar.gz -C /mnt/mtd2
ファイルシステムはインストーラーの説明書にも書かれているubifsにした。
組み込み機器等のnandによく使われるファイルシステムにはjffs2ってのもあって、途中うまくいかなくてubifsが原因かと思ってjffs2の方も試したんだが、
jffs2はブロックデバイスではなく普通にmountできず、使うとしても起動時に全部読み込む必要があるのでubifs使ったほうが良さそう。
nand用のファイルシステムじゃないとウェアレベリングしてくれずに寿命が縮んだりする。
使用する各コマンドは、Arch Linuxだとmtd-utilsパッケージでまとまってるのでpacmanでインストール。
ubifsでは、/dev/ubi0デバイスを作成して/dev/ubi0_0パーティションを作成する感じだが、ボリューム名の設定が必須ぽい。
ubiformatでubifs用にnandパーティションを初期化。
ubiattachでubi0デバイスを作成。
ubimkvolでボリューム名の設定。(-mオプションは最大サイズ)
作成した/dev/ubi0_0をmountしてrootfsを展開だが、これも母艦のapacheに置いてwgetした。


これでu-bootをnandブート用に設定すればnandのArchが起動する。
u-bootの設定は試行錯誤した結果インストーラーでやっちゃったが、
bootargs_root ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs
mtdpartitions mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs)
bootcmd setenv bootargs $(bootargs_console) $(mtdpartitions) $(bootargs_root); nand read.e 0x00800000 0x00100000 0x00400000; bootm 0x00800000
って感じで設定されてるね。
SDブートのは「ext2load mmc 0:1 0x800000 /uImage」でuImageがロードされるが、「nand read.e」でロード。
u-bootでubiデバイスを作成しないといけない?のでパーティションを切ってubiデバイスを作成って感じぽい。

起動しなくなった時はSDブートしたいと思うが、
setenv bootargs_root root=/dev/mmcblk0p2 rootdelay=5
setenv bootargs $(bootargs_console) $(bootargs_root); mmcinit; ext2load mmc 0:1 0x800000 /uImage; bootm 0x00800000
でSD起動すると思う。


起動後の初期設定とアップデート
timedatectl set-timezone Asia/Tokyo
pacman -Syu
SDの時と同じだが、rootの初期パスワードは「root」
タイムゾーンの設定コマンドは初めて知った(最近出来たコマンド?)が、わかりやいね。
PCだとタイムゾーン以外に言語設定とキーボード設定が必要だが、
言語はGUI使わないなら要らないね。
キーボードはシリアルコンソール経由だから?普通に日本語配列で使えてるから要らなそう。

DHCPの有効化
systemctl start dhcpcd@eth0
systemctl enable dhcpcd@eth0
初回起動時は最初からDHCPでネットワークが使えるんだが、システムアップデートするとDHCPが無効化されるぽくて繋がらないので、
dhcpcdの起動と有効化をする必要がある。
SDの時に同じことやってたんで、今回はすぐわかった。

あとpacmanのmirrorを速いところに設定した方が良いかもだが、メイン機でもないし標準でいいかな。

SheevaPlugに良い使い道が欲しいが、
アイドル時でも発熱するから、ルーター用途だと市販品より不安定になっちゃいそうな気がする。
Linuxで使えるワンセグチューナーがあればワンセグTVサーバー用途に良さそうなんだが・・・