一、实验环境
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()。
下一篇是打算是关于系统调用,这也是实验内容之一。
实验的完成也是磕磕绊绊,所有的失败都归结于错误的开始。因为这是几天前完成的实验,我没有保留
完整的实验现场,所以中间内容可能展示不到位,不过如果有错欢迎评论指出,初学者的路还很长。