编译并使用Qemu运行一个基于busybox的最小操作系统
Feb 19, 2024
编译环境为ubuntu 18.04
编译kernel
安装编译工具
1 | sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils |
下载并编译内核代码
1 | wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz |
令编译的内核支持ramdisk驱动
1 | General setup ---> |
Busybox
编译Busybox
1 | tar xvf busybox-1.30.0.tar.bz2 |
把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。
1 | Busybox Settings ---> |
配置根文件系统
1 | cd _install/ |
其中, fstab文件:
1 | proc /proc proc defaults 0 0 |
rcS文件:
1 | echo -e "Welcome to tinyLinux" |
mdev是busybox提供的一个工具,相当于简化版的udev。通过描述sysfs下的dev节点,在系统启动和热插拔或动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。
inittab文件:
1 | # Format for each entry: <id>:<runlevels>:<action>:<process> |
烧录镜像文件
将如下内容拷贝至make_rootfs.sh
文件中:
1 |
|
运行脚本
1 | sh make_rootfs.sh |
运行系统
安装qemu
1 | apt install qemu |
启动qemu
1 | 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 -curses |
-curses
: Normally, QEMU uses SDL to display the VGA output. With this option, QEMU can display the VGA output when in text mode using a curses/ncurses interface. Nothing is displayed in graphical mode.-curses
works over ssh.-serial
:用于配置虚拟机的串行端口。该选项可以用于将虚拟机与主机之间建立串行通信连接,以便在虚拟机中模拟串行设备的输入和输出。使用-serial file:filename
将串行输出保存到文件中进行分析。以下是一些常用的-serial
选项参数:stdio
:将虚拟机的串行输入输出重定向到主机的标准输入输出(通常是终端窗口)。file:filename
:将虚拟机的串行输出重定向到指定的文件中。tcp:host:port
:通过 TCP/IP 连接将虚拟机的串行输入输出重定向到指定的主机和端口。udp:host:port
:通过 UDP 连接将虚拟机的串行输入输出重定向到指定的主机和端口。
-append
:用于指定要传递给内核的命令行参数。当使用 -kernel 选项加载一个内核映像时,通常需要将一些参数传递给内核,以配置虚拟机的启动行为。这些参数可以通过 -append 选项来指定。
在生成的终端中关闭系统, 即可退出qemu
1 | poweroff |