创建NAT网络虚拟机:

KVM管理工具:

libvirt
使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。

virsh:
是一个常用的管理KVM虚拟化的命令行工具,常用于管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用libvirt API的虚拟化管理命令行工具。

virt-manager:
virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。

openstack:
openstack是一个开源的虚拟化编排工具,常用于构建大规模的虚拟化环境,用于管理成千上万虚拟机的创建、启
动、删除等整个生命周期。

virsh-install命令使用帮助:

# virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]
使用指定安装介质新建虚拟机。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--connect URI 使用 libvirt URI 连接到 hypervisor

通用选项:
-n NAME, --name NAME 客户端事件名称
--memory MEMORY 配置虚拟机内存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型号及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虚拟机元数据。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"

安装方法选项:
--cdrom CDROM 光驱安装介质
-l LOCATION, --location LOCATION
安装源(例如:nfs:host:/path、http://host/path
ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在磁盘映像中构建虚拟机
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引导的内核的参数
--initrd-inject INITRD_INJECT
使用 --location 为 initrd 的 root
添加给定文件
--os-variant DISTRO_VARIANT
在其中安装 OS 变体的虚拟机,比如
'fedora18'、'rhel6'、'winxp' 等等。
--boot BOOT 配置虚拟机引导设置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10

设备选项:
--disk DISK 使用不同选项指定存储。例如:
--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
配置虚拟机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置虚拟机控制程序设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虚拟机输入设备。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虚拟机串口设备
--parallel PARALLEL 配置虚拟机并口设备
--channel CHANNEL 配置虚拟机沟通频道
--console CONSOLE 配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV 将物理 USB/PCI/etc
主机设备配置为与虚拟机共享
--filesystem FILESYSTEM
将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虚拟机声音设备模拟
--watchdog WATCHDOG 配置虚拟机 watchdog 设备
--video VIDEO 配置虚拟机视频硬件。
--smartcard SMARTCARD
配置虚拟机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虚拟机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置虚拟机 memballoon 设备。例如:
--memballoon model=virtio
--tpm TPM 配置虚拟机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG 配置虚拟机 RNG 设备。例如:
--rng /dev/random
--panic PANIC 配置虚拟机 panic 设备。例如:
--panic default

虚拟机配置选项:
--security SECURITY 设定域安全驱动器配置。
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内存策略。
--blkiotune BLKIOTUNE
为域进程调整 blkio 策略。
--memorybacking MEMORYBACKING
为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES 设置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 设置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区(cgroups)

虚拟化平台选项:
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 这个客户端一个是一个半虚拟客户端
--container 这台虚拟机需要一个容器客户端
--virt-type HV_TYPE 要使用的管理程序名称(kvm、qemu、xen
等等)
--arch ARCH 模拟的 CPU 构架
--machine MACHINE 要模拟的机器类型

其它选项:
--autostart 引导主机时自动启动域。
--wait WAIT 等待安装完成的分钟数。
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 完成安装后不要引导虚拟机。
--print-xml [XMLONLY]
输出所生成域 XML,而不是创建虚拟机。
--dry-run 完成安装步骤,但不要创建设备或者定义
虚拟机。
--check CHECK 启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止无错误输出
-d, --debug 输入故障排除信息
使用 '--option=?' 或者 '--option help' 查看可用子选项
有关示例及完整选项语法,请查看 man page

虚拟机管理命令virsh:

[root@s1 ~]# virsh list #列出当前开机的
[root@s1 ~]# virsh list --inactive #列出关闭的虚拟机
[root@s1 ~]# virsh list --all #列出所有
[root@s1 ~]# virsh shutdown CentOS-7-x86_64 #正常关机
[root@s1 ~]# virsh start CentOS-7-x86_64 #正常开机
[root@s1 ~]# virsh destroy centos7 #强制停止/关机
[root@s1 ~]# virsh undefine Win_2008_r2-x86_64 #强制删除
[root@s1 ~]# virsh autostart centos7 #设置当前虚拟机开机自启动

检查是否支持虚拟化

[root@s1 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
2

Ubuntu 18.04:

https://ubuntu.com/server/docs/virtualization-libvirt

[root@s1 ~]# apt install qemu-kvm virt-manager libvirt-daemon-system
# kvm-ok #验证是否支持kvm

安装kvm 软件(CentOS7.x)

[root@s1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y

改virbr0 IP地址(默认是:192.168.122.1)

[root@s1 ~]# grep 192.168.122.1 /etc/ -R
[root@s1 ~]# vim /etc/libvirt/qemu/networks/default.xml

启动libvirt服务

[root@s1 ~]# systemctl enable --now libvirtd

创建用于存放ISO镜像的目录

[root@s1 ~]# mkdir /data/ISOs -p
[root@s1 ~]# ll /data/ISOs/CentOS-7-x86_64-Minimal-2009.iso

创建磁盘

[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.qcow2 10G

创建虚拟机(默认网络模式)

[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm1 \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso  \
--disk path=/var/lib/libvirt/images/centos7.qcow2 \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--autostart 

启动kvm管理器

[root@s1 ~]# virt-manager

使用命令列出所有虚拟机

[root@s1 ~]# virsh list --all

案例:创建Bridge网桥模式虚拟机

[root@s1 ~]# cd /etc/sysconfig/network-scripts/
[root@s1 ~]# cp ifcfg-eth0 ifcfg-br0

[root@s1 ~]# vim ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

#IPADDR=172.31.0.27
#NETMASK=255.255.0.0
#GATEWAY=172.31.0.254
#DNS1=114.114.114.114
#DNS2=223.6.6.6

[root@s1 ~]# vim ifcfg-br0
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"

IPADDR=172.18.8.127
NETMASK=255.255.0.0
GATEWAY=172.18.1.1
DNS1=172.18.1.1
DNS2=223.6.6.6

# 重启网络
[root@s1 ~]# systemctl restart network

# 查看br网桥
[root@s1 ~]# brctl show

# 创建磁盘
[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-Bridge.qcow2 10G

# 创建虚拟机
[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm2-Bridge \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-Bridge.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

案例:制作模板启动文件

通过copy虚拟机磁盘文件,可以快速创建虚拟机

[root@s1 ~]# cd /var/lib/libvirt/images/

[root@s1 ~]# cp centos7-Bridge.qcow2 centos7-Bridge2.qcow2

[root@s1 ~]# virt-install \
--virt-type kvm \
--name centos7-vm2-Bridge2 \
--ram 1024 --vcpus 2 \
--cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/centos7-Bridge2.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

注意:启动kvm虚拟机不需要进入系统,直接关机,然后设置boot下的IDE Disk启动即可,copy完记得要改IP地址

案例:使用KVM创建虚拟机并配置好网桥

通过网桥安装haproxy访问后端web服务器

# 先准备好两个网桥br0和br1,一个br0连接外网,一个不能连接外网br1
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# cp ifcfg-eth0 ifcfg-br0

[root@localhost ~]# vim ifcfg-eth0
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

[root@localhost ~]# vim ifcfg-br0
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br0"
DEVICE="br0"
ONBOOT="yes"
IPADDR=172.31.0.27
NETMASK=255.255.0.0
GATEWAY=172.31.0.254
DNS1=223.6.6.6

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost ~]# cp ifcfg-eth1 ifcfg-br1

[root@localhost ~]# vim ifcfg-eth1
TYPE="Ethernet"
BOOTPROTO="static"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
BRIDGE=br1

[root@localhost ~]# vim ifcfg-br1
TYPE="Bridge"
BOOTPROTO="static"
DEFROUTE="yes"
NAME="br1"
DEVICE="br1"
ONBOOT="yes"
IPADDR=10.0.0.27
NETMASK=255.255.255.0

# 重启网络
[root@localhost ~]# systemctl restart network
# 重启网络
[root@localhost ~]# systemctl restart network

# 创建两台kvm虚拟机
#第一台这样创建
[root@localhost ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-vm-bridge.qcow2 10G

[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos-vm1-bridge \
--ram 1024 --vcpus 2 \ --cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \ 
--disk path=/var/lib/libvirt/images/centos7-vm-bridge.qcow2 \ --network bridge=br0 --graphics vnc,listen=0.0.0.0 \ --noautoconsole

# 第一台虚拟机做好优化比如关闭selinux,防火墙
[root@kvm3 ~]# sed -ri 's#^(SELINUX=).*#\1disabled#' /etc/selinux/config

#第二台可以直接拷贝已经安装好系统的创建
[root@localhost ~]# cd /var/lib/libvirt/images/
[root@localhost images]# ll
-rw-r--r--. 1 qemu qemu 1789657088 Jul  8 14:10 centos7-vm-bridge.qcow2
[root@localhost images]# cp centos7-vm-bridge.qcow2 vm2-bridge2.qcow2

[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos-vm2-bridge \
--ram 1024 --vcpus 2 \
--cdrom=/data/ISOs/CentOS-7-x86_64-Minimal-2009.iso \
--disk path=/var/lib/libvirt/images/vm2-bridge2.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

# 启动管理
[root@localhost ~]# virt-manager
# 立马关机不安装,然后再重新运行kvm虚拟机

# 第二台测试ping外网,安装web服务器
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# systemctl enable --now httpd
制作测试页面
[root@localhost ~]# echo 123456 web > /var/www/html/index.html

测试看看能不能ping外网
[root@localhost ~]# ping www.baidu.com
ping: www.baidu.com: Name or service not known

# 第一台对外的机器安装haproxy代理服务
[root@localhost ~]# yum install haproxy -y
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

listen web-80
  bind 0.0.0.0:80
  server 10.0.0.27 10.0.0.27:80 check inter 3000 fall 2 rise 5

# 启动服务
[root@localhost ~]# systemctl start haproxy

# 开启路由转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1

# 第一台可以连接外网的测试网络连接
[root@localhost ~]# curl 10.0.0.27
123456 web
# 使用浏览器访问http://10.0.0.27 看到的界面跟上面一样

脚本

#!/bin/bash
# Date: 2021-07-08
# 用于拷贝多个kvm模板文件

muber=500
for i in `seq $muber`;do
    # cpoy KVM模板文件
    cp -av /vms/vmdisk/test-v1.qcow2 /vms/vmdisk/v${i}.qcow2

    # 安装并拉起kvm虚拟机
    virt-install --virt-type kvm --name v${i} --ram 1024 --vcpus 2 \
    --disk path=/vms/vmdisk/v${i}.qcow2 --network bridge=br0 \
    --boot hd \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole --autostart
done

案例1:VMware迁移到KVM 机器

[root@localhost ~]# qemu-img --help

convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename

说明:
-f:原文件格式
-O:输出什么格式ram,qcow2
filename:原文件名
output_filename:输出什么文件名

范例:转换VMware里面的格式为KVM(路径要写绝对路径,要么进到路径里面)

[root@localhost ISOs]# ll
-rw-r--r--. 1 root root 1936523264 Jul  8 15:25 centos8.vmdk

[root@localhost ~]# qemu-img convert -f vmdk -O qcow2 centos8.vmdk centos8.qcow2

[root@localhost ~]# mv centos8.qcow2 /var/lib/libvirt/images/

# 使用命令行
[root@localhost ~]# virt-install \
--virt-type kvm \
--name centos7-vm2 \
--ram 1024 --vcpus 2 \
--boot hd \
--disk path=/var/lib/libvirt/images/CentOS7-vmware.qcow2 \ --network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--autostart

[root@localhost ~]# mv centos8.qcow2 /var/lib/libvirt/images/
# 启动virt-manager图形界面选择import导入,然后测试看看是否能正常使用(不推荐使用)

案例2:跨主机迁移(不会保留本机虚拟机)

准备两台机器
172.31.0.17
172.31.0.27

# 把镜像拷贝到其他机器
创建目录
[root@localhost ~]# mkdir /data/ISOs -p
[root@localhost ISOs]# scp CentOS-7-x86_64-Minimal-2009.iso 172.31.0.27:/data/ISOs/
# 把磁盘拷贝到其他机器


# 安装软件
[root@s1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install -y

[root@localhost ~]# systemctl enable --now libvirtd

# 另外一台机器也要配置好网桥

# 启动管理(必须要改不能相同的主机名)
[root@localhost ~]# virt-manager
# 立马关机不安装,然后再重新运行kvm虚拟机

[root@localhost ~]# yum install openssh-askpass -y

案例3:搭建NFS服务共享存储跨主机迁移

准备三台服务器
172.31.0.17
172.31.0.27
172.31.0.37

# 172.31.0.37做共享存储服务
# 安装软件NFS
[root@localhost ~]# yum install nfs-utils -y

创建挂载目录并共享
[root@localhost ~]# mkdir /data/vmdata -p
[root@localhost ~]# vim /etc/exports
# 注意:*和()不能有空格,不然挂载会报错为只读
/data/vmdata *(rw,no_root_squash)

# 在172.31.0.17
[root@localhost ~]# showmount -e 172.31.0.37
Export list for 172.31.0.37:
/data/vmdata *

[root@localhost images]# ll
-rw-r--r--. 1 root root 1794899968 Jul  8 16:03 centos7-vm2-bridge2.qcow2

[root@localhost images]# scp centos7-vm2-bridge2.qcow2 172.31.0.37:/data/vmdata

# 命令挂载nfs
[root@localhost ~]# mount -t nfs 172.31.0.37:/data/vmdata /var/lib/libvirt/images/

# 命令创建虚拟机
[root@localhost ~]# virt-install --virt-type kvm --name centos7-vm1 --ram 1024 --vcpus 2 --cdrom=/var/lib/libvirt/images/CentOS-7-x86_64-Minimal-2009.iso --disk path=/var/lib/libvirt/images/centos7-vm1-test.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

案例:远程控制其他机器

打开virt-manager选择添加其他机器

虚拟化之KVM_vim

虚拟化之KVM_centos_02

虚拟化之KVM_客户端_03

虚拟化之KVM_centos_04

案例:通过virt-manager管理界面迁移虚拟机

虚拟化之KVM_vim_05

虚拟化之KVM_创建虚拟机_06

注意:一定要开启虚拟化技术,不然会报错

总结:

报错:比如权限问题?
关闭selinux,关闭防火墙,改文件夹的所属和所属组,同时在虚拟机里面重新创建虚拟机

#这是在nfs机器操作
[root@mysql2 ~]# id qemu
uid=107(qemu) gid=107(qemu) groups=107(qemu),36(kvm)

[root@mysql2 ~]# chown qemu:qemu /data/vmdata/centos7-vm-bridge.qcow2

[root@mysql2 ~]# setfacl -m u:qemu:rwx /data/vmdata/centos7-vm-bridge.qcow2
[root@mysql2 ~]# setfacl -m u:qemu:rwx /data/vmdata/

# 下面的操作是在kvm机器上操作
[root@kvm3 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-vm-bridge.qcow2 10G

[root@kvm3 ~]# ll /var/lib/libvirt/images/centos7-vm-bridge.qcow2

[root@kvm3 ~]# virt-install --virt-type kvm --name centos7-vm1 --ram 1024 --vcpus 2 --disk path=/var/lib/libvirt/images/centos7-vm-bridge.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --import