ほとまるブログ

おっぱいアニメ愛好家のブログ (゚∀゚)o彡゜おっぱい!おっぱい!

vanillaカーネルをビルドしてみる

kernel.org でソースを配布しているカーネルは vanilla カーネルというらしい
意味は知らんがなw
特に、新しいハードウェアを購入したとかいう訳ではないけど、最新のカーネルを使ってみたい(嘘)

ビルド環境

Debian squeeze (debian64 2.6.32-5-amd64)

ツールのインストール

カーネルパッケージを作る make-kpkg と、make menuconfig で使う ncurses が必要

$ sudo apt-get install kernel-package libncurses5-dev

カーネルソース取得

本家( http://www.kernel.org/ )をみると、Latest Stable Kernel: 2.6.38.3
なので、それでやってやるですwww
作業用ディレクトリを作ってソースをダウンロードする

$ mkdir build && cd build
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.38.3.bz2

展開する

$ tar xf linux-2.6.38.3.tar.bz2 
$ cd linux-2.6.38.3/

パッチをダウンロードして、パッチ当てる
面倒なので、パッチは[Enter]押しっぱなしw

$ wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.38.3.bz2
$ bzip2 -d patch-2.6.38.3.bz2 
$ patch -p1 < patch-2.6.38.3

カーネルのコンフィグ

とりあえず、現在の設定をコピー

$ cp /boot/config-2.6.32-5-amd64 .config

現在のコンフィグを流用。

面倒なんで、とりあえず[Enter]押しっぱなし
$ make oldconfig
適当に設定を変える(とりあえず変えなかったw)
$ make menuconfig

カーネルビルド

$ make-kpkg clean
$ fakeroot make-kpkg --initrd --revision=20110419a kernel-image

エラー発生

drivers/media/video/uvc/uvc_driver.c: In function ‘uvc_scan_chain_entity’:
drivers/media/video/uvc/uvc_driver.c:1275: error: duplicate case value
drivers/media/video/uvc/uvc_driver.c:1267: error: previously used here
drivers/media/video/uvc/uvc_driver.c:1276: error: duplicate case value
drivers/media/video/uvc/uvc_driver.c:1268: error: previously used here
drivers/media/video/uvc/uvc_driver.c:1277: error: duplicate case value
drivers/media/video/uvc/uvc_driver.c:1269: error: previously used here
make[5]: *** [drivers/media/video/uvc/uvc_driver.o] Error 1
make[4]: *** [drivers/media/video/uvc] Error 2
make[3]: *** [drivers/media/video] Error 2
make[2]: *** [drivers/media] Error 2
make[1]: *** [drivers] Error 2

試しに、ソース確認

$ vi drivers/media/video/uvc/uvc_driver.c
   1267         case UVC_OTT_VENDOR_SPECIFIC:
   1268         case UVC_OTT_DISPLAY:
   1269         case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
   1270                 if (uvc_trace_param & UVC_TRACE_PROBE)
   1271                         printk(" OT %d", entity->id);
   1272 
   1273                 break;
   1274 
   1275         case UVC_OTT_VENDOR_SPECIFIC:
   1276         case UVC_OTT_DISPLAY:
   1277         case UVC_OTT_MEDIA_TRANSPORT_OUTPUT:
   1278                 if (uvc_trace_param & UVC_TRACE_PROBE)
   1279                         printk(" OT %d", entity->id);
   1280 
   1281                 break;

同じcase文があるのが、原因ぽい・・・
1275から1281をコメントアウト

もう一度make

$ fakeroot make-kpkg --initrd --revision=20110419a kernel-image

今度は無事終わった

カーネルのインストール

makeしていたディレクトリの親にdebパッケージができているので、インストールする
そして再起動

$ cd ..
$ sudo dpkg -i linux-image-2.6.38.3_20110419a_amd64.deb 
Selecting previously deselected package linux-image-2.6.38.3.
(Reading database ... 150438 files and directories currently installed.)
Unpacking linux-image-2.6.38.3 (from linux-image-2.6.38.3_20110419a_amd64.deb) ...
Done.
Setting up linux-image-2.6.38.3 (20110419a) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 2.6.38.3 /boot/vmlinuz-2.6.38.3
dkms: running auto installation service for kernel 2.6.38.3:
      virtualbox-ose (3.2.10)...failed.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.38.3 /boot/vmlinuz-2.6.38.3
update-initramfs: Generating /boot/initrd.img-2.6.38.3
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-2.fw for module r8169
W: Possible missing firmware /lib/firmware/rtl_nic/rtl8168d-1.fw for module r8169
run-parts: executing /etc/kernel/postinst.d/pm-utils 2.6.38.3 /boot/vmlinuz-2.6.38.3
run-parts: executing /etc/kernel/postinst.d/update-notifier 2.6.38.3 /boot/vmlinuz-2.6.38.3
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 2.6.38.3 /boot/vmlinuz-2.6.38.3
Generating grub.cfg ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-2.6.38.3
Found initrd image: /boot/initrd.img-2.6.38.3
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
done

VirtualBox-OSEでエラー出てる
おそらく、2.6.38.3でVirtualBoxをビルドしないとダメだと思うので
とりあえずスルーして再起動

$ sudo reboot

再起動後のトラブル

GRUBで、一番上に追加されてるのでそのまま起動
何かエラー出たけど起動した

$ sudo cat /var/log/syslog |grep fail
localhost dkms_autoinstaller:   Build failed.  Installation skipped.
localhost kernel: [   13.980415] [drm] MTRR allocation failed.  Graphics performance may suffer.

VirtualBoxOSEでエラー

$ sudo cat /var/log/user.log |grep dkms
debian64 dkms_autoinstaller: virtualbox-ose (3.2.10): Installing module on kernel 2.6.38.3.
debian64 dkms_autoinstaller: (bad exit status: 10)
debian64 dkms_autoinstaller:   Build failed.  Installation skipped.

VirtualBoxはこの辺( http://ubuntuforums.org/archive/index.php/t-1673451.html ) 対応が書いてあったから、あとで・・・

MTRRでエラー

MTRRはこの辺( http://phoronix.com/forums/showthread.php?16940-bad-MTRR-setup-according-to-DRM )

CONFIG_X86_PAT=n
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1

とあるので

$ vi .config
-CONFIG_X86_PAT=y
-CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
+CONFIG_X86_PAT=n
+CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1

でリビルド

$ make clean
$ fakeroot make-kpkg --initrd --revision=20110419b kernel-image

さっきのをアンインストール

$ sudo dpkg -r linux-image-2.6.38.3_20110419a_amd64.deb 

新しいのをインストールして再起動

$ sudo dpkg -i ../linux-image-2.6.38.3_20110419b_amd64.deb 
$ sudo reboot

とりあえず再起動した
dmesgを確認

前回のdmesg
$ sudo cat /var/log/dmesg.0|grep MTRR
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000] MTRR variable ranges enabled:
[    4.155770] [drm] MTRR allocation failed.  Graphics performance may suffer.
今回のdmesg
$ sudo cat /var/log/dmesg|grep MTRR
[    0.000000] MTRR default type: uncachable
[    0.000000] MTRR fixed ranges enabled:
[    0.000000] MTRR variable ranges enabled:
[    0.000000] original variable MTRRs
[    0.000000] New variable MTRRs

大丈夫なようだ!

$ uname -a
Linux debian64 2.6.38.3 #3 SMP Wed Apr 20 20:15:32 JST 2011 x86_64 GNU/Linux

無事、2.6.38.3 に移行できた。
make menuconfig がほぼdefaultなので、あとでカスタマイズしよう