Linux Kernel

10.04 以降の大きな変更

一番大きい変更は server フレバーがなくなって、デスクトップ版と同じ generic カーネルだけになったこと。
もともとあった違いはここにまとまっているが、割り込み制御や I/O スケジューラーなどが異なっている。 

server フレバーを自力でビルドする

ベストパフォーマンスのためにカーネルは自前でビルドすることにしましょう。

参考資料:

環境の準備

$ 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)