首先查看当前内核版本,以便最后对照,我的当前系统为ubuntu18.04,内核版本为4.18.0
cat /proc/version
官网:https://www.kernel.org/pub/
Git:https://git.kernel.org/
ftp:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
推荐ftp,速度最快。
Git上三个版本:
mainline是主线版本,最新的
stable是稳定版
longterm是长期支持版
配置前安装:
sudo apt update && sudo apt upgrade
sudo apt-get install git fakeroot build-essential ncurses-devxz-utils libssl-dev bc flex libelf-dev bison
解压源代码并进入
执行:
cp /boot/config-$(uname -r) .config
这是拷贝当前内核的配置文件,由于我们是更新当前ubuntu内核,使用此配置文件即可
接下来进行编译配置
配置编译推荐使用,简单易用,界面清晰(由于更新的是ubuntu,内核本次文章不需要配置menuconfig,不需要配置交叉编译环境)
(多种编译配置的方式请参考文末拓展资料)
make menuconfig
此处可能会出现错误
Makefile:434: *** 隐含和普通规则混合:已弃用的语法
Makefile:1503: *** 隐含和普通规则混合:已弃用的语法
make: *** 没有规则可制作目标“menuconfig”。停止。
问题原因及解决方法见下面FAQ
编译(估计2-3个小时)
Make -j4
数字最大为cpu物理核心数的两倍,这样编译会快很多
编译完成后安装模块
sudo make modules_install
安装内核
sudo make install
编辑grub配置文件
sudo vim /etc/default/grub
接下来分为两种情况讨论,分为开机进入grub引导选择内核界面和开机自动进入新添加内核
1、若设置为开机选择内核
GRUB_TIMEOUT_STYLE=hidden屏蔽、GRUB_TIMEOUT=10。GRUB_TIMEOUT设置为10或者大于0的数,此处为开机引导界面停留时间
然后执行sudo update-grub即可重启
2、若设置为开机自动进入新内核
将原本的grub文件GRUB_DEFAULT=0屏蔽,添加GRUB_DEFAULT="1>2",其中1和2分别为一级目录和二级目录中要选择行数(从0开始计数)
查看内核版本:cat /proc/version
更新完成后内核版本为4.4.92
错误:
Makefile:434: *** 隐含和普通规则混合:已弃用的语法
Makefile:1503: *** 隐含和普通规则混合:已弃用的语法
make: *** 没有规则可制作目标“menuconfig”。停止。
原因:可能由于make对低版本makefile兼容性不好
解决:
修改Makefile文件
第一处:
修改前:
/ %/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
修改后:
/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
%/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
第二处:
修改前:
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
修改后:
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
make config:纯文本界面
make menuconfig:基于文本的可视化彩色菜单及单选列面,推荐使用(ncurses-dev)
make nconfig:基于文本的可视化彩色菜单(libcdk5-dev)
make xconfig:Qt/Windows界面,需要安装qt
make gconfig:Gtk/X-windows 界面。需要安装GTK。
make oldconfig:纯文本界面,但是其默认的问题是基于已有的本地配置文件。
make silentoldconfig:和oldconfig相似,但是不会显示配置文件中已有的问题的回答。
make olddefconfig:和silentoldconfig相似,但有些问题已经以它们的默认值选择。
make defconfig:这个选项将会创建一份以当前系统架构为基础的默认设置文件。
make ${PLATFORM} defconfig:创建一份使用arch/$ARCH/configs/${PLATFORM}defconfig中的值的配置文件。
make allyesconfig:这个选项将会创建一份尽可能多的问题回答都为‘yes’的配置文件。
make allmodconfig:这个选项将会创建一份将尽可能多的内核部分配置为模块的配置文件。
注意(以下内容来源于外文翻译):
内核代码可以放进内核自身,也可以成为一个模块。例如,用户可以将蓝牙驱动作为一个模块加入(独立于内核),或者直接放到内核里,或者完全不加蓝牙驱动。
当代码放到内核本身时,内核将会请求更多的内存并且启动会花费更长的时间。然而,内核会执行的更好。
如果代码作为模块加入,代码将会一直存在于硬盘上,需要时进行加载,接着模块被加载到内存中。这可以减少内核内存的使用,并减少启动的时间。但是,由于内核和模块在内存上相互独立所以会影响内核的性能。
另一种选择是不添加蓝牙代码。举例来说,内核开发人员假如知道系统永远都不会使用蓝牙设备,因此这个驱动就可以不加到内核中。这提升了内核的性能。然而,如果用户之后需要蓝牙设备,那么他么需要安装蓝牙模块或者升级内核才行。