本文介绍的是利用NFS挂载根文件系统。github仓库:https://github.com/rikeyone/qemu-linux-system.git
host上需要先配置NFS服务
HOST_IP=192.168.1.1
NET_NUMBER=192.168.1.0
NET_MASK=255.255.255.0
NFS_ROOT=~/work/rootfs
sudo apt-get install nfs-kernel-server
sudo apt-get install uml-utilities
if [ ! -e /etc/exports.bak ];then
sudo cp /etc/exports /etc/exports.bak
fi
sudo echo "${NFS_ROOT} *(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports
sudo /etc/init.d/nfs-kernel-server restart
TAP=$(ifconfig tap0 | head -n 1 | awk '{print $1}')
if [ x${TAP} = x ];then
sudo tunctl -u $(whoami) -t tap0
sudo ifconfig tap0 ${HOST_IP}
sudo route add -net ${NET_NUMBER} netmask ${NET_MASK} dev tap0
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
fi
在宿主机上创建一个TAP网络,对应的网络设备为tap0。
qemu启动target设备
qemu-system-arm -M vexpress-a9 \
-smp 4 \
-m 1024m \
-kernel linux-4.0/arch/arm/boot/zImage \
-append "console=ttyAMA0 loglevel=8 root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT},nolock ip=${TARGET_IP}" \
-dtb linux-4.0/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-net nic -net tap,ifname=tap0,script=no \
-nographic
关键是传入cmdline选项:
root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT},nolock ip=${TARGET_IP}
以及对应的qemu选项
-net nic -net tap,ifname=tap0,script=no
这里的qemu选项指定要虚拟网卡,并且把虚拟机的网络加到tap0中。
如果我们使用的arm64平台,那么qemu的命令会有些差异:
qemu-system-aarch64 -machine virt \
-cpu cortex-a57 \
-machine type=virt \
-nographic -m 2048 \
-smp 2 \
-kernel linux-4.0/arch/arm64/boot/Image \
-append "console=ttyAMA0 loglevel=8 root=/dev/nfs rw nfsroot=${HOST_IP}:${NFS_ROOT}/arm64/_install,nolock ip=${TARGET_IP}:${HOST_IP}:::::off::" \
-netdev tap,id=tap0,ifname=tap0,script=no \
-device virtio-net-device,netdev=tap0
主要差异在于qemu传入的选项发生了变化:
“-netdev tap,id=tap0,ifname=tap0,script=no”指定QEMU虚拟机网络设备的后端。
“-device virtio-net-device,netdev=tap0”表示虚拟机中的网络设备,需要指定绑定上的netdev。