mishimaの日記: 古いカーネルで最新のDebianを動かす
lxc や chroot 等で Debian を動かす状況はあるかと思う。
最近までは Debian の glibc は最適化をそれほどしていなかったため、けっこう問題なく動いていた。
ところが wheezy 以降ではきっちり最適化をしており、wheezyのカーネルとして使用している「2.6.26」以前の、古いカーネル上では動かなくなってしまっている。
libc の debian/changelog の該当部分はこうなってる。
* debian/sysdeps/*.mk, debhelper.in/libc.preinst: bump minimal Linux
kernel version to 2.6.26, and minimal FreeBSD kernel version to
8.0.0. Closes: #610475.
やりとりの詳細はここ。
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=610475
さて、古いカーネルでもなんとかなるようにするには次のように変更が必要だ。
apt-get source libc6
cd eglibc-2.13
grep '2\.6\.26' **/*
# ↑これで debian/sysdeps/linux.mk debian/debhelper.in/libc.preinst を修正すればいいことがわかる
vi debian/sysdeps/linux.mk debian/debhelper.in/libc.preinst
# 2\.6\.26 の部分を好きな版に修正する
debuild
これでいい…はずなんだけど、これだけだと Apache が動かない…
(sycall socket でSOCK_CLOEXECを使っていて、これが古いカーネルだとサポートされてないから)
libc 内の socket() を書き換えて、SOCK_CLOSEXEC が設定されていたらこれを外しで syscall socket し、直後に fcntl すればいいんだけどめんどくさい…
( http://www.gcd.org/blog/2009/12/181/ をみるとそれだけじゃダメみたいだし )
古いカーネルで最新のDebianを動かす More ログイン