KVM

Haixin Pang 八月 21, 2025 #NOTE

相关

virbr0 桥接网络配置

virbr0 是 libvirt 默认创建的桥接网络接口,允许虚拟机通过宿主机的网络连接到外部网络。它通常配置为 NAT 模式,这意味着虚拟机可以访问外部网络,但外部网络无法直接访问虚拟机。 配置文件位于 /etc/libvirt/qemu/networks/default.xml

环境

检查CPU虚拟化支持

grep -cE '(vmx|svm)' /proc/cpuinfo

输出大于0表示支持。

安装相关软件包

Debian/Ubuntu

sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager cloud-image-utils

Manjaro

sudo pacman -S qemu libvirt virt-install

添加当前用户到 libvirtkvm

sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

检查并启动 libvirtd 服务与默认网络

sudo systemctl status libvirtd
sudo systemctl start libvirtd
sudo virsh net-start default # 启动默认网络,启动失败可重启设备(可能是某个服务未启动)
kvm-ok  # 仅Debian/Ubuntu

安装Ubuntu虚拟机

下载Ubuntu ISO

wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img

准备硬盘

qemu-img create -F qcow2 -b ./bionic-server-cloudimg-amd64.img -f qcow2 ./np-ubuntu18.qcow2 40G

配置

创建 user-data 文件:

#cloud-config
hostname: np-ubuntu18
manage_etc_hosts: true
users:
  - name: phx2
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/phx2
    shell: /bin/bash
    lock_passwd: false
ssh_pwauth: true
disable_root: false
chpasswd:
  list: |
    vmadm:password
  expire: false

按实际情况修改 hostnameuserschpasswd

创建 meta-data 空文件

touch meta-data

生成 seed 文件

cloud-localds -v ./np-ubuntu18-seed.qcow2 user-data meta-data

创建虚拟机

sudo virt-install --name np-ubuntu18 \
  --os-variant ubuntu18.04 \
  --vcpus 2 \
  --ram 2048 \
  --network bridge=virbr0,model=virtio \
  --disk path=np-ubuntu18-seed.qcow2,device=disk \
  --disk path=/var/lib/libvirt/images/ubuntu18.qcow2,size=40,format=qcow2,backing_store=np-ubuntu18.qcow2 \
  --import \
  --nographics none
# sudo virt-install --name np-ubuntu18 --os-variant ubuntu18.04 --vcpus 2 --ram 2048 --location $iso_path --network bridge=virbr0,model=virtio --graphics none --extra-args='console=ttyS0,115200n8 serial' --disk path=/var/lib/libvirt/images/ubuntu18.qcow2,size=40,format=qcow2,bus=virtio

完整脚本

set -e
export VM_NAME=np-ubuntu18
export UBUNTU_RELEASE=bionic
export VM_IMAGE=$UBUNTU_RELEASE-server-cloudimg-amd64.img
wget https://mirror.nyist.edu.cn/ubuntu-cloud-images/$UBUNTU_RELEASE/current/$UBUNTU_RELEASE-server-cloudimg-amd64.img
# qemu-img create -F qcow2 -b ./$VM_IMAGE -f qcow2 ./$VM_NAME.qcow2 10G
# cat >network-config <<EOF
# ethernets:
#     $INTERFACE:
#         addresses:
#         - $IP_ADDR/24
#         dhcp4: false
#         gateway4: 192.168.122.1
#         match:
#             macaddress: $MAC_ADDR
#         nameservers:
#             addresses:
#             - 1.1.1.1
#             - 8.8.8.8
#         set-name: $INTERFACE
# version: 2
# EOF

cat >user-data <<EOF
#cloud-config
manage_etc_hosts: true
users:
  - name: vmadm
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/vmadm
    shell: /bin/bash
    lock_passwd: false
ssh_pwauth: true
disable_root: false
chpasswd:
  list: |
    vmadm:vmadm
  expire: false
EOF

touch meta-data
# cloud-localds -v --network-config=network-config ./$VM_NAME-seed.qcow2 user-data meta-data
cloud-localds -v ./$VM_NAME-seed.qcow2 user-data meta-data

