从源码编译内核 (简体中文)

From ArchWiki

Jump to: navigation, search
i18n
English
简体中文

以下的一些步骤有助于你编译自己的内核。 这种方法是一种对所有发行版均适用的传统方法, 但同时,用 makepkg 和 pacman 安装自己的内核也是一种干净安装的优秀方法。许多 Arch 使用者会发现这种方法是编译并安装内核的一种最优雅最精巧的方法,它最符合 K.I.S.S.原则和[ Arch 思想]。

你可以选择用 ABS 工具建立并安装你的内核;看 用ABS工具编译内核; 一些Arch 使用者更喜欢用传统方法, 然而ABS的方法更利于系统的一些自动操作任务。当然了,选择哪种方法在于你自己,没有哪种方法天生就比其他方法好。


Contents

获取源码

  • 先从 ftp.xx.kernel.org/pub/linux/kernel/获得源码, xx 是你的国家代号 (f.e. 'us', 'uk', 'de', ... - 查看 [1] 获得完整的镜像单)。 如果你没有图形界面的ftp程序,你可以用wget。例如,我们可以获取2.6.23的源码并编译;你可以将版本号改成你所需要的版本号。

例:

$ wget -c ftp://ftp.us.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2
  • 将源码拷贝到你的家目录:
$ cp linux-2.6.27.tar.bz2 ~/kernelbuild/
  • 解压源码:
$ cd ~/kernelbuild
$ tar -xvjf linux-2.6.27.tar.bz2
$ cd ~/kernelbuild/linux-2.6.27

编译前设置

  • (推荐) 如果你想使用Arch 的默认配置,可以拷贝你现在正在运行的内核的 .config 设置文件。
 $ zcat /proc/config.gz > .config
  • 设置内核。
$ make oldconfig         (仅当你已经拷贝了内核配置文件)
$ make menuconfig

你也可以使用make xconfig(依赖Qt)或者make gconfig(依赖 GTK),来代替终端模式的make menuconfig

  • 适当更改内核设置并保存。如果你希望通过多次配置探索达到最优配置的话,每次将你的内核配置文件备份将是明智之举。
  • 如果你希望用你现在的配置文件编译内核,不要忘了更改你的内核版本号,否则你可能会覆盖掉你现在正使用的内核。
$ make menuconfig
一般设置  --->
 (-ARCH) Local version - append to kernel release

What about /usr/src/ ?

用/usr/src/目录编译,连同建立连接这种方法已经不用了,很多 hackers 并不赞同这种方法。最洁净的方法是简单地利用自己的家目录,作为一个普通用户设置并编译自己的内核,以root身份安装,或者用 makepkg 和pacman (上面提过)

编译和安装

选择以下一种方法:

1.手动的传统的方法

警告: 如果你用的是 GRUB,并且同时装有 LILO,不要运行 make all ; 因它最后会设置 LILO,这样你可能再也不能启动你的机器了。如果你使用的是 GRUB, 先卸载 LILO(pacman -R lilo),然后执行make all

  • 开始编译。
$ make clean 
$ make dep
$ make modules
$ make bzImage

# make modules_install

(如果你是以普通用户身份编译的话,先运行make clean && make,然后以root身份运行make modules_install

  • 拷贝内核。
# cp -v arch/i386/boot/bzImage /boot/vmlinuz-2.6.27-revision1

(你也可以拷贝配置文件和System.map到/boot,但是一般来说他们再也不需要了。

  • (推荐) 如果需要可以做一个启动盘(多数用户需要这个)
mkinitcpio -k 2.6.27-revision1 -g /boot/kernel26-revision1.img

  • 设置 /boot/grub/menu.lst 然后你的内核安装完成.
  • 另外,如果你用的是 LILO,则安装脚本直接会自动拷贝相应文件并且设置LILO:
$ cd ~/kernelbuild/linux-2.6.27/arch/i386/boot/
# sh ./install.sh

当然,你可以将vmlinuz, Kconfig, and System.map 文件更名; 然而, 版本号系统对控制和跟踪系统中的内核(如你编译了多少个内核)。你也可以试试在名称中加入日期和时间,当然你可以坚持你想要的简单的名字。

2. 通过makepkg 和pacman。(推荐)

这种方法会建立一个 .pkg.tar.gz 包,这样可以轻松的用 pacman 工具清洁安装。

用makepkg编译内核:

  • 在内核源码放置目录中建立如下的PKGBUILD 文件和 kernel26.install 脚本。

File: PKGBUILD

nano PKGBUILD(同样可以用vi)

加入如下内容:

pkgname=kernel26-my
basekernel=2.6.27
pkgver=2.6.27
pkgrel=1
pkgdesc="The Linux Kernel and modules"
arch=('i686')
url="http://www.kernel.org"
depends=('module-init-tools')
provides=(kernel26)
install=kernel26.install

build() {
  # build!
  cd ..
  _kernver="${basekernel}${CONFIG_LOCALVERSION}"
  make || return 1
  mkdir -p $startdir/pkg/{lib/modules,boot}
  make INSTALL_MOD_PATH=$startdir/pkg modules_install || return 1
  cp System.map $startdir/pkg/boot/System.map26-my
  cp arch/x86/boot/bzImage $startdir/pkg/boot/vmlinuz26-my
  install -D -m644 .config $startdir/pkg/boot/kconfig26-my
  # set correct depmod command for install
  sed -i -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" $startdir/kernel26.install
}

File: kernel26.install

nano kernel26.install

加入如下内容:

post_install () {
  echo ">>> Updating module dependencies. Please wait ..."
  KERNEL_VERSION=2.6.27
  /sbin/depmod -A -v $KERNEL_VERSION > /dev/null 2>&1
}

post_upgrade() {
  echo ">>> Updating module dependencies. Please wait ..."
  KERNEL_VERSION=2.6.27
  /sbin/depmod -A -v $KERNEL_VERSION > /dev/null 2>&1
}

op=$1
shift

$op $*
  • 调用 makepkg
makepkg -c

(-c 参数会自动在成功构建后清除遗留垃圾文件和目录。)

  • 用如下命令安装你的内核
pacman -U kernel26-my-2.6.27-1-i686.pkg.tar.gz

Bootloader 设置

  • 如果一切就绪,设置 GRUB or LILO.

如果你用LILO,记得将lilo加入prompt以更新。

在你自己的内核下用nVIDIA 视频驱动

想在你自己编译的内核下用nVIDIA 视频驱动,看 How to install nVIDIA driver with custom kernel

General Kernel Howto

There is a general comprehensive HOWTO on kernel compilation; look here for more information: Kernel-Build-HOWTO

Personal tools