使用qemu编译并运行linux内核

参考文章:
https://www.bilibili.com/read/cv11271232?spm_id_from=333.999.0.0
https://blog.csdn.net/scarecrow_sun/article/details/124246273
https://www.jianshu.com/p/e1a4b5b808e0

linux内核的编译和qemu的安装过程基本上都是一样的,区别只在于cpu架构不同采取不同的编译方式。
关键在于文件系统的构建和busybox的安装上。

从磁盘镜像的制作开始

制作磁盘镜像并挂载

使用 qemu-img 创建一个 512M 的磁盘镜像文件:
qemu-img create -f raw disk.raw 512M
现在 disk.raw 文件就相当于一块磁盘,为了在里面存储文件,需要先进行格式化,创建文件系统。比如在 Linux 系统中使用 ext4 文件系统

进行格式化:
mkfs -t ext4 ./disk.raw

挂载磁盘镜像文件
格式化完成之后,可以在 Linux 系统中以 loop 方式将磁盘镜像文件挂载到一个目录上,这样就可以操作磁盘镜像文件中的内容了。
下面的命令将磁盘镜像文件挂载到 rootfs目录上,这个目录需要自己创建:
sudo mount -o loop ./disk.raw ./rootfs

安装内核模块
注意,下边的命令要在linux内核文件的路径下边执行,指定的安装路径是刚刚挂载的磁盘文件的路径
现在可以将之前编译好的内核模块安装到磁盘镜像中了。命令如下:

sudo make modules_install \ # 安装内核模块 
INSTALL_MOD_PATH=~home/rootfs # 指定安装路径

内核模块安装完成会在rootfs文件夹下边出现lib文件夹,lib文件夹里边有modules文件,其中就是内核模块

准备 init 程序

因为linux内核的启动需要init的引导,所以需要使用busybox来制作的init程序
busybox的编译过程基本一致,安装的时候需要

make install CONFIG_PREFIX=<path_to_disk_img_mount_point> 

路径就是刚刚挂载磁盘的路径,之后要配置一些其他文件夹,可以在rootfs文件下边创建一个脚本文件,并执行

#!/bin/bash
mkdir etc dev mnt
mkdir -p proc sys tmp mnt
mkdir -p etc/init.d/
touch etc/fstab
echo 'proc        /proc           proc         defaults        0        0
tmpfs       /tmp            tmpfs      defaults        0        0
sysfs       /sys            sysfs        defaults        0        0' > etc/fstab

touch etc/init.d/rcS
echo 'echo -e "Welcome to tinyLinux"
/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' > etc/init.d/rcS
chmod 755 etc/init.d/rcS

touch etc/inittab
echo '::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/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

至此准备工作完成

启动

qemu-system-x86_64 -m 512M -kernel /home/zsz/zsz/linux-4.9.229/arch/x86_64/boot/bzImage -append "root=/dev/sda init=/linuxrc" -drive format=raw,file=./disk.raw -serial file:output.txt

其中
/home/zsz/zsz/linux-4.9.229/arch/x86_64/boot/bzImage:是内核编译之后的文件位置
./disk.raw:是磁盘映像的位置
使用qemu编译并运行linux内核_第1张图片

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