通过uboot启动kernel+rootfs
QEMU支持网络通信方法
QEMU支持四种网络功能,分别是
- 用户协议栈方式
- socket方式
- TAP/Bridge方式
- VDE方式
以下主要采用桥接方式
安装必要模块支持
apt install uml-utilities
apt install bridge-utils
查看/dev/net/tun文件
如果该文件存在,则表明内核已经支持Tun,如果不存在,则需要加载tun模块,并创建该文件
ls -l /dev/net/tun
创建br0网桥
ifconfig <你的网卡名称(能上网的那张)> down # 首先关闭宿主机网卡接口
brctl addbr br0 # 添加一座名为 br0 的网桥
brctl addif br0 <你的网卡名称> # 在 br0 中添加一个接口
brctl stp br0 off # 如果只有一个网桥,则关闭生成树协议
brctl setfd br0 1 # 设置 br0 的转发延迟
brctl sethello br0 1 # 设置 br0 的 hello 时间
ifconfig br0 0.0.0.0 promisc up # 启用 br0 接口
ifconfig <你的网卡名称> 0.0.0.0 promisc up # 启用网卡接口
dhclient br0 # 从 dhcp 服务器获得 br0 的 IP 地址
brctl show br0 # 查看虚拟网桥列表
brctl showstp br0 # 查看 br0 的各接口信息
创建TAP设备
modprobe tun
tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问
brctl addif br0 tap0 # 在虚拟网桥中增加一个 tap0 接口
ifconfig tap0 0.0.0.0 promisc up # 启用 tap0 接口
brctl showstp br0 # 显示 br0 的各个接口
测试运行
qemu-system-arm \
-M vexpress-a9 \
-nographic \
-m 512M \
-kernel u-boot \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
在uboot命令行下,设置ip和netmask,ping主机
setenv ipaddr 10.0.219.100
setenv serverip 10.0.219.20
setenv netmask 255.255.0.0
saveenv
ping 10.0.219.20
测试结果
可以看到主机host is alive,表示QEMU已经支持网络功能。
配置u-boot
主要是修改include/configs/vexpress_common.h,并重新编译u-boot
添加默认环境变量
/* netmask */
#define CONFIG_IPADDR 10.0.219.100
#define CONFIG_NETMASK 255.255.0.0
#define CONFIG_SERVERIP 10.0.219.20
修改CONFIG_BOOTCOMMAND参数
#define CONFIG_BOOTCOMMAND "run bootflash;"
修改为:
#define CONFIG_BOOTCOMMAND "tftp 0x60003000 uImage; setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0'; bootm 0x60003000"
测试运行
qemu-system-arm \
-M vexpress-a9 \
-nographic \
-m 512M \
-kernel u-boot \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
测试结果
可以看到uboot已经可以自动从TFTP服务器上下载uImage文件。
配置kernel
因为要用u-boot引导,所以需要把kernel编译成uImage格式
export ARCH=arm
export CROSS_COMPILE=arm-linux-
export LOADADDR=0x60003000
make vexpress_defconfig
make zImage
make uImage
make modules
make
将在arch/arm/boot/生成的uImage拷贝到TFTP服务器目录下,启动TFTP服务器
测试
qemu-system-arm \
-M vexpress-a9 \
-nographic \
-m 512M \
-kernel u-boot \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
测试结果
可以看到Starting kernel,内核已经成功启动
制作rootfs
qemu-img create -f raw vexpress.ext3 100M #生成镜像
mkfs.ext3 vexpress.ext3 #格式化为ext3文件系统
mount -t ext3 vexpress.ext3 /mnt -o loop #挂载ext3文件系统到/mnt目录
cp -r rootfs/* /mnt #拷贝文件系统
umount /mnt #卸载ext3文件系统
测试
qemu-system-arm \
-M vexpress-a9 \
-nographic \
-m 512M \
-kernel u-boot \
-sd vexpress.ext3 \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0
测试结果
可以看到已经正常进入到文件系统中。