编译linux kernel源码
获取linux kernel code
git clone https://github.com/torvalds/linux.git
安装依赖项
这里以ubuntu平台为例
sudo apt-get install libncurses5-dev flex bison libssl-dev libelf-dev
编译
这里我们以编译x86平台的kernel为例
export ARCH=x86 #设置编译ARCH环境为x86
#进入linux kernel目录下
make menuconfig#进入menuconfig设置编译属性
#支持ramdisk
----------------------------------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)
-------------------------------------------------------------------------------------
make #开始编译
如果是初次编译需要等待较长时间,若编译成功,在编译log最后会看到编译kernel Image的路径,需要记下这个路径之后会使用到
如上图日志,Image文件在arch/x86/boot/bzImage路径内
制作busybox文件系统
运行简易linux环境前我们需要制作一个简易的文件系统供运行,这里我们使用busybox
安装编译busybox
#下载busybox,建议先检查版本并下载最新版,这里使用1.33.1版本
wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2
#解压
tar xvjf busybox-1.33.1.tar.bz2
#进入busybox目录编译
make menuconfig
----------------------------------menuconfig-----------------------------------------
Settings--->
--- Build Options
[*] Build static binary (no shared libs)
-------------------------------------------------------------------------------------
make && make install
编译成功后busybox目录下会出现名为_install的文件
制作文件系统
使用以下命令生成文件系统gzip包,建议把这些命令打包在shell文件内,一键生成
#!/bin/bash
cd _install
#在_install目录下补充必要文件
mkdir -p etc dev mnt proc sys tmp mnt etc/init.d/
echo "proc /proc proc defaults 0 0" > etc/fstab
echo "tmpfs /tmp tmpfs defaults 0 0" >> etc/fstab
echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab
echo "echo -e \"Welcome to tinyLinux\"" > etc/init.d/rcS
echo "/bin/mount -a" >> etc/init.d/rcS
echo "echo -e \"Remounting the root filesystem\"" >> etc/init.d/rcS
echo "mount -o remount,rw /" >> etc/init.d/rcS
echo "mkdir -p /dev/pts" >> etc/init.d/rcS
echo "mount -t devpts devpts /dev/pts" >> etc/init.d/rcS
echo "echo /sbin/mdev > /proc/sys/kernel/hotplug" >> etc/init.d/rcS
echo "mdev -s" >> etc/init.d/rcS
chmod 755 etc/init.d/rcS
echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
echo "::cttlaltdel:/bin/umount -a -r" >> etc/inittab
chmod 755 etc/inittab
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
cd ../..
rm -rf rootfs.ext3
rm -rf fs
#然后通过以下执行将文件系统打包成gzip包
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
最终在busybox目录下会生成rootfs.img.gz的gzip包,这就是我们之后会使用到的文件系统
运行QEMU
安装QEMU
#下载qemu,建议下载最新版
wget https://download.qemu.org/qemu-6.0.0.tar.bz2
tar xvjf qemu-6.0.0.tar.bz2
#编译需要的一些工具
sudo apt-get install ninja-build pkg-config libglib2.0-dev libpixman-1-dev
#进入qemu路径,注意不同版本文件名可能不同
cd qemu-6.0.0/
./configure
make && make install
运行Linux
若QEMU安装成功,那么我们所需要运行Linux的所有软件都已经安装完成了,
输入以下指令即可运行简易Linux环境
qemu-system-x86_64 -M pc -kernel ./linux/arch/x86/boot/bzImage -initrd ./busybox-1.33.1/rootfs.img.gz -append "root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" -nographic
# -kernel 编译的linux kernel image文件
# -initrd busybox文件系统gzip文件
# -nographic 无图形界面模式,如果使用终端需要这个参数
运行成功后会看到这样的日志输出,可以运行基本Linux命令
退出QEMU Linux
先按ctrl+A,再按X,即可退出QEMU Linux