Apache のアクセスログ解析が止まっていたのでどうしてだろうかと思ったら、


-rw-r--r--   1 root staff 2147483647 2007-06-25 20:44 access_log

どうやらファイルサイズの限界っぽい。
2147483647バイトのログファイル。

# ログローテーションしませう ( -.-)



fetchmailがいくつか、いつのまにか止まっていた。

再度実行しても、終了コード0を残して、瞬時に終了してしまう。何のログも残さない。

-c オプションをつけて実行すると、 "File size limit exceeded"。

何が原因か、なかなか分からなかったが、ふとログファイルをみると、動かせなくなった fetchmailのログのファイルサイズは(日付は食い違っているが)、 揃って2147483647バイトだった。



_| ̄|○日記(2007-04-05) - 牢固たる2GBの壁

Value too large for defined data type

とかエラーを出す。 どうやらファイルサイズが 2G を越えているのが原因らしい。 UNIX では「2G の壁」というものが存在する。 これは lseek() など、ファイル内の読み出し位置を移動する関数に 与えるオフセット値が伝統的に signed long であるためである。 signed long では 2147483647 、要するに 2G バイトまでしか表現できないので これを越えると単に fseek()に渡せないだけでなく、 内部の位置計算処理に多大な混乱が起こる (ちなみに相対位置指定のために負の値も必要)。

最近の UNIX では 2G を越えるファイルもサポートしている。 ただし、従来のプログラムが混乱することを防ぐために 2G を越えるファイルは 通常の open() では開けない (エラーになる)ようになっている。 前述のエラーメッセージは 2G を越えるファイルを開こうとしたときに perror() が返すエラーメッセージである。

んで、2G を越えるファイルを使いたいときは 以下のような definition を入れてコンパイルすればいいらしい。

gcc hoge.c -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

largefile
LFS(Large File Summit)とは、従来のLinuxのファイルサイズの制限である2GBを超える ファイルを作成するための機構で、ファイルの取り扱いを32bitから64bitに変更したこと により可能となっています。

Turbolinux - ターボリナックス - LFS(Large File Summit) とは何ですか?

tags: zlashdot Linux Apache Linux

Posted by NI-Lab. (@nilab)