Fedora Core 3 Building Kernel from source code [ぱそ関係]
Fedora Core 3 の Kernel バイナリをソースコードから作ってみた。
元ネタは以下のURL。
http://download.fedora.redhat.com/pub/fedora/linux/core/3/i386/os/RELEASE-NOTES-en.html
http://www.mjmwired.net/resources/mjm-kernel-fc3.shtml
-------------------------
●Get the source code
http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3/SRPMS/
kernel-2.6.11-1.14_FC3.src.rpm
ちなみに FC4 以降だと @IT で紹介されてる yumdownloader が簡単そう。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/853downsrpm.html
-------------------------
●Install source code package.
[root@localhost]# rpm -ivh kernel-2.6.11-1.14_FC3.src.rpm ...
これで、Kernel.org のソースと Fedora Core で適用しているパッチがインストールされる。
こんな感じ。
[root@localhost]# cd /usr/src/redhat [root@localhost redhat]# ls BUILD RPMS SOURCES SPECS SRPMS [root@localhost redhat]# cd SOURCES/ [root@localhost SOURCES]# ls COPYING.modules genkey kernel-2.6.11-i586.config kernel-2.6.11-i586-smp.config kernel-2.6.11-i686.config kernel-2.6.11-i686-smp.config kernel-2.6.11-ia64.config kernel-2.6.11-ppc64.config kernel-2.6.11-ppc64iseries.config kernel-2.6.11-ppc.config kernel-2.6.11-ppc-smp.config kernel-2.6.11-s390.config kernel-2.6.11-s390x.config kernel-2.6.11-x86_64.config kernel-2.6.11-x86_64-smp.config linux-2.4.0-nonintconfig.patch linux-2.4.0-test11-vidfail.patch linux-2.6.0-compile.patch linux-2.6.0-exec-shield.patch linux-2.6.0-must_check.patch linux-2.6.0-sleepon.patch linux-2.6.10-compile-fixes.patch linux-2.6.10-crashdump-common.patch linux-2.6.10-crash-xen.patch linux-2.6.10-diskdump.patch linux-2.6.10-netdump.patch linux-2.6.10-periodic-slab-debug.patch linux-2.6.10-ppc-headerabuse.patch linux-2.6.10-revert-module-invalidparam.patch linux-2.6.10-scsi-blacklist.patch linux-2.6.10-usb-use_both_schemes.patch linux-2.6.10-x86_64-read-implies-exec32.patch linux-2.6.10-x86-tune-p4.patch linux-2.6.10-xen.patch linux-2.6.11-compile-fixes.patch linux-2.6.11-default-elevator.patch linux-2.6.11-devmem.patch linux-2.6.11-pwc.patch linux-2.6.11.tar.bz2 linux-2.6.11-tux.patch linux-2.6.11-vm-taint.patch linux-2.6.11-x86_64-pmdpud-race.patch linux-2.6.12-devmem.patch linux-2.6.1-s390-compile.patch linux-2.6.2-ppc64-build.patch linux-2.6.3-crash-driver.patch linux-2.6.3-ia64-build.patch linux-2.6.3-printopen.patch linux-2.6.3-sparc-addbzimage.patch linux-2.6.4-stackusage.patch linux-2.6.7-modsign-core.patch linux-2.6.7-modsign-crypto.patch linux-2.6.7-modsign-include.patch linux-2.6.7-modsign-ksign.patch linux-2.6.7-modsign-mpilib.patch linux-2.6.7-modsign-script.patch linux-2.6.8-devmem-xen.patch linux-2.6.8-execshield-vaspace.patch linux-2.6.8-execshield-xen.patch linux-2.6.8-lockd-racewarn2.patch linux-2.6.8-netconsole.patch linux-2.6.8-ppc64-netboot.patch linux-2.6.8-print-fatal-signals.patch linux-2.6.9-ide-cd-early-EOF.patch linux-2.6.9-ieee80211.patch linux-2.6.9-ipw2100.patch linux-2.6.9-ipw2200.patch linux-2.6.9-lockd-block-nosleep.patch linux-2.6.9-lockd-reclaims.patch linux-2.6.9-module_version.patch linux-2.6.9-net-airo-nullptr.patch linux-2.6.9-net-tr-irqlock-fix.patch linux-2.6.9-NFSD-non-null-getxattr.patch linux-2.6.9-s390-autoraid.patch linux-2.6.9-s390-qeth_hipersocket-fix.patch linux-2.6.9-s390-zfcp_port-fix.patch linux-2.6.9-scsi-advansys-enabler.patch linux-2.6.9-scsi-megaraid-legacy.patch linux-2.6.9-sha1.patch linux-2.6.9-spinlock-debug-panic.patch linux-2.6.9-vm-oomkiller-debugging.patch linux-2.6.9-x86_64-flexmmap.patch linux-2.6.9-xen-agpgart.patch linux-2.6.9-xen-compile.patch patch-2.6.11.7.bz2 [root@localhost SOURCES]#
-------------------------
●/usr/src/redhat/SPECS/ に移動して、オリジナルソースとパッチからコンパイルするためのパッチ適用済ソースを SRPM から生成する。
--target のオプションにはアーキを指定する。 これが正しくないと、ソースの生成の途中でエラーが出てうまくあてられないパッチがあるようだ。 ということでシステムのアーキを確認。
[root@localhost linux-2.6.11]# arch i686
ひきつづき、ソースの生成。
rpmbuld は rpm-build パッケージに入っているので、もしインストールされてなければ yum install rpm-build にてインストール。 コマンドはハイフンなし、パッケージはハイフンありでややこしい。
あと、gcc と redhat-rpm-config パッケージも Kernel ソースの rpmbuild 実行に必要なので同様にインストールしておく。(もしなかったら rpmbuild 実行時にインストールしろって言われる)
[root@localhost SPECS]# rpmbuild -bp --target=i686 /usr/src/redhat/SPECS/kernel-2.6.spec Building target platforms: i686 Building for target i686 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.45611 + umask 022 + cd /usr/src/redhat/BUILD + LANG=C + export LANG + unset DISPLAY + cd /usr/src/redhat/BUILD + rm -rf kernel-2.6.11 + /bin/mkdir -p kernel-2.6.11 + cd kernel-2.6.11 + /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.11.tar.bz2 + tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' ++ /usr/bin/id -u + '[' 0 = 0 ']' + /bin/chown -Rhf root . ++ /usr/bin/id -u + '[' 0 = 0 ']' + /bin/chgrp -Rhf root . + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + cd linux-2.6.11 + echo 'Patch #1 (patch-2.6.11.7.bz2):' Patch #1 (patch-2.6.11.7.bz2): + /usr/bin/bzip2 -d + patch -p1 -s + STATUS=0 + '[' 0 -ne 0 ']' + echo 'Patch #211 (linux-2.6.10-x86-tune-p4.patch):' Patch #211 (linux-2.6.10-x86-tune-p4.patch): + patch -p1 -s + echo 'Patch #212 (linux-2.6.11-x86_64-pmdpud-race.patch):' Patch #212 (linux-2.6.11-x86_64-pmdpud-race.patch): + patch -p1 -s + echo 'Patch #300 (linux-2.6.2-ppc64-build.patch):' Patch #300 (linux-2.6.2-ppc64-build.patch): + patch -p1 -s + echo 'Patch #301 (linux-2.6.8-ppc64-netboot.patch):' Patch #301 (linux-2.6.8-ppc64-netboot.patch): + patch -p1 -s + echo 'Patch #302 (linux-2.6.10-ppc-headerabuse.patch):' Patch #302 (linux-2.6.10-ppc-headerabuse.patch): + patch -p1 -s + echo 'Patch #330 (linux-2.6.3-ia64-build.patch):' Patch #330 (linux-2.6.3-ia64-build.patch): + patch -p1 -s + echo 'Patch #350 (linux-2.6.1-s390-compile.patch):' Patch #350 (linux-2.6.1-s390-compile.patch): + patch -p1 -s + echo 'Patch #351 (linux-2.6.9-s390-autoraid.patch):' Patch #351 (linux-2.6.9-s390-autoraid.patch): + patch -p1 -s + echo 'Patch #353 (linux-2.6.9-s390-zfcp_port-fix.patch):' Patch #353 (linux-2.6.9-s390-zfcp_port-fix.patch): + patch -p1 -s + echo 'Patch #360 (linux-2.6.9-s390-qeth_hipersocket-fix.patch):' Patch #360 (linux-2.6.9-s390-qeth_hipersocket-fix.patch): + patch -p1 -s + echo 'Patch #400 (linux-2.6.3-sparc-addbzimage.patch):' Patch #400 (linux-2.6.3-sparc-addbzimage.patch): + patch -p1 -s + echo 'Patch #450 (linux-2.6.10-xen.patch):' Patch #450 (linux-2.6.10-xen.patch): + patch -p1 -s + echo 'Patch #452 (linux-2.6.9-xen-compile.patch):' Patch #452 (linux-2.6.9-xen-compile.patch): + patch -p1 -s + echo 'Patch #453 (linux-2.6.9-xen-agpgart.patch):' Patch #453 (linux-2.6.9-xen-agpgart.patch): + patch -p1 -s + echo 'Patch #500 (linux-2.4.0-nonintconfig.patch):' Patch #500 (linux-2.4.0-nonintconfig.patch): + patch -p1 -s + echo 'Patch #511 (linux-2.6.0-exec-shield.patch):' Patch #511 (linux-2.6.0-exec-shield.patch): + patch -p1 -s + echo 'Patch #512 (linux-2.6.8-print-fatal-signals.patch):' Patch #512 (linux-2.6.8-print-fatal-signals.patch): + patch -p1 -s + echo 'Patch #513 (linux-2.6.8-execshield-vaspace.patch):' Patch #513 (linux-2.6.8-execshield-vaspace.patch): + patch -p1 -s + echo 'Patch #514 (linux-2.6.8-execshield-xen.patch):' Patch #514 (linux-2.6.8-execshield-xen.patch): + patch -p1 -s + echo 'Patch #515 (linux-2.6.10-x86_64-read-implies-exec32.patch):' Patch #515 (linux-2.6.10-x86_64-read-implies-exec32.patch): + patch -p1 -R -s + echo 'Patch #530 (linux-2.6.0-must_check.patch):' Patch #530 (linux-2.6.0-must_check.patch): + patch -p1 -s + echo 'Patch #600 (linux-2.6.7-modsign-core.patch):' Patch #600 (linux-2.6.7-modsign-core.patch): + patch -p1 -s + echo 'Patch #601 (linux-2.6.7-modsign-crypto.patch):' Patch #601 (linux-2.6.7-modsign-crypto.patch): + patch -p1 -s + echo 'Patch #602 (linux-2.6.7-modsign-ksign.patch):' Patch #602 (linux-2.6.7-modsign-ksign.patch): + patch -p1 -s + echo 'Patch #603 (linux-2.6.7-modsign-mpilib.patch):' Patch #603 (linux-2.6.7-modsign-mpilib.patch): + patch -p1 -s + echo 'Patch #604 (linux-2.6.7-modsign-script.patch):' Patch #604 (linux-2.6.7-modsign-script.patch): + patch -p1 -s + echo 'Patch #605 (linux-2.6.7-modsign-include.patch):' Patch #605 (linux-2.6.7-modsign-include.patch): + patch -p1 -s + echo 'Patch #606 (linux-2.6.9-sha1.patch):' Patch #606 (linux-2.6.9-sha1.patch): + patch -p1 -s + echo 'Patch #700 (linux-2.6.11-tux.patch):' Patch #700 (linux-2.6.11-tux.patch): + patch -p1 -s + echo 'Patch #1000 (linux-2.4.0-test11-vidfail.patch):' Patch #1000 (linux-2.4.0-test11-vidfail.patch): + patch -p1 -s + echo 'Patch #1010 (linux-2.6.10-periodic-slab-debug.patch):' Patch #1010 (linux-2.6.10-periodic-slab-debug.patch): + patch -p1 -s + echo 'Patch #1020 (linux-2.6.4-stackusage.patch):' Patch #1020 (linux-2.6.4-stackusage.patch): + patch -p1 -s + echo 'Patch #1050 (linux-2.6.12-devmem.patch):' Patch #1050 (linux-2.6.12-devmem.patch): + patch -p1 -s + echo 'Patch #1051 (linux-2.6.11-devmem.patch):' Patch #1051 (linux-2.6.11-devmem.patch): + patch -p1 -s + echo 'Patch #1052 (linux-2.6.8-devmem-xen.patch):' Patch #1052 (linux-2.6.8-devmem-xen.patch): + patch -p1 -s + echo 'Patch #1060 (linux-2.6.3-crash-driver.patch):' Patch #1060 (linux-2.6.3-crash-driver.patch): + patch -p1 -s + echo 'Patch #1061 (linux-2.6.10-crash-xen.patch):' Patch #1061 (linux-2.6.10-crash-xen.patch): + patch -p1 -s + echo 'Patch #1070 (linux-2.6.0-sleepon.patch):' Patch #1070 (linux-2.6.0-sleepon.patch): + patch -p1 -s + echo 'Patch #1130 (linux-2.6.10-scsi-blacklist.patch):' Patch #1130 (linux-2.6.10-scsi-blacklist.patch): + patch -p1 -s + echo 'Patch #1131 (linux-2.6.9-scsi-advansys-enabler.patch):' Patch #1131 (linux-2.6.9-scsi-advansys-enabler.patch): + patch -p1 -s + echo 'Patch #1136 (linux-2.6.9-scsi-megaraid-legacy.patch):' Patch #1136 (linux-2.6.9-scsi-megaraid-legacy.patch): + patch -p1 -s + echo 'Patch #1201 (linux-2.6.9-NFSD-non-null-getxattr.patch):' Patch #1201 (linux-2.6.9-NFSD-non-null-getxattr.patch): + patch -p1 -s + echo 'Patch #1207 (linux-2.6.8-lockd-racewarn2.patch):' Patch #1207 (linux-2.6.8-lockd-racewarn2.patch): + patch -p1 -s + echo 'Patch #1209 (linux-2.6.9-lockd-block-nosleep.patch):' Patch #1209 (linux-2.6.9-lockd-block-nosleep.patch): + patch -p1 -s + echo 'Patch #1210 (linux-2.6.9-lockd-reclaims.patch):' Patch #1210 (linux-2.6.9-lockd-reclaims.patch): + patch -p1 -s + echo 'Patch #1351 (linux-2.6.9-net-tr-irqlock-fix.patch):' Patch #1351 (linux-2.6.9-net-tr-irqlock-fix.patch): + patch -p1 -s + echo 'Patch #1362 (linux-2.6.9-net-airo-nullptr.patch):' Patch #1362 (linux-2.6.9-net-airo-nullptr.patch): + patch -p1 -s + echo 'Patch #1400 (linux-2.6.10-usb-use_both_schemes.patch):' Patch #1400 (linux-2.6.10-usb-use_both_schemes.patch): + patch -p1 -s + echo 'Patch #1500 (linux-2.6.10-crashdump-common.patch):' Patch #1500 (linux-2.6.10-crashdump-common.patch): + patch -p1 -s + echo 'Patch #1501 (linux-2.6.10-netdump.patch):' Patch #1501 (linux-2.6.10-netdump.patch): + patch -p1 -s + echo 'Patch #1502 (linux-2.6.8-netconsole.patch):' Patch #1502 (linux-2.6.8-netconsole.patch): + patch -p1 -s + echo 'Patch #1503 (linux-2.6.10-diskdump.patch):' Patch #1503 (linux-2.6.10-diskdump.patch): + patch -p1 -s + echo 'Patch #1700 (linux-2.6.10-revert-module-invalidparam.patch):' Patch #1700 (linux-2.6.10-revert-module-invalidparam.patch): + patch -p1 -s + echo 'Patch #1740 (linux-2.6.11-default-elevator.patch):' Patch #1740 (linux-2.6.11-default-elevator.patch): + patch -p1 -s + echo 'Patch #1760 (linux-2.6.9-module_version.patch):' Patch #1760 (linux-2.6.9-module_version.patch): + patch -p1 -s + echo 'Patch #1910 (linux-2.6.9-spinlock-debug-panic.patch):' Patch #1910 (linux-2.6.9-spinlock-debug-panic.patch): + patch -p1 -s + echo 'Patch #2000 (linux-2.6.11-vm-taint.patch):' Patch #2000 (linux-2.6.11-vm-taint.patch): + patch -p1 -s + echo 'Patch #2003 (linux-2.6.9-vm-oomkiller-debugging.patch):' Patch #2003 (linux-2.6.9-vm-oomkiller-debugging.patch): + patch -p1 -s + echo 'Patch #2101 (linux-2.6.9-ide-cd-early-EOF.patch):' Patch #2101 (linux-2.6.9-ide-cd-early-EOF.patch): + patch -p1 -s + echo 'Patch #3000 (linux-2.6.11-pwc.patch):' Patch #3000 (linux-2.6.11-pwc.patch): + patch -p1 -s + echo 'Patch #3020 (linux-2.6.9-ipw2100.patch):' Patch #3020 (linux-2.6.9-ipw2100.patch): + patch -p1 -s + echo 'Patch #3021 (linux-2.6.9-ipw2200.patch):' Patch #3021 (linux-2.6.9-ipw2200.patch): + patch -p1 -s + echo 'Patch #3022 (linux-2.6.9-ieee80211.patch):' Patch #3022 (linux-2.6.9-ieee80211.patch): + patch -p1 -s + echo 'Patch #10000 (linux-2.6.0-compile.patch):' Patch #10000 (linux-2.6.0-compile.patch): + patch -p1 -s + echo 'Patch #10001 (linux-2.6.10-compile-fixes.patch):' Patch #10001 (linux-2.6.10-compile-fixes.patch): + patch -p1 -s + echo 'Patch #10002 (linux-2.6.11-compile-fixes.patch):' Patch #10002 (linux-2.6.11-compile-fixes.patch): + patch -p1 -s + cp /usr/src/redhat/SOURCES/COPYING.modules Documentation/ + mkdir configs + cp -fv /usr/src/redhat/SOURCES/kernel-2.6.11-i586-smp.config /usr/src/redhat/SOURCES/kernel-2.6.11-i586.config /usr/src/redhat/SOURCES/kernel-2.6.11-i686-smp.config /usr/src/redhat/SOURCES/kernel-2.6.11-i686.config . `/usr/src/redhat/SOURCES/kernel-2.6.11-i586-smp.config' -> `./kernel-2.6.11-i586-smp.config' `/usr/src/redhat/SOURCES/kernel-2.6.11-i586.config' -> `./kernel-2.6.11-i586.config' `/usr/src/redhat/SOURCES/kernel-2.6.11-i686-smp.config' -> `./kernel-2.6.11-i686-smp.config' `/usr/src/redhat/SOURCES/kernel-2.6.11-i686.config' -> `./kernel-2.6.11-i686.config' + for i in '*.config' + mv kernel-2.6.11-i586-smp.config .config ++ head -1 .config ++ cut -b 3- + Arch=i386 + make ARCH=i386 nonint_oldconfig + echo '# i386' + cat .config + for i in '*.config' + mv kernel-2.6.11-i586.config .config ++ head -1 .config ++ cut -b 3- + Arch=i386 + make ARCH=i386 nonint_oldconfig + echo '# i386' + cat .config + for i in '*.config' + mv kernel-2.6.11-i686-smp.config .config ++ cut -b 3- ++ head -1 .config + Arch=i386 + make ARCH=i386 nonint_oldconfig + echo '# i386' + cat .config + for i in '*.config' + mv kernel-2.6.11-i686.config .config ++ head -1 .config ++ cut -b 3- + Arch=i386 + make ARCH=i386 nonint_oldconfig + echo '# i386' + cat .config + perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 11/' Makefile + perl -p -i -e 's/^EXTRAVERSION.*/EXTRAVERSION = -prep/' Makefile + find . -name '*.orig' -exec rm -fv '{}' ';' removed `./mm/mremap.c.orig' removed `./mm/memory.c.orig' 。。。(省略) removed `./fs/binfmt_elf.c.orig' removed `./fs/open.c.orig' + find . -name '*~' -exec rm -fv '{}' ';' + exit 0 [root@localhost SPECS]#
----------------------------
●now you have kernel source tree under /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11/
[root@localhost]# cd /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11/ [root@localhost linux-2.6.11]# ls arch crypto include lib net security configs Documentation init MAINTAINERS README sound COPYING drivers ipc Makefile REPORTING-BUGS usr CREDITS fs kernel mm scripts
---------------------------
●config kernel
[root@localhost linux-2.6.11]# cd configs/ [root@localhost configs]# ls kernel-2.6.11-i586.config kernel-2.6.11-i686.config kernel-2.6.11-i586-smp.config kernel-2.6.11-i686-smp.config [root@localhost configs]# cp kernel-2.6.11-i686.config .config [root@localhost configs]# cd .. [root@localhost linux-2.6.11]# make oldconfig ... [root@localhost linux-2.6.11]# diff -u ./.config configs/kernel-2.6.11-i686.config --- ./.config 2005-05-14 22:41:38.000000000 +0900 +++ configs/kernel-2.6.11-i686.config 2005-05-14 21:58:18.000000000 +0900 @@ -1,7 +1,8 @@ +# i386 # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.11-prep -# Sat May 14 22:41:38 2005 +# Linux kernel version: 2.6.11.7 +# Sat May 14 21:58:18 2005 # CONFIG_X86=y CONFIG_MMU=y [root@localhost linux-2.6.11]#
--------------------
●change KConfig as you like
[root@localhost linux-2.6.11]# make xconfig
お好みで設定変更。 あとでインストールするときのために local version も付けておこう。
ちなみに、make xconfig しようとして Qt がインストールされていないとおこられる場合は yum install qt-devel すればよい。
---------------------------
●make kernel.
note that making kernel with default config will take so long time. because the configuration contains most of all modules to be compiled.
[root@localhost linux-2.6.11]# make [root@localhost linux-2.6.11]# make modules [root@localhost linux-2.6.11]# make modules_install
→ /lib/modules/2.6.11-prep1.14_FC3-20050515-3/ とかのディレクトリが作成される。
[root@localhost linux-2.6.11]# make install
→ vmlinuz-2.6.11-prep1.14_FC3-20050515-3 と initrd-2.6.11-prep1.14_FC3-20050515-3.img が /boot にコピーされて、/boot/grub/grub.conf にエントリが追加される。
ということで、再起動。