SqueezeでXENカーネルの再構築 for 208日問題+メモリ制限解除

少し古い話題ですが、メモを掘り起こしておきます。
(ぼちぼち補完しましたが、メモが古いので若干乱れがある点はご容赦を)

Debian SqueezeでXENを構築する上で、俺が知る限りカーネル再構築に関わる問題が2つあるので、その問題についてと再構築手順について記します。



Squeeze XENが抱える問題点

208日問題

詳しくはこちらに書かれているので参考にしていただくとして、
  • okkyの銀河制圧奇譚: sched_clock() overflow after 208.5 days in Linux Kernel

  • 要点は、Kernel 2.6.28 ~ 2.6.32.49 までを利用した環境では、継続起動時間(uptime)が208日を過ぎたOSは突然再起動する可能性がある というものです。今回はXENカーネルを対象に説明しますが、通常カーネルも対応しておいた方がよいので、なるべく早くメンテ入れたりフロントから外して適用しましょう。

    仮想環境のメモリ制限

    lennyまでのXENカーネルにはなかったのですが、squeeze以降からカーネル設定 CONFIG_XEN_MAX_DOMAIN_MEMORY (GB) があり、この設定がDom0, DomU両方におけるメモリ認識の最大値となっています。

    そのデフォルト値はカーネルやOSのbit数によって異なり、確認した分ですと
  • 2.6.32 : 32bit = 8 GB (※最新は 32 GB)
  • 2.6.32 : 64bit = 32 GB (※最新は 70 GB)
  • 2.6.38 : 128 GB

  • となっているため、amd64機で128GB積んでいても32GBになってしまいます。
    この2点を改善するためにXENカーネルを再構築します。

    XENカーネルの再構築

    コンパイルするカーネルバージョン

    メモにとった時期が少し古いですが、元のXENパッケージはこの2つで、linux-imageを同バージョン再構築することで対応し、Hypervisorはそのままとします。
  • linux-image-2.6.32-5-xen-amd64 (2.6.32-31)
  • xen-hypervisor-4.0-amd64 (4.0.1-2)

  • 基本ポリシーとして、Debianから正式に出たバージョン以外は扱わないものとしています。そのため、2.6.32より上のバージョンを使ってさらにHypervisorも再構築したり、Gentoo Linuxを採用したり、といったことはしません。

    コンパイルに必要なパッケージ

    インストールしておきます。

    カーネルソースを取得

    現行XENカーネルをダウンロードします。
  • わざわざ作業用に cp -Rp しているのは、何度も試行するからです(失敗したら削除してまたコピー)
  • chmod -s によって、group s-bit の無い環境を用意しています。これがあると最後の .deb ファイルの作成に失敗します
  • 速度の速いパーティションがあれば作業ディレクトリを変更してください
  • 基本パッチ

    下記を実行することで 2.6.32-38 までのパッチを適用しています。(最新の場合は2.6.32-45まで)

    さらにXENのパッチを適用します。

    最後に208日問題の諸悪の根源である timer.h にパッチを当てます。
    内容は改善済みの 2.6.32.54 との diff となっています。
    ../patch_linux-2.6.32_timer.h.patch

    最新パッケージには ./debian/patches/bugfix/all/stable/2.6.32.50.patch に上記を含むパッチが存在するようです。何をどこまで当てるかはお好みで。

    patchを当てます。

    CONFIG調整

    既存のカーネル設定を持ってきます。

    新旧の帳尻合わせをします。今回は全部Enterします。

    設定変更をします。

    変更内容は以下の通りです。

    CONFIG_XEN_MAX_DOMAIN_MEMORY などの設定を確認します。

    コンパイル実行

    実行前にCPUの並列処理数を指定します。

    スレッド数は多いほうが速いので、その環境のCPUスレッド数を指定するのがよいです。参考速度は8core 16threadの環境で
      指定なし(=1) で 65分
      4 で 19分
      16 で 11分

    コンパイルを実行します。
  • PATCH_THE_KERNEL は自動でパッチを当てるらしいですが今回はいらなかったかも
  • –initrd をつけると /boot/initrd.img-*** をパッケージに含んでくれます(あとでmkinitrdを実行する必要がない)
  • timeでついでに時間を計ります
  • –append_to_version で現行カーネル名と合わせつつ重複しないように+αをつけています。公式と同じ名前はオススメしません
  • –revision はパッケージにそれらしいバージョン名をつけています
  • もし、完全に編集をリセットすることなく再度コンパイルする場合はmake-kpkg cleanを実行してからまたmake-kpkgを実行します。

    1階層上にできたdebファイルをインストールするサーバや、PrivateなAPTサーバに持っていきます。

    インストール

    今回はDom0へ直接debでインストールします。

    自動的にupdate-grubが実行されるので、grub-legacy ならmenu.lstを、grub-pcなら /etc/grub.d/ 当たりを確認して、該当カーネルが一番上になるように編集します。

    最後に再起動して祈ります。
    無事に起動したら、uname -a や free を見てニコニコします。

    成功したら、32GB以上にしたいDomUにもインストールして一度DomUをshutdownし、Dom0上のDomU用設定.cfgの kernel指定を新しいものにしてから xm create すると、DomUでも上限が開放されます。



    とまぁ書き写しながら現行バージョンの様子が気になって見てみるとちょこちょこ変わってて補完がめんどくさったです。。が、Wheezyはまだ先だし、XENじゃなくても普通に再コンパイルするのに役立つだろうことを願って。

    この辺やったとき、ioDriveドライバについてもやったら次はそれにしようかな。