虚拟机ubuntu-编译属于自己的linux内核

一、实验环境

Vmware15.5, Ubuntu18.04, linux-5.6.14内核(以这个环境为例)

二、准备工作

1. 安装好虚拟机,安装Ubuntu系统。(本次实验用的是虚拟机没有用双系统,因为实验中有一要求是实现文件交互,所以采用虚拟机,稍后也会下载相应工具)

  (另外,如果电脑配置够的话,可以将虚拟机配置高端一点,因为后面 make 这个步骤很花时间。)

2.  下载linux-5.6.14内核(https://www.kernel.org/)(linux内核官网,下载压缩包tarball即可)

              虚拟机ubuntu-编译属于自己的linux内核

3.  现在我们就需要下载VMware Tools,一个可以将文件从主机拖入客户机的工具。(因为目前虚拟机挂起状态,所以它不可选)

  虚拟机ubuntu-编译属于自己的linux内核

4.  VMware Tools下载完成之后,会有一个CD图标。然后我们进入所在路径 /media,可以将压缩包拖入桌面,进行解压。

  解压命令:sudo tar -zxvf VMware Tools-...... (直接用Tab键补全文件名称以免出错)

         虚拟机ubuntu-编译属于自己的linux内核

  解压完成后,进入/vmware-tools-distrib路径,后执行命令 sudo ./vmware-install.pl 开始安装,一路回车。

              虚拟机ubuntu-编译属于自己的linux内核

  因为我已经安装过,就不再截图演示。如果安装出现问题,可以自行百度。

  安装完成后,重启虚拟机。

5. 现在我们可以将下载的linux-5.6.14压缩包拖入虚拟机。若不能拖入则说明VMware Tools安装出问题。

  拖入后,执行命令 sudo mv linux-5.6.14.tar.xz /usr/src 然后进入/usr/src路径,执行命令 sudo tar -xvf linux-5.6.14.tar.xz

  就可看到生成linux-5.6.14文件夹。

               虚拟机ubuntu-编译属于自己的linux内核

  到此我们的准备工作就完成了。

三、实验过程

(实验过程我以root用户进行,通过命令 su 就可进入 root用户。如果报错有可能是没有设置密码,输入 sudo passwd,设置密码即可)

我们先来看一下默认的内核。在终端输入 uname -a。(这个是重装虚拟机之前的图,所以虚拟机、用户名称不一样。无伤大雅)

虚拟机ubuntu-编译属于自己的linux内核

   下来我们开始编译自己的内核:

1. cd linux-5.6.14,进入该路径。我们通过 make 来编译内核,所以我们需要环境和依赖。

  1. apt install gcc

    2. apt install make

  3. apt install gcc make libncurses5-dev openssl libssl-dev

  4. apt install pkg-config

  5. apt install bison

  6. apt install flex

  7. apt install libelf-dev

 安装完成我们就可以进行下一步工作。执行命令 make nconfig ,进入下面界面(如果make nconfig过程中报错,按照错误提示安装相应依赖即可)。

       虚拟机ubuntu-编译属于自己的linux内核

 我们将内核名称自行命名。进入 General setup ,修改 Local version。修改完成后保存(此处会保存为.config),后退出。

           虚拟机ubuntu-编译属于自己的linux内核

 在此步骤做一点说明,此处我们仅修改了名称,别的选项都是默认。因为选项设置麻烦,所以不做说明,但这会导致下一步

 make的时候比较费时间。可以自行在网上找简洁的 .config 文件,将文件拷到虚拟机即可。

2. 好了, .config 文件我们已经完成了。下一步就开始 make。执行命令 make -j4 (4个线程跑,会快很多。-j4 是可选项,取决于

   你的虚拟机配置)。这一步骤需要 3h 左右(我第一次跑三小时,后来4线程跑一个多小时。这个过程会有 warning 内存过大,

   这个不用管,注意warning信息,如果需要可以暂停更改环境配置)。

  3. 经过漫长的等待,make 这步终于完成了。然后执行命令 make modules_install

  4. 执行命令 make install。完成后重启虚拟机。

        虚拟机ubuntu-编译属于自己的linux内核

  好啦。到此内核编译就完成了。我们开始内核引导,必须要看到属于自己的内核~

  重启过后,终端执行 cd /boot/ 。System.map - * 就是要用的东西。

  执行命令  sudo update initramfs -c -k 5.6.1418130500337-ssc (这里用你的文件名称替换哦!)

       虚拟机ubuntu-编译属于自己的linux内核

   完成后执行命令 sudo update-grub 。会生成一个.img文件,这是由内核源码生成的内核镜像。

  我们需要修改grub,执行命令 cd /boot/grub/ ,修改 grub.cfg文件。执行命令 sudo vim grub.cfg

  虚拟机ubuntu-编译属于自己的linux内核

       虚拟机ubuntu-编译属于自己的linux内核

     到这里就已经修改完成了。重启虚拟机。

再次进入执行命令 uname -a , 便可看到自己的内核。

虚拟机ubuntu-编译属于自己的linux内核

四、总结与心得

  这里说一下对内核的一些了解。ubuntu = kernel + users application + shell,是一个介于一般程序与硬件之间的东西。

  比如c语言中的 printf(), 就是 printf() -> c库中的printf() -> c库中的write() -> kernel中的 write()。

  下一篇是打算是关于系统调用,这也是实验内容之一。

  实验的完成也是磕磕绊绊,所有的失败都归结于错误的开始。因为这是几天前完成的实验,我没有保留

完整的实验现场,所以中间内容可能展示不到位,不过如果有错欢迎评论指出,初学者的路还很长。

相关推荐