阿里云源码编译内核并替换

1 介绍

阿里云新机器:

  • 系统Ubuntu 16.04
  • 内存16G
  • 4核CPU

源码编译Linux最新stable版本内核,并替换现有内核使用新内核

2 编译

2.1 安装依赖

$ apt update
$ apt apt-get install ncurses-dev bison flex pkg-config libelf-dev libssl-dev

2.2 下载源码

Linux Kernel Archives
https://www.kernel.org/

下载xz压缩后的tar包,以减少下载时间:

$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.18.9.tar.xz
$ xz -d linux-4.18.9.tar.xz
$ tar xvf linux-4.18.9.tar
$ ls
linux-4.18.9  linux-4.18.9.tar
  • xz -d: decompress xz file
  • tar xvf: x for e’x’traction, v for 'v’borse, ‘f’ for 'f’ile.

2.3 配置

$ cd linux-4.18.9
$ make menuconfig

阿里云源码编译内核并替换_第1张图片
Select->Save,会在(当前目录下生成.config文件,应该也是基于当前内核配置的基础上生成的)

.config文件格式如下,举例说明:

  • CONFIG_PCI=y PCI support
  • # CONFIG_XFS_FS is not set We have not selected the XFS filesystem support

可以Load->Select->Save来选择Custom的config,或者直接拷贝一个config文件:

$ cp /boot/config-$(uname -r) .config

2.4 编译

查看当前内核版本:

$ uname -r
4.4.0-117-generic

编译生成Kernel的Image,这里是compressed后的Image,-jN后面的N一般为CPU核心数的两倍,这里选择8:

$ make bzImage -j8
xxx
Kernel: arch/x86/boot/bzImage is ready  (#1)

编译上述配置中选择的components生成kernel modules:

$ make modules -j8

安装modules,会在/lib/modules/4.18.9目录下安装模块和其他一些必要文件:

$ make modules_install

安装kernel image,会在/boot更新kernel image,更新bootloader的配置文件(grub.conf)和其他一些让新内核bootable的操作:

$ make install

重启再查看现有内核版本:

$ reboot
$ uname -r
4.18.9

3 修改默认的启动内核

修改默认启动的Kernel,来切换内核版本,比如又想回到之前的内核版本

首先是要知道GRUB的menu格式,可以重启进入GRUB看,也可以不重启看:

  • 重启进入GRUB看:
$ vi /etc/default/grub
GRUB_HIDDEN_TIMEOUT=10(默认是0,修要修改成大于0的值,比如10)

然后按Esc进入GRUB
阿里云源码编译内核并替换_第2张图片
阿里云源码编译内核并替换_第3张图片

  • 不重启运行用如下命令看:
$ update-grub -v
grub-mkconfig (GRUB) 2.02~beta2-36ubuntu3.18

$ grep -Ei 'submenu|menuentry ' /boot/grub/grub.cfg | sed -re "s/(.? )'([^']+)'.*/\1 \2/"
menuentry  Ubuntu
submenu  Advanced options for Ubuntu
	menuentry  Ubuntu, with Linux 4.18.9
	menuentry  Ubuntu, with Linux 4.18.9 (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-117-generic
	menuentry  Ubuntu, with Linux 4.4.0-117-generic (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-116-generic
	menuentry  Ubuntu, with Linux 4.4.0-116-generic (recovery mode)
	menuentry  Ubuntu, with Linux 4.4.0-87-generic
	menuentry  Ubuntu, with Linux 4.4.0-87-generic (recovery mode)

修改GRUB默认启动的内核

$ vi /etc/default/grub
GRUB_DEFAULT="1>2"

$ update-grub

修改默认的为Advanced options for Ubuntu(1)下面menuentry Ubuntu, with Linux 4.4.0-117-generic(2),下标从0开始。

$ reboot
$ uname -r
4.4.0-117-generic

好的,内核版本换了,我胡汉三又回来了

4 总结

源码编译Linux内核就下面那些命令:

$ make menuconfig

# make包含Image和Modules
$ make
$ make modules_install
$ make install

5 出现的问题

问题1:依赖问题,解决方法就是按照提示安装依赖

问题2:不能进GRUB,解决方法是修改GRUB_HIDDEN_TIMEOUT=10

6 参考链接

https://linuxgazette.net/111/krishnakumar.html
https://blog.csdn.net/three_bird/article/details/51329195
https://blog.csdn.net/u013439115/article/details/77935602
https://en.wikipedia.org/wiki/Menuconfig
https://medium.freecodecamp.org/building-and-installing-the-latest-linux-kernel-from-source-6d8df5345980
https://bbs.aliyun.com/simple/t504372.html
https://askubuntu.com/questions/216398/set-older-kernel-as-default-grub-entry

你可能感兴趣的:(阿里云源码编译内核并替换)