如何在Debian/Ubuntu Linux上编译和安装Linux Kernel v4.9.11源代码
如何在Debian Linux v8.x或Ubuntu Linux LTS家庭服务器或笔记本电脑上下载,编译和安装最新版本的Linux内核?
如何在基于Debian或Ubuntu Linux的系统上构建和安装自定义Linux内核?
为了创建自定义内核配置文件并构建自定义内核,必须首先下载并安装完整的Linux内核源代码树。
在本教程中,您将"学习如何在Debian和Ubuntu Linux操作系统上编译Linux内核版本4.9.11并构建.deb文件。
为什么要构建自定义内核?
编译自定义Linux内核有其优点和缺点。
要更改内核行为,必须先编译然后重新引导到新的Linux中。
Linux内核中的大多数功能都包含在模块中,可以根据需要从内核动态加载和卸载模块。
自定义Linux内核的一些好处:
- 支持广泛的硬件,包括最新的硬件。
- 从内核中删除不需要的驱动程序。
- 由于内核较小,因此启动时间更快。
- 由于增加或删除了模块/驱动程序/功能,因此提高了安全性。
- 您将了解内核和高级用法。
- 始终运行最先进的最新内核。
- 降低内存使用率。
注意:以下说明已在Debian Linux v8.x和Ubuntu Linux v14.04.4/16.04.2 LTS上进行了测试。
配置要求
您需要在Debian或Ubuntu Linux上安装以下软件包才能编译Linux内核:
- git:快速,可扩展的分布式修订控制系统。您可以使用git命令获取最新的源代码。
fakeroot
:模拟超级用户权限的工具。对构建.deb文件有用。build-essential
:用于在基于Debian或Ubuntu Linux的系统上构建Linux内核的工具,例如GCC编译器和相关工具。ncurses-dev
:ncurses的开发人员库。在配置内核选项时由menuconfig使用。kernel-package
:用于构建与Linux内核相关的Debian软件包的实用程序。- xz-utils:XZ格式的压缩工具,用于解压缩Linux内核tar球。
- "磁盘空间":10 GB或更多可用磁盘空间。
- 时间:内核编译可能需要一段时间,具体取决于计算机的功能。
安装所需的软件包
打开终端应用程序。
执行以下apt-get命令以安装用于构建Linux内核的必需软件包:
$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc
输出示例:
安装gcc和好友
最后,还要安装kernel-package软件包:
$ sudo apt-get install kernel-package
或者
$ sudo apt-get --no-install-recommends install kernel-package
输出示例:
用于构建Linux内核的安装实用程序
下载Linux内核源代码
执行以下wget命令以获取源代码和pgp密钥:
$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.11.tar.sign $ wget wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.11.tar.xz
输出示例:
使用wget从kernel.org获取最新源代码
使用GnuPG验证内核签名:
$ unxz linux-4.9.11.tar.xz $ gpg --verify linux-4.9.11.tar.sign
输出示例:
gpg: assuming signed data in `linux-4.9.11.tar' gpg: Signature made Monday 20 February 2017 04:28:37 AM IST using RSA key ID 00411886 gpg: Can't check signature: public key not found
从PGP密钥服务器获取公共密钥,以验证签名,即RSA密钥ID" 00411886"(来自上述输出):
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 00411886
输出示例:
gpg: requesting key 00411886 from hkp server keys.gnupg.net gpg: /root/.gnupg/trustdb.gpg: trustdb created gpg: key 00411886: public key "Linus Torvalds <[email protected]>" imported gpg: no ultimately trusted keys found gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)
现在再次验证:
$ gpg --verify linux-4.9.11.tar.sign
输出示例:
gpg: assuming signed data in `linux-4.9.11.tar' gpg: Signature made Monday 20 February 2017 04:28:37 AM IST using RSA key ID 00411886 gpg: Good signature from "Linus Torvalds <[email protected]>" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: ABAF 11C6 5A29 70B1 30AB E3C4 79BE 3E43 0041 1886
如果您没有从gpg --verify命令中输出错误签名,请使用tar命令解压缩Linux内核tar球:
$ tar xvf linux-4.9.11.tar $ ls $ cd linux-4.9.11/ $ ls
输出示例
linux-4.9.11/ linux-4.9.11/.cocciconfig linux-4.9.11/.get_maintainer.ignore linux-4.9.11/.gitattributes linux-4.9.11/.gitignore linux-4.9.11/.mailmap linux-4.9.11/COPYING linux-4.9.11/CREDITS linux-4.9.11/Documentation/ linux-4.9.11/Documentation/.gitignore linux-4.9.11/Documentation/00-INDEX linux-4.9.11/Documentation/ABI/ linux-4.9.11/Documentation/ABI/README linux-4.9.11/Documentation/ABI/obsolete/ linux-4.9.11/Documentation/ABI/obsolete/proc-sys-vm-nr_pdflush_threads linux-4.9.11/Documentation/ABI/obsolete/sysfs-block-zram linux-4.9.11/Documentation/ABI/obsolete/sysfs-bus-usb linux-4.9.11/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-arvo linux-4.9.11/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-isku linux-4.9.11/Documentation/ABI/obsolete/sysfs-driver-hid-roccat-koneplus .... .. ... linux-4.9.11/virt/kvm/kvm_main.c linux-4.9.11/virt/kvm/vfio.c linux-4.9.11/virt/kvm/vfio.h linux-4.9.11/virt/lib/ linux-4.9.11/virt/lib/Kconfig linux-4.9.11/virt/lib/Makefile linux-4.9.11/virt/lib/irqbypass.c linux-4.9.11 arch COPYING Documentation fs ipc kernel Makefile README scripts tools block CREDITS drivers include Kbuild lib mm REPORTING-BUGS security usr certs crypto firmware init Kconfig MAINTAINERS net samples sound virt
配置Linux内核
首先,复制您现有的Linux内核配置文件
$ cd linux-4.9.11 $ cp -v /boot/config-$(uname -r) .config
输出示例:
'/boot/config-4.4.0-62-generic' -> '.config'
要配置内核,请运行:
$ make menuconfig
输出示例:
启动menuconfig
选择要构建的Linux内核配置选项和驱动程序画廊01:单击放大
警告:很容易删除对设备驱动程序或选件的支持,最终导致内核损坏。
例如,如果从内核配置文件中删除了ext4驱动程序,则系统可能无法启动。
如有疑问,请将支持留在内核中。
在退出menuconfig之前,请确保保存更改。
编译Linux内核
您需要清理源代码树并重置内核软件包参数,执行:
$ make-kpkg clean
输出示例:
运行make-kpkg命令
现在,您可以编译内核,运行:
$ fakeroot make-kpkg --initrd --revision=1.0.NAS kernel_image kernel_headers
为了加快编译过程,请使用-j选项(-j 16表示您正在使用所有16个内核来编译Linux内核):
$ fakeroot make-kpkg --initrd --revision=1.0.NAS kernel_image kernel_headers -j 16
输出示例:
开始编译内核
fakeroot在似乎具有root用户特权的文件操作环境中运行一个名为make-kpkg的命令。
这对于允许用户创建包含根权限/所有权的文件的存档(tar,ar,.deb等)非常有用。
make-kpkg命令从Linux内核源代码和选项构建Debian/Ubuntu内核软件包:
- --initrd:创建一个initrd图像。
- --revision = 1.0.NAS:为您的内核设置自定义修订,例如1.0.NAS或-1.0-custom-kernel等。
kernel_image
:这个目标产生Linux内核源镜像的Debian软件包,以及在内核配置文件.config中配置的任何模块。kernel_headers
:这个目标产生Linux内核头文件镜像的Debian软件包。
请注意,取决于计算机的功能,内核编译可能需要一段时间。
在我共享的4个CORE CPU和4GB ram上,构建Linux内核花费了60分钟。
最后,您应该在屏幕上看到以下内容:
test ! -e debian/control~ || rm -f debian/control~ dpkg-gencontrol -isp -DArchitecture=amd64 -plinux-headers-4.9.11 \ -P/tmp/linux-4.9.11/debian/linux-headers-4.9.11/ dpkg-gencontrol: warning: -isp is deprecated; it is without effect create_md5sums_fn () { cd ; find . -type f ! -regex './DEBIAN/.*' ! -regex './var/.*' -printf '%P$ ls ../*.deb `../linux-headers-4.9.11_1.0.NAS_amd64.deb ../linux-image-4.9.11_1.0.NAS_amd64.deb`' | xargs -r0 md5sum > DEBIAN/md5sums ; if [ -z "DEBIAN/md5sums" ] ; then rm -f "DEBIAN/md5sums" ; fi ; } ; create_md5sums_fn /tmp/linux-4.9.11/debian/linux-headers-4.9.11 chown -R root:root /tmp/linux-4.9.11/debian/linux-headers-4.9.11 chmod -R og=rX /tmp/linux-4.9.11/debian/linux-headers-4.9.11 dpkg --build /tmp/linux-4.9.11/debian/linux-headers-4.9.11 .. dpkg-deb: building package `linux-headers-4.9.11' in `../linux-headers-4.9.11_1.0.NAS_amd64.deb'. cp -pf debian/control.dist debian/control make[2]: Leaving directory '/tmp/linux-4.9.11' make[1]: Leaving directory '/tmp/linux-4.9.11'
验证内核deb文件:
$ cd .. $ sudo dpkg -i linux-headers-4.9.11_1.0.NAS_amd64.deb $ sudo dpkg -i linux-image-4.9.11_1.0.NAS_amd64.deb
安装自定义内核
执行以下dpkg命令以在系统上安装定制内核:
Selecting previously unselected package linux-headers-4.9.11. (Reading database ... 96175 files and directories currently installed.) Preparing to unpack linux-headers-4.9.11_1.0.NAS_amd64.deb ... Unpacking linux-headers-4.9.11 (1.0.NAS) ... Setting up linux-headers-4.9.11 (1.0.NAS) ... Examining /etc/kernel/header_postinst.d. Selecting previously unselected package linux-image-4.9.11. (Reading database ... 110487 files and directories currently installed.) Preparing to unpack linux-image-4.9.11_1.0.NAS_amd64.deb ... Done. Unpacking linux-image-4.9.11 (1.0.NAS) ... Setting up linux-image-4.9.11 (1.0.NAS) ... Hmm. There is a symbolic link /lib/modules/4.9.11/build However, I can not read it: No such file or directory Therefore, I am deleting /lib/modules/4.9.11/build Hmm. The package shipped with a symbolic link /lib/modules/4.9.11/source However, I can not read the target: No such file or directory Therefore, I am deleting /lib/modules/4.9.11/source Running depmod. Examining /etc/kernel/postinst.d. run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 4.9.11 /boot/vmlinuz-4.9.11 run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.9.11 /boot/vmlinuz-4.9.11 update-initramfs: Generating /boot/initrd.img-4.9.11 W: mdadm: /etc/mdadm/mdadm.conf defines no arrays. run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 4.9.11 /boot/vmlinuz-4.9.11 run-parts: executing /etc/kernel/postinst.d/update-notifier 4.9.11 /boot/vmlinuz-4.9.11 run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.9.11 /boot/vmlinuz-4.9.11 Generating grub configuration file ... Found linux image: /boot/vmlinuz-4.9.11 Found initrd image: /boot/initrd.img-4.9.11 Found linux image: /boot/vmlinuz-4.4.0-62-generic Found initrd image: /boot/initrd.img-4.4.0-62-generic Found linux image: /boot/vmlinuz-4.4.0-21-generic Found initrd image: /boot/initrd.img-4.4.0-21-generic done
输出示例:
$ sudo reboot
重新启动机器/服务器/笔记本电脑
执行以下命令:
$ sudo shutdown -r now
或者
$ uname -a $ uname -r $ uname -mrs $ dmesg | more $ dmesg | egrep -i --color 'error|critical|failed'
验证一切正常
执行以下命令来验证您的新内核,一切正常:
Linux ubuntu-box-1 4.9.11 #1 SMP Mon Feb 20 21:10:55 IST 2017 x86_64 x86_64 x86_64 GNU/Linux
输出示例:
##代码##并且,在那里,已经安装了Linux内核版本4.9.11并可以正常工作。