升级 Linux 自带内核,编译内核过程的记录。本文意在编译安装指定版本的内核用以实现某些功能或者兼容某些软件。
准备工作
切换至工作目录
cd /usr/src
小贴士:很多教程说必须放至在/usr/src
目录中,实测放哪都行。要是条件允许就按官方的说法放在/usr/src
里,并且请确认目录所在磁盘可用空间大于 10Gb)
下载源码
以 4.9.39 版本为例
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.39.tar.xz
查看当前最新内核请到内核组织官网 The Linux Kernel Archives
解包源码
xz -d linux-4.9.39.tar.xz
tar xvpf linux-4.9.39.tar
构建依赖
安装编译环境
# Debian/Ubuntu
sudo apt install build-essential
# RedHat/CentOS
sudo yum groupinstall "development tools"
开始构建
cd linux-4.9.39/
清理工作
进入目录后先做一次清除命令,预防有残余编译文件留下。
make mrproper && make clean
小贴士:若是新下载解压的,可以跳过此步骤。
创建编译参数
以下三种方法可生成编译参数文件
- 使用当前系统的配置参数
- 问答式全新配置
- 载入目前配置并对新配置进行询问时配置(建议使用)
使用当前系统的配置参数
make defconfig
用命令获取当前内核参数
问答式全新配置
问答式配置过程,想细心配置的,可以逐个逐条去看。实在不想看的,一路按着回车按默认设置就可以了。
make localmodconfig
载入目前配置并对新配置进行询问时配置
建议用这种方式,通过命令界面配置内核,会自动载入既有的 .config
配置文件,并且只有在遇到先前没有设定过的选项时,才会要求手动设定。
make oldconfig
图形界面微调参数
生成内核配置参数后,若需要微调,可以执行命令进入图形界面对选项进行调整。
make menuconfig
小贴士:此功能需要依赖支持才能使用,若执行命令输出报错,请根据发行版不同进行安装依赖。
Debian/Ubuntu
sudo apt install ncurses-dev
RedHat/CentOS
sudo yum install -y ncurses-devel
开始编译
make -j $(nproc)
小贴士:若机器为多核心可以使用 -j
参数指定多线程编译,大幅度提高速度。
编译内核模块
make modules && make modules_install
部署内核
安装新内核并自动配置启动文件
sudo make install
小贴士:不推荐在 Debian 系统中使用此种方式进行编译安装内核,其专属方式请参见相关链接。
使用新内核
安装新内核后必须重启系统才能读取并使用新内核
sudo reboot
清理旧内核
Debian / Ubuntu
sudo dpkg -l | grep linux-image
以 Debian 8 默认内核为例
root@kane:~# dpkg -l | grep linux-image ii linux-image-3.16.0-4-amd64 3.16.43-2+deb8u5 amd64 Linux 3.16 for 64-bit PCs ii linux-image-amd64 3.16+63 amd64 Linux for 64-bit PCs (meta-package)
以下命令可以移除指定版本内核
sudo apt purge linux-image-3.16.0* sudo apt autoremove
RedHat / CentOS
sudo rpm -qa | grep kernel
以下命令可以移除指定版本内核
sudo yum remove kernel-3.10.*
常见问题
报错提示 fatal error: libelf.h: No such file or directory
# Debian / Ubuntu
sudo apt install libelf-dev
# CentOS / Fedora / RedHat
sudo dnf install elfutils-libelf-devel
提示 bison: command not found
sudo apt install bison
小贴士:其他必备依赖在官网有公示,可参考
附录
相关链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2017-09-29 21:21 PM