KVM#TyporaKVM虚拟机笔记

-企业私有云容器化架构运维实战

一、虚拟化技术概述

了解

什么是虚拟化:
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性。

Hypervisor:虚拟化管理程序
#vmm、Hypervisor 是提供正真虚拟机管理程序的,---创建,删除-开关机。。。Hypervisor是属于内核功能的操作系统内核的一个模块。把和内核交互的工具称之为用户肽工具:比如:virsh命令行--virt-manager图形界面,

虚拟化技术的分类:

平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。
资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。把硬件的东西变成了一个应用

​ 我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor(虚拟监控器VMM) 或Hypervisor,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。

平台虚拟化类型

操作系统虚拟化
常见的操作系统叫openvz,他的特点是所有虚拟机共享宿主机的内核。

vps--虚拟服务器--底层虚拟机比如kvm
全虚拟化(Full Virtualization):
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存等,使原始硬件的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。

现在的kvm与vmware都支持全虚拟化
半虚拟化(Para Virtualization):
半虚拟化(也叫超虚拟化)是另一种类似于全虚拟化的技术,它使用Hypervisor分享存取底层的硬件,它的guest操作系统集成了虚拟化方面的代码。因为操作系统自身能够与虚拟进程进行很好的协作。#半虚拟化要比全虚拟化先进

半虚拟化需要guest操作系统做一些修改,使guest操作系统意识到自己是处于虚拟化环境的。
硬件辅助虚拟化
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。#必须得是cpu支持虚拟化 
常用的虚拟化产品有哪些
1.桌面版虚拟化
2.企业级虚拟机化

