少し古い話題ですが、メモを掘り起こしておきます。
(ぼちぼち補完しましたが、メモが古いので若干乱れがある点はご容赦を)
Debian SqueezeでXENを構築する上で、俺が知る限りカーネル再構築に関わる問題が2つあるので、その問題についてと再構築手順について記します。
Squeeze XENが抱える問題点
208日問題
詳しくはこちらに書かれているので参考にしていただくとして、要点は、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数によって異なり、確認した分ですと
となっているため、amd64機で128GB積んでいても32GBになってしまいます。
この2点を改善するためにXENカーネルを再構築します。
XENカーネルの再構築
コンパイルするカーネルバージョン
メモにとった時期が少し古いですが、元のXENパッケージはこの2つで、linux-imageを同バージョン再構築することで対応し、Hypervisorはそのままとします。基本ポリシーとして、Debianから正式に出たバージョン以外は扱わないものとしています。そのため、2.6.32より上のバージョンを使ってさらにHypervisorも再構築したり、Gentoo Linuxを採用したり、といったことはしません。
コンパイルに必要なパッケージ
インストールしておきます。
1 |
apt-get install kernel-package linux-patch-debian-2.6.32 libncurses5-dev gawk |
カーネルソースを取得
現行XENカーネルをダウンロードします。
1 2 3 4 5 6 7 8 9 10 11 |
cd /usr/local/src mkdir SOURCE_linux-image-2.6.32-5-xen-amd64 chmod -s SOURCE_linux-image-2.6.32-5-xen-amd64 cd SOURCE_linux-image-2.6.32-5-xen-amd64 apt-get source linux-image-2.6.32-5-xen-amd64 cd ../ cp -Rp SOURCE_linux-image-2.6.32-5-xen-amd64/linux-2.6-2.6.32 SOURCE_linux-image-2.6.32-5-xen-amd64/linux-2.6.32 mv SOURCE_linux-image-2.6.32-5-xen-amd64/linux-2.6.32 ./ cd linux-2.6.32/ |
基本パッチ
下記を実行することで 2.6.32-38 までのパッチを適用しています。(最新の場合は2.6.32-45まで)
1 |
python ./debian/bin/patch.apply |
さらにXENのパッチを適用します。
1 |
patch -p1 -i ./debian/patches/features/all/xen/pvops.patch |
最後に208日問題の諸悪の根源である timer.h にパッチを当てます。
内容は改善済みの 2.6.32.54 との diff となっています。
../patch_linux-2.6.32_timer.h.patch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
--- linux-2.6.32/arch/x86/include/asm/timer.h 2009-12-03 12:51:21.000000000 +0900 +++ linux-2.6.32.54/arch/x86/include/asm/timer.h 2012-01-13 04:53:50.000000000 +0900 @@ -38,6 +38,22 @@ * (mathieu.desnoyers@polymtl.ca) * * -johnstul@us.ibm.com "math is hard, lets go shopping!" + * + * In: + * + * ns = cycles * cyc2ns_scale / SC + * + * Although we may still have enough bits to store the value of ns, + * in some cases, we may not have enough bits to store cycles * cyc2ns_scale, + * leading to an incorrect result. + * + * To avoid this, we can decompose 'cycles' into quotient and remainder + * of division by SC. Then, + * + * ns = (quot * SC + rem) * cyc2ns_scale / SC + * = quot * cyc2ns_scale + (rem * cyc2ns_scale) / SC + * + * - sqazi@google.com */ DECLARE_PER_CPU(unsigned long, cyc2ns); @@ -47,9 +63,14 @@ static inline unsigned long long __cycles_2_ns(unsigned long long cyc) { + unsigned long long quot; + unsigned long long rem; int cpu = smp_processor_id(); unsigned long long ns = per_cpu(cyc2ns_offset, cpu); - ns += cyc * per_cpu(cyc2ns, cpu) >> CYC2NS_SCALE_FACTOR; + quot = (cyc >> CYC2NS_SCALE_FACTOR); + rem = cyc & ((1ULL << CYC2NS_SCALE_FACTOR) - 1); + ns += quot * per_cpu(cyc2ns, cpu) + + ((rem * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR); return ns; } |
patchを当てます。
1 |
patch -p1 -i ../patch_linux-2.6.32_timer.h.patch |
CONFIG調整
既存のカーネル設定を持ってきます。
1 |
cp /boot/config-2.6.32-5-xen-amd64 ./.config |
新旧の帳尻合わせをします。今回は全部Enterします。
1 |
make oldconfig |
設定変更をします。
1 |
make menuconfig |
変更内容は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Dom0のメモリ認識最大値GB Processor type and features ---> Paravirtualized guest support ---> (1024) Maximum allowed size of a domain in gigabytes # 不要サービス削除(特に Wireless はコンパイルでエラーになったため) Networking support (NET [=y]) Wireless (WIRELESS [ ]) WiMAX Wireless Broadband support [ ] Device Drivers Network device support (NETDEVICES [=y]) Wireless LAN (WLAN [ ]) [ ] ISDN support Kernel Hack ---> Kernel Debugging OFF |
CONFIG_XEN_MAX_DOMAIN_MEMORY などの設定を確認します。
1 |
less ./.config |
コンパイル実行
実行前にCPUの並列処理数を指定します。
1 |
export CONCURRENCY_LEVEL=16 |
指定なし(=1) で 65分
4 で 19分
16 で 11分
コンパイルを実行します。
1 2 3 4 |
time PATCH_THE_KERNEL=YES make-kpkg \ --initrd \ --append_to_version -5-xen-amd64-drecom --revision 2.6.32drecom1 \ kernel_image kernel_headers modules_image |
1階層上にできたdebファイルをインストールするサーバや、PrivateなAPTサーバに持っていきます。
インストール
今回はDom0へ直接debでインストールします。
1 2 |
cd /usr/local/src dpkg -i linux-image-2.6.32-5-xen-amd64-drecom1_2.6.32drecom1_amd64.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ドライバについてもやったら次はそれにしようかな。