Linux Kernel
10.04 以降の大きな変更
一番大きい変更は server フレバーがなくなって、デスクトップ版と同じ generic カーネルだけになったこと。
もともとあった違いはここにまとまっているが、割り込み制御や I/O スケジューラーなどが異なっている。
server フレバーを自力でビルドする
ベストパフォーマンスのためにカーネルは自前でビルドすることにしましょう。
参考資料:
- https://help.ubuntu.com/community/Kernel/Compile
- http://blog.avirtualhome.com/compile-linux-kernel-3-2-for-ubuntu-11-10/
環境の準備
$ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo reboot (make sure the system is running the latest kernel) $ sudo apt-get install build-essential
カーネルソースをダウンロード
$ apt-cache search linux-image-3 virtual | sort | tail -1 | sed 's/-virtual.*$//' linux-image-3.2.0-25 $ sudo apt-get build-dep linux-image-3.2.0-25-generic $ apt-get source linux-image-3.2.0-25-generic
設定を編集
$ cd linux-3.2.0/debian.master/config/amd64 $ cp config.flavour.generic config.flavour.server $ vi config.flavour.server (change I/O scheduler from CFQ to deadline. Disable voluntary preemption.) $ cat config.flavour.server # CONFIG_DEFAULT_CFQ is not set CONFIG_DEFAULT_DEADLINE=y CONFIG_DEFAULT_IOSCHED="deadline" CONFIG_INTEL_IDLE=y CONFIG_NR_CPUS=256 CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set $ sed -i 's/^CONFIG_HZ=250/CONFIG_HZ=100/' config.common.amd64 $ cd .. $ vi config.common.ubuntu (Edit HZ like this) CONFIG_HZ_100=y # CONFIG_HZ_1000 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set $ cd ../.. $ chmod -R a+x debian/scripts/* $ ./debian/rules updateconfigs $ cd debian.master $ vi etc/getabis (append server flavour to amd64 arch like this) getall amd64 generic virtual server $ vi rules.d/amd64.mk (append server flavour to list of flavours like this) flavours = generic virtual server $ cp control.d/vars.generic control.d/vars.server $ vi control.d/vars.server (edit as you like) $ diff -u control.d/vars.generic control.d/vars.server --- control.d/vars.generic 2012-05-30 06:41:02.000000000 +0000 +++ control.d/vars.server 2012-05-30 07:02:14.952238628 +0000 @@ -1,6 +1,6 @@ arch="i386 amd64" -supported="Generic" -target="Geared toward desktop and server systems." +supported="Server" +target="Geared toward server systems." desc="=HUMAN= SMP" bootloader="grub-pc | grub-efi-amd64 | grub-efi-ia32 | grub | lilo (>= 19.1)" provides="kvm-api-4, redhat-cluster-modules, ivtv-modules, ndiswrapper-modules-1.9" $ cd ..
独自パッチを適用
LIO のパッチとか。
ビルド
$ fakeroot debian/rules clean $ skipabi=true skipmodule=true fakeroot debian/rules binary-indep (this will build kernel header package) $ DEB_BUILD_OPTIONS=parallel=8 skipabi=true skipmodule=true fakeroot debian/rules binary-server (this will build kernel image package) $ ls ../*.deb ../linux-doc_3.2.0-24.38_all.deb ../linux-headers-3.2.0-24_3.2.0-24.38_all.deb ../linux-headers-3.2.0-24-server_3.2.0-24.38_amd64.deb ../linux-image-3.2.0-24-server_3.2.0-24.38_amd64.deb ../linux-source-3.2.0_3.2.0-24.38_all.deb ../linux-tools-common_3.2.0-24.38_all.deb
インストール
$ sudo apt-get -y purge linux-image-$(uname -r) $ sudo apt-get autoremove --purge $ sudo dpkg -i linux-headers-*.deb linux-image-*.deb
バグ
BDI flusher threads stop working
ext4 ファイルシステムの遅延アロケーションと組み合わせてこれが起きると、 vm.dirty_expire_centisecs
が発生してしまう。
(通常 30 秒)経過してもダーティーページがフラッシュされず、永遠に空ファイルのままという現象
BDI flusher が止まる理由は kernel 2.6.36 以降での「最適化」によるものらしい。問題は、その後 dirty page
が発生したイベントを取り損ねてスレッドが起動しないことにあるようだ。手動で sync(1)
を呼べば BDI flusher
が起動するのは確認した。
c.f. R.I.P. pdflush (LKML)