kvm虚拟化

文章目录

一、部署 KVM

删除其他虚拟化软件(假如有)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 检查当前服务器 CPU 是否支持虚拟化

grep -E 'svm|vmx' /proc/cpuinfo
  • vmx is for Intel processors
  • svm is for AMD processors

3 安装相关软件

yum -y install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager

4 启动服务并授权开机自启

systemctl enable libvirtd && systemctl start libvirtd

5 验证 kvm 的内核模块是否加载

lsmod |grep kvm

在这里插入图片描述

二、图形化方式创建虚拟机

1 安装流程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

等待系统安装完成即可

安装完成后进入系统,可以执行一些初识化操作

2 查看虚拟机默认的配置文件和虚拟磁盘文件

2.1 配置文件

1 位置
[root@kvm-server ~]# ls /etc/libvirt/qemu
autostart  centos7.xml  networks
[root@kvm-server ~]#
2 配置文件关键内容详解

虚拟机名称

  <name>centos7</name>

UUID 具有唯一性

  <uuid>9fd70bcf-1ba4-49b2-b3a9-b70b0282ec60</uuid>  

内存

kvm 虚拟机的内存可以动态调整,就是可以在虚拟机运行状态下修改当前的内存大小,但是动态设置的内存容量不能大于配置文件中设置的最大可用内存。

  <!--虚拟机的最大可配置的内存容量-->
  <memory unit='KiB'>4194304</memory>

  <!--运行时候的实际内存-->
  <currentMemory unit='KiB'>4194304</currentMemory>

磁盘

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos7.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

这里需要注意的是:

  • 磁盘的文件路径 <source file='/var/lib/libvirt/images/centos7.qcow2'/>
  • 磁盘的名称 <target dev='vda' bus='virtio'/>
  • 磁盘的插槽号 <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>

kvm 虚拟磁盘的文件格式有两种

  • raw 性能最好,设置几G,就会占用物理机磁盘的实际几G 容量,不支持虚拟机的快照
  • qcow2 性能一般,优点是支持写时复制,支持虚拟机的快照

写时复制就是,设置 10G 容量的磁盘,而实际占用物理机磁盘容量是没有 10G,实际占用的容量是虚拟机内实际使用的大小。比如虚拟机内实际使用了 3G,那会占用物理机磁盘的 3G 左右的容量。


网卡

网卡需要关注 mac 地址部分,前三组是不能变的,后面三组是可以变化的。

    <interface type='network'>
      <mac address='52:54:00:e2:6c:c1'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

2.2 虚拟磁盘文件


[root@kvm-server ~]# ls /var/lib/libvirt/images/
centos7.qcow2
[root@kvm-server ~]#

3 修改配置文件,创建虚拟机

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、利用模板快速创建虚拟机

我们可以利用已有的虚拟机配置文件和含有操作系统的虚拟磁盘快速创建一台虚拟机。

1 制作配置文件模板文件

首先我们需要准备一个虚拟机配置文件的模板。

下面我们拷贝原来虚拟机的配置文件 centos7.xml 到当前用户的家目录下,并命名为 centos7-mod.xml

cp /etc/libvirt/qemu/centos7.xml centos7-mod.xml

接下来修改模板文件 centos7-mod.xml 中的如下内容:

  • 虚拟机的名称、UUID、内存部分、mac 部分

设置虚拟机的名称部分为关键字: vm-name
设置虚拟机的 UUID 部分为关键字: vm-uuid
设置虚拟机的最大可用内存和当前使用内存部分为关键字: vm-mem
设置虚拟机的 mac 部分为关键子: vm-mac

  <name>vm-name</name>    <!--这里修改了-->
  <uuid>vm-uuid</uuid>    <!--这里修改了-->
  <memory unit='KiB'>vm-mem</memory>
  <currentMemory unit='KiB'>vm-mem</currentMemory>

  • 虚拟机的磁盘部分

设置虚拟磁盘的路径部分为关键字: vm-disk-path

<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='vm-disk-path'/>    <!--这里修改了-->
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
  • 虚拟机 mac 部分
    <interface type='network'>
      <mac address='52:54:00:vm-mac'/>  <!--这里修改了-->
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

修改后的模板文件完整代码

