编译Linux内核实验

编译Linux内核

1. 实验目的

(1)学习配置虚拟机环境,安装配置虚拟机操作系统

(2)学习编译Linux系统内核的过程及相关问题,编译Linux内核

(3)了解GRUB启动程序,修改系统中grub2启动配置

2. 实验内容

(1)安装虚拟机并配置环境

(2)下载Linux内核

(3)编译内核配置

(4)编译内核

(5)修改引导菜单

3. 实验环境

本实验基于Ubuntu虚拟机完成,具体实验环境如下:

3.1 宿主机环境

宿主机环境配置如下:

  • 操作系统:macOS
  • 内存容量:8GB
  • 处理器:2.9GHz Intel Core i5
  • 硬盘容量:500GB

3.2 虚拟机环境

虚拟机环境配置如下:

  • 虚拟机软件:Parallels Desktop 13.3.1
  • 虚拟机操作系统:Ubuntu 18.04
  • 虚拟机内存:4GB
  • 虚拟机硬盘容量:64GB
  • Linux内核(源):Linux-4.15.0
  • Linux内核(用于编译):Linux-5.0.0

4. 程序设计与实现

4.1 安装虚拟机并配置环境

由于本实验宿主机使用的是macOS系统,采用的是和Mac更加适配的Parallels Desktop虚拟机软件。

在官方网站下载安装镜像文件,解压并安装。

在Ubuntu官网下载Ubuntu镜像文件,本实验选择的是18.04版本。

使用Parallels Desktop安装虚拟机,并配置如3.2的实验环境

4.2 下载Linux内核

进入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

4.2 编译内核配置操作

编译内核时需要用到很多工具,例如libncursesbuild-essential,在编译内核操作之前,要先将这些工具安装配置好,在Ubuntu中使用apt-get命令完成这些操作。

4.2.1 修改镜像源

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

4.2.2 配置编译工具

使用如下命令,安装配置工具

$ sudo apt-get install libncurses5-dev build-essential kernel-package

其中,libncurses5-dev是保证配置内核运行make menuconfigbuild-essential是实验所使用的编译工具,kernel-package是编译内核工具。

之后可能还会有部分工具在编译时需要使用,在编译过程中会报错,届时仍然使用上述方法进行安装即可。

4.4 编译Linux内核

4.4.1 图形化配置界面

图像化配置菜单

$ 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只需要将终端放大即可

执行完上述命令后,会打开配置菜单

可以在里面修改内核配置,本实验中未修改

4.4.2 编译内核

使用下述命令编译内核

$ sudo make

注意,该步骤要在解压后的目录下进行

编译内核需要消耗较多的时间,实验过程中大约花费2小时(数据仅供参考)

在编译过程中,可能会出现错误,大部分错误都是由于配置工具未配齐,只需要根据报错信息依照4.2流程进行配置。

4.4.3 安装内核模块

使用如下两个命令进行模块安装

$ sudo make modules_install
$ sudo make install

安装好之后,就可以重新启动系统。

在重新启动的过程中可能会遇到Storage Out报错,这是由于内存配置不足造成的问题,关机后重新配置虚拟机环境增加内存即可。

4.5 修改引导菜单

4.5.1 修改开机启动菜单

使用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

4.5.2 修改开机启动配置项

使用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

在这里插入图片描述

5. 实验收获与体会

​ 在本实验中,我学会完整实现下载编译Linux内核,更新切换Linux内核使用。在配置grub2过程中,查找许多相关资料,细心去了解GRUB启动配置项的各项内容。由于在实验过程中遇到很多错误和困难,曾经因为修改grub文件导致系统不能启动。于是花费了一天时间去了解启动配置文件每一条语句的内容,才敢于第二次修改启动配置文件。相较于编译Linux内核操作步骤而言,对问题的解决才是知识上更多的收获。

​ 此外,在编译Linux内核过程中遭遇到了很多挫折和失败,这些失败给我带来不少历练。我在一次又一次的失败中,不断查找资料,让我更加有耐心,更加能面对挫折。

你可能感兴趣的:(BIT)