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 种网络通信方法,它们分别是:
- User mode stack:用户协议栈方式,这种方式的大概原理是在 QEMU 进程中实现一个协议栈,这个协议栈可以被视为一个主机与虚拟机之间的 NAT 服务器,它负责将 QEMU 所模拟的系统网络请求转发到外部网卡上面,从而实现网络通信。但是不能将外面的请求转发到虚拟机内部,并且虚拟机 VLAN 中的每个接口必须放在 10.0.2.0 子网中。
- socket: 为 VLAN 创建套接字,并把多个 VLAN 连接起来。
- TAP/bridge:最重要的一种通信方式,我们想要实现 QEMU 虚拟机和外部通信就需要使用这种方式。
- 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 即可。
Links
- https://wiki.gentoo.org/wiki/QEMU
- https://wiki.gentoo.org/wiki/QEMU/Options
- https://wiki.qemu.org/Documentation/Networking
- http://en.wikibooks.org/wiki/QEMU/Networking
- https://wiki.debian.org/QEMU
- https://wiki.debian.org/VGAPassthrough
- https://wzt.ac.cn/2019/09/10/QEMU-networking/
- https://lunar.computer/posts/gpu-passthrough-proxmox-60/
- https://pve.proxmox.com/wiki/Pci%5C_passthrough#GPU%5C_Passthrough
- https://wiki.gentoo.org/wiki/QEMU/Windows%5C_guest