如何在Debian/Ubuntu Linux上编译和安装Linux Kernel v4.9.11源代码

时间:2020-01-09 10:37:58  来源:igfitidea点击:

如何在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并可以正常工作。