学习linux内核,要能够了解内核,需要了解内核如何启动根文件系统。 本文教你完成下列过程: 1.下载linux并编译linux内核源码 2.编译busybox 3.制作一个最小的根文件系统 4.qemu启动你编译好的内核和根文件系统
linux源码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/ https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz 备用下载地址: http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz 下载到本地,解压,然后进入linux-4.9.229目录: 1.指定硬件体系架构。
#export ARCH=x86(如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器) 2.配置board config,此处配置为 x86_64_defconfig。
# make x86_64_defconfig3.配置内核 这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:
# make menuconfig(没有的先安装它)
General setup —>
Device Drivers —>
4.编译内核
编译过程中喝杯茶
编译成功后的内核位于:arch/x86_64/boot/bzImage
下载buysbox源码,下载地址: https://busybox.net/downloads/ 1.解压buysbox源码
# tar xvf busybox-1.30.0.tar.bz22.配置buysbox源码 进入busybox-1.30.0目录:
# make menuconfig3.编译和安装
#make && make install4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下: 1)
# mkdir etc dev mnt # mkdir -p etc/init.d/ # vim etc/fstabproc /proc proc defaults 0 0 temps /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 /procm kdir -p /tmp mkdir -p /sys mkdir -p /mnt/bin/mount -a mkdir -p /dev/pts mount -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包。
制作shell脚本
#!/bin/bash rm -rf rootfs.ext3 rm -rf fsdd if=/dev/zero of=./rootfs.ext3 bs=1M count=32 mkfs.ext3 rootfs.ext3 mkdir fs mount -o loop rootfs.ext3 ./fscp -rf ./_install/* ./fs umount ./fs gzip --best -c rootfs.ext3 > rootfs.img.gz最终生成的文件系统镜像名字为:rootfs.img.gz 准备好了内核和文件系统镜像,幸福的一刻马上来临了:
通过qemu模拟器启动我们自己编译的内核和文件系统: Top:没有qemu模拟器 先安装 (命令:sudo apt-get 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这样一个完整的最小linux系统就起来啦: 执行.sh
显示以下界面说明已经成功进入x86最小系统。如若未能成功,可能是bzImage 和 rootfs.img.gz路径不对
END。。。