qemu使用踩坑

编译qemu

./configure --target-list=aarch64-softmmu --enable-virtfs
make -j8

Mac OS 不支持9Pfs

运行

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 4 -m 2048 --append "console=ttyAMA0" --kernel ~/work/src/linux.git/arch/arm64/boot/Image --initrd ~/work/buildroot-2018.05/output/images/rootfs.cpio.bz2

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine type=virt -nographic -smp 4 -m 2048 --append "console=ttyAMA0" --kernel aarch64-linux-3.16-buildroot-gdb.img -fsdev local,id=r,path=/home/schspa/work/src/signal-test,security_model=none -device virtio-9p-device,fsdev=r,mount_tag=r -s -S

文件共享

9P over virtiofs

9pfs是基于网络的文件共享协议,qemu中的软件可以通过此种方法来访问宿主机中的文件。详见Plan 9 9p remote filesystem protocol
qemu在Mac OS上不支持virtio,故无法使用以下的方法
参数设置:

  • 针对宿主机

    -fsdev local,id=shareid,path=/home/schspa/work/src/share,security_model=none

    上述参数告诉QEMU要设置一个文件系统设备,使用本地的文件系统,id设置为shareid

  • 针对客户机

    -device virtio-9p-device,fsdev=shareid,mount_tag=share

    上面的参数告诉向客户机添加一个设备,设备类型是virtio-9p-device,连接到设备shareid, 挂载时的tag为share

  • 挂载共享文件夹
    在客户系统启动时需要挂载共享的文件夹,上面已经显示出来mount_tag是share
    挂载命令

    mount -t 9p -o trans=virtio share /mnt/share
    

    mount tag也可以通过sysfs来查看

    /sys/bus/virtio/drivers/9pnet_virtio/virtio<n>/mount_tag
    

网络设置

  • 设置网络设备

    #!/usr/bin/env bash
    
    sudo ip link add br0 type bridge
    sudo ip link set br0 up
    sudo ip addr add 192.168.123.1/24 broadcast 192.168.123.255 dev br0
    sudo dnsmasq  --strict-order --except-interface=lo --interface=br0 --listen-addr=192.168.123.1 --bind-interfaces --dhcp-range=192.168.123.101,192.168.123.254 --pid-file=/var/run/qemu-dhcp-br0.pid
    
    sudo ip tuntap add tap0 mod tap user $UID
    sudo ip link set dev tap0 up
    sudo ip link set dev tap0 master br0
    
  • 卸载网络设备

    #!/usr/bin/env bash
    
    sudo ip link set dev tap0 nomaster
    sudo ip link set tap0 down
    sudo ip tuntap del tap0 mod tap
    
    sudo ip link set br0 down
    sudo ip link delete br0 type bridge
    sudo kill $(cat /var/run/qemu-dhcp-br0.pid)
    

    上述脚本添加了一个tap设备1,并使用dnsmasq网桥桥开启了dhcp,客户端启动之后即可自动获取ip地址。由于没有将实体网卡加入到br0的网桥之中,目前客户机系统还无法联网。

Tags: QEMU