虚拟化-KVM

虚拟化-KVM

在centos7环境部署kvm虚拟化

应用场景:
1. 割接
使用新服务器替换老旧的服务器。

2. 迁移
如果坏了,多长时间你能修好?


开始部署:

安装之前,将vmware中虚拟机的虚拟化功能打开,勾选上即可
(生产环境中服务器不需要这样设置)

准备工作: 内存大于8G,添加一个存储,虚拟机CPU虚拟化技术打开。

[root@kvm ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd release/     
lftp 172.16.0.99:/release> get epel-release-7-6.noarch.rpm 

[root@kvm ~]# rpm -ivh epel-release-7-6.noarch.rpm

[root@kvm ~]# yum install -y libvirt-python virt-manager libguestfs-tools virt-install qemu-kvm libvirt bridge-utils kvm

准备一个虚拟机需要的资源:

  1. CPU
    直接从宿主机划分。

  2. 内存
    直接从宿主机划分。

  3. 硬盘

使用lv分区方式
[root@kvm ~]# pvcreate /dev/sdb
[root@kvm ~]# vgcreate vgkvm /dev/sdb
[root@kvm ~]# lvcreate -L 50G -n lvkvm vgkvm
[root@kvm ~]# mkfs.xfs /dev/vgkvm/lvkvm 
	
[root@kvm ~]# vim /etc/fstab
/dev/mapper/vgkvm-lvkvm /kvm    xfs defaults    0 0

[root@kvm ~]# mkdir /kvm
[root@kvm ~]# mount -a
[root@kvm ~]# df -h | tail -1
/dev/mapper/vgkvm-lvkvm   50G   33M   50G   1% /kvm

如果硬盘有足够的vg空间可以扩容

[root@localhost ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   20G   70M   20G   1% /

扩容命令
[root@localhost ~]# lvextend -L 150G -n /dev/mapper/centos-root 

为了使扩容分区可以查到,使用这条命令
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root

[root@kvm ~]# mkdir /kvm
[root@kvm ~]# mount -a
[root@kvm ~]# df -h | tail -1

做kvm虚拟机底层存储的有:
(1)分区
/dev/sda5 /dev/sda6

(2)lv
/dev/vgkvm/lv01 , lv02
使用物理层设备做存储,优点是读写速度快,缺点是不能迁移。

(3)文件
raw格式,默认的,基本不用
qcow2格式,用多少,占多少,直到上限 (使用这个方式比较好,跟虚拟机磁盘管理方式一样,用多少涨多少,到上限停止)

[root@kvm /kvm]# qemu-img create -f qcow2 /kvm/node.qcow2 200G
[root@kvm ~]# cd /kvm/
[root@kvm /kvm]# ls
node.qcow2
	> lv,一会在使用的时候,会有警告。
  1. 网卡
    创建网桥。
[root@kvm /etc/sysconfig/network-scripts]# cp ifcfg-ens32 ifcfg-br0

[root@kvm /etc/sysconfig/network-scripts]# vim ifcfg-ens32 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens32
DEVICE=ens32
ONBOOT=yes
BRIDGE=br0	<--- 改

[root@kvm /etc/sysconfig/network-scripts]# vim ifcfg-br0
TYPE=Bridge		<--- 改
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=br0	<--- 改
DEVICE=br0	<--- 改
ONBOOT=yes
IPADDR=172.16.0.29
NETMASK=255.255.0.0
GATEWAY=172.16.0.254
DNS1=211.137.32.178
DNS2=202.96.64.68

[root@kvm ~]# /etc/init.d/network restart

[root@kvm ~]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.0.29  netmask 255.255.0.0  broadcast 172.16.255.255

安装虚拟机:

安装前确认虚拟机cpu是否开启虚拟化
如下图:
在这里插入图片描述

**KS部署端:**确认好硬盘设置是否是vda。(不是sda)


[root@kvm ~]# virt-install --name=node --vcpus 1 --ram 4096 --disk path=/kvm/node.qcow2,device=disk,size=200,format=qcow2,bus=virtio --network bridge=br0 --os-type linux --location 'ftp://172.16.0.99/iso/C7464' --graphics none --console pty,target_type=serial --extra-args='ks=ftp://172.16.0.99/pub/ksC7464.cfg console=ttyS0,115200n8 serial'


	--name	指定虚拟机的名字
		与存储的名字一致
	--vcpus	cpu线程数
	--ram	内存,M
	--disk	硬盘参数
	--network	网卡参数
	--os-type	安装的系统类型
	--location	安装源
	--graphics	文本化安装
	--console	控制接口参数
	--extra-args	安装参数

按键 ctrl ] 退出虚拟控制接口 (相当于切换,正常情况需要先logout登出,然后再切换)

连接虚拟机:

1. 在宿主机连接console接口
只有1个控制台可以连接

[root@kvm ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 3     node                           running
	查看正在运行的虚拟机

[root@kvm ~]# virsh list --all
	查看所有的虚拟机

[root@kvm ~]# virsh console node
	2次回车
ks1 login:

配置IP!!!
[root@ks1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens3
NAME="ens3"
DEVICE="ens3"
ONBOOT=yes
NETBOOT=yes
IPV6INIT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=172.16.0.239
NETMASK=255.255.0.0
GATEWAY=172.16.0.254
DNS1=211.137.32.178

[root@ks1 ~]# /etc/init.d/network restart

[root@ks1 ~]# ping www.baidu.com
PING www.a.shifen.com (39.156.66.18) 56(84) bytes of data.
64 bytes from 39.156.66.18 (39.156.66.18): icmp_seq=1 ttl=53 time=25.0 ms

记住!!!
退出console接口时,一定要退出虚拟机的登录。
ctrl d 按键

2. ssh
[c:~]$ ssh [email protected]

进行初始化操作。

虚拟机的开启和关闭:
关闭:

[root@kvm ~]# virsh shutdown node		# 关机
[root@kvm ~]# virsh destroy  node		# 断开电源

启动:

[root@kvm ~]# virsh start node

虚拟机的文件:

[root@kvm /etc/libvirt/qemu]# ls
node.xml	配置文件

[root@kvm /kvm]# ls
node.qcow2	存储文件

解读配置文件:
[root@kvm /etc/libvirt/qemu]# vim node.xml 
<domain type='kvm'>	类型
  <name>node</name>	名字
  <uuid>81a03bb4-0b4b-4192-ae26-7eca96172e56</uuid>	UUID,唯一标识
  <memory unit='KiB'>4194304</memory>				内存
  <currentMemory unit='KiB'>4194304</currentMemory>	内存
  <vcpu placement='static'>1</vcpu>	CPU线程数

  <clock offset='utc'>	改--下边改-需要关机改配置文件
	utc改成localtime

    <disk type='file' device='disk'>	硬盘配置
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/node.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>

    <interface type='bridge'>			网卡配置,类型桥接
      <mac address='52:54:00:f6:b8:55'/>	
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

需要的配置!!!

将内存修改为1G
时钟改成本地时区

修改虚拟机的配置,虚拟机一定是处于关机状态

[root@kvm ~]# virsh shutdown node		<---先将虚拟机关机
[root@kvm ~]# virsh list  --all				<--- 查看列表中虚拟机的状态

[root@kvm ~]# export EDITOR=vim		<--- 将EDITOR和vim关联,这样用edit编辑时会有颜色显示
[root@kvm ~]# virsh edit node		<--- 编辑配置文件
  <memory unit='GiB'>1</memory>
  <currentMemory unit='GiB'>1</currentMemory>
  <clock offset='localtime'>

[root@kvm ~]# virsh start node

[root@node ~]# grep -c "proc" /proc/cpuinfo 
1

[root@node ~]# free -m
              total
Mem:            992

[root@node ~]# cat /proc/partitions 
major minor  #blocks  name
 252     0  209715200 vda
 252     1     204800 vda1
 252     2  209509376 vda2
 253     0   10485760 dm-0
 253     1     524288 dm-1

  1. 克隆
    nginx
    tomcat
    mysql

方案1:
node完成初始化的centos7,满足公司内部环境的需求;
满足线上条件,还需要做安全方面的设置。

使用node克隆出所有的虚拟机,然后使用服务的一键安装脚本进行软件部署。

方案2:用这个!
node–第一代模板机
克隆
nginx-temp tomcat-temp mysql-temp …
第二代模板机
用第二代模板机,克隆出需要的节点

操作步骤:

(1)制作二代模板机
(2)使用二代模板机克隆出需要的节点
修改虚拟机的IP 主机名
修改虚拟机的CPU和内存
(3)单机一键启动和关闭
(4)分发虚拟机
(5)虚拟机的启动控制脚本
sshpass


(1)制作二代模板机

手动克隆:
virt-clone -o 模板机名字 -n 虚拟机名字 -f 虚拟机的存储文件的绝对路径

虚拟机必须是关机状态!!!


虚拟机必须是关机状态!!!
[root@kvm ~]# virsh shutdown node
[root@kvm ~]# virsh list

[root@kvm ~]# virt-clone -o node -n nginx-temp -f /kvm/nginx-temp.qcow2
[root@kvm ~]# virt-clone -o node -n tomcat-temp -f /kvm/tomcat-temp.qcow2
[root@kvm ~]# virt-clone -o node -n mysql-temp -f /kvm/mysql-temp.qcow2

[root@kvm ~]# virsh start nginx-temp
[root@kvm ~]# virsh start tomcat-temp
[root@kvm ~]# virsh start mysql-temp

console连接,修改IP

xshell连接,运行nginx、tomcat、mysql的一键安装脚本。


使用二代模板机之前,你要把所有需要准备的东西都想好。


[root@kvm ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     mysql-temp                     shut off
 -     nginx-temp                     shut off
 -     node                           shut off
 -     tomcat-temp                    shut off

(2)使用二代模板机克隆出需要的节点

修改虚拟机的IP 主机名
修改虚拟机的CPU和内存

构建一个节点信息表格。

虚拟机的命名
阶段-功能IP地址最后一位
阶段:DEV UAT PDT
nginx11
nginx12

开始克隆:
脚本1:批量克隆

[root@kvm ~]# mkdir clone-sh
[root@kvm ~]# cd clone-sh/
[root@kvm ~/clone-sh]# ls
[root@kvm ~/clone-sh]# vim vmfile
UAT-nginx31 	nginx-temp
UAT-nginx32 	nginx-temp
UAT-tomcat41    tomcat-temp
UAT-tomcat42    tomcat-temp
UAT-MySQLA  	mysql-temp
UAT-MySQLB  	mysql-temp
UAT-NFS61   	node
UAT-NFS62   	node

[root@kvm ~/clone-sh]# vim 1-clone-forum.sh
#!/bin/bash
# 克隆出论坛项目需要的虚拟机

qcow2Dir="/kvm"
dir=`pwd`
file="${dir}/vmfile"


while read line
do
      vmname=$(echo $line | awk '{print $1}')
    tempname=$(echo $line | awk '{print $2}')
    virt-clone -o $tempname -n $vmname -f ${qcow2Dir}/${vmname}.qcow2
done < $file

sync
sleep 2
virsh list --all

修改虚拟机的CPU和内存:
以非交互形式,修改UAT-nginx31.xml文件里面的 内存和CPU 的配置。

CPU

sed -r -i "/vcpu/s/[0-9]+/2/" UAT-nginx31.xml

内存

sed -r -i "/emory/s/K/G/" UAT-nginx31.xml 
sed -r -i "/emory/s/[0-9]+/2/" UAT-nginx31.xml 

脚本化:批量修改虚拟机的CPU和内存。

[root@kvm ~/clone-sh]# vim cpumem
UAT-nginx31 2   1
UAT-nginx32 2   1
UAT-tomcat41    2   1
UAT-tomcat42    2   1
UAT-MySQLA  1   2
UAT-MySQLB  1   2
UAT-NFS61   1   2
UAT-NFS62   1   2

[root@kvm ~/clone-sh]# vim 2-Modify_vmCPUMem.sh
#!/bin/bash
# 修改虚拟机的CPU和内存

dir=`pwd`
file="${dir}/cpumem"
xmldir="/etc/libvirt/qemu"

while read line
do
    vmname=$(echo $line | awk '{print $1}')
     vmcpu=$(echo $line | awk '{print $2}')
     vmmem=$(echo $line | awk '{print $3}')
#修改CPU
    sed -r -i "/vcpu/s/[0-9]+/${vmcpu}/" ${xmldir}/${vmname}.xml

#修改内存
    sed -r -i "/emory/s/K/G/" ${xmldir}/${vmname}.xml
    sed -r -i "/emory/s/[0-9]+/${vmmem}/" ${xmldir}/${vmname}.xml

#重新define,使修改生效
    virsh define ${xmldir}/${vmname}.xml

done < $file

修改虚拟机的主机名和IP:
在关机的状态写修改。

虚拟机镜像文件的控管命令:
1. virt-ls
可以查看虚拟机镜像文件里面目录的内容。

[root@kvm ~]# virt-ls -a /kvm/UAT-nginx31.qcow2 /root

2. virt-cat
查看虚拟机镜像文件某个文件的内容

[root@kvm ~]# virt-cat -a /kvm/nginx-temp.qcow2 /etc/passwd

3. virt-edit ★★★★★
修改虚拟机镜像文件里的某个文件内容

[root@kvm ~]# virt-edit -a /kvm/UAT-nginx31.qcow2 /etc/hosts

虚拟机的密码,忘了或前任没和你交接?

[root@kvm ~]# virt-edit -a /kvm/UAT-nginx31.qcow2 /etc/passwd
root::0:0:root:/root:/bin/bash		<---将密码占位符x删除掉即可无密码登录系统

4. virt-df
查看虚拟机的分区情况

[root@kvm /kvm]# virt-df -a node.qcow2

5. virt-copy-in
将宿主机的文件拷贝到虚拟机里
6. virt-copy-out
将虚拟机里的文件拷贝到宿主机

[root@kvm ~]# virt-copy-in /root/clone-sh/2-Modify_vmCPUMem.sh -a /kvm/UAT-nginx31.qcow2 /tmp/
[root@kvm ~]# virt-copy-out -a /kvm/UAT-nginx31.qcow2 /etc/passwd /tmp/

注意:拷贝看次数不看大小。
解释说明:拷贝大文件和小文件花费的时间几乎相同,但是如果多个文件拷贝多次,那么花费的时间就会更多

[root@kvm ~/clone-sh]# cat hostname 
nginx1

[root@kvm ~/clone-sh]# virt-copy-in hostname -a /kvm/UAT-nginx31.qcow2 /etc/
[root@kvm ~/clone-sh]# virt-cat -a /kvm/UAT-nginx31.qcow2 /etc/hostname
nginx1

[root@kvm ~/clone-sh]# virt-copy-in ifcfg-ens3 -a /kvm/UAT-nginx31.qcow2 /etc/sysconfig/network-scripts/

脚本化:修改虚拟机的主机名和ip地址。
修改/etc/hosts,作业?

[root@kvm ~/clone-sh]# vim iphostname
UAT-nginx31 172.16.0.31 nginx1
UAT-nginx32 172.16.0.32 nginx2
UAT-tomcat41    172.16.0.41 tomcat1
UAT-tomcat42    172.16.0.42 tomcat2
UAT-MySQLA  172.16.0.51 mysqlA
UAT-MySQLB  172.16.0.52 mysqlB
UAT-NFS61   172.16.0.61 NFS1
UAT-NFS62   172.16.0.62 NFS2

[root@kvm ~/clone-sh]# ls hostname ifcfg-ens3 
hostname  ifcfg-ens3

[root@kvm ~/clone-sh]# cat ifcfg-ens3 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens3
DEVICE=ens3
ONBOOT=yes
IPADDR=172.16.0.31
NETMASK=255.255.0.0
GATEWAY=172.16.0.254
DNS1=211.137.32.178

脚本:
[root@kvm ~/clone-sh]# vim 3-change_vmIPhostname.sh
#!/bin/bash
# 修改虚拟机的主机名和IP

dir=`pwd`
qcow2Dir="/kvm"
file="${dir}/iphostname"
hostfile="${dir}/hostname"
ipfile="${dir}/ifcfg-ens3"
count=$(wc -l < $file)
echo "论坛项目有${count}个虚拟机."
num=1
while read line
do
    vmname=$(echo $line | awk '{print $1}')
      vmip=$(echo $line | awk '{print $2}')
    vmhost=$(echo $line | awk '{print $3}')
	
	echo "修改第${num}个--${vmname}"    

# 修改主机名
    echo $vmhost > $hostfile
    virt-copy-in $hostfile -a ${qcow2Dir}/${vmname}.qcow2 /etc/

# 修改IP
    sed -r -i "/^IPADDR/s/IPADDR=.*/IPADDR=${vmip}/"  $ipfile
    virt-copy-in $ipfile -a ${qcow2Dir}/${vmname}.qcow2 /etc/sysconfig/network-scripts/
    let num++
done < $file

(3)单机一键启动和关闭

[root@kvm ~/clone-sh]# cat start 
UAT-NFS61
UAT-NFS62
UAT-MySQLA
UAT-MySQLB
UAT-tomcat41
UAT-tomcat42
UAT-nginx31
UAT-nginx32
[root@kvm ~/clone-sh]# cat shutdown 
UAT-nginx31
UAT-nginx32
UAT-tomcat41
UAT-tomcat42
UAT-MySQLA
UAT-MySQLB
UAT-NFS61
UAT-NFS62

[root@kvm ~/clone-sh]# vim 4-start_vm.sh
#!/bin/bash
# 单机一键启动虚拟机

dir=`pwd`
file="${dir}/start"

count=$(wc -l < $file)
echo "论坛项目有${count}个虚拟机."

num=1
while read vmname
do
    echo "启动第${num}个虚拟机--$vmname"
    virsh start $vmname &> /dev/null
    sleep 3
    let num++
done < $file
virsh list

[root@kvm ~/clone-sh]# vim 5-shutdown_vm.sh
#!/bin/bash
# 单机一键关闭虚拟机

dir=`pwd`
file="${dir}/shutdown"

count=$(wc -l < $file)
echo "论坛项目有${count}个虚拟机."

num=1
while read vmname
do
    echo "关闭第${num}个虚拟机--$vmname"
    virsh shutdown $vmname  &> /dev/null
    sleep 3
    let num++
done < $file
sleep 10
virsh list --all

注意:virsh shutdown实现关机功能,需要依赖acpid包,在开始的时候我们已经安装过了.

一个小程序:可以查看当前运行了多少kvm虚拟机

[root@kvm ~/clone-sh]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd scripts/     
lftp 172.16.0.99:/scripts> get 9-VM_info.sh
 

将虚拟机分发到其他的宿主机:

冷迁移: 在虚拟机处于关机状态进行迁移操作。

虚拟机的配置文件和存储文件 scp

qcow2格式的存储文件:
优点:用多少,占多少;
缺点:一直写新块。

解决:
细致化分区。
mysql /var – rpm 创建一个新的lv mount
/data – bin 创建一个新的lv mount

压缩存储文件:

[root@kvm /kvm]# qemu-img convert -c -O qcow2 UAT-MySQLA.qcow2 UAT-MySQLA-Y.qcow2
	convert	压缩
	-c	创建新的存储文件
	-o	指定格式
	原始文件
	压缩后的新的存储文件

[root@kvm /kvm]# ls -lh UAT-MySQLA*
-rw------- 1 root root 4.3G Dec 19 11:42 UAT-MySQLA.qcow2
-rw-r--r-- 1 root root 1.8G Dec 19 12:10 UAT-MySQLA-Y.qcow2

[root@kvm /kvm]# mv UAT-MySQLA.qcow2 UAT-MySQLA.qcow2.bak ; mv UAT-MySQLA-Y.qcow2 UAT-MySQLA.qcow2

[root@kvm /kvm]# virsh start UAT-MySQLA
	启动
	连接 都没有问题,说明压缩后的文件是好用的。

[root@kvm /kvm]# rm -f UAT-MySQLA.qcow2.bak

把UAT-MySQLA从宿主机172.16.0.29迁移到宿主机172.16.14.7:
	冷迁移,UAT-MySQLA是关机状态。

172.16.0.29:
[root@kvm /kvm]# scp UAT-MySQLA.qcow2 172.16.14.7:/kvm/
[root@kvm /etc/libvirt/qemu]# scp UAT-MySQLA.xml 172.16.14.7:/etc/libvirt/qemu

172.16.14.7:
[root@kvm qemu]# ls
UAT-MySQLA.xml

[root@kvm qemu]# virsh define UAT-MySQLA.xml


克隆 冷迁移
将虚拟机复制一份。

注意:!!!

mysql 
[root@mysqlA data]# cat auto.cnf 		<--- 这个文件要删除掉,重新启动mysql会重新生成新的uuid
[auto]
server-uuid=b2f5956e-2161-11ea-bf03-525400b78919

克隆或冷迁移之后,这个文件要删掉!!!

文件路径:
[root@mysqlA mysql]# find / -name "auto.cnf"
/data/mysql/data/auto.cnf

虚拟机提示 UUID 冲突?

这种情况一般是拷贝虚拟机时,两个宿主虚拟机内置的机器名字相同导致这个提示


[root@kvm qemu]# virsh define UAT-MySQLA.xml 
error: Failed to define domain from UAT-MySQLA.xml
error: operation failed: domain 'UAT-MySQLA' already exists with uuid 43d902b6-2912-486b-89c2-436af326ad91

[root@kvm qemu]# virsh edit UAT-MySQLA
error: operation failed: domain 'UAT-MySQLA' already exists with uuid 43d902b6-2912-486b-89c2-436af326ad91
Failed. Try again? [y,n,i,f,?]:  输入n
error: operation failed: domain 'UAT-MySQLA' already exists with uuid 43d902b6-2912-486b-89c2-436af326ad91

[root@kvm qemu]# cp UAT-MySQLA.xml /tmp/

[root@kvm qemu]# virsh undefine UAT-MySQLA

[root@kvm qemu]# cp /tmp/UAT-MySQLA.xml .

[root@kvm qemu]# vim UAT-MySQLA.xml 
	将UUID改成和原来不一样就行。

[root@kvm qemu]# virsh define UAT-MySQLA.xml 

冷修改虚拟机的硬件配置;

1. CPU 和内存 已完成 <— 上边已经修改完成

2. 给虚拟机加存储

UAT-NFS62

[root@kvm /kvm]# qemu-img create -f qcow2 nfs62_2.qcow2 100G

[root@kvm /kvm]# virsh edit UAT-NFS62
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/UAT-NFS62.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm/nfs62_2.qcow2'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>

[root@kvm /kvm]# virsh start UAT-NFS62

[root@kvm /kvm]# virsh console UAT-NFS62

[root@NFS2 ~]# fdisk -l /dev/vda
[root@NFS2 ~]# fdisk -l /dev/vdb

[root@NFS2 ~]# pvcreate /dev/vdb

[root@NFS2 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree  
  sys   1   2   0 wz--n- 199.80g 189.30g

[root@NFS2 ~]# vgextend sys /dev/vdb

[root@NFS2 ~]# vgs
  VG  #PV #LV #SN Attr   VSize    VFree   
  sys   2   2   0 wz--n- <299.80g <289.30g
  

3. 给虚拟机加网卡

UAT-NFS62 增加一个网卡。
关掉虚拟机。

[root@kvm /kvm]# virsh edit UAT-NFS62
    <interface type='bridge'>
      <mac address='52:54:00:e5:24:72'/>
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='52:54:00:e6:25:73'/>
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </interface>

[root@kvm /kvm]# virsh start UAT-NFS62
[root@kvm /kvm]# virsh console UAT-NFS62

[root@NFS2 network-scripts]# cp ifcfg-ens3 ifcfg-ens8
[root@NFS2 network-scripts]# vim ifcfg-ens8 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens8
DEVICE=ens8
ONBOOT=yes
IPADDR=172.17.0.62
NETMASK=255.255.0.0

[root@NFS2 ~]# /etc/init.d/network restart

应用场景:

网站的静态资源数据如何处理。
文字 小
图片 大
视频 大

与业务沟通
跟防火墙"商量",背板带宽是有限的
如果静态资源数据量很大,会堵死防火墙的背板带宽!!!

(1)静态资源数据量不是很高
将所有的节点都放置在防火墙内部,受其保护。

(2)静态资源的数据量很高
将静态资源节点放置在防火墙外部,通过交换机的外网vlan,直连公网。

在这里插入图片描述

在线修改虚拟机的硬件配置:

虚拟机处于运行状态调整硬件配置。

应用场景:
监控收到了资源 灾难级别 的报警。

怎么办?
看着。(kan 一声)
只要不出其他问题,就可以。

前提:
服务器还有资源。

1. CPU

CPU只支持调大,不支持缩小。

查看cpu情况
[root@kvm ~]# lscpu
CPU(s):                4
On-line CPU(s) list:   0-3

编辑对应的配置文件
[root@kvm /etc/libvirt/qemu]# virsh edit UAT-MySQLA
  <vcpu placement='auto' current='1'>4</vcpu>
	placment='auto'	支持动态调整
	current			当前线程数是1
	最大支持到4

[root@kvm ~]# virsh start UAT-MySQLA

[root@mysqlA ~]# grep -c "proc" /proc/cpuinfo 
1

[root@kvm ~]# virsh setvcpus UAT-MySQLA 2 --live

[root@mysqlA ~]# grep -c "proc" /proc/cpuinfo 
2

CPU只支持调大,不支持缩小。

前提:应用程序可以在每个在线的CPU上都得到处理。

2. 内存

可以调大,也可以调小

[root@kvm /etc/libvirt/qemu]# virsh edit UAT-MySQLA
  <memory unit='KiB'>2097152</memory>		能够使用的内容的上限
  <currentMemory unit='KiB'>2097152</currentMemory>	当前使用的内存
	关机改成
  <memory unit='GiB'>4</memory>
  <currentMemory unit='GiB'>1</currentMemory>

[root@kvm ~]# virsh start UAT-MySQLA

[root@mysqlA ~]# free -m
              total
Mem:            879

上调到2G:
[root@kvm ~]# virsh qemu-monitor-command UAT-MySQLA --hmp --cmd balloon 2048

[root@mysqlA ~]# free -m
              total
Mem:           1903

上调到2G:
[root@kvm ~]# virsh qemu-monitor-command UAT-MySQLA --hmp --cmd balloon 2048

[root@mysqlA ~]# free -m
              total
Mem:           1903

下调到512M:
[root@kvm ~]# virsh qemu-monitor-command UAT-MySQLA --hmp --cmd balloon 512

[root@mysqlA ~]# free -m
              total
Mem:            367

3. 硬盘

当前是1块硬盘 vda

[root@kvm /kvm]# qemu-img create -f qcow2 mysqlA-2.qcow2 100G

将硬盘加入虚拟机,作为第二块硬盘 vdb
[root@kvm ~]# virsh attach-disk UAT-MySQLA --source /kvm/mysqlA-2.qcow2 --target vdb --cache writeback --subdriver qcow2

[root@mysqlA ~]# fdisk -l /dev/vdb
Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors

删除硬盘:

[root@kvm ~]# virsh detach-disk UAT-MySQLA --target vdb  

应用场景:
收到分区空间不足的报警?
了解分区存储的是什么数据?
日志 清除 >
静态数据 拉伸lv
数据库数据 拉伸lv

4. 网卡

永久增加一个网卡:(需要重启生效,写入配置文件里)

[root@kvm ~]# virsh domiflist UAT-MySQLA
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      bridge     br0        rtl8139     52:54:00:b6:7b:bd

永久增加一个网卡:(需要重启生效,写入配置文件里)
[root@kvm ~]# virsh attach-interface UAT-MySQLA --type bridge --source br0 --config

[root@kvm ~]# vim /etc/libvirt/qemu/UAT-MySQLA.xml
	写入配置文件,需要重启生效。

临时添加一个网卡:(直接就生效了)


临时添加一个网卡:(直接就生效了)
[root@kvm ~]# virsh attach-interface UAT-MySQLA --type bridge --source br0

[root@kvm ~]# virsh domiflist UAT-MySQLA
Interface  Type       Source     Model       MAC

-------------------------------------------------------
vnet0      bridge     br0        rtl8139     52:54:00:b6:7b:bd
vnet1      bridge     br0        rtl8139     52:54:00:da:55:ad

[root@mysqlA ~]# ip a
2: ens3:
3: ens7: 

删除网卡:

[root@kvm ~]# virsh detach-interface UAT-MySQLA --type bridge --mac 52:54:00:da:55:ad

给虚拟机做快照:

一定是在虚拟机关机的状态下,创建快照。

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

创建:
[root@kvm ~]# qemu-img snapshot -c init /kvm/node.qcow2

查看;
[root@kvm ~]# qemu-img snapshot -l /kvm/node.qcow2

使用:
[root@kvm ~]# qemu-img snapshot -a ID号 /kvm/node.qcow2

删除:


[root@kvm ~]# qemu-img snapshot -d ID号 /kvm/node.qcow2 


在kvm环境,安装windows虚拟机:

  1. 宿主机有图形界面,直接打开图形界面安装
[root@kvm ~]# virt-manager
  1. 宿主机是minimal版本,没有图形界面
[root@kvm ~]# yum install -y virt-manager xorg-x11-xauth dejavu-lgc-sans-fonts tigervnc tigervnc-server

[root@kvm ~]# virt-manager

如果无法启动,检查xshell安装是否缺少组件.


kvm虚拟机的在线迁移:

应用场景:
(1)当前宿主机硬件(CPU和内存)不足
(2)在线割接

宿主机1:172.16.0.29
宿主机2:172.16.14.7
NFS:172.16.0.30

虚拟机:
存储文件,保存在NFS上。
在宿主机本地,还有一份存储文件。

172.16.0.29:
/kvm 15个虚拟机
172.16.0.29 8个 /kvm 有8个存储文件
172.16.14.7 7个 /kvm 有7个存储文件

NFS的共享目录,挂载到 14.7和0.29 /kvm 上
共享目录里,有15个存储文件。

如果存储节点故障,虚拟机就死了。
因为宿主机本地有一份虚拟机的存储文件,直接重启宿主机,启动虚拟机的初始存储文件,再将数据导入。

先配置宿主机的hosts

两台宿主机,主机名要不一致,写好/etc/hosts!!!
[root@kvm29 ~]# vim /etc/hosts
172.16.0.29 kvm29.up.com    kvm29
172.16.14.7 kvm7.up.com     kvm7

[root@kvm29 ~]# scp /etc/hosts 172.16.14.7:/etc/

搭建集中存储

(1)NFS


[root@NFS ~]# yum install -y nfs-utils

[root@NFS ~]# fdisk /dev/sda
[root@NFS ~]# partx -a /dev/sda

[root@NFS ~]# pvcreate /dev/sda3
[root@NFS ~]# vgcreate vgkvm /dev/sda3
[root@NFS ~]# lvcreate -L 50G -n lvkvm vgkvm
[root@NFS ~]# lvcreate -L 1G -n xml vgkvm
[root@NFS ~]# mkfs.xfs /dev/vgkvm/lvkvm
[root@NFS ~]# mkfs.xfs /dev/vgkvm/xml

[root@NFS ~]# vim /etc/fstab
/dev/vgkvm/lvkvm   /nfs/qcow2  xfs defaults    0 0
/dev/vgkvm/xml	   /nfs/xml    xfs defaults    0 0

[root@NFS ~]# mkdir -p /nfs/{qcow2,xml}
[root@NFS ~]# mount -a
[root@NFS ~]# df -h | tail -2
/dev/mapper/vgkvm-lvkvm   50G  1.9G   49G   4% /nfs/qcow2
/dev/mapper/vgkvm-xml   1014M   33M  982M   4% /nfs/xml

[root@NFS ~]# chmod 757 /nfs/qcow2/ /nfs/xml/

[root@NFS ~]# vim /etc/exports
/nfs/qcow2  172.16.0.0/16(rw,sync,no_root_squash)
/nfs/xml    172.16.0.0/16(rw,sync,no_root_squash)

[root@NFS ~]# systemctl start nfs
[root@NFS ~]# systemctl enable nfs

(2)宿主机

开始挂载目录

[root@kvm29 ~]# yum install -y nfs-utils
[root@kvm7 ~]# yum install -y nfs-utils

[root@kvm29 ~]# showmount -e 172.16.0.30
Export list for 172.16.0.30:
/nfs/xml   172.16.0.0/16
/nfs/qcow2 172.16.0.0/16

[root@kvm7 ~]# showmount -e 172.16.0.30
Export list for 172.16.0.30:
/nfs/xml   172.16.0.0/16
/nfs/qcow2 172.16.0.0/16

临时挂载到/mnt下,为了将配置文件和磁盘文件拷到nfs共享
[root@kvm29 ~]# mkdir /mnt/{qcow2,xml}
[root@kvm29 ~]# mount 172.16.0.30:/nfs/xml /mnt/xml/
[root@kvm29 ~]# mount 172.16.0.30:/nfs/qcow2 /mnt/qcow2/

保证虚拟机是关机状态!!!

[root@kvm29 /kvm]# cp UAT-MySQLB.qcow2 /mnt/qcow2/
[root@kvm29 /etc/libvirt/qemu]# cp UAT-MySQLB.xml /mnt/xml/

[root@kvm29 ~]# umount /mnt/qcow2/
[root@kvm29 ~]# umount /mnt/xml/

停止虚拟化服务:
[root@kvm29 ~]# systemctl stop libvirtd
[root@kvm7 ~]# systemctl stop libvirtd

挂载集中存储:

正式将/nfs挂载到对应宿主机的目录下,这样每台宿主机都可以获得

[root@kvm29 ~]# mount 172.16.0.30:/nfs/qcow2 /kvm/
[root@kvm29 ~]# mount 172.16.0.30:/nfs/xml /etc/libvirt/qemu

[root@kvm7 ~]# mount 172.16.0.30:/nfs/qcow2 /kvm/
[root@kvm7 ~]# mount 172.16.0.30:/nfs/xml /etc/libvirt/qemu

启动虚拟化服务:
[root@kvm29 ~]# systemctl start libvirtd
[root@kvm7 ~]# systemctl start libvirtd

[root@kvm29 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     UAT-MySQLB                     shut off
[root@kvm7 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     UAT-MySQLB                     shut off
	千万不能在2个宿主机启动同一个虚拟机。

编辑配置文件:

3个配置文件

编辑配置文件:
[root@kvm29 ~]# vim /etc/libvirt/libvirtd.conf 	<---配置安全协议和监听端口,地址
 22 listen_tls = 0
 33 listen_tcp = 1
 45 tcp_port = "16509"
 55 listen_addr = "0.0.0.0"
 64 mdns_adv = 0
158 auth_tcp = "none"

[root@kvm29 ~]# scp /etc/libvirt/libvirtd.conf 172.16.14.7:/etc/libvirt/

[root@kvm29 ~]# vim /etc/sysconfig/libvirtd 
  9 LIBVIRTD_ARGS="--listen"

[root@kvm29 ~]# scp /etc/sysconfig/libvirtd 172.16.14.7:/etc/sysconfig/

[root@kvm29 ~]# vim /etc/libvirt/qemu.conf
 66 vnc_listen = "0.0.0.0"

[root@kvm29 ~]# scp /etc/libvirt/qemu.conf 172.16.14.7:/etc/libvirt/

[root@kvm29 ~]# systemctl restart libvirtd
[root@kvm7 ~]# systemctl restart libvirtd

[root@kvm29 ~]# netstat -antp | grep 16509
tcp        0      0 0.0.0.0:16509           0.0.0.0:*     LISTEN      5385/libvirtd 

[root@kvm7 ~]# netstat -antp | grep 16509
tcp        0      0 0.0.0.0:16509           0.0.0.0:*     LISTEN      1950/libvirtd

开始迁移:

[root@kvm29 ~]# virsh start UAT-MySQLB	<---一台启动的vm虚拟机

[root@NFS ~]# ping 172.16.0.52	<---ping的状态为了查看迁移过程中虚拟机是否中断迁移命令

[root@kvm29 ~]# virsh migrate --live --unsafe --persistent UAT-MySQLB qemu+tcp://root@172.16.14.7:16509/system

[root@kvm29 ~]# virsh list --all	# 机器现在是关闭状态,开机状态给对方了
 Id    Name                           State
----------------------------------------------------
 -     UAT-MySQLB                     shut off

[root@kvm7 ~]# virsh list --all		# 交给kvm7 运行这台虚拟机了
 Id    Name                           State
----------------------------------------------------
 3     UAT-MySQLB                     running
 

kvm虚拟机的网络:

  1. br0 桥接

  2. virbr0 NAT

[root@kvm /etc/libvirt/qemu/networks]# ls
autostart default.xml

虚拟机的网卡,连接到virbr0
虚拟机可以连接外网
但是外部节点无法连接虚拟机

[root@kvm ~]# virsh net-list
Name State Autostart Persistent

default active yes yes

[root@kvm ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29ad6032 no ens32
virbr0 8000.5254004a42db yes virbr0-nic

==========================================================

监控虚拟机

查看当前所有虚拟机的资源消耗情况

[root@kvm ~]# yum install -y virt-top

监控虚拟机消耗的资源。
[root@kvm ~]# virt-top 
	
virt-top 17:29:08 - x86_64 8/8CPU 2266MHz 8191MB 17.1%
16 domains, 2 active, 2 running, 0 sleeping, 0 paused, 14 inactive D:0 O:0 X:0
CPU: 13.4%  Mem: 5120 MB (5120 MB by guests)

   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME                                         
    1 R    0    0    0    0 12.9 50.0   1:39.26 win7
    2 R    1  115  664    0  0.5 12.0   0:39.20 UAT-tomcat122
    -                                           (UAT-MySQLA)
    -                                           (UAT-mysql-22)
    -                                           (UAT-mysql131)
    -                                           (UAT-mysql132)
    -                                           (UAT-nfs141)
    -                                           (UAT-nfs142)
    -                                           (UAT-nginx111)
    -                                           (UAT-nginx112)
    -                                           (UAT-tomcat121)
    -                                           (mysql-temp)
    -                                           (nfs-temp)
    -                                           (nginx-temp)
    -                                           (node)
    -                                           (tomcat-temp)

virsh是kvm虚拟机常用的管理工具,以下是一些常用的命令。
1、查看在运行的虚拟机
virsh list
2、查看创建的所有虚拟机
virsh list --all
3、启动虚拟机
virsh start win10
win10是虚拟机的domain名称,下同。
4、挂起虚拟机
virsh suspend win10
5、恢复被挂起的虚拟机
virsh resume win10
6、开机启动虚拟机,即在虚拟机服务(libvirt)启动的时候,就启动虚拟机。
virsh autostart win10
7、关闭开机启动虚拟机
virsh auto start --disable win10
8、关闭虚拟机(需要ACPID服务的支持,ACPI是Advanced Configuration and PowerInterface缩写,高级配置和电源管理接口)
virsh shutdown win10
9、强制关闭虚拟机,这种方式是从virsh list列表中将虚拟机删除,仍然可以start起来
virsh destory win10
10、启动默认的网络
virsh net-start default
11、自启动默认网络
virsh net-autostart default
12、彻底删除虚拟机步骤
1)关闭虚拟机:virsh destroy win10
2)删除定义:virsh undefine win10
3)删除虚拟机文件(在/var/lib/libvirtd/下的相关文件)

故障参考:

tomcat的8005端口启动不起来的解决办法
修改$JAVA_HOME/jre/lib/security/java.security 文件中 securerandom.source 配置项:
将原本的:securerandom.source=file:/dev/random
修改为: securerandom.source=file:/dev/urandom
保存退出后,使用killall杀掉java进程:
killall java
再重新启动

发布了57 篇原创文章 · 获赞 3 · 访问量 1000

猜你喜欢

转载自blog.csdn.net/weixin_42502744/article/details/103602106