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-networkNAT 网络特点
| 特性 | 说明 |
|---|---|
| 外部访问 | 外部无法直接访问虚拟机 |
| 出站访问 | 虚拟机可通过 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 networkOpen 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 virtioOVS 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=100MacVTap
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 bridgeMacVTap 限制
- 宿主机无法访问使用 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(增量镜像)
格式对比
| 特性 | RAW | QCOW2 |
|---|---|---|
| 性能 | 最优 | 略低(约 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 defaultQ: 网桥创建后宿主机无法上网
原因:添加物理网卡到网桥时,原有 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 的高级功能。
