要学习Linux内核,首先要会编译内核,还需要了解内核是如何启动根文件系统的。 这样就可以完成Linux内核代码更改后的验证过程。
本文将引导您完成以下过程:
2.编译busybox
3.制作最小根文件系统
4.qemu启动编译好的内核和根文件系统
Linux源码下载地址:
镜像.边缘.内核。 组织/pub/linux/内核/
我选择的版本是:4.9.229
CDN.内核。 org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz
下载到本地,解压linux 源码怎么编译,然后进入linux-4.9.229目录:
1. 指定硬件架构。
为了减少安装编译器的过程,本例中我使用了x86,因为我的开发环境是x86。 如果要编译arm内核linux 源码怎么编译,指定ARCH=arm,需要安装交叉编译器。
# export ARCH=x86
2、配置boardconfig,这里配置为x86_64_defconfig。 好的,我们已经点了,菜单是x86_64_defconfig
# make x86_64_defconfig
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)
4.编译内核
# make
编译成功后的内核位于:arch/x86_64/boot/bzImage
下载buysbox源码,下载地址:
繁忙的盒子。 网/下载/
我使用的版本是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/fstab
proc /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 /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
# 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.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模拟器启动我们自己编译的内核和文件系统:
# 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内核代码并运行验证。