Skip to content

KVM 网络与存储配置

本章节详细介绍 KVM 虚拟机的网络配置和存储管理,包括 NAT、桥接网络、OVS、MacVTap 以及各种存储格式和存储池。


网络配置

NAT 网络

NAT(Network Address Translation)是 KVM 默认的网络模式,虚拟机通过宿主机访问外部网络,但外部网络无法直接访问虚拟机。

配置 NAT 网络

bash
# 查看默认网络
virsh net-list

# 查看默认 NAT 网络配置
virsh net-dumpxml default

# 创建自定义 NAT 网络
cat > /tmp/nat-network.xml << EOF
<network>
  <name>nat-network</name>
  <forward mode='nat'/>
  <bridge name='virbr-nat' stp='on' delay='0'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.128' end='192.168.100.254'/>
    </dhcp>
  </ip>
</network>
EOF

# 定义网络
virsh net-define /tmp/nat-network.xml

# 启动网络
virsh net-start nat-network

# 设置自动启动
virsh net-autostart nat-network

NAT 网络特点

特性说明
外部访问外部无法直接访问虚拟机
出站访问虚拟机可通过 NAT 访问外部网络
隔离性虚拟机之间相互隔离
DHCP内置 DHCP 服务器分配 IP

桥接网络

桥接网络让虚拟机像物理机一样直接接入网络,获得与宿主机同网段的 IP 地址。

创建网桥

bash
# 查看当前网络接口
ip addr show

# 创建网桥
brctl addbr br0

# 将物理网卡添加到网桥(注意:这会导致宿主机断网)
brctl addif br0 eth0

# 配置网桥 IP(如果之前 eth0 有 IP)
ip addr add 192.168.1.100/24 dev br0
ip addr del 192.168.1.100/24 dev eth0
ip link set br0 up

# 或者使用 nmcli(推荐)
nmcli con add type bridge ifname br0
nmcli con add type bridge-slave ifname eth0 master br0

使用 virsh 配置桥接网络

bash
# 创建桥接网络 XML
cat > /tmp/bridge-network.xml << EOF
<network>
  <name>bridge-network</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
EOF

# 定义网络
virsh net-define /tmp/bridge-network.xml
virsh net-start bridge-network
virsh net-autostart bridge-network

持久化网桥配置(RHEL/CentOS)

bash
# 编辑网络配置文件
vim /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0
TYPE=Bridge
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
BOOTPROTO=static

# 修改物理网卡配置
vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
TYPE=Ethernet
BRIDGE=br0
ONBOOT=yes
BOOTPROTO=none

# 重启网络
systemctl restart network

Open vSwitch 集成

Open vSwitch(OVS)是一个生产级的虚拟交换机,支持 VLAN、QoS、流量监控等高级功能。

安装 OVS

bash
# RHEL/CentOS
yum install -y openvswitch

# Ubuntu/Debian
apt install -y openvswitch-switch

# 启动服务
systemctl enable openvswitch
systemctl start openvswitch

创建 OVS 网桥

bash
# 创建网桥
ovs-vsctl add-br ovs-br0

# 添加物理端口
ovs-vsctl add-port ovs-br0 eth0

# 查看网桥信息
ovs-vsctl show
ovs-vsctl list-br
ovs-vsctl list-ports ovs-br0

配置 OVS 网络

bash
# 创建 OVS 网桥网络 XML
cat > /tmp/ovs-network.xml << EOF
<network>
  <name>ovs-network</name>
  <forward mode='bridge'/>
  <bridge name='ovs-br0'/>
</network>
EOF

# 定义网络
virsh net-define /tmp/ovs-network.xml
virsh net-start ovs-network

# 在虚拟机中使用 OVS 网络
virsh attach-interface vm01 network ovs-network --model virtio

OVS VLAN 配置

bash
# 创建 VLAN 网桥
ovs-vsctl add-br ovs-vlan100
ovs-vsctl add-port ovs-vlan100 eth0 tag=100

# 或者使用内部 VLAN
ovs-vsctl add-br ovs-br0
ovs-vsctl add-port ovs-br0 eth0
ovs-vsctl set port eth0 trunks=100,200
ovs-vsctl set port eth0 tag=100

MacVTap

MacVTap 是一种轻量级的网络虚拟化方案,虚拟机直接与物理网卡绑定,性能接近桥接,但配置更简单。

MacVTap 模式

模式说明
bridge类似于传统桥接,多个虚拟机共享同一物理网卡
vepa虚拟以太网端口聚合器,需要支持 VEPA 的交换机
private虚拟机之间完全隔离,无法通信
passthrough直接绑定到物理网卡,一个网卡只能绑定一个虚拟机

配置 MacVTap

bash
# 使用 MacVTap 创建虚拟机
virt-install \
    --name vm01 \
    --memory 4096 \
    --vcpu 2 \
    --disk path=/var/lib/libvirt/images/vm01.qcow2 \
    --network type=direct,source=eth0,source_mode=bridge \
    --os-type linux \
    --boot hd

# 或者修改现有虚拟机网络
virsh attach-interface vm01 direct eth0 --model virtio --source_mode bridge

MacVTap 限制

  • 宿主机无法访问使用 MacVTap 的虚拟机
  • 多个虚拟机使用同一物理网卡时,无法相互通信
  • 需要物理网卡支持 802.1Qbg

存储管理

磁盘镜像格式

RAW 格式

RAW 是最简单、最直接的磁盘格式,原始写入,无任何元数据开销。

bash
# 创建 RAW 格式镜像
qemu-img create -f raw /var/lib/libvirt/images/vm01.raw 20G

# 查看镜像信息
qemu-img info /var/lib/libvirt/images/vm01.raw

