RESETボタンを押しHDDに開発用Linux(あるいは何らかのディストリビューション導入キット)を導入しようとした際、コンソール上では何も進まなくなりINFO LEDもオレンジの点滅が止まる気配がない、といったエラーが起こることがある。
この時mountコマンドで確認してもHDDはマウントされておらず、ただfdiskコマンド?で確認すると4つのパーティション?に切られていることがわかっている。
そして開発用Linuxのhddrootfs.tar.gzも展開されていないはずだ。
この時mountコマンドで確認してもHDDはマウントされておらず、ただfdiskコマンド?で確認すると4つのパーティション?に切られていることがわかっている。
そして開発用Linuxのhddrootfs.tar.gzも展開されていないはずだ。
原因
一度、開発用Linuxを導入し何らかの事情で再度開発用Linuxを導入する際によく見受けられるエラーだ。
この時、共通して見られる行為は
この時、共通して見られる行為は
- 標準Linuxからのブートになっている
- HDDはfdiskコマンド?でパーティション?を解放している
- dd if=/dev/zero /dev/sda bs=1M count=1と実行している場合もある
などだろう。
ここで玄箱PROのHDDがどのように処理されているのか追ってみる。
ここで玄箱PROのHDDがどのように処理されているのか追ってみる。
HDDの取り付け後
まずは未フォーマットのHDDがある。
パーティションを切る
/usr/local/bin/InitDisk1.sh内の処理で、
fdisk ${DISK1_DEV} < /usr/local/bin/PartitionDefinition
を実行しパーティション?を4つに切る。
HDDの先頭512バイトにパーティションテーブルを含むMBRが確保される。
各パーティションをフォーマットし、開発用Linux導入完了
続けて/usr/local/bin/InitDisk1.shが呼び出した/usr/local/bin/kuro_lib内のFormat_EXT3関数、Format_XFS関数、そしてmkswapコマンド?でそれぞれのパーティション?を適宜フォーマットしていく。
この際に重要なのは、各パーティション?の先頭512バイトにブートセクターが置かれることだ。
ext3形式のブートセクターには何も記録されていないが、xfs形式のブートセクターの先頭3バイトには「XFS」という文字列が入る(余談だが、このためxfs形式の上からext3形式をフォーマットしても先頭の「XFS」という文字列が残る)。
この後、各種ファイルの展開などがあり開発用Linuxの導入も終わる。
ext3形式のブートセクターには何も記録されていないが、xfs形式のブートセクターの先頭3バイトには「XFS」という文字列が入る(余談だが、このためxfs形式の上からext3形式をフォーマットしても先頭の「XFS」という文字列が残る)。
この後、各種ファイルの展開などがあり開発用Linuxの導入も終わる。
fdiskコマンドでパーティション解放
HDDのマウントをはずし、fdiskコマンド?でHDD先頭のパーティションテーブルを書き換え(消去し)、各パーティション?の「壁」を取り払う。
しかしこのままであれば、基本領域であったパーティション?の中のデータそのものはフォーマットされない限り消えることはない。
しかしこのままであれば、基本領域であったパーティション?の中のデータそのものはフォーマットされない限り消えることはない。
ここで重要なのは「パーティション?は存在しないがsda2とsda4の先頭領域だった場所には「XFS」という文字列はそのまま残っている」という点だ。
そしてこの状態で再度の開発用Linuxの導入をするため、RESETボタンを押すとどうなるか続けてみる。
そしてこの状態で再度の開発用Linuxの導入をするため、RESETボタンを押すとどうなるか続けてみる。
InitDisk1.shのチェックを抜ける
/usr/local/bin/InitDisk1.shのXFSフォーマットチェックの方法は以下だ。
XFS_FORMATTED=`dd if=${DISK1_DEV} bs=1 count=3` ; [ "${XFS_FORMATTED}" = XFS ] && ExitWithError formatted
XFS_FORMATTED=`dd if=${DISK1_DEV}1 bs=1 count=3` ; [ "${XFS_FORMATTED}" = XFS ] && ExitWithError formatted
XFS_FORMATTED=`dd if=${DISK1_DEV}4 bs=1 count=3` ; [ "${XFS_FORMATTED}" = XFS ] && ExitWithError formatted
つまり、/dev/sda、/dev/sda1、/dev/sda4の先頭に「XFS」という文字列がなければ「フォーマットされていない」と見なされる。
この時のHDDの状態は下のようになっている。
この時のHDDの状態は下のようになっている。
/dev/sdaは存在するが先頭に「XFS」という文字列はなく、/dev/sda1、/dev/sda4に関してはそもそもそのようなデバイスが存在しない。
よってこの状態のHDDは/usr/local/bin/InitDisk1.shの初期チェックを通過してしまう。
よってこの状態のHDDは/usr/local/bin/InitDisk1.shの初期チェックを通過してしまう。
パーティションを切る
その次に待っているのはパーティション?を切る処理だ。
fdisk ${DISK1_DEV} < /usr/local/bin/PartitionDefinition
この処理後、HDDは以下のようになる。
/usr/local/bin/PartitionDefinitionを変更して実行しない限り、以前とまったく同じパーティション?の切り方になるはずだ。
各パーティションをフォーマットする
次に/usr/local/bin/InitDisk1.shはFormat_EXT3関数とFormat_XFS関数を呼び、それぞれext3形式とxfs形式にフォーマットを始める。
Format_EXT3関数にはチェック項目はないため、/dev/sda1は問題なくext3形式でのフォーマットが完了する。
しかしFormat_XFS関数は再度ここでxfs形式フォーマットのチェックを行う。
Format_EXT3関数にはチェック項目はないため、/dev/sda1は問題なくext3形式でのフォーマットが完了する。
しかしFormat_XFS関数は再度ここでxfs形式フォーマットのチェックを行う。
KEY=`dd if=$1 bs=1 count=3`
if [ "${KEY}" = "XFS" ] ; then
チェック対象デバイスの先頭3バイトを読み込み、それが「XFS」であれば別の処理が待っている。
この時、HDDは以下のようになっている。
この時、HDDは以下のようになっている。
/dev/sda1、/dev/sda3はフォーマットする、という意味で空白にしている。
/dev/sda2、/dev/sda4は、ちょうど先頭3バイトに「XFS」が入る形になっている。
よって次の処理を実行する。
/dev/sda2、/dev/sda4は、ちょうど先頭3バイトに「XFS」が入る形になっている。
よって次の処理を実行する。
. /etc/melco/info
/etc/melco/infoというファイルを開く、という意味だが、このファイルは標準では存在しない。
製品仕様書にもあるが、
製品仕様書にもあるが、
内蔵HDD(/dev/sda)が既にxfs形式でフォーマットされている場合、フォーマットは行われない。但し、/etc/melco/info内、 force_format=yesとすることで、xfsでフォーマットされている/いないにかかわらず、フォーマットを行うようにすることができる。
とのことで、任意のファイルだ。
このファイルがないため、多くは内部的にここで止まっている。
これが処理が止まり、INFO LEDが点滅しつづける原因だ。点滅を止めるmiconaplコマンドに到達していないのだ。
この図のような状態に、実際は/dev/sda1のext3形式でのフォーマットが済んでいるため、/dev/sda3以外のパーティション?はすべて手動でマウントできる。
その後で、INFO LEDを止めるため
このファイルがないため、多くは内部的にここで止まっている。
これが処理が止まり、INFO LEDが点滅しつづける原因だ。点滅を止めるmiconaplコマンドに到達していないのだ。
この図のような状態に、実際は/dev/sda1のext3形式でのフォーマットが済んでいるため、/dev/sda3以外のパーティション?はすべて手動でマウントできる。
その後で、INFO LEDを止めるため
miconapl -a led_set_code_information clear
とすればいい。
/dev/sda3は
/dev/sda3は
mkswap /dev/sda3
swapon /dev/sda3
でswapを有効にできる。
ただし、開発環境はHDDに一切展開されていないので注意が必要だ。
ただし、開発環境はHDDに一切展開されていないので注意が必要だ。
/etc/melco/infoを用意する
これを回避するため/etc/melco/infoを用意した場合、次の処理を通る。
if [ "${force_format}" = "yes" ] ; then
確認のため10秒間のタイマーが始動
else
return 0
fi
(略)
dd if=/dev/zero of=$1 bs=512 count=1
mkfs.xfs $1 -f
/etc/melco/infoに「force_format=yes」と記述していれば、先頭の512バイト(つまりブートセクター)を消去しxfs形式でのフォーマットが始まる。
しかし、/etc/melco/infoが「force_format=no」あるいは記述がない場合、elseを通りreturn 0、つまりFormat_XFS関数を抜けさせられ、あとに続くmkfs.xfsコマンドは実行されない。
つまり、/dev/sda2、/dev/sda4にフォーマットは施されないのだ。
この時のHDDは以下。
しかし、/etc/melco/infoが「force_format=no」あるいは記述がない場合、elseを通りreturn 0、つまりFormat_XFS関数を抜けさせられ、あとに続くmkfs.xfsコマンドは実行されない。
つまり、/dev/sda2、/dev/sda4にフォーマットは施されないのだ。
この時のHDDは以下。
パーティション?を切る前のファイルシステムがそのまま使えてしまうため、一見mkfs.xfsが処理されたように思えるためわかりにくいが、/dev/sda2と/dev/sda4は実は前回の開発用Linuxのままなのだ。
そこにデータが残っていれば扱うことができる。
そこにデータが残っていれば扱うことができる。
対処
/etc/melco/infoを用意し、force_format=yesと記述しておけばいい。
~ # mkdir /etc/melco
~ # echo force_format=yes > /etc/melco/info
これでFormat_XFS関数を通過できる。
現時点でINFO LEDが点滅している場合、fdiskコマンド?で全パーティション?を解放し、上の/etc/melco/infoを用意して一度再起動し、再度RESETボタンを押せば開発用Linuxを導入できるだろう。
また各種Debian化キットなどもシリアルコンソールの世話になることなく導入できるのではないだろうか。
現時点でINFO LEDが点滅している場合、fdiskコマンド?で全パーティション?を解放し、上の/etc/melco/infoを用意して一度再起動し、再度RESETボタンを押せば開発用Linuxを導入できるだろう。
また各種Debian化キットなどもシリアルコンソールの世話になることなく導入できるのではないだろうか。