参考:https://www.zhaixue.cc/qemu/qemu-build_kernel.html

前言:

Linux操作系统运用十分广泛,但我们有时不需要运用所有组件,或者对处理机性能有要求,所以需要对Linux内核进行裁剪。

 

1.开发环境 

系统 ubantu18.04

linux内核源码 linux-4.9.229 

busybox版本 busybox-1.30.0

虚拟机 qemu 2.0.0

 

2.相关软件安装

这是一个shell文件也可以一行行复制执行(shell脚本)

 

# download code 

curl https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz -o kernel.tar.xz

export ARCH=x86

# unzip Kernel

tar xf kernel.tar.xz

cd linux-4.9.229

# install curses

sudo apt-get install libncurses5-dev

make x86_64_defconfig

#

cd ..

curlhttps://busybox.net/downloads/busybox-1.30.0.tar.bz2 -o busybox-1.30.0.tar.bz2

#

tar xf busybox-1.30.0.tar.bz2

 

cd linux-4.9.229

make menuconfig

#打开编译配置界面

左右按键选择 <select> <Exit> …等控制选项 上下选择编译选项 空格选择该选项是否运行 回车键确定操作

选择General setup --→

 

按空间建  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

如上设置

Device Drivers --->

[*] Block devices --->

<*>  RAM block device support

 (65536) Default RAM disk size (kbytes)

 

选择Save保存

make 编译

需要等一会

 

系统编译后位于 arch/x86_64/boot/bzImage

 

接下来编译busybox

先  make menuconfig 然后设置为静态编译

Busybox Settings --->

Build Options --->

[*] Build BusyBox as a static binary (no shared libs)

#make && make install

编译和安装

编译后文件在 __install

创建一些必要的目录和路径

# mkdir etc dev mnt

# mkdir -p proc sys tmp mnt

# mkdir -p etc/init.d/

# vim etc/fstab

proc    /proc      proc     defaults    0    0

tmpfs    /tmp      tmpfs    defaults    0    0

sysfs    /sys      sysfs    defaults    0    0

# vim etc/init.d/rcS

echo -e "Welcome to tinyLinux"

/bin/mount -a

echo -e "Remounting the root filesystem"

mount -o remount,rw /

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

# 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

以上已经完成了所有linux最小系统所需要的东西

 

接下来是制作系统镜像

思路参考B站UP主 “简说Linux”

1.先制作一个空的镜像文件;

2.然后把此镜像文件格式化为ext3格式;

3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

4.卸载该镜像文件。

5.打成gzip包。

#!/bin/bash

rm -rf rootfs.ext3

rm -rf fs

dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32

mkfs.ext3 rootfs.ext3

mkdir fs

mount -o loop rootfs.ext3 ./fs

cp -rf ./_install/* ./fs

umount ./fs

gzip --best -c rootfs.ext3 > rootfs.img.gz

最终生成的文件系统镜像名字为:rootfs.img.gz

接下来用模拟器启动该镜像。

安装qemu

apt-install qemu

接下来启动镜像

# qemu-system-x86_64 \

-kernel ./linux-4.9.229/arch/x86_64/boot/bzImage \

-initrd ./busybox-1.30.0/rootfs.img.gz  \

-append "root=/dev/ram init=/linuxrc" \

-serial file:output.txt

打开虚拟机后输入ls测试执行成功  按alt+ctrl退出虚拟机输入

自此一个最小linux系统搭建完成。

 

结束语

现在我们完成了相当于“hello world”和点灯的操作,但内核开发还有很多的知识等待我们探索。

作者:阿木实验室