本文主要讨论如何编译 Linux 核心成 RPM 套件 (*.rpm)。如果想把 Linux 编译成 dpkg 套件 (*.deb)或用原始工具编译,可以参看相关文章。
[编辑]
为何要编译核心
[编辑]
Linux 核心 RPM 套件如果您的系统是使用 RPM 套件管理系统 (包括 CentOS、Fedora、Mandriva、Redhat 及 SuSE),那麽您值得考虑使用把 Linux 核心包成 RPM 套件。成为 RPM 套件,可以享有其他包成 RPM 套件软件的优点,在安装、管理和更新方面都较为方便。尤其当您要维护大量近似硬件配备及运行 RPM 的 GNU/Linux 系统时,核心 RPM 套件的长处就更易看到。 [编辑]
预备编译需要的工具要编译 Linux 核心,一般需要以下工具
打算使用文字窗口接口 (make menuconfig) 设定编译选项的朋友可以打安装所需的套件: su -c 'yum install rpm-build rpmdevtools unifdef gcc ncurses-devel' 打算使用 QT GUI 接口 (make xconfig) 设定编译选项的朋友可以打安装所需的套件: su -c 'yum install rpm-build rpmdevtools unifdef gcc gcc-c++ qt-devel' Fedora 9 或以上的使用者要改打: su -c 'yum install rpm-build rpmdevtools unifdef gcc gcc-c++ qt3-devel' 打算使用 GTK+ 接口 (make gconfig) 设定编译选项的朋友可以打安装所需的套件: su -c 'yum install rpm-build rpmdevtools unifdef gcc gtk+devel libglade2-devel' [编辑]
建立用户编译环境[编辑]
sudo打 jrandom ALL=(ALL) ALL [编辑]
建立 rpmbuild 目录您需要有以下目录:
cd ~ cp -a /usr/src/redhat rpmbuild echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros 或者执行 fedora-rpmdevtools 套件中的 fedora-buildrpmtree: fedora-buildrpmtree [编辑]
取得 Linux 核心源码要编译 Linux,首先当然是要最得 Linux 的源码(source code)。最新的 Linux 官方源码是可以从 Kernel.org 或其映射站取得,而最新 2.6.x 版本一般放在 /pub/linux/kernel/v2.6/ 中。 当然,您亦可以使用 distribution 所提供的 Linux 源码。 [编辑]
Fedora RPMFedora 的核心源码被包在 kernel 源码 RPM (*.src.rpm) 中。Fedora 9 的核心源码 RPM 被放在http://download.fedora./pub/fedora/linux/releases/10/Fedora/source/SRPMS/kernel-2.6.27.5-117.fc10.src.rpm 。其他 Fedora 版本的核心源码分别在:
下载后,可以用命令" wget http://download.fedora./pub/fedora/linux/releases/10/Fedora/source/SRPMS/kernel-2.6.27.5-117.fc10.src.rpm rpm -ihv kernel-2.6.27.5-117.fc10.src.rpm 安装源码 RPM,您可能会看到以下警告讯息: warning: user brewbuilder does not exist - using root warning: group brewbuilder does not exist - using root 您可以不理会它们。 [编辑]
核实 Linux 核心源码 (可省略)要确保您下载的 Linux 核心源码没有被人恶意植入有问题的程序码,每个 tarball 都有一个 *.sign 记录了相关程序码的数码签署,可以让您用 GNUPG 之类的软件核实源码的真伪。 先确定您拥有 Kernel.org 的数码公钥,您可以到 Kernel.org 或由金钥服务器 wwwkeys.下载: $ gpg --keyserver wwwkeys. --recv-keys 0x517D0F0E gpg: requesting key 517D0F0E from hkp server wwwkeys. gpg: key 517D0F0E: "Linux Kernel Archives Verification Key <ftpadmin@>" 34 new signatures gpg: no ultimately trusted keys found gpg: Total number processed: 1 gpg: new signatures: 34 $ 使用 GNUPG 核实源码: $ gpg --verify linux-2.6.36.tar.bz2.sign linux-2.6.36.tar.bz2 gpg: Signature made Thu 15 Dec 2005 02:13:27 PM HKT using DSA key ID 517D0F0E gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@>" 如果您得到以上结果,即表示您下载的源码正确无误。但如果您得到以下结果,您下载的源码可能已被人更动过了。 Could not find a valid trust path to the key. Let's see whether we can assign some missing owner trust values. No path leading to one of our keys found. gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. [编辑]
解开核心源码压缩档[编辑]
解开 GNU Zip了(*.tar.gz) 的压缩档如果您是下载了GNU Zip 的 Linux 核心源码压缩档(档案伸廷名称为*.tar.gz),可以用指令 " tar zxvf linux-2.6.36.tar.gz [编辑]
解开 BZip2 了(*.tar.bz2) 的压缩档如果您是下载了 BZip2 了的 Linux 核心源码压缩档(档案伸廷名称为*.tar.bz2),可以用指令 " tar jxvf linux-2.6.36.tar.bz2 [编辑]
建立连结ln -s linux-2.6.36 /usr/src/linux [编辑]
用Patch档案如果您有前一个版本的Linux核心源码并下载了GNU Zip了的现在版本patch档案(档名为patch-*.gz),可以使用工具patch把前一个版本的Linux核心源码转变成现在版本: cd linux-2.6.18 gzip -cd ../patch-2.6.17.gz | patch -p1 --dry-run gzip -cd ../patch-2.6.17.gz | patch -p1 如果您有前一个版本的Linux核心源码并下载了BZip2了的现在版本patch档案(档名为patch-*.bz2),可以使用工具patch把前一个版本的Linux核心源码转变成现在版本: cd linux-2.6.18 bzip2 -cd ../patch-2.6.17.bz2 | patch -p1 --dry-run bzip2 -cd ../patch-2.6.17.bz2 | patch -p1 cd ~/rpmbuild/SOURCES/ wget http://www./pub/linux/kernel/v2.6/patch-2.6.18.2.bz2 [编辑]
设定编译选项编译 Linux 核心其中一个最重要的步骤就是选择您的新核心需要那些功能,那些功能要编译成可加载模组(Loadable Modules),甚至那些功能不需要编入核心中。当然,越少功能可以令新核心大小越少,耗癈资源越少。但如果编译功能太少,常需要新功能时,就需要再重新编译核心。所以设定编译选项亦成为编译核心中最困难和最耗时的步骤。 Linux 提供了多个方法去让您设定编译选项:
[编辑]
make config - 文字模式make config 是最原始的设定方法,早在 Linux 0.x 时就出现了。当您打入 make config,系统就会在文字模式下会逐一问您每一个编译选项: $ make config scripts/kconfig/conf arch/i386/Kconfig * * Linux Kernel Configuration * * * Code maturity level options * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] * * General setup * Local version - append to kernel release (LOCALVERSION) [] Automatically append version information to the version string (LOCALVERSION_AUTO) [Y/n/?] Support for paging of anonymous memory (swap) (SWAP) [Y/n/?] System V IPC (SYSVIPC) [Y/n/?] POSIX Message Queues (POSIX_MQUEUE) [Y/n/?] BSD Process Accounting (BSD_PROCESS_ACCT) [N/y/?] Export task/process statistics through netlink (EXPERIMENTAL) (TASKSTATS) [N/y/?] Auditing support (AUDIT) [N/y/?] Kernel .config support (IKCONFIG) [Y/n/?] Enable access to .config through /proc/config.gz (IKCONFIG_PROC) [Y/n/?] Kernel->user space relay support (formerly relayfs) (RELAY) [N/y/?] Initramfs source file(s) (INITRAMFS_SOURCE) [] Optimize for size (Look out for broken compilers!) (CC_OPTIMIZE_FOR_SIZE) [Y/n/?] n * * Configure standard kernel features (for small systems) * Configure standard kernel features (for small systems) (EMBEDDED) [N/y/?] 一般编译选项容许您选择 (用大阶字母显示表示为缺省选项):
这种方法的好处是设定时不需要额外的程序库,坏处是当您发觉选错选项时,您只可以按 Ctrl-C 中断设定,重新回答每个问题,非常麻烦。现时编译 Linux 有三千七百多个选项, [编辑]
make menuconfig - 文字选单模式
同样您可以按 [编辑]
make xconfig - 图像模式 (Qt/Tcl)
Qt 版面提供三种显示方式:
「?」表示启用,空间表示关闭,圆点(「.」)表示编译成模组。 旧 Tcl 版面 (2.2.x 或以前): [编辑]
make gconfig - 图像模式 (GTK+)
GTK+ 版面和 Qt 版面一样提供三种显示方式:
「?」表示启用,空间表示关闭,减号(「-」)表示编译成模组。 [编辑]
make oldconfig - 只选择新编译选项
使用则,您必需要取得以往编译时的编译选项 (即档案 .config) 或 distribution 官方编译选项。习惯上各核心的编译设定档会保存在目录 /boot 中一些名为 “config-核心版本” 的档案中,您可以直接复制至您的核心源码目录中: cp /boot/config-`uname -r` .config 搞定后打「 make oldconfig [编辑]
设定编译选项提示[编辑]
一般要留意的选项
如果您使用 nVidia 显示咭,请关闭下列选项:
[编辑]
设定桌面计算机(Desktop)要留意的选项
[编辑]
设定笔记簿型计算机 (Laptop/Notebook) 要留意的选项
[编辑]
设定服务器 (Server) 要留意的选项
[编辑]
编译核心先打 “ 如果您之前曾在同一个源码目录编译过核心,当中产生的旧核心和 .o 等遗留物可能会影响新编译出来的核心不是按最新选择的编译选项编译。此时,您需要打 “ 打 “ 打 “ 您亦可以使用命令 “ make bzImage modules [编辑]
安装新核心[编辑]
搬动有关档案打 " make modules_install 您会在目录 arch/i386/boot 中找到个叫 bzImage 或 zImage 的档案,那就是您编辑出来的新核心了。为方便管理,您需要把它移动至目录 /boot中,并改名为 "vmlinuz-核心版本"。为保存编译选项方便日后参考,您也应该把 .config 复制至 /boot 及改名为 "config-核心版本"。例如(假设核心版本为 2.6.36): cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.36 cp .config /boot/config-2.6.36 [编辑]
设定开机管理程序如果您是透过 rpm 命令安装新的 Linux 核心套件,系统会自动帮您设定开机管理程序。 不过您亦以按下指示检查开机管理程序的设定是否有问题。 [编辑]
设定 GRUB设定 GRUB 前请先输入命令 df 查出目录 / 和 /boot 所在的分割区名称,例如: $ df 档案系统 1K-区段 已用 可用 已用% 挂载点 /dev/sda5 14535584 7275752 6527272 53% / udev 1033204 60 1033144 1% /dev devshm 1033204 184 1033020 1% /dev/shm /dev/sda2 43256 24819 18437 57% /boot 如上例中,目录 / 的分割区名称就是 /dev/sda5。 修改 GRUB 的设定档 /boot/grub/menu.lst 加上启动新 Linux 核心的项目,以下是 Ubuntu/Debian 的例子: ## ## End Default Options ## title New Linux (2.6.36) root (hd0,4) kernel /boot/vmlinuz-2.6.36 root=UUID=a3b3df6a-a4b7-4395-8278-45c23e45ca53 ro quiet splash locale=zh_TW quiet title Ubuntu 8.04, kernel 2.6.24-19-generic root (hd0,4) kernel /boot/vmlinuz-2.6.24-19-generic root=UUID=a3b3df6a-a4b7-4395-8278-45c23e45ca53 ro quiet splash locale=zh_TW initrd /boot/initrd.img-2.6.24-19-generic quiet 以下是 Fedora/CentOS 的例子: splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title New Linux (2.6.36) root (hd0,0) kernel /vmlinuz-2.6.36 ro root=/dev/VolGroup00/LogVol100 rhgb quiet title Fedora (2.6.26.10-86.fc9.i686) root (hd0,0) kernel /vmlinuz-2.6.25.10-86.fc9.i686 ro root=/dev/VolGroup00/LogVol100 rhgb quiet initrd /initrd-2.6.25.10-86.fc9.i686.img 简单来说,把现有的项目设定复制一次,改一改标题 (title) 和核心名称 (kernel) 就可以了。 [编辑]
设定 lilo设定好设定档案 /etc/lilo.conf: boot=/dev/hda root=/dev/hda5 install=/boot/boot.b map=/boot/map vga=normal delay=100 image=/boot/vmlinuz-2.6.36 label=Linux read-only image=/boot/vmlinuz-2.6.8 label=LinuxOld read-only other=/dev/hda1 label=WinXP table=/dev/hda 打「 lilo [编辑]
失败后的处理方法[编辑]
参考资料
[编辑]
请参看[编辑]
外部连结 |
|