从源码编译linux内核并运行一个最小的busybox文件系统

从源码编译linux内核并运行一个最小的busybox文件系统

环境基础:

开发环境:ubuntu 18.04
linux源码版本:linux-4.9.229
busybox源码版本:busybox-1.30.0
qemu-system-x86_64版本:2.0.0

这篇文章将按照如下4个步骤来完成整体过程

1.下载linux并编译linux内核源码
2.编译busybox并制作一个最小的根文件系统
3.qemu启动你编译好的内核和根文件系统

1.下载linux并编译linux内核源码
可以随便选取一个:
我选择的版本是:4.9.229 :

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

1.1、指定硬件体系结构:
由于我们的开发环境是ubuntu18.04的x86_64位,我们可以将硬件的体系结构直接设置为x86,这样
就省去了我们安装编译器的过程:(如果你要使用ARM/MIPS架构,则指定ARCH=arm且需要安装交叉编译器)

export ARCH=x86 

1.2、配置board config,此处配置为 x86_64_defconfig:

make  x86_64_defconfig

1.3、配置内核:
这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:

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)

1.4、编译内核:

make

编译成功后的内核位于:arch/x86_64/boot/bzImage 。

2.编译busybox并制作一个最小的根文件系统

2.1.下载buysbox源码:

我使用的版本是busybox-1.30.0

wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2

2.2.配置buysbox源码:
在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

# make menuconfig

Busybox Settings  --->
      Build Options  --->
            [*] Build BusyBox as a static binary (no shared libs) 

2.3.编译安装:

make && make install

2.4.文件系统补充:
编译完成后的busybox就安装在源码根目录下的_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 dazaiLinux"
/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
::ctrlaltdel:/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 

2.5.制作根文件系统镜像文件:
思路
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 -p fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz 

最终生成的文件系统镜像名字为:rootfs.img.gz
执行完上述操作之后,一个最小的,完整的可以被内核启动的文件系统就完成了。

3.qemu启动你编译好的内核和根文件系统

在完成上述的2步就绪操作后,我们已经准备好了内核和文件系统镜像,幸福的一刻马上来临:
在没有开发板的情况下,我们通过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 

这样一个完整的最小的Linux系统就起来了:
从源码编译linux内核并运行一个最小的busybox文件系统_第1张图片

你可能感兴趣的:(Linux操作系统移植,linux,运维,服务器)