2014-07-25

Linuxカーネルのバグをgit bisectで特定する話

Odd Bits - Tracking down a kernel bug with git bisect

Linuxカーネルのバージョンを3.15に上げたところ、Docker内でのsuやrunuserが謎のシステムエラーで動かなくなった。カーネルのバージョンを3.14に下げると問題なく動作する。明らかにカーネルが影響を及ぼしている。

よろしい、ならばgit bisectだ。git bisectは良いコミットと悪いコミットの間をバイナリサーチして、問題を引き起こしたコミットを見つけてくれる。

しかし、Linuxカーネル3.14と3.15の間には、約15000件のコミットがあるので、git bisectを手動で回すのは現実的ではない。

git bisectには、自動化のための仕組み、git bisect runがある。これは、コミットをチェックアウトした後に、自動でスクリプトを実行して、現在のコミットが良いか悪いか判断してくれる。したがって、自動化するスクリプトさえ書けば、あとは自動でgit bisectを走らせておけるはずだ。

とはいえ、結構面倒だったという。

まず、コミットが良いか悪いか判断するには、現在のコミットのLinuxカーネルをコンパイルして、実行して、Dockerを実行できるほどには構築されたシステムを立ち上げ、Dockerを実行してその中でテストを実行し、その結果を何とかしてビルド環境まで伝えなければならない。docker pullも行うので、ネットワークも必要だ。

元記事の筆者は、何とかしてその自動化環境を作り上げた。

さて、しばらく実行すると、git bisectは悪いコミットを特定したのだが、残念ながら、そのコミットは多数の変更を含むマージコミットだった。確かに、問題をもたらしたコミットには違いないのだが、まだ本当のコミットを特定できたわけではない。

そんなわけで、そのマージに含まれるコミットに対してさらにgit bisectをかけると、問題のコミットが見つかった。

問題の詳細としては、これはユーザースペースのソフトウェアの挙動に変化をもたらすものではあるが、権限の有無の問題であるので、Docker側を直すほうが望ましいとのことらしい。

ドワンゴ広告

この記事はドワンゴ勤務中に書かれた。

N4036があまりにも読みづらい自己満足レイアウトを利用しているので読む意欲が保てず、気分転換に最近読んで面白かった記事を紹介した次第。

そういえば、Ubuntuにはrunuserがないのだな。suで代用できるか。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

3 comments:

  1. N4036を見てみましたが、極一般的な雑誌スタイルでした。
    良かったら、どのあたりを自己満足レイアウトだと思ったのか教えてください。
    私はこのレイアウトに親しみ過ぎて、欠点が見えていません。多くの研究者たちもそうでしょう。

    ReplyDelete
  2. アカデミックな研究論文とかペーパーでよく見かける普通の2列の段組だね。
    標準化委員には暗黙のしきたりがあるのでしょう。

    ReplyDelete
  3. あの書式は紙に印刷すると読みやすいけど、モニタに映して読むのはしんどいですな。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.