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

一、实验环境

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

二、准备工作

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

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

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

              

 

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

    

 

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

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

         

 

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

              

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

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

  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文件夹。

               

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

三、实验过程

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

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

  

 

 

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

  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过程中报错,按照错误提示安装相应依赖即可)。

       

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

           

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

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

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

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

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

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

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

        

 

 

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

 

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

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

 

       

 

 

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

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

  

       

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

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

  

 

四、总结与心得

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

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

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

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

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

 

posted @ 2020-06-03 13:00  c聪少  阅读(2463)  评论(2编辑  收藏  举报