Linux内核源码:下载源码、编译内核并运行一个最小系统

周末有空,动手实践一下。

1.下载linux并编译linux内核源码

2.编译busybox

3.制作一个最小的根文件系统

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

一. 编译最小系统内核

linux源码下载地址:

https://mirrors.edge.kernel.org/pub/linux/kernel/

我选择的版本是:4.9.1

下载到本地,解压,然后进入linux-4.9.1目录:

1.指定硬件体系架构。

在本例中使用的是x86,因为我的开发环境就是x86。如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。

# export ARCH=x86

2.配置board config,此处配置为 x86_64_defconfig。

# make  x86_64_defconfig

3.配置内核

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

#make menuconfig

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)

4.编译内核

# make

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

 

二. 编译Busybox根文件系统

下载buysbox源码,下载地址:

https://busybox.net/downloads/

我使用的版本是busybox-1.30.0

1.解压buysbox源码

# tar xvf busybox-1.30.0.tar.bz2

2.配置buysbox源码

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

# make menuconfig

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

3.编译和安装

#make && make install

4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:

# mkdir etc dev mnt
# mkdir -p etc/init.d/
# vim etc/fstabproc  /proc
proc  defaults 0 0
temp  /tmp  rpoc  defaults 0 0
none  /tmp  ramfs defaults 0 0
sysfs /sys  sysfs defaults 0 0
mdev  /dev  ramfs defaults 0 0

# vim etc/init.d/rcS
mkdir -p /procmkdir -p /tmpmkdir -p /sysmkdir -p /mnt/bin/mount -amkdir -p /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -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 

这样一个最小的、完整的可以被内核启动的文件系统。

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

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

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

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

4.卸载该镜像文件。

5.打成gzip包。

#!/bin/bash
rm -rf rootfs.ext3rm -rf fsdd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3mkdir fsmount -o loop rootfs.ext3 ./fscp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz 


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

四. qemu模拟器启动内核系统

​#qemu-system-x86_64 -kernel ./linux-4.9.1/arch/x86_64/boot/bzImage -initrd ./busybox-1.30.0/rootfs.img.gz  -append "root=/dev/ram init=/linuxrc" -serial file:outputfile.txt



 

Linux内核源码:下载源码、编译内核并运行一个最小系统_第1张图片

 

说明:

1. 容易出错的地方:配置内核选项时,需要选择内核支持ramdisk驱动。

 

 

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