在Debian Wheezy上编译并安装Linux Kernel 3.12.5

时间:2020-03-21 11:42:53  来源:igfitidea点击:

这是我有空余时间,决定将现有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