Linux内核编译运行最小系统

参考视频链接:https://www.bilibili.com/video/BV1yk4y1B7Fx/spm_id_from=333.788.recommend_more_video.0
参考教程:https://www.bilibili.com/read/cv7118525/

运行环境:基于X64平台虚拟机的ubuntu20.04系统

1.编译linux内核源码

首先下载linux内核源码:
地址:https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.250.tar.xz
我采用的版本是4.9.250,可以根据需求登录https://www.kernel.org/更改其他版本使用

在Ubuntu创建一个工作目录,后续工作均在这个目录进行
我选择的目录是/home/ubuntu/work/kernel (这里ubuntu是我的用户名)
通过xftp或其他工具将下载的linux-4.9.250.tar.xz包放到该目录下,执行以下命令进行解压:

xz -d linux-4.9.250.tar 
tar -xvf linux-4.9.250.tar

进入到linux-4.9.250目录,并切换到root用户
1)指定硬件体系架构
采用X86架构,输入以下命令

export ARCH=x86
  1. 配置board config
    此处配置x86_64_defconfig,输入命令
make x86_64_defconfig
  1. 配置内核
    需要支持ramdisk,输入以下命令:
make meunconfig

此时会进入kernel config配置界面
Linux内核编译运行最小系统_第1张图片
注意:此处的[*]代表被选中,[ ]表示未被选中

依次进入
General setup —>
[*]Initial RAM filesystem and RAM disk (initramfs/initrd) support
选中上面这个选项(光标放上去按空格可以选中或者取消),如果已经选中了就什么也不用做。
返回上一级,依次进入

Device Drivers —>
[*]Block devices —>
[*] RAM block device support
选中该选项,并将下面的Default RAM disk size (kbytes)修改为65536

选择依次退出,并在最后提示是否保存时选择yes。

  1. 编译内核
    执行以下命令(此时应在目录/home/ubuntu/work/kernel/linux-4.9.250/下)
make

第一次编译时间可能比较长,约10分钟左右,请耐心等待编译完成。
编译成功后的内核位于:arch/x86_64/boot/bzImage

编译过程如果出现以下错误
fatal error: openssl/opensslv.h: No such file or directory
执行以下代码安装OpenSSL开发包

 apt-get install libssl-dev

重新执行make。

2.编译文件系统

1)下载busybox
下载地址:
https://busybox.net/downloads/busybox-1.32.0.tar.bz2

原教程采用的版本为1.30.0, 编译时出现错误,编译不通过,更换了1.32.0后成功。

通过xftp或其他方法将busybox-1.32.0.tar.bz2放在/home/ubuntu/work/kernel目录下

2)解压:

tar xvf busybox-1.32.0.tar.bz2

3)配置busybox

进入busybox-1.32.0目录,配置busybox为静态编译,这样busybox运行的时候不需要额外对的动态链接库。
输入命令

make menuconfig

打开以下界面
Linux内核编译运行最小系统_第2张图片
依次选择
Settings —>
— Build Options
[*] Build static binary (no shared libs) (NEW)
选中该选项。
依次选择退出该界面,在最后提示保存的时候选择yes。

4)编译与安装
首先在busybox-1.32.0目录下执行

make

等待编译完成,出现以下结果表示编译成功:
Linux内核编译运行最小系统_第3张图片
再执行

make install

出现以下结果表示成功:
Linux内核编译运行最小系统_第4张图片

5)补充相关文件或目录

首先创建几个文件夹,执行

 mkdir etc dev mnt
 mkdir -p etc/init.d/

在etc(是我们创建出来的etc,而不是ubuntu系统的etc)目录添加fstab文件,执行命令

vim etc/fstab

在文件中输入以下内容:

proc  /proc proc  defaults 0 0
tmpfs  /tmp  tmpfs  defaults 0 0
none  /tmp  ramfs defaults 0 0
sysfs /sys  sysfs defaults 0 0
mdev  /dev  ramfs defaults 0 0

在etc/init.d目录下创建rsS文件,输入命令:

vim etc/init.d/rcS

输入以下内容:

mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

更改该文件权限:

chmod 755 etc/init.d/rcS

在etc目录下创建inittab:

vim etc/inittab

输入以下内容:

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::cttlaltdel:/bin/umount -a -r

更改文件权限

chmod 755 etc/inittab

还需要执行以下指令创建三个虚拟设备

 cd dev
 mknod console c 5 1
 mknod null c 1 3
 mknod tty1 c 4 1

3.制作根文件系统镜像文件

参考博主思路:

1.先制作一个空的镜像文件;
2.然后把此镜像文件格式化为ext3格式;
3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;
4.卸载该镜像文件。
5.打成gzip包。

在/home/ubuntu/work/kernel/busybox-1.32.0目录下

1)创建一个镜像文件并将其格式化为ext3格式:

dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
  1. 创建fs目录并将rootfs.ext3文件挂载到该目录下,执行以下命令:
mkdir fs
mount -o loop rootfs.ext3 ./fs
  1. 将 ./_install下的全部文件复制到 ./fs目录下,执行:
cp -rf ./_install/* ./fs
  1. 卸载镜像文件并打包成gzip文件:
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz

以上内核和文件系统镜像应准备好,准备启动内核…

3.启动文件系统和内核

首先需要在Ubuntu内安装qemu虚拟机,通过执行以下命令查看qemu是否已经安装:

dpkg -l|grep qemu-system-x86

如果返回类似以下内容表示已经安装了
在这里插入图片描述
否则,应先安装qemu,执行以下命令安装

apt-get install qemu-system-x86

安装完成以后在/home/ubuntu/work/kernel目录下执行:

qemu-system-x86_64 -kernel ./linux-4.9.250/arch/x86_64/boot/bzImage -initrd ./busybox-1.32.0/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt

启动完成后按下回车键进入以下界面表示启动成功:
Linux内核编译运行最小系统_第5张图片
以上教程结束,有问题欢迎留言或加QQ:878234972交流!

你可能感兴趣的:(Linux,linux,ubuntu,内核)