朋友呼吁写一篇搭建qemu的文章,在网络上面看到的文章比较散乱,按照操作都没办法运行起来。我这边就主要写一个实操,没什么理论分析,完全就是一个搭建步骤,不过保证按照操作基本就可以运行起来。
提前要准备的工具
windows电脑一台、virtualbox软件、ubuntu18.04 x64桌面版iso镜像文件
安装好virtualbox软件,并且在virtualbox中安装ubuntu18.04系统,这样工具就准备好了。
虚拟机网络设置
设置两块网卡,网卡一使用nat方式,网卡二使用host only方式。网卡一用来给虚拟机上网,不用特别的设置,网卡二用来qemu与ubuntu通信。
下图就是虚拟机中网卡二的设置
ubuntu中需要安装的软件
基础软件
sudo apt install bison u-boot-tools flex net-tools uml-utilities bridge-utils tftp-hpa tftpd-hpa xinetd zlib1g-dev libglib2.0-0 libglib2.0-dev libtool libsdl1.2-dev autoconf
安装qemu
sudo apt-get install qemu
安装交叉编译工具
sudo apt-get install gcc-arm-linux-gnueabi
qemu网络设置
修改/etc/network/interfaces文件
这里enp0s8就是网卡二在ubuntu系统中的端口号,通过ifconfig命令可以查看,不同的设备可能会有差异。
auto lo
iface lo inet loopback
auto enp0s8
auto br0
iface br0 inet dhcp
bridge_ports enp0s8
修改/etc/qemu-ifup文件
#! /bin/sh
echo tunctl -u $(id -un) -t $1
tunctl -u $(id -un) -t $1
echo ifconfig $1 0.0.0.0 promisc up
ifconfig $1 0.0.0.0 promisc up
echo brctl addif br0 $1
brctl addif br0 $1
echo brctl show
brctl show
修改/etc/qemu-ifdown文件
#! /bin/sh
echo brctl delif br0 $1
brctl delif br0 $1
echo tunctl -d $1
tunctl -d $1
echo brctl show
brctl show
上面这两个脚本文件,主要是在qemu启动和退出的时候会被调用到。
内核的获取与编译
获取内核源码
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.157.tar.xz
编译内核
make vexpress_defconfig ARCH=arm
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LOADADDR=0x60003000 uImage -j4
busybox的获取与编译
获取busybox源码
wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2
编译busybox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
设置busybox为静态链接
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
uboot的获取与编译
获取uboot源码
wget http://ftp.denx.de/pub/u-boot/u-boot-2020.01.tar.bz2
编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
制作根文件系统
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
拷贝busybox内容到磁盘文件中
cd /work/qemu/
mkdir tmp
mount -t ext3 rootfs.ext3 /tmp -o loop
cp -rf busybox-1.31.1/_install/* tmp/
cd tmp
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
创建/etc/inittab文件
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
chmod 777 etc/inittab
创建rcS文件
mkdir etc/init.d
touch etc/init.d/rcS
vim etc/init.d/rcS
#!/bin/sh
mount proc
mount -o remount,rw /
mount -a
clear
echo "My Tiny Linux Start :D ......"
chmod 777 etc/init.d/rcS
创建fstab文件
touch etc/fstab
vim etc/fstab
# /etc/fstab
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
umount设备
umount tmp
设置tftp
创建tftpboot目录
cd /work/qemu
mkdir tftpboot
chmod 777 tftpboot
修改tftp配置文件/etc/default/tftpd-hpa
TFTP_USERNAME="root"
TFTP_DIRECTORY="/work/qemu/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
重启tftpd服务
/etc/init.d/tftpd-hpa restart
拷贝kernel和设备树到tftp目录
cd /work/qemu
cp -f linux-4.4.157/arch/arm/boot/uImage tftpboot/
cp -f linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb tftpboot/
qemu的开发环境就搭建好了,下面来运行一下
单独启动kernel
qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-4.4.157/arch/arm/boot/zImage -dtb linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
单独启动uboot
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot-2020.01/u-boot -net nic -net tap,ifname=tap0 -sd rootfs.ext3
通过uboot启动kernel
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel u-boot-2020.01/u-boot -net nic -net tap,ifname=tap0 -sd rootfs.ext3
setenv ipaddr 192.168.56.110
setenv serverip 192.168.56.102
tftp 0x60003000 uImage
tftp 0x60500000 vexpress-v2p-ca9.dtb
setenv bootargs root=/dev/mmcblk0 rw ip=192.168.56.111 console=ttyAMA0
bootm 0x60003000 - 0x60500000
这里要注意,serverip就是ubuntu系统中网卡二(enp0s8)的ip,不同的设备地址可能会不同,需要根据自己的情况修改。