特点

  • 性能最佳,无额外开销
  • 创建时立即分配全部空间
  • 不支持快照、压缩、加密

QCOW2 格式

QCOW2(QEMU Copy On Write 2)是 QEMU 推荐的最佳格式,支持快照、压缩、加密等高级功能。

bash
# 创建 QCOW2 格式镜像(稀疏分配)
qemu-img create -f qcow2 /var/lib/libvirt/images/vm01.qcow2 20G

# 创建预分配元数据的 QCOW2
qemu-img create -f qcow2 -o preallocation=metadata /var/lib/libvirt/images/vm01.qcow2 20G

# 创建带 backing file 的 QCOW2
qemu-img create -f qcow2 -b /var/lib/libvirt/images/base.qcow2 \
    -F qcow2 /var/lib/libvirt/images/derived.qcow2

# 镜像信息
qemu-img info /var/lib/libvirt/images/vm01.qcow2

特点

  • 延迟分配空间,初始文件较小
  • 支持快照(链式快照)
  • 支持压缩和加密
  • 支持 backing file(增量镜像)

格式对比

特性RAWQCOW2
性能最优略低(约 5-10%)
空间占用即时分配按需分配
快照支持不支持支持
压缩不支持支持
加密不支持支持
镜像链不支持支持

存储池管理

查看存储池

bash
# 列出所有存储池
virsh pool-list

# 查看存储池详细信息
virsh pool-info default

# 查看存储池中的卷
virsh vol-list default

创建存储池

bash
# 创建目录存储池
cat > /tmp/pool-dir.xml << EOF
<pool type='dir'>
  <name>images</name>
  <target>
    <path>/var/lib/libvirt/images</path>
  </target>
</pool>
EOF

virsh pool-define /tmp/pool-dir.xml
virsh pool-build images
virsh pool-start images
virsh pool-autostart images

# 创建 LVM 存储池
cat > /tmp/pool-lvm.xml << EOF
<pool type='logical'>
  <name>lvm-pool</name>
  <source>
    <device path='/dev/sdb'>
      <extent name='vg_kvm' size='100G'/>
    </device>
  </source>
  <target>
    <path>/dev/vg_kvm</path>
  </target>
</pool>
EOF

管理存储卷

bash
# 在存储池中创建卷
virsh vol-create-as default vm01-disk 20G --format qcow2

# 克隆卷
virsh vol-clone vm01-disk vm01-clone --pool default

# 删除卷
virsh vol-delete vm01-disk --pool default

# 查看卷信息
virsh vol-info vm01-disk --pool default

挂载 ISO 安装虚拟机

方法一:使用 virt-install

bash
virt-install \
    --name=vm01 \
    --vcpu=2 \
    --memory=4096 \
    --disk path=/var/lib/libvirt/images/vm01.qcow2,size=20 \
    --cdrom=/path/to/centos7.iso \
    --os-type=linux \
    --os-variant=rhel7 \
    --network network=default \
    --graphics vnc \
    --boot cdrom

方法二:修改虚拟机配置

bash
# 附加 CD-ROM 设备
virsh attach-disk vm01 /path/to/centos.iso hdc --type cdrom --mode readonly

# 分离 CD-ROM
virsh detach-disk vm01 hdc

# 或者在 XML 中添加
virsh edit vm01
# 添加以下内容到 <devices> 部分:
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/path/to/centos.iso'/>
  <target dev='hdc'/>
  <readonly/>
</disk>

块设备直接挂载

使用 LVM 作为虚拟机磁盘

bash
# 创建 LVM 卷
lvcreate -L 50G -n vm01-disk vg_kvm

# 在虚拟机中使用
virsh attach-disk vm01 /dev/vg_kvm/vm01-disk vda --source-type block

使用 iSCSI 存储

bash
# 配置 iSCSI 目标
# 在 /etc/iscsi/targets 中配置

# 发现 iSCSI 目标
iscsiadm -m discovery -t sendtargets -p 192.168.1.100

# 登录到 iSCSI 目标
iscsiadm -m node -T iqn.target.name -p 192.168.1.100 --login

# 在虚拟机中使用
virsh attach-disk vm01 /dev/sdb vda --source-type block

常见问题

Q: 虚拟机无法获取 IP 地址

原因:DHCP 服务未启动或网络配置错误。

解决方法

bash
# 检查 NAT 网络状态
virsh net-list
virsh net-start default

# 检查 dnsmasq 进程
ps aux | grep dnsmasq

# 重启网络
virsh net-destroy default
virsh net-start default

Q: 网桥创建后宿主机无法上网

原因:添加物理网卡到网桥时,原有 IP 配置未正确迁移。

解决方法

bash
# 恢复网络配置
# 1. 删除网桥
brctl delif br0 eth0
brctl delbr br0

# 2. 恢复物理网卡配置
ip addr add 192.168.1.100/24 dev eth0

# 3. 重新创建网桥并正确配置

Q: QCOW2 镜像空间不足

原因:镜像文件达到预设大小限制。

解决方法

bash
# 调整 QCOW2 镜像大小(增大)
qemu-img resize /var/lib/libvirt/images/vm01.qcow2 +10G

# 调整后需要在虚拟机内部扩展分区

Q: 存储池空间不足

原因:存储池所在磁盘空间耗尽。

解决方法

bash
# 查看存储池使用情况
virsh pool-info default

# 清理不需要的镜像文件
rm /var/lib/libvirt/images/old-image.qcow2

# 扩展存储池
virsh pool-refresh default

下一步

掌握网络和存储配置后,继续学习 高级特性与性能调优 了解 KVM 的高级功能。