2009年6月17日水曜日

Ubuntu で kernel をソースコードからビルドする (make-kpkg 編)

最新の Linux kernel を利用するには、ソースからビルドするしかありません。
Ubuntu でそれをやる場合、Fedora とは違う作法があるようです。

1. kernel ソースを kernel.org からダウンロードします。
(2009/06/17 時点の最新版は 2.6.30)

2. ダウンロードしたソースを展開します。

# cd /usr/src
# tar jxvf linux-2.6.30.tar.bz2

3. 今起動している kernel のコンフィグファイルを /boot/ ディレクトリからコピーします。

# cd linux-2.6.30/
# cp /boot/config-2.6.27-11-generic .config

4. make menuconfig を実行します。ここで設定を変えてもいいです。
(変えたいときだけ変える程度)

# make menuconfig

5. make-kpkg でビルドします (パッケージ管理するため)。

# make-kpkg --initrd kernel_image kernel_headers

※ make-kpkg の前に CONCURRENCY_LEVEL=2 を付けると、処理の並列化が図れます。

# CONCURRENCY_LEVEL=2 make-kpkg --initrd kernel_image kernel_headers

※ kernel-package が無い場合はインストールしておきます。
# apt-get install kernel-package

6. 一つ上のディレクトリに deb ファイルが作成されるのでインストールします。
(この deb ファイルを配ると、他のメンバーのビルドの手間が省けます)

# cd ..
# dpkg -i linux-image-2.6.30_2.6.30-10.00.Custom_i386.deb
# dpkg -i linux-headers-2.6.30_2.6.30-10.00.Custom_i386.deb

7. grub の設定を変更します。

# vi /boot/grub/menu.lst
大抵の場合 default 0 に設定すれば、インストールしたカーネルで起動します。

■ 2009/08/04 追記

カーネル Ver.2.6.30.3 で運用中に、Ver.2.6.30.4 とかにアップデートしようとすると、
下記のエラーが出て、アップデートできません。

# dpkg -i linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb
Selecting previously deselected package linux-image-2.6.30.4.
(Reading database ... 147376 files and directories currently installed.)
Unpacking linux-image-2.6.30.4 (from linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb) ...
Done.
dpkg: error processing linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb (--install):
 trying to overwrite `/lib/firmware/av7110/bootcode.bin', which is also in package linux-image-2.6.30.3
dpkg-deb: subprocess paste killed by signal (Broken pipe)
Running postrm hook script /sbin/update-grub.
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.30.3
Found kernel: /boot/vmlinuz-2.6.24-19-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done

Errors were encountered while processing:
 linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb

こんなときは、運用中のパッケージを削除してから、インストールします。
※ これをやるときは、かならず起動できるカーネルイメージを 1 つは残してからやること。
※ インストールしたカーネルが起動しなかったときは、残しておいたカーネルで一旦起動してから、復旧させる必要があります。

途中、Do you want to abort removal now? と聞かれますが、
No を選択します。

# dpkg -r linux-image-2.6.30.3
(Reading database ... 147375 files and directories currently installed.)
Removing linux-image-2.6.30.3 ...
Ok, proceeding with removing running kernel image.
Running postrm hook script /sbin/update-grub.
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.24-19-generic
Found kernel: /boot/memtest86+.bin
Replacing config file /var/run/grub/menu.lst with new version
Updating /boot/grub/menu.lst ... done

The link /vmlinuz is a damaged link
Removing symbolic link vmlinuz
Unless you used the optional flag in lilo,
 you may need to re-run your boot loader[lilo]
The link /initrd.img is a damaged link
Removing symbolic link initrd.img
Unless you used the optional flag in lilo,
 you may need to re-run your boot loader[lilo]

■ Do you want to abort removal now?
 → No を選択

そのあとで、インストールします。

# dpkg -i linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb
(Reading database ... 144924 files and directories currently installed.)
Unpacking linux-image-2.6.30.4 (from linux-image-2.6.30.4_2.6.30.4-10.00.Custom_i386.deb) ...
Done.
Setting up linux-image-2.6.30.4 (2.6.30.4-10.00.Custom) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Running postinst hook script update-grub.
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.30.4
Found kernel: /boot/vmlinuz-2.6.24-19-generic
Found kernel: /boot/memtest86+.bin
Replacing config file /var/run/grub/menu.lst with new version
Updating /boot/grub/menu.lst ... done

■ 2009/09/25 追記

make-kpkg 実行時に、CONCURRENCY_LEVEL を設定することで、並列処理が図れることを追記。

■ 2011/03/30 追記

カーネル Ver.2.6.38.2 をビルドする時に下記のエラーが出ました。

The UTS Release version in include/linux/version.h
    ""
does not match current version:
    "2.6.38.2"
Please correct this.
make: *** [install/linux-image-2.6.38.2] Error 2

この手のエラーが出た時は、下記を実行して再ビルドすれば OK。

# cp include/generated/utsrelease.h include/generated/compile.h include/linux/
● kernel, build

0 件のコメント: