Linux内核学习①:内核的下载、编译及过程中的问题处理
Linux内核文件下载
内核下载网址:
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
①进入该网站后界面如下:
②选择自己合适的版本进行下载,如博主下载的版本是V5.9,步骤如下选中V5.x
博主下载的是这一版本的内核压缩包
③下载成功后解压出来即可,这目录便是Linux内核的所有文件,至此文件下载完毕
编译内核源码
由于是Linux的内核文件所以仅下载到Windows的目录下是无法进行编译的,所以我们要将其拷贝到Linux的目录中再进行编译。
在编译内核前,我们可以输入命令查看当前系统的版本信息和内核版本信息,如博主的Linux是Ubuntu18.04因此内核版本为4.15.0
可通过如下命令
cat /etc/issue #查看系统版本信息
cat /etc/redhat-release #查看系统版本信息(第一种方法不行则采用第二种)
uname -mrs #查看内核版本信息
博主将事先下载的Linux内核5.9拷贝到Linux虚拟机和Windows之间的共享文件夹中
(在此博主遇到一个问题,即在拷贝文件夹过程中会报错提示某个目录无权限,因此不能完整拷贝过来,博主的解决方法是直接将整个压缩包拷贝到共享文件夹中,再通过命令对其进行解压)
系统提示无权限,直接取消即可,直接拷贝整个压缩包,而非文件夹
博主事先在Linux虚拟机中的桌面创建了个Demo目录,再将共享文件夹中的Linux内核源码的压缩包拷贝到桌面的Demo文件夹中
打开终端后,命令如下:
cd Desktop #进入桌面
sudo mkdir Demo #创建Demo文件夹
cp /mnt/hgfs/Linux_share/Demo/linux-5.9.tar Demo/
#拷贝共享文件夹中的压缩包到Linux虚拟机中的Demo路径下,由于每个人的路径不一定一致,因此路径名需要修改
拷贝完成之后,我们进入该目录执行命令进行解压。
cd /Desktop/Demo #进入到Demo目录
tar xvf linux-5.9.tar #解压该压缩包到当前目录下
可以看到我们解压后的文件
在进入该目录执行编译前我们需要通过命令下载一些编译相关的依赖。
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
安装完成之后的界面如下
下载完依赖后在编译内核之前,可以对内核源代码进行配置,配置的主要目的是为了确定哪些模块会变编译到内核当中去。
首先进入源代码的目录中
cd linux-5.9 #进入到源码目录中
cp -v /boot/config-$(uname -r) .config
#从当前机器的启动目录拷贝配置信息到源代码目录。
#这步操作的意思是我们编译内核的配置采用用当前环境一致的配置。
完成上述配置后,可以输入
make menuconfig #该命令会执行一些脚本,然后打开一个配置界面
下面是打开的配置界面。可以看出里面包含所有的内核组件,包括文件系统,网络,IO栈,虚拟化和设备驱动等等。如果不熟悉,可以不做任何修改。
下面就可以进行内核的编译了,在当前目录下能够看到有个Makefile文件,我们直接执行make命令进行编译即可
sudo make #执行当前目录下的Makefile脚本开始编译
(编译过程中需要确认必要的问题,这些问题取决于你将升级的现有内核以及升级后的内核。博主在编译过程中一路回车,最终没有编译过,报了个错误)
经过百度以后,需进行如下操作
查看当前目录下的文件,找到.config文件
先使用vi 命令进入该文本,再使用快捷查找
/CONFIG_SYSTEM_TRUSTED_KEYS #使用该命令课跳转至该处
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem" #这个双引号中间要删除,如下图
CONFIG_SYSTEM_TRUSTED_KEYS="" #如左侧所示
执行完成之后,可再次执行sudo make命令继续编译,编译时长比较长需要耐心等待。
执行成功后,打印如下图所示(显示界面不一致,原因是因为编译一次时间太长了第二天重新编译的,期间博主用的串口工具进行远程登陆编译的,没有影响正常敲命令就好了,成功的打印是一样的。)
然后安装模块
sudo make modules_install #安装模块
成功后打印如下
最后我们执行命令安装内核
安装内核前可以再次看到我们的内核版本原来是4.15.0
sudo make install #安装内核
若无报错,则安装成功后打印如下。
最后我们重启下我们的虚拟机,即可。