virt-install --connect qemu:///system \
  --virt-type kvm \
  --name $VM_NAME \
  --ram 1024 \
  --vcpus=2 \
  --os-type linux \
  --os-variant ubuntu18.04 \
  --disk path=/var/lib/libvirt/images/$VM_NAME.qcow2,size=40,format=qcow2,backing_store=$VM_IMAGE \
  --disk path=$VM_NAME-seed.qcow2,device=disk \
  --import \
  --network network=default,model=virtio \
  --noautoconsole

virt-install

安装 Windows 10

准备virt-install

export ISO_PATH=/opt/kvm/iso
export IMG_PATH=/opt/kvm/img
export VM_NAME=win
sudo mkdir -p $ISO_PATH
sudo mkdir -p $IMG_PATH

下载 Windows 10 ISO 和 VirtIO 驱动

wget -O $ISO_PATH/win10_ltsc.iso https://go.microsoft.com/fwlink/p/?LinkID=2195404&clcid=0x409&culture=en-us&country=US
wget -O $ISO_PATH/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.271-1/virtio-win.iso

安装

sudo virt-install \
 --name $VM_NAME \
 --memory 4096 \
 --vcpus 2 \
 --os-variant win10 \
 --cdrom $ISO_PATH/win10_ltsc.iso \
 --disk path=$ISO_PATH/virtio-win.iso,device=cdrom \
 --disk path=$IMG_PATH/win.qcow2,size=60,format=qcow2,bus=virtio \
 --network network=default,model=virtio

注意

安装时需要加载 VirtIO 驱动

在安装过程中,当提示选择磁盘时,选择加载驱动程序,然后选择 VirtIO 驱动的w10目录

安装完毕之后需要更新驱动

取消virtio-win.iso的挂载

执行以下命令取消挂载: 注意如果虚拟机正在运行,需要添加--live参数

sudo virsh change-media $VM_NAME $ISO_PATH/virtio-win.iso --eject --config

网络配置

前面提到 virbr0 是 libvirt 默认创建的桥接网络接口,允许虚拟机通过宿主机的网络连接到外部网络。它通常配置为 NAT 模式,这意味着虚拟机可以访问外部网络,但外部网络无法直接访问虚拟机。

我们可以通过配置桥接网络来实现虚拟机与宿主机在同一局域网内通信。

配置桥接网络

配置宿主机桥接接口

libvirt 桥接网络需要宿主机上有一个桥接接口。这里以创建一个名为 virbr1 的桥接接口为例。

编辑宿主机的网络配置文件,一般需要根据具体的网络管理工具进行配置,例如NetplanNetworkManagersystemd-networkd。这里以systemd-networkd为例:

创建一个新的网络设备/etc/systemd/network/20-bridge-br1.netdev

[NetDev]
Name=virbr1
Kind=bridge

创建桥接接口配置文件/etc/systemd/network/30-bridge-br1.network

[Match]
Name=virbr1

[Network]
DHCP=yes
# 或者使用静态IP

修改宿主机的物理网络接口配置文件,可能是/etc/systemd/network/89-ethernet.network,具体文件名根据实际情况而定:

[Match]
Name=enp5s0  # 替换为实际的物理网络接口名称

[Network]
Bridge=virbr1

然后重启systemd-networkd服务:

sudo systemctl restart systemd-networkd

编辑libvirt网络配置文件

新建一个桥接网络配置文件br1.xml,内容如下:

<network>
  <name>br1</name>
  <uuid>f1e12345-abcd-4e67-9876-123456abcdef</uuid>
  <forward mode='bridge'/>
  <bridge name='virbr1'/>
</network>

定义并启动新网络

sudo virsh net-define br1.xml
sudo virsh net-start br1
sudo virsh net-autostart br1

配置虚拟机使用新网络

在创建虚拟机时,使用--network bridge=virbr1,model=virtio参数指定使用新的桥接网络。

或者直接修改已有虚拟机的网络配置:

sudo virsh edit <vm-name>

将网络部分修改为:

<interface type='bridge'>
  <mac address='52:54:00:xx:xx:xx'/> <!-- 替换为实际的MAC地址 -->
  <source bridge='virbr1'/>
  <model type='virtio'/>
</interface>

保存并退出后,重启虚拟机使配置生效:

sudo virsh reboot <vm-name>