2007年04月19日
_ [Ubuntu] カーネルの再構築をして嵌る
ソースを取ってくる。
$ sudo apt-get install linux-source $ cd /usr/src $ sudo tar jxvf linux-source-2.6.20.tar.bz2 $ sudo ln -s linux-source-2.6.20 linux $ cd /usr/src/linux
どんなカーネルにするか決める。
$ sudo cp /boot/config-2.6.20-15-generic .config $ sudo make oldconfig $ sudo make menuconfig
ここで、自分の環境に合わせてCPUの種類やら何やらを決める。Ubuntuのカーネルは様々な環境で動くように沢山のオプションが有効になっているので、いらんものは片っ端から無効にする。
CPU Frequency scaling、PCI Hotplug、APM、ARCnet、ISDN、Dallas's 1-wire bus、OSS、などなど。
迷ったのはCONFIG_HZの値。Ubuntuでは250。同じじゃ面白くないし、1000だと負荷が高くなりそうなので300にした。
終わったらパッケージを作る。
$ sudo make-kpkg clean $ sudo make-kpkg --initrd --revision=hoge01 kernel_image kernel_headers $ cd .. $ sudo dpkg --install *.deb
再起動して、新しいカーネルを選んで立ち上げると、無事起動するのでホッとする。
んで、たまに使うVMware Playerのためのカーネルモジュールを作る。
$ sudo apt-get install vmware-player-kernel-source $ cd /usr/src $ tar jxvf linux-source-2.6.20.tar.bz2 $ cd /usr/src/linux $ sudo make-kpkg --revision=hoge01 modules_image
とやればパッケージができる、筈なのだが、、、
make[2]: ディレクトリ `/usr/src/modules/vmware-player-kernel' に入ります
echo '# NOTE: THIS FILE IS AUTO-GENERATED FROM control.modules.in.in' > \
debian/control.modules.in
sed -e 's/@@KVERSION@@/2.6.15/g' \
-e 's/@@ABIVER@@/2.6.15-23/g' \
debian/control.modules.in.in >> debian/control.modules.in
if [ "" ]; then \
echo '# NOTE: THIS FILE IS AUTO-GENERATED FROM control.in' > \
debian/control; \
sed -e 's/@@KVERSION@@/2.6.15/g' \
-e 's/@@ABIVER@@/2.6.15-23/g' \
debian/control.in >> debian/control ; \
fi
dh_testdir
dh_testdir: cannot read debian/control: No such file or directory
make[2]: *** [clean] エラー 1
make[2]: ディレクトリ `/usr/src/modules/vmware-player-kernel' から出ます
make[1]: *** [kdist_build] エラー 2
make[1]: ディレクトリ `/usr/src/modules/vmware-player-kernel' から出ます
Module /usr/src/modules/vmware-player-kernel failed.
となってしまい失敗する。
vmware-player-kernel-source.tar.bz2を適当な場所に展開して、手動でmakeするもエラーでコンパイルできない。
VMwareのサイトからVMware-player-1.0.3-34682.tar.gzを落としてmakeすると、vmnetは警告は出るもののなんとかmakeは通るが、vmmonは駄目。
こんな感じ。
Using 2.6.x kernel build system. make -C /lib/modules/2.6.20.3-ubuntu1/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules `-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead. `-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead. make[1]: ディレクトリ `/usr/src/linux-source-2.6.20' に入ります CC [M] /home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/linux/driver.o In file included from /home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/linux/driver.c:80: /home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/./include/compat_kernel.h:21: error: expected declaration specifiers or ‘...’ before ‘compat_exit’ /home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/./include/compat_kernel.h:21: error: expected declaration specifiers or ‘...’ before ‘exit_code’ /home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/./include/compat_kernel.h:21: 警告: type defaults to ‘int’ in declaration of ‘_syscall1’ make[2]: *** [/home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only/linux/driver.o] エラー 1 make[1]: *** [_module_/home/hogehoge/download_files/vmware-player-distrib/lib/modules/source/vmmon-only] エラー 2 make[1]: ディレクトリ `/usr/src/linux-source-2.6.20' から出ます make: *** [vmmon.ko] エラー 2
解決方法を発見。
vmmon-only/include/compat_kernel.hを
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) static inline _syscall1(int, compat_exit, int, exit_code); +#endif
な感じに修正するといいらしい。
なんとかvmmon.oとvmnet.oができたので
$ sudo mkdir /lib/modules/2.6.20.3-ubuntu1/misc/ $ sudo cp vmmon.o vmnet.o /lib/modules/2.6.20.3-ubuntu1/misc/ $ sudo depmod -a $ sudo modprobe vmmon FATAL: Module vmmon not found.
orz
手で、 modules.depに
/lib/modules/2.6.20.3-ubuntu1/misc/vmmon.o: /lib/modules/2.6.20.3-ubuntu1/misc/vmnet.o:
modules.symbolsに
alias symbol:VMX86_RegisterMonitor vmmon
と書けばいいのだがなんだか腑に落ちない。
小一時間ほど検索しまくったり、うーーーんと悩んでふと気づく。
$ cd /lib/modules/2.6.20.3-ubuntu1/misc/ $ sudo mv vmmon.o vmmon.ko $ sudo mv vmnet.o vmnet.ko $ sudo depmod -a $ sudo modprobe vmmon $
・・・。
