- 1. KVM 工具包
- 2. 安装
- 安装相关包
- 开机自启并启动
- 3. 创建虚拟机
- 安装相关服务
- 创建 isos 源文件目录
- 挂载光盘到 isos 源文件目录
- 创建 kickstart 目录
- 将提前准备好的 kickstart 文件放入 kickstart 文件目录
- platform=x86, AMD64, or Intel EM64T
- version=DEVEL
- Install OS instead of upgrade
- Keyboard layouts
- Root password
- System language
- System authorization information
- Use text mode install
- SELinux configuration
- Firewall configuration
- Network information
- Reboot after installation
- System timezone
- Use network installation
- url —url=$tree cobbler使用这个
- System bootloader configuration
- Clear the Master Boot Record
- Partition clearing information
- Disk partitioning information
- 自动以 LVM 格式分区
- autopart —type=lvm
- 创建用户wuvikr,密码744123
- 4. 以现有虚拟机磁盘为模版创建新虚拟机
- 5. 存储管理
- 6. 网络管理
- 创建网桥配置文件
- 将物理网卡 eth0 加入网桥
- 6.x virsh 命令管理网络
1. KVM 工具包
- qemu-kvm: 为 kvm 提供底层仿真支持
- libvirt-daemon: libvirtd 守护进程,管理虚拟机
- libvirt-client: 用户端软件,提供客户端管理命令
- libvirt-daemon-driver-qemu: libvirtd 连接 qemu 的驱动
- libvirt: 使用最多的 KVM 虚拟化管理工具和应用程序接口,即通过 libvirt 调用 KVM 创建虚拟机,
- libvirt是KVM通用的访问API,其不但能管理 KVM,还能管理 VMware、Xen、Hyper-V、 virtualBox 等虚拟化方案。
- virt-manager: 图形界面管理工具,其底层也是调用 libvirt API 来完成对虚拟机的操作,包括虚拟机 的创建、删除、启动、停止以及一些简单的监控功能等。
- virt-install: 虚拟机命令行安装工具
- virsh: 命令行工具是基于 libvirt API 创建的命令行工具,它可以作为图形化的 virt-manager 应用 的备选工具。virsh 命令可以被用来创建虚拟化任务管理脚本,如安装、启动和停止虚拟机
virt-viewer: 通过 VNC 和 SPICE 协议显示虚拟机器图形控制台的最小工具。
1.1 KVM 体系结构图

