mdadmのヤバそうなバグのCentOSにおける修正状況
はじめに
Ubuntu 16.04のmdadmには、所定の条件を満たすとユーザのデータをぶっ壊すという恐ろしいバグがあります。具体的には次の記事の"バグ1"のことです。
Ubuntuについては一応回避策もありますし、そのうち修正されるでしょうが、「そういえばこれ、CentOSではどうなってるんだろう」と気になったので、CentOS 6.9と7.4についてこのバグの有無を調べてみました。
調査結果
注意: これと同じことがCentOSのクローン元のRHELに当てはまるかどうかは知りません。気になる人はご自身で確認した上で対処してください。間違ってもRed Hat社に「このブログにCentOS 6.9のmdadmに問題があると書いてたからRHELのmdadmを直して」などと言わないようにしてください。Red Hat社にとってはCentOSにバグがあろうとなかろうと「知らんがな」なので。
調査ログ
このバグが存在するかどうかは実機確認すれば一発でわかるのですが、せっかくなのでソースからバグの有無を調査する手順を載っけときます。
CentOS 6.9
まずはソースパッケージのバージョンを次のサイトから調べました。
Index of /6.9/os/Source/SPackages
その中で次の行が見つかりました。
mdadm-3.3.4-8.el6.src.rpm
続いてこのソースrpmをダウンロード&インストールしてソース調査しました。このパッケージの元になっているのはファイル名からわかる通り、upstreamのバージョン3.3.4です。このバージョンは、この問題の修正がまだ適用されていないものです。
さて、これでアウトかと言うと違います。なぜかというと、CentOSなどのディストリビュータが提供するパッケージはupstreamのものにdistro固有のパッチがいくつか当たっていることがあり、それらパッチによって修正されている可能性があるからです。
mdadmのspecファイルを見ると、いくつか独自パッチが当たっていることがわかりました。
... Patch1: mdadm-3.3.4-imsm-don-t-call-abort_reshape-in-imsm_manage_reshape.patch Patch2: mdadm-3.3.4-Grow-close-file-descriptor-earlier-to-avoid-still-in.patch Patch3: mdadm-3.3.4-imsm-abort-reshape-if-sync_action-is-not-reshape.patch Patch4: mdadm-3.3.4-imsm-use-timeout-when-waiting-for-reshape-progress.patch Patch5: mdadm-3.3.4-imsm-don-t-update-migration-record-when-reshape-is-i.patch Patch6: mdadm-3.3.4-Grow-Add-documentation-to-abort_reshape-for-suspend_.patch Patch7: mdadm-3.3.4-super-intel-ensure-suspended-region-is-removed-when-.patch Patch8: mdadm-3.3.4-Grow-close-fd-earlier-to-avoid-cannot-get-excl-acces.patch Patch9: mdadm-3.3.4-Introduce-stat2kname-and-fd2kname.patch Patch10: mdadm-3.3.4-IMSM-retry-reading-sync_completed-during-reshape.patch Patch11: mdadm-3.3.4-The-sys_name-array-in-the-mdinfo-structure-is-20-byt.patch Patch12: mdadm-3.3.4-imsm-add-handling-of-sync_action-is-equal-to-idle.patch Patch13: mdadm-3.3.4-imsm-properly-handle-values-of-sync_completed.patch Patch14: mdadm-3.3.4-Incremental-don-t-try-to-load_container-for-a-subarr.patch Patch15: mdadm-3.3.4-Allow-level-migration-only-for-single-array-containe.patch Patch16: mdadm-3.3.4-imsm-set-generation-number-when-reading-superblock.patch Patch97: mdadm-3.3.2-disable-ddf.patch Patch98: mdadm-3.3.2-udev.patch Patch99: mdadm-3.3-makefile.patch ...
これらのパッチを全部当てた状態のソースを調査しても、バグは修正されていないことがわかりました。つまり、CentOS 6.9は結局アウト。
CentOS 7.4
6.9の場合と同様に、まずはソースパッケージのバージョンを確認しました。
Index of /7.4.1708/os/Source/SPackages
その結果、次のバージョンを使用していることがわかりました。
mdadm-4.0-5.el7.src.rpm
次はこのソースパッケージの調査です。ダウンロード&インストールすると、upstreamのmdadm 4.0がベースとなっていることがわかりました。このバージョンは、バグが修正されているものです。では、これでセーフ確定かというとそうではありません。CentOS固有パッチによってregressionを起こして、またバグが復活している可能性がわずかに残っています。このため、全パッチを適用した上でソース確認しました。確認の結果は問題なかったので、7.4はセーフ。