1月版 ext3でデータが破損!? メモリ管理で不整合


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2007/1/31

ext3でデータが壊れる!?

 12月8日、Marc Haberが「ext3ファイルシステムを利用しているのだが、Debianのパッケージ管理システムaptitude(注)の制御ファイルのデータが破損するという問題が起きている。どうやら2.6.19で発生しているようだ」という報告をメーリングリストに投げました。同じく、Florian Weimerが「Debianの2.6.18カーネルでも同じ問題が発生する」と報告しました。

注:Debian GNU/Linuxシステムでのパッケージ管理のためのツール。ソフトウェアの導入・削除・アップグレードなどを管理する。

 12月17日には、Andrei Popaが「rtorrent(注)を実行してファイルをダウンロードすると、ダウンロードしたデータが壊れている場合がある」という、一見まったく関連性のなさそうな報告を投稿しました。これに対して、ほかのユーザーからも同じ問題が起きているという内容のメールが投げられました。

注:PtoPファイル共有システムBitTorrent用アプリケーションの1つ。
http://libtorrent.rakshasa.no/

 この問題を解析していくと、

  • ext3ファイルシステムを利用している
  • 2.6.19を利用している
  • aptitudeやrtorrentを利用している

環境においてデータ破損が発生しているようです。

 Andrew MortonやLinusが乗り込み、問題の解決に挑みました。問題を絞り込むと、aptitudeとrtorrentの共通点として、「mmapを利用している」ことが判明しました。mmapは、ディスク上のファイル領域をメモリ領域にマップする仕組みです。

 長いデバッグ期間を経て、12月28日にLinusが毎回同じ問題を再発させるプログラムを編み出しました。それを利用して、とうとう問題解決に至りました。

 今回は、カーネルのメモリ管理の仕組みで不整合が発生していたそうです。Linuxカーネルのメモリはページ単位で管理されています。mmapされたメモリ領域においては、データ書き込みが発生したメモリのページは、msync命令(注)が発行された時点でディスクに書き込む必要があります。メモリ領域にアクセスが発生したことを管理しているのはCPUです。その情報をカーネル内部では複数個所で管理しており、その伝播がうまくいっていなかったのが問題だったそうです。

注:mmapでメモリに書き込んだ内容をディスク上に反映する命令。

 現象を整理すると、メモリサブシステムが、

set_page_dirtyを呼び、「メモリ領域をディスクに書き込む必要がある」とフラグを設定して指示するタイミング

と、ディスク書き込みルーチンが、

「メモリ領域をディスクに書き込む必要がある」と認識して書き込みを行い、フラグをクリアするタイミング

の整合が取れていない場合に問題が発生していたようです。この問題は2.6.20-rc3で修正されたようです。「2.6.18でも発生するのではないか」といううわさが流れましたが、調査の結果、Debian独自のパッチが当たっている2.6.18カーネルでしか発生しないということでした。Debian独自のパッチの影響だったようです。

 そもそも発生しない方がよい問題ですが、影響範囲が2.6.19だけであまり深刻な問題とならず、何よりです。

-stableに付きまとう機能追加の誘惑

 12月は、Chris Wrightが2.6.18系と2.6.19系のアップデートをリリースしていました。ペースとしては、月例でパッチが出ています。2.6.19がリリースされると、基本的には2.6.18のメンテナンスを終えています。

 一方、Adrian Bunkは相変わらず2.6.16のメンテナンスをしています。Adrian BunkはPCI quirkのアップデートをするというメールを出しました。一部のPCI quirkは、適用しても動作しないことが分かっているものもあります。新しいデバイスに対応するような変更を加えることに対しては、賛否両論でした。Linusは、「2.6.x.yリリースに関しては、リグレッション(regression)が発生せず、安心して使えることが大切なのだ」と指摘。さらに、「問題が100%把握できていない場合は解決しようとしてはならない」としました。

 新しいデバイスも使えるようにしておく方が便利なのは分かりますが、今後の方向性が気になります。

  • 2.6.18.5(12月1日)
    ・FUSEでのoopsの修正
    ・AGPページをGFP_DMA32で確保するのをデフォルトにする
    ・IA64でコピー命令bte_unaligned_copy()がキャッシュライン1つ分余分にコピーするのを修正
     など23パッチ
  • 2.6.18.6(12月16日)
    ・Core2とnetburstでRDTSCの当期実行の扱いが違うことに対応
    ・BluetoothのCAPIメッセージのサイズを確認する(CVE-2006-6106)
    ・m32rのコンパイルエラーの修正
    など25パッチ
  • 2.6.19.1(12月11日)
    ・do_coredump()のセキュリティホール(CVE-2006-6304)
    ・m32rのコンパイルエラーの修正
    ・softirqでBUG_ONが間違って発生する事象の修正
    など33パッチ
  • 2.6.16.35(12月7日)
    ・net/bridgeのget_fdb_entriesのオーバフロー(CVE-2006-5751)
    ・cpqarray/ccissでiostatが動作するパッチ
    ・16Tbytes以上のJFSボリュームでのバグの修正
    など34パッチ
  • 2.6.16.36(12月14日)
    ・問題が発生したので、2.6.16.17で追加したquirk_via_irqを元に戻す
    ・ICH7/8 ACPI/GPIO io resource quirksを追加
    ・1022:7450(AMD 8131 Bridge)のPCI IDのデバイスの名前を修正
    など12パッチ
  • 2.6.16.37(12月27日)
    ・nfs_lookup:ルックアップをしない場合には、dentryのハッシュをしない
    ・sata_nv:PCI IDの追加
    ・dm:oopsの修正など
    など43パッチ

(以上、敬称略)

2/2

Index
Linux Kernel Watch 1月版
 ext3でデータが破損!? メモリ管理で不整合
  Page 1
 カーネル2.6.20始動、その開発方針は?
 仮想化機能KVMとlhype、鋭意開発中
 ペンギンはバイナリモジュールの夢を見るか?
Page 2
 ext3でデータが壊れる!?
 -stableに付きまとう機能追加の誘惑

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間