在Debian Wheezy上编译并安装Linux Kernel 3.12.5
这是我有空余时间,决定将现有Linux内核升级到我的Debian VM之一上的最新稳定版本(在我撰写本文时,最新稳定版本为3.12.5)的那个星期天之一。
安装前注意事项
注意1:我们将从下面的Debian Wheezy内核升级:
$uname -rv 3.2.0.4-686-pae #1 SMP Debian 3.2.51-1
注意2:我们使用GRUB 2引导程序。
注意3:请确保/
分区上有足够的可用空间,最好至少8GB,以避免遇到任何问题,因为不同的内核配置可能需要不同的空间量。
您已被警告。
注意4:如果使用单独的/boot
分区,请确保已安装该分区,并为initrd镜像留出了至少200MB的可用空间,以防万一。
您已被警告。
安装
确保系统是最新的:
# apt-get update && apt-get upgrade -uV && apt-get dist-upgrade -uV
如果系统上还没有必备软件包,请安装:
# apt-get install gcc make bc
安装ca证书以避免wget出现以下错误:
错误:" www.kernel.org"证书不受信任。
错误:" www.kernel.org"证书尚未获得已知的颁发者。
# apt-get install ca-certificates
可选:如果要通过文本模式窗口化环境配置内核,请安装ncurses软件包(make menuconfig):
# apt-get install libncurses5-dev
可选:如果要通过基于Qt的GUI环境(make xconfig)配置内核,请安装QT软件包:
# apt-get install pkg-config qt4-dev-tools qt4-qmake
可选:如果要通过基于GTK的GUI环境(make gconfig)配置内核,请安装GTK +开发包:
# apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev
下载完整内核源代码包
# cd ~ # wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.12.5.tar.xz
将档案解压缩到/urs/src
中:
# tar xvfJ linux-3.12.5.tar.xz -C /usr/src
改成:
# cd /usr/src/linux-3.12.5
配置内核3.12.5
删除以前的内核版本中可能存在的旧输出文件:
# make clean
如果您认为需要删除更多文件,请选中make mrproper
或者make distclean
。
要配置内核,我们将使用" make oldconfig",因为我们要保留现有的内核配置。
为简单起见,我们将接受任何新功能的默认值:
# yes "" | make oldconfig
oldconfig模式会将原始的.config文件移至.config.old并创建一个新的.config文件。
编译内核3.12.5
编译可能需要几分钟到几小时的时间,具体取决于硬件的速度和我们正在编译的内核功能的数量。
构建内核:
# make bzImage
bzImage代表"大zImage"。
开发它是为了克服zImage的512KB压缩大小限制。
请注意,两个内核镜像都是使用最慢的gzip压缩方法压缩的。
在系统引导期间,未压缩的zImage内核镜像会加载到低内存中,而未压缩的bzImage内核镜像会加载到高内存中。
内核镜像文件将放置在/usr/src/linux-3.12.5/arch/x86/boot/bzImage下:
# file -b /usr/src/linux-3.12.5/arch/x86/boot/bzImage Linux kernel x86 boot executable bzImage, version 3.12.5 ([email protected]) #1 SMP Sun Dec 15 13:04:15 GMT 2013, RO-rootFS, swap_dev 0x2, Normal VGA
创建bzImage镜像后,我们需要构建内核模块。
这些基本上是目标文件(.ko文件),可以将其加载到内核中以添加所需的功能。
构建模块:
# make modules
值得一提的是,对于Linux内核,也可以使用默认的make目标"全部制作"来构建主内核文件和所有单独的内核模块。
安装内核3.12.5及其模块
命令" make install"用作复制内核文件,System.map和配置文件的快捷方式,并且经常(但并非总是)创建初始内存磁盘并修改新内核的GRUB配置,其中" make modules_install" "将内核模块安装在" /lib/modules/3.12.5"下。
同时安装:
# make modules_install install INSTALL arch/... INSTALL crypto/... INSTALL drivers/... INSTALL fs/... INSTALL lib/... INSTALL mm/... INSTALL net/... INSTALL sound DEPMOD 3.12.5 sh /usr/src/linux-3.12.5/arch/x86/boot/install.sh 3.12.5 arch/x86/boot/bzImage \ System.map "/boot" run-parts: executing /etc/kernel/postinst.d/dkms 3.12.5 /boot/vmlinuz-3.12.5 run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.12.5 /boot/vmlinuz-3.12.5 update-initramfs: Generating /boot/initrd.img-3.12.5 run-parts: executing /etc/kernel/postinst.d/pm-utils 3.12.5 /boot/vmlinuz-3.12.5 run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.12.5 /boot/vmlinuz-3.12.5 Generating grub.cfg ... Found background: /usr/share/images/desktop-base/umbrella.png Found background image: /usr/share/images/desktop-base/umbrella.png Found linux image: /boot/vmlinuz-3.12.5 Found initrd image: /boot/initrd.img-3.12.5 Found linux image: /boot/vmlinuz-3.2.0.4-686-pae Found initrd image: /boot/initrd.img-3.2.0.4-686-pae done
正如我们在上面看到的,初始内存磁盘镜像已创建,并且grub配置已更新。
仔细检查以确保在/boot下没有文件丢失。
所有四个红色文件必须存在:
# ls -1 /boot config-3.12.5 config-3.2.0-4-686-pae grub initrd.img-3.12.5 initrd.img-3.2.0-4-686-pae System.map-3.12.5 System.map-3.2.0-4-686-pae vmlinuz-3.12.5 vmlinuz-3.2.0-4-686-pae
请注意,通常内核可能具有以下几种名称中的任何一种:vmlinuz,zImage(已作废),bzImage,内核(通用名称)。
在我们的案例中,vmlinuz意味着内核已使用多种工具中的任何一种进行了压缩,并通过添加一些功能使其可启动。
创建initrd文件(如果未自动创建)
仅当未自动创建initrd镜像文件时,才创建它:
# cd /boot # update-initramfs -c -k 3.12.5
更新Grub配置文件(如果未自动更新)
仅当grub没有自动更新时才这样做!备份当前的grub配置文件。
我们始终可以使用LiveCD在新的但损坏的文件上恢复旧的但仍在工作的grub.cfg.org
文件:
# cp /boot/grub/grub.cfg /boot/grub/grub.cfg.org
完成后,运行命令以更新grub:
# update-grub
检查grub配置文件以查看是否有新内核的菜单项。
如果没有,您可能需要打开文件并手动对其进行修改:
# vim /boot/grub/grub.cfg
蓝色的行是现有的grub配置,手动添加了红色的行以指向新安装的内核3.12.5。
修改grub配置文件,使其外观如下所示并保存更改。
[...] menuentry 'Debian GNU/Linux, with Linux 3.2.0-4-686-pae' --class debian --class gnu-linux --class gnu --class os { load_video insmod gzio insmod part_msdos insmod ext2 set root='(hd0,msdos1)' search --no-floppy --fs-uuid --set=root 47acf9c3-cc2f-47eb-9c8b-18ace566bb40 echo 'Loading Linux 3.2.0-4-686-pae ...' linux /vmlinuz-3.2.0-4-686-pae root=UUID=cdd66e16-cfc0-4f98-99a0-3efc92fea00f ro quiet echo 'Loading initial ramdisk ...' initrd /initrd.img-3.2.0-4-686-pae } menuentry 'Debian GNU/Linux, with Linux 3.12.5' --class debian --class gnu-linux --class gnu --class os { load_video insmod gzio insmod part_msdos insmod ext2 set root='(hd0,msdos1)' search --no-floppy --fs-uuid --set=root 47acf9c3-cc2f-47eb-9c8b-18ace566bb40 echo 'Loading Linux 3.12.5 ...' linux /vmlinuz-3.12.5 root=UUID=cdd66e16-cfc0-4f98-99a0-3efc92fea00f ro quiet echo 'Loading initial ramdisk ...' initrd /initrd.img-3.12.5 } [...]
重新启动系统
假设所有配置均正确,我们现在可以重新引导系统以引导新内核:
# reboot
系统将自动启动到新内核中:
$uname -rvm 3.12.5 #1 SMP Sun Dec 15 17:18:55 GMT 2013 i686