1、实验环境linux
Vmware15.5, Ubuntu18.04, linux-5.6.14内核(以这个环境为例)shell
2、准备工做ubuntu
1. 安装好虚拟机,安装Ubuntu系统。(本次实验用的是虚拟机没有用双系统,由于实验中有一要求是实现文件交互,因此采用虚拟机,稍后也会下载相应工具)vim
(另外,若是电脑配置够的话,能够将虚拟机配置高端一点,由于后面 make 这个步骤很花时间。)app
2. 下载linux-5.6.14内核(https://www.kernel.org/)(linux内核官网,下载压缩包tarball便可)工具
3. 如今咱们就须要下载VMware Tools,一个能够将文件从主机拖入客户机的工具。(由于目前虚拟机挂起状态,因此它不可选)flex
4. VMware Tools下载完成以后,会有一个CD图标。而后咱们进入所在路径 /media,能够将压缩包拖入桌面,进行解压。es5
解压命令:sudo tar -zxvf VMware Tools-...... (直接用Tab键补全文件名称以避免出错)
spa
解压完成后,进入/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文件夹。
到此咱们的准备工做就完成了。
3、实验过程
(实验过程我以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 , 即可看到本身的内核。
4、总结与心得
这里说一下对内核的一些了解。ubuntu = kernel + users application + shell,是一个介于通常程序与硬件之间的东西。
好比c语言中的 printf(), 就是 printf() -> c库中的printf() -> c库中的write() -> kernel中的 write()。
下一篇是打算是关于系统调用,这也是实验内容之一。
实验的完成也是磕磕绊绊,全部的失败都归结于错误的开始。由于这是几天前完成的实验,我没有保留
完整的实验现场,因此中间内容可能展现不到位,不过若是有错欢迎评论指出,初学者的路还很长。