[root@kvm-server ~]# cat centos7-mod.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 edit centos7
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>vm-name</name>  <!--这里修改了-->
  <uuid>vm-uuid</uuid>  <!--这里修改了-->
  <memory unit='KiB'>vm-mem</memory>  <!--这里修改了-->
  <currentMemory unit='KiB'>vm-mem</currentMemory>  <!--这里修改了-->
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>SandyBridge-IBRS</model>
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='spec-ctrl'/>
    <feature policy='require' name='ssbd'/>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='vm-disk-path'/>  <!--这里修改了-->
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:vm-mac'/>  <!--这里修改了-->
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='2'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes'>
      <listen type='address'/>
      <image compression='off'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </rng>
  </devices>
</domain>

2 制作虚拟硬盘的模板

虚拟硬盘只需要把原有虚拟机含有操作系统的磁盘拷贝一份即可。

提示:最好是把计划作为模板的这个虚拟机实现做一下系统初始化操作,比如关闭 SELINUX 和防火墙,安装一下常用的软件等。

进行常规设置和安装常用软件

setenforce 0
sed -ri '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
systemctl stop firewalld && systemctl disable firewalld
yum -y install wget bash-completion vim-enhanced

至此,现有的虚拟机的硬盘中已经包含了我们需要的环境,下面我们以此虚拟机的硬盘作为一个模板文件。
这样的话,以后以此模板硬盘文件作为新的虚拟机的硬盘文件,新的虚拟机也会有同样的环境了。


[root@kvm-server ~]# cp /var/lib/libvirt/images/centos7.qcow2 centos7-mod.qcow2

3 创建新的虚拟机

3.1 创建新虚拟机的配置文件

首先定义和新虚拟机相关的变量

 vm_name=centos7-1
 vm_uuid=`uuidgen`
 vm_mem=1048576
 vm_disk_path=/home/centos7-1.qcow2
 vm_mac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
  • \B 匹配非单词边界的意思
  • & 表示前面正则匹配到的所有内容

接下来,把配置文件中的特殊字符替换变量的值,并产生一个新虚拟机的配置文件

[root@kvm-server ~]# sed -r \
> -e  s%vm-name%$vm_name% \
> -e  s%vm-uuid%$vm_uuid% \
> -e  s%vm-mem%$vm_mem% \
> -e  s%vm-disk-path%$vm_disk_path% \
> -e  s%vm-mac%$vm_mac% \
> centos7-mod.xml  > centos7-1.xml

3.2 创建新虚拟机的虚拟磁盘

[root@kvm-server ~]# cp centos7-mod.qcow2 /home/centos7-1.qcow2

4 定义虚拟机

[root@kvm-server ~]# virsh define centos7-1.xml
定义域 centos7-1(从 centos7-1.xml)

5 启动虚拟机

[root@kvm-server ~]# virsh list --all   # 列出所有的虚拟机
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭
 -     centos7-1                      关闭

[root@kvm-server ~]# virsh start centos7-1    # 启动指定的虚拟机
域 centos7-1 已开始

