2015年12月2日水曜日

玄人志向 玄箱(Debian Jessie)で u-boot の設定を間違える

Debian Jessie をインストールした玄箱の u-boot の設定を見直していました。シリアルコンソールが途中で切断される理由も bootconsole から netconsole へ切換られているためだという事が判明したため、 netconsole でアクセスをしようと u-boot の設定を見直していました。設定を間違えたようで、u-boot のコンソールへアクセス出来なくなってしまいました。

経緯

u-boot の環境変数の "ethact=COMET#0" の部分を変更したところ、システムの起動は今までどおりに行えるのですが、u-boot のコンソールへ移行することができなくなってしまいました。どうもコンソール画面がまだ満足に環境設定を行なっていないイーサネット側へ出力されているようです。このままでは、u-boot の設定の見直しができなくなってしまいます。
ethact=COMET#0
   ↓
ethact=RTL8169#0


対策

フラッシュメモリへ書き込まれている u-boot の設定値を修正して書き戻すこととしました。

まずはブロックデバイスがどのように認識されているか確認しました。
# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00400000 00010000 "physmap-flash.0"

# ls /dev | grep mtd
mtd0
mtd0ro
mtdblock0

Debian Jessie のシステム上では、フラッシュメモリは /dev/mtdblock0 と認識されているようです。

フラッシュメモリ全体のデータを吸い出す

この /dev/mtdblock0 からフラッシュメモリ全体のデータを dd コマンドを使用して全部吸い上げてしまいました。
# dd if=/dev/mtdblock0 of=flash.bin bs=1k
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 1.51899 s, 2.8 MB/s

吸い上げたデータがフラッシュメモリの内容と一致するか確認しました。
# cmp flash.bin /dev/mtdblock0
(何の表示もせずに終了した場合はデータは一致しています)

操作パソコンで修正

吸い上げたフラッシュメモリのデータ(flash.bin)を操作するパソコンへ転送して、バイナリ・エディタで編集しました。私は ghex で編集しました。上記の "ethact=" の部分を検索して編集して、新しく flash2.bin として保存しました。そして再び玄箱へ転送しました。

修正済みデータの書き込み

念の為、書き換え前のデータと修正データを比較してみました。最終行の "EOF on flash2.bin" の部分は、編集によって新しいデータの長さが若干短くなってしまいました。空白(null)データが詰まっている部分なので、これで問題ありません。
# cmp -l flash.bin flash2.bin
3540661 122 103
3540662 124 117
3540663 114 115
3540664  70 105
3540665  61 124
3540666  66  43
3540667  71  60
3540668  43   0
3540669  60   0
3604479   0 117
3604480   0 113
3604483 117 116
3604484 113 107
3604735 116 377
3604736 107 377
cmp: EOF on flash2.bin

大きな不安を抱えつつフラッシュメモリを書き換えました。読み出しの時と違って書き換えの時には時間が掛かるため、心臓に負担がかかります(苦笑)。
# dd if=flash2.bin of=/dev/mtdblock0 bs=1k
4095+1 records in
4095+1 records out
4194302 bytes (4.2 MB) copied, 66.4426 s, 63.1 kB/s

最後にもう一度比較を行います。
# cmp -l flash2.bin /dev/mtdblock0
cmp: EOF on flash2.bin

これで作業は終了です。祈りながら再起動をします。
# reboot

再起動後

再起動した後、u-boot の起動表示画面が表示されて Bad CRC の表示と共に初期値のデータを使用するとの表示が出ました。

"s" キーで無事に u-boot のコンソールへログインすることができました。ただし設定値は初期化された状態でした。

そこで再度 u-boot の設定値を setenv コマンドを使って設定し直しました。これで無事起動することができるようになりました。

0 件のコメント:

コメントを投稿