其中 KVM 负责模拟 CPU 和内存,而 QEMU 负责虚拟机硬件级别的模拟。
libvirt 是一个与虚拟机监控程序相独立的虚拟化应用程序接口,它可以与操作系统的一系列虚拟化性能进行交互。而像 virsh、virt-manager、virt-viewer、virt-install 这些管理工具都是用过 libvirt 提供的接口来实现对虚拟机的操作和管理。
2. 安装
2.1 安装前准备
KVM需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。
# 检测是否开启虚拟化功能grep -Em 1 "svm|vmx" /proc/cpuinfo
2.2 安装 KVM
使用虚拟化,需要至少 qemu-kvm 和 qemu-img 包。
建议安装:qemu-kvm、libvirt、virt-manager、virt-install(安装 qemu-kvm 会自动安装 qemu-img 包)CentOS ```bash
安装相关包
[root@kvm ~]# yum install -y install qemu-kvm libvirt virt-manager virt-install
开机自启并启动
[root@kvm ~]# systemctl enable —now libvirtd
- Ubuntu[**Ubuntu官方文档**](https://ubuntu.com/server/docs/virtualization-libvirt)```bash# 安装相关包[root@kvm ~]# apt update[root@kvm ~]# apt -y install qemu-kvm virt-manager libvirt-daemon-system
3. 创建虚拟机
3.1 准备 ISO 镜像文件
# 创建文件夹
[root@kvm ~]# mkdir -p /data/isos/
# 拷贝文件
...
# 查看文件
[root@kvm ~]# ll /data/isos/ -h
total 2.1G
-rw-r--r-- 1 root root 973M Jun 9 20:46 CentOS-7-x86_64-Minimal-2009.iso
-rw-r--r-- 1 root root 1.2G Jun 9 20:45 ubuntu-20.04.2-live-server-amd64.iso
3.2 virt-manager 创建虚拟机
virt-manager 是一个图形化虚拟机管理工具,方便管理和查看虚拟机,可以使用 X-Manager 或者类似的工具,将图形界面转发到本地进行显示操作,下面介绍两种方法:
- X-Manager
先本地启动 X-Manager,查看右下角 X-Manager 图标,鼠标放在上面不动,这时会显示其转发端口号。
然后导入 DISPORT 变量,启动 virt-manager 即可。
[root@kvm ~]# export DISPORT=192.168.0.1:1.0
[root@kvm ~]# virt-manager
- MobaXTerm
MobaXTerm官网
MobaXTerm 是一款全能型终端神器,支持SSH,FTP,串口,VNC,X server等功能。由于其自身本就自带 X11 转发功能,所以直接使用即可。
注意:使用 MobaXterm 启动 virt-manager 可能会有 libGL error: unable to load driver: swrast_dri.so 的警告,造成 virt-manager 界面出现字符显示混乱,安装对应的 libGL 包即可。
yum provides *swrast_dri.so
yum install -y mesa-dri-drivers
3.2.1 安装步骤图解
3.3 virt-install 创建虚拟机
virt- install 是命令行的 KVM 管理工具,熟练使用后非常方便,可以批量的创建虚拟机。
3.3.1 virt-install 使用说明
使用前先 —help 查看帮助,以下是一些常用选项的说明:
# 使用 --help 查看帮助
[root@kvm ~]# virt-install --help
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
Create a new virtual machine from specified install media.
optional arguments:
-h, --help 查看帮助
--version 查看版本
--connect URI 使用 libvirt URI 连接到 hypervisor
General Options:
-n NAME, --name NAME 虚拟机实例的名称
--memory MEMORY 指定虚拟机内存大小. Ex:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--memory 512,maxmemory=1024,hotplugmemorymax=2048,hotplugmemoryslots=2
--vcpus VCPUS 指定虚拟机的 CPU 数量. Ex:
--vcpus 5
--vcpus 5,maxvcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2
--cpu CPU 指定 CPU 型号或功能. Ex:
--cpu coreduo,+x2apic
--cpu host-passthrough
--cpu host
--metadata METADATA 配置虚拟机元数据信息. Ex:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
Installation Method Options:
--cdrom CDROM 从光盘安装
-l LOCATION, --location 安装源
Installation source (eg, nfs:host:/path,
http://host/path, ftp://host/path)
--pxe pxe 安装
--import 导入已经存在的镜像
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
Additional arguments to pass to the install kernel
booted from --location
--initrd-inject INITRD_INJECT
Add given file to root of initrd from --location
--os-variant DISTRO_VARIANT
The OS variant being installed guests, e.g.
'fedora18', 'rhel6', 'winxp', etc.
--boot BOOT 配置虚拟机的 boot 参数 Ex:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
Device Options:
--disk DISK 指定虚拟机的存储设置 Ex.
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虚拟机网络接口 Ex:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虚拟机显示设置 Ex:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置虚拟机控制程序设备 Ex:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虚拟机输入设备. Ex:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虚拟机串口设备
--parallel PARALLEL 配置虚拟机并口设备
--channel CHANNEL 配置虚拟机沟通频道
--console CONSOLE 配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV 将物理 USB/PCI/etc 主机设备配置为与虚拟机共享
--filesystem FILESYSTEM
将主机目录传递给虚拟机 Ex:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虚拟机声音设备模拟
--watchdog WATCHDOG 配置虚拟机 watchdog 设备
--video VIDEO 配置虚拟机视频硬件
--smartcard SMARTCARD
配置虚拟机智能卡设备 Ex:
--smartcard mode=passthrough
Guest Configuration Options:
--security SECURITY 设定域安全驱动器配置
--blkiotune BLKIOTUNE 为域进程调整 blkio 策略
--memorybacking MEMORYBACKING
为域进程设置内存后备策略 Ex:
--memorybacking hugepages=on
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区 (cgroups)
Virtualization Platform Options:
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 客户端应该是一个半虚拟客户端
--arch ARCH 模拟 CPU 架构
--machine MACHINE 要模拟的机器类型
Miscellaneous Options:
--autostart 引导主机时自动启动域
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 完成安装后不要引导虚拟机
--check CHECK 启用或禁用验证检查 Example:
--check path_in_use=off
--check all=off
-q, --quiet 禁止无错误输出
-d, --debug 输入故障排除信息
Use '--option=?' or '--option help' to see available suboptions
See man page for examples and full option syntax.
3.3.2 qemu-img 创建虚拟磁盘
# 创建 CentOS7 虚拟磁盘
[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS7.qcow2 20G
# 查看磁盘大小
[root@kvm ~]# ll -h /var/lib/libvirt/images/CentOS7.qcow2
-rw-r--r-- 1 root root 193K Jun 15 16:14 /var/lib/libvirt/images/CentOS7.qcow2
创建磁盘的时候明明声明给了20G,但实际上创建后只有193K。
3.3.3 从光盘手动安装
[root@kvm ~]# virt-install --virt-type kvm --name centos7 --memory 1024 --vcpus 1 --cdrom=/data/isos/CentOS-7-x86_64-Minimal-2009.iso --os-variant=centos7.0 --disk path=/var/lib/libvirt/images/CentOS7.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
上面的命令中,指定了虚拟机类型为 KVM ;实例名为 centos7 ;内存1024M;1核CPU;从/data/isos/CentOS-7-x86_64-Minimal-2009.iso加载光盘安装;指定了 OS 系统为 CentOS7.0; 磁盘路径则为上一步创建的/var/lib/libvirt/images/CentOS7.qcow2;使用默认的网络模式,即 NAT 模式;图像界面使用 VNC ,监听 0.0.0.0 地址;并且使用了 --noautoconsole 选项,并不自动打开virt-viewer连接 console,需要手动打开 virt-manager 连接,并手动安装系统。
3.3.4 PXE 自动安装
- 准备 kickstart 环境
```bash
安装相关服务
[root@kvm ~]# yum -y install httpd tftp-server dhcp syslinux [root@kvm ~]# systemctl enable —now httpd tftp
创建 isos 源文件目录
[root@kvm ~]# mkdir -p /var/www/html/centos/7/os/x86_64/
挂载光盘到 isos 源文件目录
[root@kvm ~]# mount /dev/sr0 /var/www/html/centos/7/os/x86_64/
创建 kickstart 目录
[root@kvm ~]# mkdir /var/www/html/ks/
将提前准备好的 kickstart 文件放入 kickstart 文件目录
[root@kvm ~]# vim /var/www/html/ks/centos7.cfg
platform=x86, AMD64, or Intel EM64T
version=DEVEL
Install OS instead of upgrade
install
Keyboard layouts
keyboard —vckeymap=us —xlayouts=’us’
Root password
rootpw —iscrypted $6$Ow9n3A86WGKGv8tF$.Jm4iXJLnilU0q/miXxkFD56uF/ZaD6pRzyvNjxt3H55XgA70PpJoWNQZAv3zLTU6vF3RB2qevwpHuRVNzFrI/
System language
lang en_US
System authorization information
auth —useshadow —passalgo=sha512
Use text mode install
text
firstboot —disabled
SELinux configuration
selinux —disabled
ignoredisk —only-use=sda
Firewall configuration
firewall —disabled
Network information
network —bootproto=dhcp —device=eth0
Reboot after installation
reboot
System timezone
timezone Asia/Shanghai —nontp
Use network installation
url —url=http://192.168.0.74/centos/7/os/x86_64/
url —url=$tree cobbler使用这个
System bootloader configuration
bootloader —append=”net.ifnames=0” —location=mbr —boot-drive=sda
Clear the Master Boot Record
zerombr
Partition clearing information
clearpart —all —initlabel
Disk partitioning information
part /boot —fstype=”xfs” —size=1024 part / —fstype=”xfs” —size=10240 part swap —fstype=”xfs” —size=2048 part /data —fstype=”xfs” —size=5120
自动以 LVM 格式分区
autopart —type=lvm
创建用户wuvikr,密码744123
user —name=wuvikr —password=$6$z96.c6bRe..qZRAi$sxHDL0HLf5vFPvayvSjS2uwMaC/zWFMN3oPokFC5Z2S.wD1X8PDkLShdoZxGDhN51bBn/v7QKvhumknH2Qpya0 —iscrypted —gecos=”wuvikr”
%packages @^minimal @core kexec-tools vim curl tree wget bash-completion net-tools lrzsz lsof zip unzip tcpdump psmisc man-pages chrony
%end
%post echo “PS1=’[\e[1;33m][\u@\h \W]\$ [\e[0m]‘“ >> /etc/profile.d/env.sh echo “export EDITOR=vim” >> /etc/profile.d/env.sh rm -rf /etc/yum.repos.d/* cat > /etc/yum.repos.d/CentOS7.repo <<EOF [Packages] name=Base baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/ https://mirrors.huaweicloud.com/centos/7/os/x86_64/ https://mirrors.163.com/centos/7/os/x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
[epel] name=epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ https://mirrors.huaweicloud.com/epel/7/x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7
[extras] name=extras baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/ https://mirrors.huaweicloud.com/centos/7/extras/x86_64/ https://mirrors.163.com/centos/7/extras/x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official EOF
cat > /root/.vimrc <<EOF “保存.vimrc文件时自动重启加载,即让此文件立即生效 autocmd BufWritePost \$MYVIMRC source \$MYVIMRC “TAB长度 set tabstop=2 “输入tab制表符时,自动替换成空格 set expandtab “设置自动缩进长度为4空格 set shiftwidth=2 “设置行号 “set number “语法高亮 syntax on “高亮显示括号匹配 set showmatch “忽略大小写 set ignorecase “当前行显示下划线 set cursorline “自动缩进 set autoindent “搜索到最后匹配的位置后,再次搜索不回到第一个匹配处 set nowrapscan
“”定义函数SetTitle,自动插入文件头 autocmd BufNewFile .sh exec “:call SetTitle()” func SetTitle() if expand(“%:e”) == ‘sh’ call setline(1,”#!/bin/bash”) call setline(2,”#”) call setline(3,”#**“) call setline(4,”#Author: Wuvikr”) call setline(5,”#QQ: 744123155”) call setline(6,”#Date: “.strftime(“%Y-%m-%d”)) call setline(7,”#FileName “.expand(“%”)) call setline(8,”#URL: http://www.wuvikr.top“) call setline(9,”#Description The test script”) call setline(10,”#Copyright (C): “.strftime(“%Y”).” All rights reserved”) call setline(11,”#**“) call setline(12,””) endif endfunc “新建文件后,自动定位到文件末尾 autocmd BufNewFile normal G EOF
%end
2. 自动安装
```bash
# 半自动化安装,需要光盘引导,并指定 ks 文件位置。
virt-install --virt-type kvm --name centos7-01 --memory 2048 --vcpus 1 --location=/data/isos/CentOS-7-x86_64-Minimal-2009.iso --extra-args="ks=http://192.168.0.74/ks/centos7.cfg" --os-variant=centos7.0 --disk path=/var/lib/libvirt/images/CentOS7-01.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
# pxe 自动化安装
virt-install --virt-type kvm --name centos7-01 --memory 2048 --vcpus 1 --os-variant=centos7.0 --disk bus=virtio,path=/var/lib/libvirt/images/CentOS7-02.qcow2 --graphics vnc,listen=0.0.0.0 --network=bridge:virbr1,model=virtio --noautoconsole --pxe
4. 以现有虚拟机磁盘为模版创建新虚拟机
4.1 virt-manager 实现
# 拷贝磁盘文件
cp -a /var/lib/libvirt/images/centos7.qcow2 /var/lib/libvirt/images/centos7-2.qcow2
4.2 virt-install 实现
# 拷贝磁盘文件
cp -a /var/lib/libvirt/images/centos7.qcow2 /var/lib/libvirt/images/centos7-2.qcow2
# 导入已存在的磁盘镜像
virt-install --virt-type kvm --name centos7-2 --memory 1024 - -vcpus 1 --disk bus=virtio,path=/var/lib/libvirt/images/centos7-2.qcow2 -- network --network network=default,model=virtio --graphics vnc,listen=0.0.0.0 -- noautoconsole --autostart --boot hd
4.3 virt-clone 实现
克隆前,先关闭已有的虚拟机 test01。
# 自动克隆已有的虚拟机 test01,并命名为 test02。
virt-clone --auto-clone -o test01 -n test02
5. 存储管理
5.2 虚拟磁盘格式
6. 网络管理
libvirt 虚拟网络官方文档
安装完 KVM 虚拟工具后,会自动生成 virbr0 和 virbr0-nic 虚拟网卡,其中 virbr0-nic 类似于 Vmware workstation 生成的 VMnet8 网卡;而 virbr0 则是一个虚拟网桥,每创建一个虚拟机,虚拟机的网卡都会自动连接到这个 virbr0 的网桥上来,它还充当所有虚拟机的网关,所有通信都是通过它进行的,而且它还有着 dhcp 和 dns 的功能,这是由于其安装了一个 dnsmasq 的服务。
# 查看网卡配置
[root@kvm ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:87:7f:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.72/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4670:b4b8:dfe5:3378/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:8e:66:c0 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:8e:66:c0 brd ff:ff:ff:ff:ff:ff
# 查看 virbr0 设备
[root@kvm opt]# ip link show virbr0
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:8e:66:c0 brd ff:ff:ff:ff:ff:ff
# dnsmasq 服务
[root@kvm ~]# rpm -q dnsmasq
dnsmasq-2.76-16.el7.x86_64
# 虚拟机 dhcp 配置
[root@kvm ~]# cat /var/lib/libvirt/dnsmasq/default.conf
##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
##OVERWRITTEN AND LOST. Changes to this configuration should be made using:
## virsh net-edit default
## or other application using the libvirt API.
##
## dnsmasq conf file created by libvirt
strict-order
pid-file=/var/run/libvirt/network/default.pid
except-interface=lo
bind-dynamic
interface=virbr0
dhcp-range=192.168.122.2,192.168.122.254
dhcp-no-override
dhcp-authoritative
dhcp-lease-max=253
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
KVM 安装后,还会在 /etc/libvirt/qemu/networks/ 路径下生成一个 default.xml 的网络配置文件,作为后续创建虚拟机的默认网络配置文件。
# virtlib 网络配置文件
[root@kvm ~]# grep -R 192.168.122.1 /etc/libvirt/*
/etc/libvirt/qemu/networks/autostart/default.xml: <ip address='192.168.122.1' netmask='255.255.255.0'>
/etc/libvirt/qemu/networks/default.xml: <ip address='192.168.122.1' netmask='255.255.255.0'>
# 查看 default 配置文件
[root@kvm ~]# cat /etc/libvirt/qemu/networks/default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>default</name>
<uuid>792a5df0-4205-4505-bc99-8a1c429377a7</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:8e:66:c0'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
6.1 qemu-kvm 网络简介
KVM 常用的网络模式有以下几种:
- NAT 模式:KVM 虚拟机的默认模式
- Bridge 模式:公司服务器大多数情况下采用的模式
- 隔离网络模式:用户自定义的虚拟网段
- 物理设备模式:直接分配物理网卡,性能最好
KVM 支持的的虚拟网卡设备:
[root@kvm ~]# /usr/libexec/qemu-kvm -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
6.2 NAT 网络
默认 KVM 网络配置即为 NAT 模式,在 Net 网络模式下,虚拟机可以访问外部的网络,但外部网络无法访问内部的虚拟机网络,此策略由 libvirtd 服务在创建虚拟机的时候自动加载到 iptables 的 NAT 表。
# 创建一个虚拟机后查看 Iptables 规则
[root@kvm ~]# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 965 packets, 263K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 144 packets, 15917 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 744 packets, 56861 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 744 packets, 56861 bytes)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * * 192.168.122.0/24 224.0.0.0/24
0 0 RETURN all -- * * 192.168.122.0/24 255.255.255.255
87 5220 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
35 2660 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24
因为外部网络无法访问内部的虚拟机网络,KVM 虚拟机当做服务器使用时不推荐使用此种方式连接。
Net 网络的具体架构如下图所示:
6.3 桥接模式
将虚拟机网卡桥接到宿主机的物理网卡,相当于 vmware 的桥接模式的 Vmnet0。
桥接网络可以让运行在宿主机上的虚拟机使用和宿主机相同网段的 IP,并且可以从外部直接访问到虚拟机,目前企业中大部分场景都使用桥接网络。
6.3.1 virt-manager 配置
修改时需要关闭虚拟机,否则可能无法修改成功。
修改完毕后重启虚拟机,可以看到宿主机的网卡由 vnet0 变为了 macvtap0@eth0 ,查看虚拟机的 IP 可以发现已经和宿主机同网段了。并且外部网络也能正常访问虚拟机了。
[root@kvm ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:87:7f:87 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.72/24 brd 192.168.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::4670:b4b8:dfe5:3378/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:8e:66:c0 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:8e:66:c0 brd ff:ff:ff:ff:ff:ff
11: macvtap0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/ether 52:54:00:fd:d8:d5 brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:ff:fefd:d8d5/64 scope link
valid_lft forever preferred_lft forever
6.3.2 自定义虚拟网桥
具体架构如下图所示:
自定义虚拟网桥可以通过配置文件的方式,也可以通过命令行的方式:
- 配置文件 ```bash [root@kvm ~]# cd /etc/sysconfig/network-scripts/
创建网桥配置文件
[root@kvm network-scripts]# vim ifcfg-virbr1 TYPE=Bridge NAME=virbr1 DEVICE=virbr1 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.100 PREFIX=24 GATEWAY=192.168.0.2 DNS1=180.76.76.76 DNS2=223.6.6.6 STP=yes
将物理网卡 eth0 加入网桥
[root@kvm network-scripts]# vim ifcfg-eth0 TYPE=Ethernet NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=virbr1
[root@kvm network-scripts]# nmcli connection reload [root@kvm network-scripts]# nmcli connection up eth0 virbr1
- nmcli 命令
```bash
# 创建网桥 br0
nmcli con add type bridge con-name br0 ifname br0 ipv4.addresses 10.0.0.100/24 ipv4.gateway 10.0.0.1 ipv4.dns 223.5.5.5 ipv4.method manual
# 将本机网卡添加到 br0
nmcli con add type bridge-slave con-name br0-port1 ifname eth0 master br0
# 启动新网卡
nmcli con reload
nmcli con up br0 br0-port1
# 删除网桥 br0
nmcli con down br0
rm /etc/sysconfig/network-scripts/ifcfg-br0*
nmcli con reload
6.3.3 使用自定义网桥模式安装虚拟机
# 创建虚拟磁盘
[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/CentOS7.qcow2 10G
# --network 指定使用网桥模式
[root@kvm ~]# virt-install --virt-type kvm --name centos7 --memory 1024 --vcpus 1 --cdrom=/data/isos/CentOS-7-x86_64-Minimal-2009.iso --os-variant=centos7.0 --disk bus=virtio,path=/var/lib/libvirt/images/CentOS7.qcow2 --graphics vnc,listen=0.0.0.0 --network=bridge:virbr1,model=virtio --noautoconsole
6.x virsh 命令管理网络
# 查看虚拟机网卡配置
[root@kvm ~]# virsh domiflist ubuntu20.04
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 network default virtio 52:54:00:fd:d8:d5
# 查看虚拟机网卡地址
[root@kvm ~]# virsh domifaddr ubuntu20.04
Name MAC address Protocol Address
-------------------------------------------------------------------------------
vnet0 52:54:00:fd:d8:d5 ipv4 192.168.122.105/24