[root@kvm-server ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 1     centos7-1                      running

[root@kvm-server ~]# virsh domifaddr 1
 名称     MAC 地址           Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:e2:6c:c1    ipv4         192.168.122.3/24

注意: virsh domifaddr 虚拟机名称 可以查看虚拟机的 IP 地址,前提条件是虚拟主机需要是自动获取的 IP

四、virsh 管理虚拟机

下文中 vm-name 表示一个虚拟机的名称

1 列出当前宿主机中正在运行的虚拟机

virsh list

2 列出所有的虚拟机

virsh list  --all

3 查看指定虚拟机的元数据信息

virsh dominfo   vm-name

4 查看指定虚拟机的 IP 地址

virsh domifaddr  vm-name

5 启动虚拟机

virsh start vm-name

6 正常关闭虚拟机

virsh shutdown  vm-name

7 强制关闭虚拟机,相当于拔掉电源

virsh destroy vm-name

8 重启虚拟机

virsh reboot vm-name

9 从一个 xml 文件定义一个虚拟机

virsh define  vmn.xml

vmn.xml 是一个 xml 文件路径名称

10 取消定义一个虚拟机

就是删除一台虚拟机,但是虚拟机的磁盘文件会保留

virsh undefine vm-name

五、给虚拟添加硬件

1 图形化方式添加

自己练习

2 命令方式添加

2.1 添加内存

首先确认虚拟机已经处于关闭状态

virsh shutdown centos7-1

之后设置最大可分配内存

virsh setmaxmem centos7-1 6G

查看虚拟机信息

[root@kvm ~]# virsh dominfo centos7-1
Id:             -
名称:       centos7-1
UUID:           87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型:    hvm
状态:       关闭
CPU:          2
最大内存: 6291456 KiB
使用的内存: 4194304 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI: 0

之后就可以在虚拟机启动的情况下,给其动态的调整内存的大小(范围在最大内存容量内)


[root@kvm ~]# virsh setmem centos7-1 4G

[root@kvm ~]# virsh dominfo centos7-1
Id:             2
名称:       centos7-1
UUID:           87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型:    hvm
状态:       running
CPU2
CPU 时间:   12.0s
最大内存: 6291456 KiB
使用的内存: 4194304 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI0

[root@kvm ~]# virsh setmem centos7-1 5G

[root@kvm ~]# virsh dominfo centos7-1
Id:             2
名称:       centos7-1
UUID:           87f6c2ff-811d-4685-8b61-6494f6ae17e9
OS 类型:    hvm
状态:       running
CPU2
CPU 时间:   12.4s
最大内存: 6291456 KiB
使用的内存: 5242880 KiB
持久:       是
自动启动: 禁用
管理的保存: 否
安全性模式: none
安全性 DOI0

2.2 添加硬盘

创建一个虚拟硬盘

mkdir -p /centos7/
qemu-img create -f qcow2 /centos7/centos7-1-2.qcow2 2G

编辑一个虚拟硬盘的 xml 文件模板

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
  <source file='/centos7/centos7-1-2.qcow2'/>
  <target dev='vdb' bus='virtio'/>
</disk>

然后使用 attach-device 命令从XML文件添加

virsh attach-device centos7-1 disk.xml --persistent
  • –persistent 让实时更改并且持久生效。

最后查看虚拟机的所有磁盘

virsh domblklist centos7-1
在宿主机中修改虚拟磁盘中的文件

1 挂载磁盘
适用于磁盘没有损坏的情况

guestmount -a /opt/kvm/imgs/tpl-dbcache.qcow2 -m /dev/sda1 /mnt

guestmount -a /opt/kvm/imgs/xgqd-dbcache02.qcow2 -m /dev/centos-root /mnt
  1. 磁盘损坏了或者不损坏均可

virt-copy-out 复制出来

virt-copy-in 复制进去

virt-copy-out -a tpl-nginx-gz.qcow2 /etc/default/grub .

2.3 添加网卡

生产 mac 地址的后 3 位

[root@kvm ~]# openssl rand -hex 3 | sed -r 's/..\B/&:/g'
12:47:d4

参考当前需要添加网卡的这台虚拟机的xml配置文件中的网络部分,创建一个新网卡的 xml 配置文件

注意修改 mac 地址

<interface type='network'>
  <mac address='52:54:00:12:47:d4'/>
  <source network='default'/>
  <model type='virtio'/>
</interface>

然后使用 attach-device 命令从XML文件添加

[root@kvm ~]# virsh attach-device centos7-1 network.xml --persistent
成功附加设备

最后查看确认是否添加

[root@kvm ~]# virsh domiflist centos7-1
接口     类型     源        型号      MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:ba:ac:be
vnet1      network    default    virtio      52:54:00:12:47:d4

扩容磁盘

1 扩容虚拟磁盘
qemu-img  resize guangfayinhang-1.qcow2 200G # 扩容后的容量 200G

qemu-img  resize guangfayinhang-1.qcow2 +100G # 增加 100G
2 重启虚拟机
3 查看磁盘容量是否增加

登录虚拟机,执行如下命令

partprobe
fdisk -l   # 查看并确认磁盘容量
4 扩容 pv ,lv
pvresize  /dev/vdb

vgs   # 查看

lvresize  -L  +100G            /dev/apps/app   # 增加100G
           注意这里的 +        逻辑卷路径
                   
5 扩容文件系统
resize2fs 逻辑卷   # EXT2,EXT3,EXT4 文件系统

xfs_growfs 逻辑卷  # xfs 文件系统

六、虚拟机的存储池

1 存储池概念

存储池是由libvirt管理的文件,目录或存储设备,用于为虚拟机提供存储。

存储池分为存储虚拟机映像的存储卷或作为附加存储附加到虚拟机的存储卷。

多个被管理的虚拟机可以共享同一个存储池,从而可以更好地分配存储资源。

存储池可以是本地的,也可以是基于网络的(共享的):

本地存储池

本地存储池直接连接到主机服务器。它们包括本地设备上的本地目录,直接连接的磁盘,物理分区和逻辑卷管理(LVM)卷组。
本地存储池对于不需要迁移或大量虚拟机的开发,测试和小型部署很有用。
本地存储池可能不适用于许多生产环境,因为它们不能用于实时迁移。

网络(共享)存储池

联网存储池包括使用标准协议在网络上共享的存储设备。

2 kvm默认存储池的位置

/var/lib/libvirt/images/ 

3 定义存储池

使用 virsh pool-define-as 命令创建持久性存储池。

[root@kvm ~]# mkdir /vm-pool/centos7
[root@kvm ~]# virsh pool-define-a --name centos7-pool --type dir --target "/vm-pool/centos7"
创建池 centos7-pool

使用 virsh pool-list --all 命令列出所有现有的存储池。

[root@kvm ~]# virsh pool-list
 名称               状态     自动开始
-------------------------------------------
 centos7-pool         非活动     否
 default              活动     是

4 启动存储池


[root@kvm ~]# virsh pool-start centos7-pool
池 centos7-pool 已启动

[root@kvm ~]# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 centos7-pool         活动     否
 default              活动     是
 opt                  活动     是

5 打开自动启动(可选)

默认情况下,virsh 使用自定义的存储池未设置为每次 libvirtd 启动时自动启动。

可以使用 virsh pool-autostart 命令将存储池配置为自动启动。

virsh pool-autostart centos7-pool

6 删除存储池

6.1 删除存储池的前提条件

为避免对使用要删除的存储池的其他来宾虚拟机产生负面影响,建议您停止存储池并释放其使用的所有资源。

6.2 使用virsh删除存储池

6.2.1 列出定义的存储池:
# virsh pool-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes
guest_images_pool    active     yes
6.2.2 停止要删除的存储池。
# virsh pool-destroy guest_images_disk
6.2.3(可选)对于某些类型的存储池,您可以选择删除存储池所在的目录:
# virsh pool-delete guest_images_disk
6.2.4 删除存储池的定义。
# virsh pool-undefine guest_images_disk
6.2.5 确认池未定义:
# virsh pool-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes

七、 虚拟机的快照

这里以为虚拟机 centos7-1 创建一个快照(磁盘格式必须为qcow2)为例说明对一个虚拟机快照的创建、查询、删除操作。

[root@kvm ~]# qemu-img info /var/lib/libvirt/images/centos7-1.qcow2
image: /var/lib/libvirt/images/centos7-1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 10G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

1 给指定虚拟机创建快照

[root@kvm ~]# virsh snapshot-create-as centos7-1 centos7-1.snap1
已生成域快照 centos7-1.snap1

2 查看指定虚拟机的快照

[root@kvm ~]# virsh snapshot-list  centos7-1
 名称               生成时间              状态
------------------------------------------------------------
 centos7-1.snap1      2020-10-18 16:01:07 +0800 shutoff

3 恢复快照

[root@kvm ~]# virsh snapshot-revert centos7-1 --snapshotname centos7-1.snap1

4 删除快照


[root@kvm ~]# virsh snapshot-delete centos7-1 --snapshotname centos7-1.snap1
已删除域快照 centos7-1.snap1

八、虚拟机的网络

1 网络模式介绍

Libvirt虚拟网络使用虚拟网络交换机的概念。虚拟网络交换机是一种在主机物理机服务器上运行的软件结构。

虚拟机通过这个虚拟的网络交换机和物理宿主机进行通信,从而数据通过物理机和外部网络进行通信。

Linux主机物理机服务器将虚拟网络交换机表示为网络接口。

首次安装并启动libvirtd守护程序(libvirtd)时,表示虚拟网络交换机的默认网络接口是virbr0。

可以使用一下命令查明虚拟网桥

[root@kvm ~]# brctl show

bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400831963	yes		virbr0-nic

libvirt 会依赖 ip_forward 参数, 并添加响应的 iptables(防火墙)规则,允许去往和来自虚拟机的数据。有些程序可能会关闭 ip_forward 参数,因此最好的选择是将以下内容添加到 /etc/sysctl.conf

 net.ipv4.ip_forward = 1

可以使用如下命令查看此网络接口的信息

 $ ip addr show virbr0
 3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
     link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

NAT模式(默认模式)

默认网络的配置文件是:/etc/libvirt/qemu/networks/default.xml

默认情况下,虚拟网络交换机以NAT模式运行。如下图所示:
在这里插入图片描述

隔离模式

使用隔离模式时,连接到虚拟交换机的所有虚拟机可以彼此之间通信,也可以与宿主机通信,但是它们不会通过宿主机和外部进行互相通信。但是,即使此网络与任何物理网络隔离开,DNS名称仍然可以解析。因此,当DNS名称解析但ICMP(ping)回显请求命令失败时,可能会出现这种情况。在这里插入图片描述

桥接模式

桥接网络(也称为网络桥接或虚拟网络交换)用于将虚拟机网络接口放置在与物理接口相同的网络上。

使用桥接模式时,所有虚拟机都与主机物理机出现在同一子网内。同一物理网络上的所有其他物理机都知道这些虚拟机,并且可以访问这些虚拟机。桥接在OSI网络模型的第2层上运行。

在这里插入图片描述

2 设置桥接网络

网桥是一种链路层设备,可根据MAC地址在网络之间转发流量。

它通过侦听网络流量并由此了解哪些主机连接到每个网络来构建基于MAC地址表的转发决策。

可以在Linux主机内使用软件桥,以模拟硬件桥,例如在虚拟化应用程序中,用于与一个或多个虚拟NIC共享NIC。

2.1 配置文件方式配置桥接:在宿主机上

[root@kvm-server ~]# ip a   #先找出宿主机用的哪个网卡设备,我的是enp0s25

1.定义虚拟网卡配置文件

[root@kvm-server ~]# cd /etc/sysconfig/network-scripts/
[root@kvm-server network-scripts]# vim ifcfg-br0    #创建该桥接网卡,默认没有此文件需要新建
[root@kvm-server network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=static
IPADDR=10.0.111.182   #要和宿主机在一个网络,这里我用的是宿主机的ip
GATEWAY=10.0.111.1    #宿主的网关,nat的是.2,桥接是.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8

2 然后看清楚宿主机正在使用的网卡,修改其配置文件(将物理机网卡桥到桥接网卡)

[root@kvm-server network-scripts]# cp ifcfg-enp0s25 ifcfg-enp0s25.back
[root@kvm-server network-scripts]# vim ifcfg-enp0s25
NAME=enp0s25   #定义网卡设备名称
DEVICE=enp0s25   #宿主机正在使用的网卡设备
ONBOOT=yes
BRIDGE=br0     #和ifcfg-br0文件里面的设备对应,新添加

3 重启 libvirtd 服务

[root@kvm-server network-scripts]# systemctl restart libvirtd 

4 重启 network 服务

[root@kvm-server network-scripts]# systemctl restart network

2.2 虚拟机使用桥接网络的方式

虚拟机使用桥接网络有三种可选方式:

  • 新建虚拟机时候使用桥接网络
  • 给现有的虚拟机添加一块新的网卡使用桥接网络
  • 修改现有虚拟机的网卡为桥接网络

2.3 图形化方式使用桥接网络

下面的实例是给现有的虚拟机添加新的网卡,并使用桥接网络

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.4 命令行配合配置文件方式添加

network.mod

echo "<interface type='bridge'>
     <mac address='52:54:00:${vm_mac}'/>
     <source bridge='br0'/>
     <model type='rtl8139'/>
</interface>"

vm_mac="34:5a:6d"
source network.mod  > network.xml

virsh attach-device centos7-1 tmp/network.xml --persistent 

3 删除网桥模式

删除桥接网卡步骤:
1.删除br0的配置文件
2.修改正常网卡的配置文件
3.重启系统

[root@kvm-server network-scripts]# mv ifcfg-br0 ifcfg-br0.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25 ifcfg-enp0s25.bak
[root@kvm-server network-scripts]# mv ifcfg-enp0s25.back ifcfg-enp0s25
[root@kvm-server network-scripts]# systemctl restart libvirtd
[root@kvm-server network-scripts]# systemctl restart network
[root@kvm-server network-scripts]# ping www.baidu.com
PING www.a.shifen.com (39.156.66.14) 56(84) bytes of data.
64 bytes from 39.156.66.14 (39.156.66.14): icmp_seq=1 ttl=52 time=13.3 ms

九、编写 kvm 管理系统(写个 shell 脚本)

#!/bin/bash
#kvm batch create vm tool
#version:0.1
#author:name
#需要事先准备模板镜像和配置文件模板

echo "1.创建自定义配置单个虚拟机
2.批量创建自定义配置虚拟机
3.批量创建默认配置虚拟机
4.删除虚拟机"

read -p "选取你的操作(1/2/3):" op

batch_self_define() {

        kvmname=`openssl rand -hex 5`

        sourceimage=/var/lib/libvirt/images/vmmodel.img
        sourcexml=/etc/libvirt/qemu/vmmodel.xml

        newimg=/var/lib/libvirt/images/${kvmname}.img
        newxml=/etc/libvirt/qemu/${kvmname}.xml

        cp $sourceimage  $newimg
        cp $sourcexml $newxml

        kvmuuid=`uuidgen`
        kvmmem=${1}000000
        kvmcpu=$2
        kvmimg=$newimg
        kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`

        sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
        virsh define $newxml
        virsh list --all
}
self_define() {
        read -p "请输入新虚机名称:" newname
        read -p "请输入新虚机内存大小(G):" newmem
        read -p "请输入新虚机cpu个数:" newcpu

        sourceimage=/var/lib/libvirt/images/vmmodel.img
        sourcexml=/etc/libvirt/qemu/vmmodel.xml

        newimg=/var/lib/libvirt/images/${newname}.img
        newxml=/etc/libvirt/qemu/${newname}.xml

        cp $sourceimage  $newimg
        cp $sourcexml $newxml

        kvmname=$newname
        kvmuuid=`uuidgen`
        kvmmem=${newmem}000000
        kvmcpu=$newcpu
        kvmimg=$newimg
        kvmmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`

        sed -i "s@kvmname@$kvmname@;s@kvmuuid@$kvmuuid@;s@kvmmem@$kvmmem@;s@kvmcpu@$kvmcpu@;s@kvmimg@$kvmimg@;s@kvmmac@$kvmmac@" $newxml
        virsh define $newxml
        virsh list --all
}

case $op in
1)self_define;;
2)
        read -p "请输入要创建的虚拟机的个数:" num
        read -p "请输入新虚机内存大小(G):" newmem
        read -p "请输入新虚机cpu个数:" newcpu

        for((i=1;i<=$num;i++))
        do
                batch_self_define $newmem $newcpu
        done;;

