(1)学习配置虚拟机环境,安装配置虚拟机操作系统
(2)学习编译Linux系统内核的过程及相关问题,编译Linux内核
(3)了解GRUB
启动程序,修改系统中grub2
启动配置
(1)安装虚拟机并配置环境
(2)下载Linux内核
(3)编译内核配置
(4)编译内核
(5)修改引导菜单
本实验基于Ubuntu虚拟机完成,具体实验环境如下:
宿主机环境配置如下:
虚拟机环境配置如下:
由于本实验宿主机使用的是macOS系统,采用的是和Mac更加适配的Parallels Desktop虚拟机软件。
在官方网站下载安装镜像文件,解压并安装。
在Ubuntu官网下载Ubuntu镜像文件,本实验选择的是18.04版本。
使用Parallels Desktop安装虚拟机,并配置如3.2的实验环境
进入Ubuntu虚拟机系统后,打开终端,使用如下命令查看预装内核:
$ uname -a
Linux XXX-Parallels-Virtual-Platform 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 1028 x86_64 x86_64 x86_64 GNU/Linux
得到如上结果,由结果可知,系统预装内核版本为4.15.0
版本
使用wget
命令从www.kernel.org网站上下载Linux内核,本次实验下载的内核版本为5.0.0
版本,命令如下
$ wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.0.0.tar.xz
下载之后,在当前目录下的到一个名为linux-5.0.0.tar.xz
的压缩文件
将该压缩文件移动到用户目录的源目录,即/usr/src
目录下,并进行解压,命令如下:
$ sudo cp ./linux-5.0.0.tar.xz /usr/src
$ cd /usr/src
$ sudo tar xvjf ./linux-5.0.0.tar.xz
编译内核时需要用到很多工具,例如libncurses
和build-essential
,在编译内核操作之前,要先将这些工具安装配置好,在Ubuntu中使用apt-get
命令完成这些操作。
apt-get
操作是从制定的源下载指定的安装包,但是Ubuntu一般预使用的源都是国外的源,我们需要将源改为国内镜像源保证可以进行使用
进入apt
路径,备份源文件
$ cd /etc/apt/
$ sudo cp ./sources.list ./sources.list.bat
本实验中,我选取的是清华大学的镜像源进行替换,将sources.list
文件替换如下(将原来的镜像路径进行注释)替换如下:
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
修改保存之后,进行更新数据源
$ sudo apt-get update
使用如下命令,安装配置工具
$ sudo apt-get install libncurses5-dev build-essential kernel-package
其中,libncurses5-dev
是保证配置内核运行make menuconfig
,build-essential
是实验所使用的编译工具,kernel-package
是编译内核工具。
之后可能还会有部分工具在编译时需要使用,在编译过程中会报错,届时仍然使用上述方法进行安装即可。
图像化配置菜单
$ sudo make menuconfig
注意,在执行该命令过程中可能会出现以下错误:
scripts/kconfig/mconf Kconfig
Your display is too small to run Menuconfig
It must be at least 19 lines by 80 columns
上述错误表示限制所使用的终端太小,无法运行menuconfig
只需要将终端放大即可
执行完上述命令后,会打开配置菜单
可以在里面修改内核配置,本实验中未修改
使用下述命令编译内核
$ sudo make
注意,该步骤要在解压后的目录下进行
编译内核需要消耗较多的时间,实验过程中大约花费2小时(数据仅供参考)
在编译过程中,可能会出现错误,大部分错误都是由于配置工具未配齐,只需要根据报错信息依照4.2流程进行配置。
使用如下两个命令进行模块安装
$ sudo make modules_install
$ sudo make install
安装好之后,就可以重新启动系统。
在重新启动的过程中可能会遇到Storage Out
报错,这是由于内存配置不足造成的问题,关机后重新配置虚拟机环境增加内存即可。
使用vim修改grub文件
$ sudo vim /etc/default/grub
修改开机界面等待时间和开机默认选项,修改如下
注意,此文件为只读文件,需要root权限才能修改,所以命令行需要添加sudo
GRUB_DEFAULT=1
#GRUB_HIDDEN_TIMEOUT=10
GRUB_HIDDEN_TIMEOUT_QUIET=false
修改GRUB_DEFAULT=1
表示使用默认启动菜单1进行启动,注释GRUB_HIDDEN_TIMEOUT
表示开机时在选择菜单停留,不自动进入。
GRUB_DEFAULT
可以根据如下命令查看开机可选启动项
$ grep menuentry /boot/grub/grub.cfg
修改之后,更新启动引导菜单
$ sudo update-grub
使用vim打开开机启动配置文件
$ sudo vim /boot/grub/grub.cfg
此文件也是只读文件,需要root权限
找到自己新编译的内核菜单项,修改菜单项,如下:
menuentry 'Ubuntu, Linux 5.0.0 XXXXXX'
重启,就可以在菜单看到修改
选择新编译的内核,查看内核版本,的到如下信息
$ uname -a
patrick-Parallels-Virtual-Platform 5.0.0 #1 SMP Tue Mar 5 21:28:51 CST 2019 x86_64 x86_64 x86_64 GNU/Linux
在本实验中,我学会完整实现下载编译Linux内核,更新切换Linux内核使用。在配置grub2
过程中,查找许多相关资料,细心去了解GRUB
启动配置项的各项内容。由于在实验过程中遇到很多错误和困难,曾经因为修改grub
文件导致系统不能启动。于是花费了一天时间去了解启动配置文件每一条语句的内容,才敢于第二次修改启动配置文件。相较于编译Linux内核操作步骤而言,对问题的解决才是知识上更多的收获。
此外,在编译Linux内核过程中遭遇到了很多挫折和失败,这些失败给我带来不少历练。我在一次又一次的失败中,不断查找资料,让我更加有耐心,更加能面对挫折。