2015年8月16日日曜日

Linksys WRT54G を外部ストレージで起動 (ExtRoot)

このところ無線 LAN ルータのシステムメモリやフラッシュメモリを張り替えてメモリ容量を拡張してきました。システムメモリで使用した SDRAM はパソコン用のメモリカードから取得する方法があり比較的安易に入手することができます。しかしフラッシュメモリについては他の無線 LAN ルータなどから入手するしか個人的には方法がありませんでした。特に 4MB までのフラッシュメモリはまだ入手しやすいものですが、8MB 以上のフラッシュメモリは難しくなってきます。そこで何かよい方法はないものかとネット上を検索していると extroot を使った外部ストレージ(USB メモリなど)からシステムを起動させる方法があることを知りました。今回はこの extroot を使って USB メモリから起動させることをリンクシス WRT54G V2 で試してみました。

WRT54G の準備

リンクシス WRT54G V2 は、すでに USB ポートを設置していますので今回の検証に最適でした。前回 USB ポートを設置していたときには、外部から 5 ボルトの電源を供給していましたが、今回の検証では三端子レギュレータを使用して内部の 12 ボルト電源から USB 用の 5 ボルトを供給するようにしています。
そして使用する USB メモリは、Linux マシン上で Ext4 フォーマットを事前に行なって USB ポートへ接続しておきます。

 extroot を検証中の WRT54G のボード

どのファームウェアを使用するか

今回の ExtRoot の検証では、WRT54G V2 で USB ポートの動作実績のある OpenWrt Attitude Adjustment 12.09 (openwrt-brcm47xx-squashfs.trx) を使用しました。外部ストレージから起動するとは言っても、一番最初はオンボード上のフラッシュメモリから起動して外部ストレージを認識するところまでは最低限必要な部分です。なお OpenWrt Barrier Breaker 14.07 は 4MB のフラッシュメモリが搭載されている WRT54G に USB 関係のカーネルモジュールがインストールすることが出来ないため、この ExtRoot を動作させることが難しいようです。

USB メモリへ ExtRoot 化

実際の extroot 化に当たって次のウェブサイトを参考にしました。特に三番目の TP-Link WR703N の事例を紹介したウェブサイトを基本にして extroot の検証作業を行いました。
Linksys WRT54G, WRT54GL and WRT54GS [OpenWrt Wiki]
http://wiki.openwrt.org/toh/linksys/wrt54g


Rootfs on External Storage (extroot) [OpenWrt Wiki]
http://wiki.openwrt.org/doc/howto/extroot

How to increase storage on TP-Link WR703N with ExtRoot
http://en.code-bude.net/2013/02/16/how-to-increase-storage-on-tp-link-wr703n-with-extroot/

次の順番でコンソール上からインストールのためのコマンドを実行しました。

USB 関連のモジュール類のインストール
# opkg update
# opkg install kmod-usb-ohci kmod-usb-storage kmod-usb-core
# opkg install kmod-fs-ext4 block-mount

再起動させて USB メモリを認識させます。
# reboot

起動後 USB メモリを認識しているか確認します。
# ls /dev/sda1

オンボード上のフラッシュメモリからシステムを USB メモリへコピーします。
# mkdir -p /mnt/sda1
# mount /dev/sda1 /mnt/sda1
# mkdir -p /tmp/cproot
# mount --bind / /tmp/cproot
# tar -C /tmp/cproot -cvf - . | tar -C /mnt/sda1 -xf -
# umount /tmp/cproot
# umount /mnt/sda1

起動時に USB メモリを自動的にマウントさせる設定をします。
/etc/config/fstab を vi エディタで "config mount" の部分を編集します。
# vi /etc/config/fstab
- 修正場所 - (enabled_fsck を追記しました)
option target /home --> /
option enabled 0    --> 1
option enabled_fsck
0 --> 1


以上でインストール終了です。再起動させて USB メモリ上にルートが存在しているか確認します。
root@WRT54G:/# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                 1968736     72588   1797524   4% /
/dev/root                 2048      2048         0 100% /rom
tmpfs                    14636        68     14568   0% /tmp
tmpfs                      512         0       512   0% /dev
/dev/sda1              1968736     72588   1797524   4% /
設定画面の [MountPoints] です。
/dev/sda1 が / へマウントされています。
ソフトウェアの設定画面では、大量の空き領域があります。

この ExtRoot でフラッシュメモリの容量不足を解決できるようになりました。

[ 問題発生 ] 2015-08-17

何度も電源の切断と投入を繰り返していると USB メモリ内容が破壊されてしまうようです。強力なジャーナリング機能を持っている Ext4 フォーマットですが、残念ながら破壊されたデータは復活しないようです。念の為 fstab の設定のところでファイルチェックも行う設定とした方が良さそうです。なおコンソール上から halt コマンドを実行してシステム停止をした後に電源を切った場合は問題ありませんでしたが、実用的ではありません(苦笑)。 ExtRoot による動作は注意した方が良さそうです。

[ 電源遮断時の対策 ] 2015-08-18

ExtRoot の /etc/config/fstab の設定でファイルシステムを検査する "option enabled_fsck 1" は有効のようです。halt コマンドを使用せず、直接電源を遮断して再起動させたところ USB メモリのエラーを修復して、正常に起動するようです。

修復の様子は起動ログ(dmesg)に残っていました。
[   21.468000] sd 0:0:0:0: [sda] Attached SCSI removable disk
[   41.740000] JBD2: Clearing recovery information on journal
[   41.916000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
switching to external rootfs
なお halt コマンドでシステムを停止した後、再起動した場合には USB メモリのリカバリはありませんでした。
[   21.476000] sd 0:0:0:0: [sda] Attached SCSI removable disk
[   41.768000] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
switching to external rootfs

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。