3)
        read -p "请输入要创建的虚拟机的个数:" num

        for((i=1;i<=$num;i++))
        do
                batch_self_define 1 1
        done;;

*)echo "输入错误,请重新执行脚本"
  exit;;
esac

配置文件模块

# vim /etc/libvirt/qemu/vmmodel.xml
<domain type='kvm'>
  <name>kvmname</name>
  <uuid>kvmuuid</uuid>
  <memory unit='KiB'>kvmmem</memory>
  <currentMemory unit='KiB'>kvmmem</currentMemory>
  <vcpu placement='static'>kvmcpu</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Haswell-noTSX</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='kvmimg'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:kvmmac'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>

迁移

压缩办法:

qcow2是稀疏格式的文件,直接传会填充0到创建时声明的大小,

转换方式(推荐方法)

qemu-img convert -c -O qcow2 tpl-nginx.qcow2 tpl-nginx-gz.qcow2

转换后的 tpl-nginx-gz.qcow2 可进行 cp 或者 scp 进行传输,
之后可以进行直接使用。

关于网卡名称不一致

1 修改网卡名称使用 eth[0-9]

修改 /etc/default/grub 的内容 添加 net.ifnames=0 biosdevname=0

在这里插入图片描述
执行命令

grub2-mkconfig -o /boot/grub2/grub.cfg

重启机器

查看网卡 UUID 和名称

在这里插入图片描述

查看本机实际的网卡名称分配地址

nmcli device
nmcli device show
在这里插入图片描述

添加 console

/boot/grub2/grub.cfg

console=ttyS0,115200n8 
  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shark_西瓜甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值