[Armadillo:04461] Re: Armadillo-9のDebianの起動について

Yasushi SHOJI email@hidden
2009年 8月 4日 (火) 15:31:41 JST


At Mon, 27 Jul 2009 14:28:05 +0900,
suzuki wrote:
> 
> >> mke2fs -O -filetype /dev/hdc1
> >>
> >> を、
> >>
> >> mke2fs -j /dev/hdc1 
> >>
> >> にし、ext3にする事で、問題なく起動しました。
> >
> > mke2fs -O -filetype /dev/hdc1
> >
> > 上記コマンドでフォーマットをやり直しても問題があったために、ext3にした
> > ということでしょうか? もしそうであれば教えてください。
> 
> そうです。 

調べてみました。

結論から言うと、armadillo-9の RTCが現在時間ではなく、ドライバの初期化
時間である 2000年にセットされていませんか? または、時間を正しくセット
して howto を手順通りに行なうと、エラーにならないと思いますが、どうで
すか?

ファイルシステムは、たぶん PCで作成されていると思います。そこで作成さ
れたファイルシステムは、PCのシステム時間、つまり現在時間が書き込まれま
す。しかし、armadillo-9に CFを接続して起動すると、fsckの下記のコードの
部分でチェックが動きます。

最近の新しい e2fsckは下記のようになっていますが、

        } else if (fs->super->s_checkinterval &&
                   ((ctx->now - lastcheck) >=
                    ((time_t) fs->super->s_checkinterval))) {
                reason = _(" has gone %u days without being checked");
                reason_arg = (ctx->now - fs->super->s_lastcheck)/(3600*24);
                if (batt && ((ctx->now - fs->super->s_lastcheck) <
                             fs->super->s_checkinterval*2))
                        reason = 0;
        }

Armadilloが現在採用している Debian etchに入っている e2fsck は、
e2fsprogs 1.40相当なので

http://git.kernel.org/?p=fs/ext2/e2fsprogs.git;a=commitdiff;h=2acad6b4895a0e218f9d9eece1ade23c2cf4ffc7#patch5

にある変更が入っていないようです。そのため

        } else if (fs->super->s_checkinterval &&
                   ((ctx->now - fs->super->s_lastcheck) >= 
                    fs->super->s_checkinterval)) {
                reason = _(" has gone %u days without being checked");
                reason_arg = (ctx->now - fs->super->s_lastcheck)/(3600*24);
                if (batt && ((ctx->now - fs->super->s_lastcheck) < 
                             fs->super->s_checkinterval*2))
                        reason = 0;
        }

となっています。ソースコードは↓にあります
http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsprogs_1.39+1.40-WIP-2006.11.14+dfsg.orig.tar.gz
http://ftp.de.debian.org/debian/pool/main/e/e2fsprogs/e2fsprogs_1.39+1.40-WIP-2006.11.14+dfsg-2etch1.diff.gz

ここで、ctx->now が s_lastcheckより古いと 「マイナスの signed int >=
プラスの UNSIGNED int」という比較になってしまいます。(time_t は、
signed intです)  このため、unsigned による比較になり、本来であれば小さ
いはずの「マイナスの signed int」が「プラスの UNSIGNED int」より大きい
と判断され、間違ったコードパスに入るようです。

なにか勘違いしているところがあれば、ツッコミお願いします。
-- 
             yashi



armadillo メーリングリストの案内