产品分类:
1.Kvm(redhat-----企业级
2.Vmware:
Vmware-workstation(windows和linux)----桌面级
Vmware-fusion(mac)
Vmware-esxi-----(企业级别)本身就是一个操作系统。
3.hyper-v(微软)
4.Ovm(oracle公司--Windows linux) virtulbox
5.Xen(rhel6之前所有版本默认用的虚拟化产品)
企业级虚拟化与桌面级虚拟化的区别
1.桌面级虚拟化:
App  ---在安装APP,也就是应用
guest os  ---客户机也叫客户操作系统
虚拟化软件---(hypervisor+{
    
    图形管理工具(gui)+文本管理工具(tui)}--Api接口)位于操作系统之上
操作系统--(wind\linux\mac)
物理机--硬件

2.企业级虚拟化
App
guest os
虚拟化软件-----(gui或者tui)
操作系统---内核(hypervisor):属于内核里面的一个模块,直接安装企业级的操作系统就可以了
物理机

#桌面级比企业级虚拟化多了一层交互,所以企业级虚拟化要比桌面级虚拟化性能高,但是hyprtvisor会占用系统的资源
虚拟化的应用场景
1.机器配置比较高,应用需求配置低的情况下。--宿主机--安装虚拟机--使用虚拟机
2.云平台:
最传统的方式还没有虚拟机的时候:有机房---有物理服务器---使用。最大浪费点---磁盘,内存CPU这些资源。
有了虚拟化机之后优点是---虚拟机迁移--拍快照--随意定义配置---vps虚拟服务器--虚拟机比如kvm,--通过虚拟机管理程序管理
云主机--底层还是虚拟机比如kvm。管理方式上有区别:云平台管理,比如阿里云,,华为云,openstack--默认调用还是kvm

#云服务器可以为企业节约成本,实现资源的最大使用。计费方式很灵活可以包年包月,按需付费。。自定义配置

3.云分类:
iaas:infrastructure as a service---基础设施及服务,比如我们购买的云主机然后在用-openstack属于这个
paas: platform as a serivce ---平台及服务,在基础设施服务上面安装好了软件,连软件一块卖出去给用户使用
saas:softeare as a service ----软件及服务,比如云文档腾讯文档,只需要浏览器什么都不用,直接拿来使用
dsaas:data storage as a service ---数据存储及服务--比如百度网盘
caas:container as a serivce ---容器服务

4.kvm使用

二、KVM虚拟化技术简介

KVM 针对运行在 x86 硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第一个成为原生 Linux 内核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 开发和维护的,现在归 Red Hat 所有。
#KVM 是作为内核模块实现的
KVM安装
kvm虚拟化平台软件一般装在操作系统为Centos上面
大家不想把电脑装为Centos的操作系统,可以用VMware workstations装一台配置较高的虚拟机(cpu、内存、磁盘)给的尽可能最大,然后需要在开启之前做如下操作

然后打开虚拟机,安装kvm即可

查看cpu是否支持虚拟化
# cat /proc/cpuinfo | grep -E 'vmx|svm'
"关闭防火墙和selinux"   --注:如果虚拟机ping不通就把防火墙开起来

一般企业如果使用kvm虚拟机平台,都会把物理服务器装成Centos的操作系统,然后装上kvm,创建使用虚拟机

1.需求内核(rhel6以上):
[root@kvm-server ~]# uname -r 
3.10.0-1062.el7.x86_64
2.如果之前安装kvm了清理环境:卸载kvm
[root@kvm-server ~]# yum remove `rpm -qa | egrep 'qemu|virt|kvm'` -y

[root@kvm-server ~]# rm -rf /var/lib/libvirt  /etc/libvirt/
3.升级系统:(在安装虚拟机出错的情况下,一般是操作系统的版本问题)
[root@kvm-server ~]# yum upgrade
4.安装软件:
[root@kvm-server ~]# yum install *qemu*  *virt*  librbd1-devel -y
其实下载的是下面几款软件
[root@kvm-server ~]# yum install qemu-kvm libvirt virt-manager  librbd1-devel -y 
qemu-kvm libvirt virt-manager 

qemu:模拟器
qemu-kvm : 主包
libvirt:api接口
virt-manager:图形化界面

#在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁琐。

#kvm xen  qemu三者区别:
kvm与xen的区别;
xen是红帽6之前红帽5的虚拟化应用,6出来之后用kvm替代了。

#kvm和qemu有什么关系:
qemu就是一款开源的虚拟化软件,后来被红帽收购了,进行了优化变成了,qemu-kvm,这也是我们现在用的kvm全称。

ji

KVM gustos图形方式部署安装虚拟机—需要掌握

[root@kvm-server ~]# virt-manager
====================
下面就是点点点

#安装完成一台虚拟机之后,网络模式默认是NAT的。也只有这一种网络

备注

#####一、GuestOS安装问题解析

问题1:用图形安装guest os的时候卡住不动

解决:升级系统
[[email protected] ~]#  yum upgrade -y

问题2:升级系统后安装guest os的时候还是卡住不动

解决:需要在安装宿主机的时候安装兼容性程序(有的同学就没有安装也可以使用,这可能是bug)

问题3:如果安装了各种兼容程序之后还是不行

如果所有问题都排查过后还是安装不上guestos,最后的原因就是在安装宿主机系统的时候各种兼容性软件没有安装而且Yum也没有自动处理导致的

完全文本方式安装虚拟机

[root@kvm-server ~]# yum install -y vsftpd  #安装ftp,并配置最后将镜像上传到ftp中
[root@kvm-server ~]# mkdir /var/ftp/centos7u4
[root@kvm-server IOS]# mount CentOS-7-x86_64-DVD-1708.iso /var/ftp/centos7u4/
[root@kvm-server ~]# virt-install --connect qemu:///system -n vm10 -r 2050 --disk path=/var/lib/libvirt/images/vm10.img,size=5  --os-type=linux --os-variant=centos7.0 --vcpus=1  --location=ftp://10.0.111.182/centos7u4 -x console=ttyS0 --nographics

用这种方式安装的操作系统有一个毛病:纯文本安装的输入时大小写莫名的变换,远程ssh没问题。内存不低于2G

注意:
virt-install 
bash: virt-install: 未找到命令...
# yum install libguestfs-tools -y
# yum install virt-install.noarch -y

参数解释:
-n name
-r  以M为单位指定分配给虚拟机的内存大小
--disk 指定作为客户机存储的媒介 size以G为单位的存储
--os-type   系统类型
--os-variant 系统类型版本
--vcpus 指定核数,不能超过物理cpu
--location  客户虚拟机安装源下载,必须为镜像挂载在ftp目录下
-x console=ttyS0 执行终端0
--nographics 无图形,文本模式

按空格退出!

下面的操作根据提示点点就可以了

模板镜像+配置文件 方式安装虚拟机—需要掌握

1.虚拟机配置文件
[root@kvm-server ~]# ls /etc/libvirt/qemu
networks  vm2.xml
2.储存虚拟机的介质
[root@kvm-server ~]# ls /var/lib/libvirt/images/
vm2.img
==============================
define方式创建好,不会启动
create方式创建好,会启动
实战:
1.拷贝模板镜像和配置文件
[root@kvm-server ~]# cp /etc/libvirt/qemu/vm2.xml /etc/libvirt/qemu/vm3.xml
[root@kvm-server ~]# cp /var/lib/libvirt/images/vm2.img /var/lib/libvirt/images/vm3.img 
2.修改配置文件
生成新的UUID
[root@kvm-server ~]# uuidgen
2e3fa6db-ff7f-41c3-bc8f-0428e81ebb57
[root@kvm-server ~]# vim /etc/libvirt/qemu/vm3.xml
domain type='kvm'>
  <name>vm3</name>  #名字不能一样需要修改
  <uuid>2e3fa6db-ff7f-41c3-bc8f-0428e81ebb57</uuid> #uuid不能一样需要修改
  <memory unit='KiB'>1024000</memory>  #内存,可选
  <currentMemory unit='KiB'>1024000</currentMemory>  #当前内存与上面定义一样
  <vcpu placement='static'>2</vcpu>  #cpu可选
  <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='/var/lib/libvirt/images/vm3.img'/>   #磁盘镜像需要修改
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' 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='0x06' function='0x0'/>
    </controller>
    <interface type='network'>
      <mac address='52:54:00:82:d6:3c'/>  #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>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <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>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='2'/>
    </redirdev>
    <redirdev bus='usb' type='spicevmc'>
      <address type='usb' bus='0' port='3'/>
    </redirdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </rng>
  </devices>
</domain>

#必须修改name,uuid,mac地址,其余可选

用vim修改完之后需要define一下配置文件
[root@kvm-server ~]# virsh define /etc/libvirt/qemu/vm3.xml
重启一下:
[root@kvm-server ~]# systemctl restart libvirtd
宿主机开启路由转发:
[root@kvm-server ~]# vim /etc/sysctl.conf 
[root@kvm-server ~]# sysctl -p
net.ipv4.ip_forward = 1
=============
查看虚拟机列表:
[root@kvm-server ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm2                            关闭
 -     vm3                            关闭
或者如下:

三、KVM虚拟机管理

虚拟机的基本管理命令:
查看
启动
关闭
重启
重置 
===================
[root@kvm-server ~]# virsh list  #列出在运行状态中的虚拟机
 Id    名称                         状态
----------------------------------------------------
 2     vm3                            running
[root@kvm-server ~]# virsh list --all  #列出所有虚拟机
 Id    名称                         状态
----------------------------------------------------
 2     vm3                            running
 -     vm2                            关闭
查看kvm虚拟机配置文件:
#语法:virsh dumpxml vm_name
[root@kvm-server ~]# virsh dumpxml vm3

将vm3虚拟机的配置文件保存至vm4.xml
[root@kvm-server ~]# virsh dumpxml vm3 > /etc/libvirt/qemu/vm4.xml


启动
[root@kvm-server ~]# virsh start vm2
域 vm2 已开始

暂停虚拟机:
[root@kvm-server ~]# virsh suspend vm_name
域 vm2 被挂起

恢复虚拟机:
[root@kvm-server ~]# virsh resume vm_name
域 vm2 被重新恢复

关闭:
方法1:
[root@kvm-server ~]# virsh shutdown vm3
域 vm3 被关闭
    
方法2:
[root@kvm-server ~]# virsh destroy vm3

重启:
[root@kvm-server ~]# virsh reboot vm3
域 vm3 正在被重新启动

重置:
[root@kvm-server ~]# virsh reset vm3   #断电重启。速度快
Domain vm3 was reset

删除虚拟机:
[root@kvm-server ~]# virsh undefine vm2
Domain vm2 has been undefined

注意:虚拟机在开启的情况下undefine是无法删除的只是将配置文件删除了,不能删除磁盘文件。需要手动rm
======================

虚拟机开机自动启动:
#如果虚拟机开机自启,里面的服务应该设置的有开机自启,不然没有意义
[root@kvm-server ~]# virsh autostart vm_name
域 vm3标记为自动开始

[root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/     //此目录默认不存在,在有开机启动的虚拟机时自动创建
vm3.xml

关闭开机启动
[root@kvm-server ~]# virsh autostart --disable vm_name
域 vm3取消标记为自动开始
[root@kvm-server ~]# ls /etc/libvirt/qemu/autostart/

如何查看已启动的虚拟机ip地址
假如vm3虚拟机已启动
[root@kvm-server ~]# virsh domifaddr vm3
 名称     MAC 地址           Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:82:d6:3c    ipv4         192.168.122.85/24

四、虚拟机添加设备

1.图形方式:
    首先,关闭要添加硬件的虚拟机
    双击虚拟机,在打开的对话框点击上方的View,点击Details,点击Add Hardware可以选择要添加的虚拟硬件

按需求点点就可以了。

2.修改配置文件方式:

我们给虚拟机vm3添加磁盘为例:

首先需要创建出要添加的磁盘
[root@kvm-server ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm4-1.qcow2 5G

注:创建空的磁盘文件:这里我们创建一个5G的磁盘,不过创建出来,通过ll -h查看大小,看不出它是5G,添加上之后才能看到
[root@kvm-server ~]# cd /etc/libvirt/qemu/
[root@kvm-server qemu]# vim vm3.xml/
加好之后,启动虚拟机
[root@kvm-server qemu]# systemctl restart libvirtd
[root@kvm-server qemu]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     centos7.0                      running
 -     vm3                            关闭
[root@kvm-server qemu]# virsh start vm3
可以看到我们新添加的磁盘vdb
#然后可以正常分区,制作文件系统,进行挂载

虚拟机克隆

1.图形界面:Applications (左上角)-----> System Tools ------>Virtual Machine Manager
   关闭要克隆的虚拟机,右键点击虚拟机选择Clone
2.在终端执行命令克隆
[root@kvm-server ~]# virt-clone -o vm2 --auto-clone
正在分配 'vm2-clone.qcow2'                              | 5.0 GB  00:00     
成功克隆 'vm2-clone'。
-o       origin-原始
    
[root@kvm-server ~]# virt-clone -o vm2 -n vm5 --auto-clone
正在分配 'vm5.qcow2'                                    | 5.0 GB  00:00     
成功克隆 'vm5'。
-n :指定新客户机的名字
        
[root@kvm-server ~]# virt-clone -o vm2 -n vm6 -f /var/lib/libvirt/images/vm6.img 
正在分配 'vm6.img'                                      | 5.0 GB  00:00     
成功克隆 'vm6'。
-f ,--file NEW_DISKFILE:为新客户机使用新的磁盘镜像文件

这条命令在克隆的同时,可以指定镜像文件的位置和名称。

[root@kvm-server ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     vm2                            关闭
 -     vm2-clone                      关闭
 -     vm3                            关闭
 -     vm5                            关闭
 -     vm6                            关闭

kvm高级命令

#建立虚拟机磁盘镜像文件:
磁盘镜像文件格式:
    1.qed  ----不用了
    2.raw     原始格式,性能最好 直接占用你一开始给多少 系统就占多少 不支持快照
    qcow  先去网上了解一下cow(写时拷贝copy on write) ,性能远不能和raw相比,所以很快夭折了,所以出现了qcow2(性能低下 早就被抛弃)
    3.qcow2 性能上还是不如raw,但是raw不支持快照,qcow2支持快照。

#什么叫写时拷贝?
raw立刻分配空间,不管你有没有用到那么多空间
qcow2只是承诺给你分配空间,但是只有当你需要用空间的时候,才会给你空间。最多只给你承诺空间的大小,避免空间浪费

工作当中用哪个?看你用不用快照。本身做快照也是需要存储空间的。

[root@kvm-server images]# pwd
/var/lib/libvirt/images

建立qcow2格式磁盘文件:
[root@kvm-server images]# qemu-img create -f qcow2 test.img 5G
Formatting 'test.img', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

qemu-kvm  qemu是早先的一个模拟器,kvm是基于qemu发展出来的。

建立raw格式磁盘文件:
[root@kvm-server images]# qemu-img create -f raw test.raw 5G
Formatting 'test.raw', fmt=raw size=5368709120 

查看已经创建的虚拟磁盘文件:
[root@kvm-server images]# qemu-img info test.img 
[root@kvm-server images]# qemu-img info test.raw 

=============================================================================
#挂载磁盘,,,先前条件:文件系统没有坏掉

将vm2虚拟机先关闭
查看vm2的磁盘镜像分区信息:
[root@kvm-server images]# virt-df -h -d vm2
文件系统                                  大小      已用空间    可用空间     使用百分比%
vm2:/dev/sda1                            1014M        92M       922M         10%
vm2:/dev/centos/root                      3.5G       863M       2.6G         25%

1.创建一个挂载目录
[root@kvm-server images]# mkdir /test
2.挂载虚拟机的跟分区到test目录
[root@kvm-server images]# guestmount -d vm2 -m /dev/centos/root --rw /test/
[root@kvm-server images]# cd /test/
[root@kvm-server test]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
[root@kvm-server test]# cat etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

取消挂载
[root@kvm-server ~]# guestunmount /test

五、KVM存储配置

#存储池
概念:
    kvm必须要配置一个目录当作他存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池
    
#kvm默认存储池的位置:
    /var/lib/libvirt/images/    

1.创建基于文件夹的存储池(目录,可自定义)
[root@kvm-server ~]# mkdir -p /data/vmfs

2.定义存储池与其目录
[root@kvm-server ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs
Pool vmdisk defined
解释:vmdisk是新建的存储池的名称。可自定义

3.创建已定义的存储池
(1)创建已定义的存储池
[root@kvm-server ~]# virsh pool-build vmdisk
Pool vmdisk built

(2)查看已定义的存储池,存储池不激活无法使用。
[root@kvm-server ~]# virsh pool-list --all
Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 ISO                 active     yes       
 vmdisk               inactive   no     

4.激活并自动启动已定义的存储池
[root@kvm-server ~]# virsh pool-start vmdisk
Pool vmdisk started
[root@kvm-server ~]# virsh pool-autostart vmdisk
Pool vmdisk marked as autostarted

[root@kvm-server ~]# virsh pool-list --all
 Name                 State      Autostart 
-------------------------------------------
 default              active     yes       
 ISO                 active     yes       
 vmdisk               active     yes   
这里vmdisk存储池就已经创建好了,可以直接在这个存储池中创建虚拟磁盘文件了。

5.在存储池中创建虚拟机存储卷
[root@kvm-server ~]# virsh vol-create-as vmdisk vm99.qcow2 2G --format qcow2
Vol vm99.qcow2 created


[root@kvm-server ~]# ll /data/vmfs/ -h
总用量 196K
-rw------- 1 root root 193K 10月 25 16:04 vm99.qcow2



6.存储池相关管理命令
(1)在存储池中删除虚拟机存储卷
[root@kvm-server ~]# virsh vol-delete --pool vmdisk vm99.qcow2
Vol vm99.qcow2 deleted

(2)取消激活存储池
[root@kvm-server ~]# virsh pool-destroy vmdisk
Pool vmdisk destroyed

(3)删除存储池定义的目录/data/vmfs
[root@kvm-server ~]# virsh pool-delete vmdisk
Pool vmdisk deleted

(4)取消定义存储池
[root@kvm-server ~]# virsh pool-undefine vmdisk
Pool vmdisk has been undefined

到此kvm存储池配置与管理操作完毕。 

六、kvm快照

为虚拟机vm2创建一个快照(磁盘格式必须为qcow2)
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2.snap1


注意:如果在创建快照的时候报错:
error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw

raw
不支持snapshot

qcow2
现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了
对于qcow2的格式,几点还是比较突出的:
	•更小的存储空间
	•支持多个snapshot,对历史snapshot进行管理
查看磁盘文件格式
[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2.qcow2
image: /var/lib/libvirt/images/vm2.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 5.0G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

[root@kvm-server ~]# virsh snapshot-list  vm2   #查看某台虚拟机设备的快照
 Name                 Creation Time             State
------------------------------------------------------------

创建一块磁盘
[root@kvm-server ~]# qemu-img create -f raw /var/lib/libvirt/images/vm2-1.raw 2G
Formatting '/var/lib/libvirt/images/vm2-1.raw', fmt=raw size=2147483648 

[root@kvm-server ~]# ll -h /var/lib/libvirt/images/vm2-1.raw
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 /var/lib/libvirt/images/vm2-1.raw

将其添加到vm2虚拟机上面
[root@kvm-server ~]# cd /etc/libvirt/qemu/
[root@kvm-server qemu]# vim vm2.xml 
[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml
[root@kvm-server images]# virsh start vm2
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap1
错误:不支持的配置:存储类型 vdb 不支持磁盘 raw 的内部快照



#磁盘格式的转换

由于raw的磁盘格式,不支持快照功能,我们需要将其转换为qcow2的格式
[root@kvm-server qemu]# qemu-img convert -O qcow2 /var/lib/libvirt/images/vm2-1.raw  /var/lib/libvirt/images/vm2-1.qcow2
[root@kvm-server qemu]# cd /var/lib/libvirt/images/
[root@kvm-server images]# ll -h 
总用量 21G
-rw------- 1 root root 5.1G 10月 24 18:59 centos7.0.qcow2
-rw-r--r-- 1 root root 193K 10月 25 16:44 vm2-1.qcow2
-rw-r--r-- 1 root root 2.0G 10月 25 16:25 vm2-1.raw
-rw------- 1 root root 5.1G 10月 25 16:13 vm2.qcow2


[root@kvm-server images]# qemu-img info /var/lib/libvirt/images/vm2-1.qcow2
image: /var/lib/libvirt/images/vm2-1.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false


然后去修改vm2虚拟机的磁盘格式和名称
[root@kvm-server images]# vim /etc/libvirt/qemu/vm2.xml
[root@kvm-server images]# virsh define /etc/libvirt/qemu/vm2.xml

创建快照
[root@kvm-server qemu]# virsh snapshot-create-as vm2 vm2.snap2
已生成域快照 vm2.snap2

然后我们开始做快照,图形化方式不再介绍

登录vm2的虚拟机:
[root@vm2 ~]# mkdir /opt/test
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap3
已生成域快照 vm2-snap3

再次登录vm2的虚拟:
[root@vm2 ~]# rm -rf /opt/test/
[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-create-as vm2 vm2-snap4
已生成域快照 vm2-snap4

查看快照
[root@kvm-server ~]# virsh snapshot-list vm2 
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

然后将vm2关闭,恢复到快照vm2.snap3
[root@kvm-server ~]# virsh snapshot-revert vm2 vm2-snap3
[root@kvm-server ~]# virsh start vm2
Domain vm2 started

在vm2虚拟机上查看
[root@vm2 ~]# ls /opt/
test
可以再恢复到vm2.snap4测试一下

删除虚拟机快照操作:
[root@kvm-server ~]# virsh shutdown vm2
[root@kvm-server ~]# virsh snapshot-list vm2
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap3            2019-10-30 15:27:15 +0800 running
 vm2-snap4            2019-10-30 15:29:37 +0800 shutoff

[root@kvm-server ~]# virsh snapshot-delete --snapshotname vm2-snap3 vm2
已删除域快照 vm2-snap3

[root@kvm-server ~]# virsh snapshot-list vm2
 名称               生成时间              状态
------------------------------------------------------------
 vm2-snap4            2019-10-30 15:27:15 +0800 running

七、KVM网络配置

四种网络

NAT default方式:支持主机与虚拟机互访,虚拟机访问外界网络,但不支持外界访问虚拟机。
isolated 隔离,vmware--host-only:仅主机模式。外网不能访问虚拟机,虚拟机也不能访问外网
bridge  ----桥接模式属于桥接口
路由模式

nat网络

桥接网络

隔离网络

#查看管理接口对应的网卡
[root@kvm-server ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400831963	yes		virbr0-nic
							           vnet0
							           vnet1

注意:这里vnet网卡,是每台启动的虚拟机正在使用的网卡设备,每台虚拟机使用的不同						                             					                             
#从交换机上把vnet网卡删除:
[root@kvm-server ~]# brctl delif virbr0 vnet0

来到vm2的虚拟机,ping不通百度
添加vnet网卡添加到交换机上:
[root@kvm-server ~]# brctl addif virbr0 vnet0
	
来到vm2的虚拟机,恢复正常

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

先将kvm虚拟机关闭

配置文件方式配置桥接:在宿主机上
[root@kvm-server ~]# ip a   #先找出宿主机用的哪个网卡设备,我的是enp0s25
[root@kvm-server ~]# cd /etc/sysconfig/network-scripts/
1.定义网卡配置文件
[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

然后看清楚宿主机正在使用的网卡,修改配置文件,(将物理机网卡桥到桥接网卡)
[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文件里面的设备对应,新添加
  
2.重启libvirtd服务
[root@kvm-server network-scripts]# systemctl restart libvirtd 
3.重启network服务 
[root@kvm-server network-scripts]# systemctl restart network     

然后去查看有没有新设备生成

删除桥接网卡步骤:
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

配置文件方式创建nat网络:

配置文件方式创建nat网络:
[root@kvm-server ~]# cd /etc/libvirt/qemu/networks
[root@kvm-server networks]# ls
autostar default.xml
[root@kvm-server networks]# cp default.xml nat1.xml
[root@kvm-server networks]# vim nat1.xml  

重启服务

[root@kvm-server netwoeks]# systemctl  restart libvirtd

在某个(比如vm3)虚拟机去添加此设备测试

配置文件方式创建isolated网络隔离网络:这个模式我从来没用过,我们不再操作,有兴趣可以操作一下   
[root@kvm-server networks]# cp default.xml isolated200.xml
[root@kvm-server networks]# vim isolated200.xml
启动:
[root@kvm-server networks]# systemctl restart libvirtd
开机自启动:
[root@kvm-server networks]# virsh net-autostart  isolated200
查看所有的网络:
[root@kvm-server networks]# virsh net-list

kvm迁移(了解)

最简单的方法:
拷贝配置文件,磁盘镜像文件
冷迁移:将虚拟机关闭,将虚拟机放到另外一台宿主机上面


热迁移----有一个毛病:迁移过程中会暂停虚拟机

			  192.168.1.1/24	            192.168.1.2/24
				++++++++++++            	++++++++++++
				+		   +			    +		    +		
				+    KVM-A  +  =======>     +	KVM-B 	+
				+	    	+			    +	        +	
				++++++++++++				++++++++++++
			images                              images
		/var/lib/libvirt/images	          /var/lib/libvirt/images                   

添加磁盘和内存脚本

virsh list --all

查看一个域的信息

virsh dominfo rhel6
启动虚拟机
virsh start vhostname

正常关闭虚拟机
virsh shutdown  vhostname

强制关闭虚拟机
virsh destroy vhostname


取消定义一个域
virsh undefine vhostname

//编辑默认虚拟网络配置文件
virsh net-edit default
systemctl restart lirbvirtd

创建一个虚拟磁盘
qemu-img create -f qcow2 /home/virtimg/rhel6.img 10G

改变虚拟磁盘大小
qemu-img resize /home/virtimg/rhel6.img +1G
qemu-img info /home/virtimg/rhel6.img


改变虚拟内存的大小
1 设置一个虚拟机的最多使用内存,前提是此虚拟机关闭状态
   这里仅仅会更改配置文件中的设置
virsh setmaxmem centos3 4096M --config

2 启动虚拟机,当前实际使用的内存还是原来的大小
virsh start centos3

3  假如希望增加正在运行中的虚拟机的内存,使用如下命令
virsh setmem centos3 2048M
传文件到虚拟主机里
virt-install --filesystem /host/soource/dir,/dir/in/virthost

在线添加删除硬盘

可以查看虚拟机所有磁盘

virsh domblklist vmname
  • 准备一块虚拟磁盘
qemu-img create -f qcow2 /path/to/vm1-1.qcow2 2G

在线添加硬盘

  • 首先配置一份磁盘的xml文件,作为模板

配置需要的参数项,比如:
cache=writeback,io=third

disk_mod.xml
[root@kvm-shark ~]# cat disk_mod.xml
echo "<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
  <source file='"${vdisk_path}"'/>
  <target dev='"${device_name}"' bus='virtio'/>
</disk>
"

使用模板文件产生一个新的配置文件片段

[root@shark ~]# vdisk_path=/path/to/vm1-1.qcow2
[root@shark ~]# device_name=vdb
[root@shark ~]# source disk_mod.xml > disk.xml
  • 然后使用attach-device命令添加

attach-device - 从一个XML文件附加装置

virsh attach-device vm1 disk.xml --persistent

attach-device [–persistent] [–config] [–live] [–current]
选项
[–domain] domain name, id or uuid
[–file] XML 文件
--persistent 让实时更改并且持久生效。
--config 影响下一次引导,域无论是否运行,都可以直接修改配置文件,单独使用,不会影响当前正确运行中的域
--live 影响运行的域,只能用于域启动的时候
--current 影响当前域
当前域处于关机状态下,会直接修改配置文件
当前域处于开机状态下,不会修改配置文件,临时生效而已,和单独使用 --live 一样。

永久移除vdb磁盘

virsh detach-disk vmname vdb --persistent

自动化找到我们需要创建的硬盘名称

虚拟硬盘名一般都是 vda vdb vdc, 可以利用 a-z 的连续行找到我们新建磁盘的名称。

# 目前虚拟机已经存在的盘符

disk_name_w="a b  e f"

declare -A tmp_arr

for i in $disk_name_w
do
    tmp_arr[$i]=1
done

for i in {a..z}
do
   w=${tmp_arr[$i]}
   if [ -z "$w" ];then
       disk_name=vd$i
      echo "磁盘名称是$disk_name"
      break
   fi
done

八、自动化脚本管理kvm

#!/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>

B:字母数字与字母数字分割,非字母数字与非字母数字分割

&:表示原来的内容

随机生成mac地址

其中方式如下:
# echo `openssl rand -hex 1`:`openssl rand -hex 1`:`openssl rand -hex 1`
99:6e:67

# openssl rand -hex 3 | sed -r 's/(..)(..)(..)/\1:\2:\3/g'
94:89:e3

# openssl rand -hex 3 | sed -r 's/..\B/&:/g'
c5:66:90

Centos设置输入法

管理 KVM 虚拟机

列出所有的虚拟机

virsh list --all

查看一个域的信息

virsh dominfo rhel6
启动虚拟机
virsh start vhostname

正常关闭虚拟机
virsh shutdown  vhostname

强制关闭虚拟机
virsh destroy vhostname


取消定义一个域
virsh undefine vhostname

//编辑默认虚拟网络配置文件
virsh net-edit default
systemctl restart lirbvirtd

创建一个虚拟磁盘
qemu-img create -f qcow2 /home/virtimg/rhel6.img 10G

改变虚拟磁盘大小
qemu-img resize /home/virtimg/rhel6.img +1G
qemu-img info /home/virtimg/rhel6.img


改变虚拟内存的大小
1 设置一个虚拟机的最多使用内存,前提是此虚拟机关闭状态
   这里仅仅会更改配置文件中的设置
virsh setmaxmem centos3 4096M --config

2 启动虚拟机,当前实际使用的内存还是原来的大小
virsh start centos3

3  假如希望增加正在运行中的虚拟机的内存,使用如下命令
virsh setmem centos3 2048M
传文件到虚拟主机里
virt-install --filesystem /host/soource/dir,/dir/in/virthost

在线添加删除硬盘

可以查看虚拟机所有磁盘

virsh domblklist vmname
  • 准备一块虚拟磁盘
qemu-img create -f qcow2 /path/to/vm1-1.qcow2 2G

在线添加硬盘

  • 首先配置一份磁盘的xml文件,作为模板

配置需要的参数项,比如:
cache=writeback,io=third

disk_mod.xml
[root@kvm-shark ~]# cat disk_mod.xml
echo "<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
  <source file='"${vdisk_path}"'/>
  <target dev='"${device_name}"' bus='virtio'/>
</disk>
"

使用模板文件产生一个新的配置文件片段

[root@shark ~]# vdisk_path=/path/to/vm1-1.qcow2
[root@shark ~]# device_name=vdb
[root@shark ~]# source disk_mod.xml > disk.xml
  • 然后使用attach-device命令添加

attach-device - 从一个XML文件附加装置

virsh attach-device vm1 disk.xml --persistent

attach-device [–persistent] [–config] [–live] [–current]
选项
[–domain] domain name, id or uuid
[–file] XML 文件
--persistent 让实时更改并且持久生效。
--config 影响下一次引导,域无论是否运行,都可以直接修改配置文件,单独使用,不会影响当前正确运行中的域
--live 影响运行的域,只能用于域启动的时候
--current 影响当前域
当前域处于关机状态下,会直接修改配置文件
当前域处于开机状态下,不会修改配置文件,临时生效而已,和单独使用 --live 一样。

永久移除vdb磁盘

virsh detach-disk vmname vdb --persistent

自动化找到我们需要创建的硬盘名称

虚拟硬盘名一般都是 vda vdb vdc, 可以利用 a-z 的连续行找到我们新建磁盘的名称。

# 目前虚拟机已经存在的盘符
disk_name_w="vda vdb  vdc vde"

declare -A tmp_arr

for i in $disk_name_w
do
    tmp_arr[$i]=1
done


for i in {
    
    a..z}
do
   w=${tmp_arr[vd$i]}
   if [ -z "$w" ];then
       disk_name=vd$i
      echo "磁盘名称是$disk_name"
      break
   fi
done

virt-install

下面是命令行方式创建虚拟磁盘的

qemu-img create -f qcow2 /home/kvm/data/kube-master.qcow2 50G

一、 安装kvm 虚拟机的脚本

install-virtualhost.sh
#!/usr/bin/env bash
set -ue
set -o pipefail

# 创建相关目录
ls /home/kvm/{
    
    ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{
    
    ks,virtualhost,virtual-img}


# 此程序的变量
KVM_HOME=/home/kvm
KVM_ISO=${KVM_HOME}/iso/CentOS-7-x86_64-Minimal.iso
KVM_KS_FILE=${KVM_HOME}/ks/ks.cfg
KVM_IMG_DIR=${KVM_HOME}/virtual-img
KVM_HOST_DIR=${KVM_HOME}/virtualhost

OS_TYPE="linux"
DEF_OS_VARIANT="rhel7"
DEF_VM_NAME="centos$(date +%Y%m%dT%H%M%S)"

# 设置默认内存大小 1024 M,这个单位是固定的 M,不支持其他单位
DEF_MEM_SIZE=1024
DEF_VCPUS=1
DEF_DISK_SIZE=10G

#  交互式安装
echo  "输入将要创建的KVM虚拟机名称,不是主机名哦"
read -p "默认值${DEF_VM_NAME}>>:" VM_NAME


echo  "输入将要创建的服务器主机名"
read -p "默认 localhost>>:"  HOST_NAME

read -p "输入虚拟机 CPU 核心数默认 1 示例:2>>:" VCPUS

echo "输入虚拟机内存大小,默认1024M,不支持其他单位"
read -p "只需要添数字即可>>:" MEM_SIZE

echo "输入虚拟机使用的磁盘容量"
read -p "默认 10G,[示例写法:15G]>>:"  DISK_SIZE


# 变量替换, 假如没有输入值, 就使用默认值
VM_NAME=${VM_NAME:-$DEF_VM_NAME}
HOST_NAME=${HOST_NAME:-localhost.localdomain}

VCPUS=${VCPUS:-$DEF_VCPUS}
MEM_SIZE=${MEM_SIZE:-$DEF_MEM_SIZE}
DISK_SIZE=${DISK_SIZE:-$DEF_DISK_SIZE}
OS_VARIANT=${OS_VARIANT:-$DEF_OS_VARIANT}

new_disk=${KVM_IMG_DIR}/${VM_NAME}.qcow2


if [[ ! "${DISK_SIZE}" =~ G$ ]] || [[ ! "${DISK_SIZE::-1}" =~ ^[0-9]+$ ]]
then
    echo "格式不正确,正确示例:20G"
    exit
fi


if [ ! -f "${new_disk}" ];then
    qemu-img create -f qcow2 ${new_disk} ${DISK_SIZE}
fi


# 开始创建

virt-install -v \
     --arch x86_64 --virt-type kvm \
     --name ${VM_NAME} \
     --memory ${MEM_SIZE} \
     --vcpus ${VCPUS} \
     --os-type ${OS_TYPE} \
     --location ${KVM_ISO} \
     --network default \
     --graphics none \
     --os-variant     ${OS_VARIANT} \
     --initrd-inject  "${KVM_KS_FILE}" \
     --extra-args     "ks=file:/ks.cfg  \
                       console=tty0 console=ttyS0,115200n8 \
                       hostname=${HOST_NAME}" \
     --disk ${new_disk},cache=writeback,io=threads,bus=virtio

# 桥接模式,前提是你已经建立好了网桥
#     --network bridge=virbr0 --network bridge=docker0 \


# end

参数说明:

  • --arch 指定平台架构
  • --virt-type 虚拟化类型 kvm 是最佳选择
  • --name 虚拟机名称
  • --memory 内存大小
  • --vcpus cpu 核心数
  • --os-type 操作系统类型
  • --os-variant 发行版本,必须是 virt-install 规定好的
  • --network 网络类型 default 是 NAT 类型的网络
  • --graphics 是否使用 vnc 这个的 none 意思是不使用
  • --location ISO 镜像文件路径
  • --initrd-inject 内核注入,指定一个 ks.cfg 文件的路径,会把此文件主人到跟目录下
  • --extra-args 额外的参数
    • ks=file:/ks.cfg 这个值不要变
    • console=ttyS0 表示使用 console 口控制服务器
  • --disk 指定虚拟硬盘文件路径

二、使用KICKSTART自动化安装

  1. 安装工具包,定制并获取到 ks.cfg 文件
yum -y install system-config-kickstart
system-config-kickstart
  1. 验证自定义的 Kickstart 文件

在创建或自定义Kickstart文件时,在尝试在安装中使用它之前验证它是否有效很有用。红帽企业Linux 7包含ksvalidator命令行实用程序,可用于执行此操作。该工具是pykickstart软件包的一部分。要安装此软件包,请用 root 执行以下命令:

 yum install pykickstart

安装软件包后,可以使用以下命令验证Kickstart文件:

ksvalidator /path/to/kickstart.ks

/path/to/kickstart.ks 替换为要验证的Kickstart文件的路径。

重要

请记住,验证工具有其局限性。Kickstart文件可能非常复杂。ksvalidator可以确保语法正确并且文件不包含不建议使用的选项,但是不能保证安装成功。它也不会尝试验证的%pre,%post并且%packagesKickstart文件的各个部分。

  1. ks.cfg 示例
#platform=x86, AMD64, 或 Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$KXeyOPUO$5JlUe3pPpi.hplHB71JdX/
# 系统语言
#lang zh_CN.UTF-8
lang en_US

# System authorization information
auth  --useshadow  --passalgo=sha512
# Use CDROM installation media
#cdrom

# Use text mode install
# 使用字符界面安装操作系统
text

# Do not configure the X Window System
# 不配置图形界面系统
skipx

# SELinux configuration
selinux --disabled

# Firewall configuration
firewall --disabled

# 设置动态获取 IP
network  --bootproto=dhcp --device=eth0 --onboot=on
network  --hostname=HOSNAME

# 设置静态 IP
# network  --bootproto=static --device=eth0 --gateway=192.168.122.1 --ip=192.168.122.100 --nameserver=192.168.122.1 --netmask=255.255.255.0 --activate

# 系统安装完成后 重启系统
#halt
reboot

# System timezone 系统时区
timezone Asia/Shanghai

# System services  系统启动时候自动启动的服务
services --enable="chronyd"

# System bootloader configuration
#系统启动引导方式 vda 是kvm 虚拟机时候的第块磁盘名称
bootloader --location=mbr --boot-drive=vda

# 清除主引导记录
zerombr

# 删除原来的分区和磁盘标签
clearpart --all --initlabel

# 磁盘分区信息,这里采用的是 lvm 自动分区
autopart --type=lvm

# 下面是自定义分区
#part /boot --fstype="xfs" --ondisk=vda --size=200
#part / --fstype="xfs" --ondisk=vda --size=10040
#part /var --fstype="xfs" --ondisk=vda --size=2048
#part /home --fstype="xfs" --ondisk=vda --size=2048

# 安装软件
%packages
@^minimal
@core
chrony
%end

# 禁用 kdump
%addon com_redhat_kdump --disable --reserve-mb='auto'

%end

# 安装系统完成后执行的命令脚本
%post --interpreter=/bin/bash
yum install -y epel-release bash-completion vim-enhanced wget
yum group install "Development Tools" -y
%end

# 用户密码策略
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

注意:

  • 由于安装源直接在virt-install 命令中指定,因此ks文件中没有安装源配置项
    install

Keyboard layouts

keyboard ‘us’

Root password

rootpw --iscrypted 1 1 1KXeyOPUO$5JlUe3pPpi.hplHB71JdX/

系统语言

#lang zh_CN.UTF-8
lang en_US

System authorization information

auth --useshadow --passalgo=sha512

Use CDROM installation media

#cdrom

Use text mode install

使用字符界面安装操作系统

text

Do not configure the X Window System

不配置图形界面系统

skipx

SELinux configuration

selinux --disabled

Firewall configuration

firewall --disabled

设置动态获取 IP

network --bootproto=dhcp --device=eth0 --onboot=on
network --hostname=HOSNAME

设置静态 IP

network --bootproto=static --device=eth0 --gateway=192.168.122.1 --ip=192.168.122.100 --nameserver=192.168.122.1 --netmask=255.255.255.0 --activate

系统安装完成后 重启系统

#halt
reboot

System timezone 系统时区

timezone Asia/Shanghai

System services 系统启动时候自动启动的服务

services --enable=“chronyd”

System bootloader configuration

#系统启动引导方式 vda 是kvm 虚拟机时候的第块磁盘名称
bootloader --location=mbr --boot-drive=vda

清除主引导记录

zerombr

删除原来的分区和磁盘标签

clearpart --all --initlabel

磁盘分区信息,这里采用的是 lvm 自动分区

autopart --type=lvm

下面是自定义分区

#part /boot --fstype=“xfs” --ondisk=vda --size=200
#part / --fstype=“xfs” --ondisk=vda --size=10040
#part /var --fstype=“xfs” --ondisk=vda --size=2048
#part /home --fstype=“xfs” --ondisk=vda --size=2048

安装软件

%packages
@^minimal
@core
chrony
%end

禁用 kdump

%addon com_redhat_kdump --disable --reserve-mb=‘auto’

%end

安装系统完成后执行的命令脚本

%post --interpreter=/bin/bash
yum install -y epel-release bash-completion vim-enhanced wget
yum group install “Development Tools” -y
%end

用户密码策略

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end


> ### 注意:
>
> - 由于安装源直接在virt-install 命令中指定,因此ks文件中没有安装源配置项
> - 由于安装的是虚拟机,而kvm中中qemu-img创建的磁盘,在kvm中默认识别为vda、vdb...之类的磁盘,因此ks文件中,不能再像安装物理机一样指定为sda、sdb之类的磁盘

猜你喜欢

转载自blog.csdn.net/kakaops_qing/article/details/108932567