qemu+linux内核+busybox
前提步骤
- ubuntu宿主机 x86系统
- 宿主机通过apt-get 安装qemu,交叉编译环境
- linux内核源码以及busybox源码
arm64 or x86_64
如果交叉编译,即在x86的系统上要编译启动arm64的linux内核,则在编译内核或者是busybox时均需要执行修改环境变量
export CROSS_COMPILE=aarch-linux-gnu-
export ARCH=arm64
以上的命令不是固定的,需要看我们要编译的对象是否与宿主机相同,如果相同,上面的两个环境变量便不需要执行,否则需要执行;
编译内核
- 生成默认.config
make defconfig
- 利用menuconfig修改基本配置
make menuconfig
在Devices driver -> Block devices -> RAM block device support选中,将Default RAM disk size (kbytes) 置为65536
- 可选 多线程编译
nproc 命令获得当前的cpu数, 启动内核多线程编译 - 编译内核
make -j$(nproc)
- 等待编译完成
arch/xxx平台相关/boot/
- 注意
可以在编译过程中编译的文件确认是否平台编译正确,如下面有进入到arch/arm64目录下,如果是x86,则会进入到x86的目录下
编译busy_box
- 环境变量设置之后生成默认配置项
make defconfig
- 通过menuconfig修改默认配置项
make menuconfig
Settings -> Build static binary (no shared libs)选中
3. 编译
make -j$(nproc)
- 生成_intall
make install
- 补充文件目录
在busybox的_intall同级目录下创建mk_rootfs.sh脚本,内容如下,chmod 777 mk_rootfs.sh增加执行权限之后,执行脚本;
rootfs=fs
busybox_folder=.
if [ ! -d $rootfs ]; then
mkdir $rootfs
fi
cp $busybox_folder/_install/* $rootfs/ -rf
cd $rootfs
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" >> etc/fstab
echo "tmpfs /tmp tmpfs defaults 0 0" >> etc/fstab
echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab
touch etc/init.d/rcS
echo "/bin/mount -a" >> 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
touch etc/inittab
echo "::sysinit:/etc/init.d/rcS" >> etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
echo "::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
- 制作镜像
在busybox的_install同级目录执行完毕mk_rootfs.sh的脚本之后,创建mk_img.sh,chmod 777 mk_img.sh增加执行权限之后,执行脚本,在busybox的目录下会生成rootfs.img.gz文件
#!/bin/bash
rm -rf rootfs.ext3
rm -rf fs_ext3
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs_ext3
mount -o loop rootfs.ext3 ./fs_ext3
cp -rf ./fs/* ./fs_ext3
umount fs_ext3
gzip --best -c rootfs.ext3 > rootfs.img.gz
qemu启动
创建启动脚本,launch_arm64.sh, 修改kernel路径和文件系统路径,即可执行
qemu-system-aarch64 -M virt -nographic -m size=1024M -cpu cortex-a57 -smp 4 -kernel ~/linux-4.9.229_aarch64/arch/arm64/boot/Image -initrd ~/linux-4.9.229_aarch64/busybox-1.33.1/rootfs.img.gz -append "root=/dev/ram console=ttyAMA0 rdinit=/linuxrc"
如果是编译的x86的,可以不用指定模拟机器,launch_x86.sh
qemu-system-x86_64 -kernel ~/linux-4.9.229/arch/x86_64/boot/bzImage -initrd ~/linux-4.9.229/rootfs/busybox-1.33.1/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt
qemu关闭
Ctrl+a 然后按x即可关闭qemu
Ctrl+Alt+G释放单开的qemu窗口