UP | HOME

qemu

目录

创建 VM

    # 创建磁盘
    qemu-img create -f qcow2 <name>.img <size>G

    # 引导安装系统
    qemu-system-x86_64 -display vnc=:0 -enable-kvm -hda <IMAGE>.img -cdrom <path/to/iso> -boot -d -m <size>G

    # 启动VM(NAT模式)
    qemu-system-x86_64 -display vnc=:0 -enable-kvm -hda <IMAGE>.img -m <size>G
    # 启动VM并使用端口转发
    # 本例将guest的22端口转发到host的10022端口
    qemu-system-x86_64 -display vnc=:0 -enable-kvm -hda <IMAGE>.img -m <size>G -net user,hostfwd=tcp::10022-:22 -net nic

选项介绍

  • -display vnc:

    开启 vnc,如 X 为 0 则将会监听 5900 端口,1会监听 5901 等

  • -enable-kvm

    开启 kvm

  • -m G

    设置内存大小

  • -hda IMAGE.img

    将特定的 img 文件设置为虚拟硬盘

  • -cdrom IMAGE.iso

    将特定的 iso 文件设置为虚拟 CDROM

  • boot -d -–— 首先引导虚拟 CDROM
  • boot -c -–— 首先引导虚拟硬盘
  • boot -n -–— 从虚拟网络引导

网络策略

QEMU 提供 4 种网络通信方法,它们分别是:

  1. User mode stack:用户协议栈方式,这种方式的大概原理是在 QEMU 进程中实现一个协议栈,这个协议栈可以被视为一个主机与虚拟机之间的 NAT 服务器,它负责将 QEMU 所模拟的系统网络请求转发到外部网卡上面,从而实现网络通信。但是不能将外面的请求转发到虚拟机内部,并且虚拟机 VLAN 中的每个接口必须放在 10.0.2.0 子网中。
  2. socket: 为 VLAN 创建套接字,并把多个 VLAN 连接起来。
  3. TAP/bridge:最重要的一种通信方式,我们想要实现 QEMU 虚拟机和外部通信就需要使用这种方式。
  4. VDE:也是用于连接 VLAN 的,如果没有 VLAN 连接需求基本用不到。

重点解释一下 tap 模式,之前说了如果计算机想要访问网络,必须有网卡的支持,那么我们可以仿照 VMware 的方式,给 QEMU 的虚拟机虚拟化一张网卡,这样就可以实现网络通信了。

TAP 属于 LInux 内核支持的一种虚拟化网络设备,还有 TUN 也属于这种设备,它们完全由软件模拟实现,TUN/TAP 负责在内核协议栈和用户进程之间传送协议数据单元。TUN 工作在网络层,而 TAP 工作在数据链路层,TUN 负责与应用程序交换 IP 数据包,而 TAP 与应用程序交换以太网帧。所以 TUN 经常涉及路由,而 TAP 常用于网络桥接。

所谓桥接就是在两张网卡之间搭一座桥,这样一端有数据就可以通过桥走到另一端,对于实现 QEMU 虚拟机通信正合适。桥接技术在 VMWARE 中非常常用,我们设置虚拟机网络的时候就能看见桥接选项,实际上 VMware 在物理机上虚拟化了 3 张网卡,分别负责桥接、仅主机、共享网络。

桥接网络

由于是使用 ssh 连接到远程机器,所以必须要求在设置桥接时不会使网络中断

    # 其中192.168.2.178为当前机器IP
    # 192.168.2.1为当前网络网关
    # 设置网桥
    sudo ip link add br0 type bridge
    sudo ip link set br0 up
    sudo ip addr add 192.168.2.178/24 dev br0

    # 设置tap0
    sudo ip tuntap add dev tap0 mode tap group kvm
    sudo ip link set dev tap0 up promisc on
    sudo ip addr add 0.0.0.0 dev tap0

    # 使用br0桥接enp2s0和tap0
    sudo ip link set dev enp2s0 master br0
    sudo ip link set tap0 master br0

    # 设置路由
    sudo ip route add 192.168.2.1 dev br0
    sudo ip route del default via 192.168.2.1 dev enp2s0
    sudo ip route add default via 192.168.2.1 dev br0

    # 清除原有IP
    sudo  ip addr flush dev enp2s0

    # 最后使用桥接模式启动VM
    qemu-system-x86_64 -display vnc=:0 -enable-kvm -hda <IMAGE>.img -m <size>G -nic tap,ifname=tap0,script=no,downscript=no
    # -net nic 表示希望 QEMU 在虚拟机中创建一张虚拟网卡,-net tap 表示连接类型为 TAP,并且指定了网卡接口名称(就是刚才创建的 tap0,相当于把虚拟机接入网桥)。
    # script 和 downscript 两个选项的作用是告诉 QEMU 在启动系统的时候是否调用脚本自动配置网络环境,如果这两个选项为空,那么 QEMU 启动和退出时会自动选择第一个不存在的 tap 接口(通常是 tap0)为参数,调用脚本 /etc/qemu-ifup 和 /etc/qemu-ifdown。由于我们已经配置完毕,所以这两个参数设置为 no 即可。

Windows

Links

作者: Petrus.Z

Created: 2021-09-01 Wed 00:38