ubuntu下qemu创建arm虚拟机、uefi shell启动系统并与物理机通信
因为个人需要,搭建了一台arm仿真的虚拟机。具体细节和原理可以网上搜索,这里仅记录过程
qemu创建虚拟机
1.下载镜像(用于安装系统),下载QEMU_EFI.fd(用于引导启动操作系统,地址http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/)
2.创建虚拟盘,这里选择的qocw2格式,名称是ubuntu_arrch64.img,大小30G
qemu-img create -f qcow2 ubuntu_arrch64.img 30G
3.初次启动并安装系统。下面的命令可以写入shell脚本中方便反复使用。其中QEMU_EFI.fd是efi的路径。$1是准备的镜像的路径。$2是刚才创建的img的路径。-m 后面表示模拟的内存,单位是MB。-smp表示模拟的cpu个数。
qemu-system-aarch64 \
-m 4096 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic \
-drive if=none,file=$1,id=cdrom,media=cdrom \
-device virtio-scsi-device \
-device scsi-cd,drive=cdrom \
-drive if=none,file=$2,id=hd0 \
-device virtio-blk-device,drive=hd0
命令成功后,会进入引导安装系统界面,按照安装系统的步骤操作即可。
qemu启动虚拟机
1.安装完成后,下次需要启动虚拟机
qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic \
-drive if=none,file=$1,id=hd0 -device virtio-blk-device,drive=hd0 \
因为qemu只是相当于模拟了一套硬件,来启动我们创建好的虚拟盘。在我们将系统装进了虚拟盘后,其他的参数(内存、cpu、网卡等)是可以更改的。
2.启动后会进入uefi shell界面,需要找到efi存放路径并启动
FS0:
cd EFI/ubuntu
grubaa64.efi
一般默认都是在第一个分区里。如果这样没找到efi文件那就在其他分区里找找。
实现虚拟机和物理机通信
- 物理机创建网桥,并将一个网卡和网桥桥接。需要的工具:
bridge-utils与uml-utilities
ifconfig down eth0 //先关闭一个网口,建议选一个非上网的端口专门用来和虚拟机通信
brctl addbr virbr0 //添加一个虚拟网桥virbr0
brctl addif virbr0 eth0 //eth0添加到virbr0中
ifconfig virbr0 10.0.2.20 netmask 255.255.255.0 //配置网桥IP。这个IP是用来和虚拟机通信的。
tunctl -t tap0 //创建一个接口tap0
brctl addif virbr0 tap0 //将tap0添加到virbr0中
这些操作完成后,可以通过brctl show查看结果是否成功。正常应该和下面类似
2. 启动虚拟机。这次要禁用qemu启动if-up脚本,改用网卡绑定我们创建的tap0。就是添加一行-net nic -net tap,ifname=tap0,script=no,downscript=no
qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic \
-drive if=none,file=$1,id=hd0 -device virtio-blk-device,drive=hd0 \
-net nic -net tap,ifname=tap0,script=no,downscript=no
3.启动虚拟机后,修改虚拟机的网卡,让它和virbr0在同一个网段
ifconfig eth0 10.0.2.15 netmask 255.255.255.0
然后可以虚拟机与物理机相互ping,发现网络ping通啦!大功告成,接下来就可以ssh/sftp相互访问与传输文件了。
可以将物理机/虚拟机更改后的网卡配置写入/etc/network/interface中,这样下次开机就会自动启用。