「(エラー)RESETボタンでの初期化中、INFO LEDが点滅して作業が中断する」の編集履歴(バックアップ)一覧に戻る
(エラー)RESETボタンでの初期化中、INFO LEDが点滅して作業が中断する - (2008/01/24 (木) 01:04:42) のソース
RESETボタンを押しHDDに開発用Linuxを導入しようとした際、コンソール上では何も進まなくなりINFO LEDもオレンジの点滅が止まる気配がない、といったエラーが起こることがある。 この時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がどのように処理されているのか追ってみる。 **HDDの取り付け後 まずは未フォーマットのHDDがある。 #image(p1-1.jpg) もちろんこのままではHDDとして機能はしない。(必要に応じて)パーティションを切り、[[ファイルシステム]]を導入(フォーマット)しないと役に立たない。 **パーティションを切る /usr/local/bin/[[InitDisk1.sh]]内の処理で、 >fdisk ${DISK1_DEV} < /usr/local/bin/PartitionDefinition を実行しパーティションを4つに切る。 #image(p1-2.jpg) HDDの先頭512バイトにパーティションテーブルを含むMBRが確保される。 **各パーティションをフォーマットし、開発用Linux導入完了 続けて/usr/local/bin/[[InitDisk1.sh]]が呼び出した/usr/local/bin/[[kuro_lib]]内のFormat_EXT3関数、Format_XFS関数、そしてmkswapコマンドでそれぞれのパーティションを適宜フォーマットしていく。 #image(p1-3.jpg) この際に重要なのは、各パーティションの先頭512バイトにブートセクターが置かれることだ。 ext3形式のブートセクターには何も記録されていないが、xfs形式のブートセクターの先頭3バイトには「XFS」という文字列が入る。 この後、各種ファイルの展開などがあり開発用Linuxの導入も終わる。 **fdiskコマンドでパーティション解放 fdiskコマンドでHDD先頭のパーティションテーブルを書き換え(消去し)、各パーティションの「壁」を取り払う。 しかしこのままであれば、基本領域であったパーティションの中のデータそのものはフォーマットされない限り消えることはない。 #image(p1-4.jpg) ここで重要なのは「パーティションは存在しないがsda2とsda4の先頭領域だった場所には「XFS」という文字列はそのまま残っている」という点だ。 そしてHDDのマウントをはずし、この状態で再度の開発用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の状態は下のようになっている。 #image(p1-4.jpg) /dev/sdaは存在するが先頭に「XFS」という文字列はなく、/dev/sda1、/dev/sda4に関してはそもそもそのようなデバイスが存在しない。 よってこの状態のHDDは/usr/local/bin/[[InitDisk1.sh]]の初期チェックを通過してしまう。 **パーティションを切る その次に待っているのはパーティションを切る処理だ。 >fdisk ${DISK1_DEV} < /usr/local/bin/PartitionDefinition この処理後、HDDは以下のようになる。 #image(p1-3.jpg) /usr/local/bin/PartitionDefinitionを変更して実行しない限り、以前とまったく同じパーティションの切り方になるはずだ。 **各パーティションをフォーマットする 次に/usr/local/bin/[[InitDisk1.sh]]はFormat_EXT3関数とFormat_XFS関数を呼び、それぞれext3形式とxfs形式にフォーマットを始める。 Format_EXT3関数にはチェック項目はないため、/dev/sda1は問題なくext3形式でのフォーマットが完了する。 しかしFormat_XFS関数は再度ここでxfs形式フォーマットのチェックを行う。 >KEY=`dd if=$1 bs=1 count=3` >if [ "${KEY}" = "XFS" ] ; then チェック対象デバイスの先頭3バイトを読み込み、それが「XFS」であれば別の処理が待っている。 この時、HDDは以下のようになっている。 #image(p1-5.jpg) /dev/sda1、/dev/sda3はフォーマットする、という意味で空白にしている。 /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コマンド]]に到達していないのだ。 **/etc/melco/infoを用意する これを回避するためtouchコマンドなどで/etc/melco/infoを用意した場合(内容には記述なし)、次の処理を通る。 >if [ "${force_format}" = "yes" ] ; then >else >return 0 then以降にはもちろん処理文があるが、今は「記述なし」の場合なのでそのままelseを通った。 するとreturn 0、つまりFormat_XFS関数を抜けさせられ、あとに続くmkfs.xfsコマンドは実行されない。 つまり、/dev/sda2、/dev/sda4にフォーマットは施されないのだ。 この時のHDDは以下。 #image(p1-6.jpg) パーティションを切る前のファイルシステムがそのまま使えてしまうため、一見mkfs.xfsが処理されたように思えるが、実は前回の開発用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を導入できるだろう。 ----