Linux云计算——KVM虚拟化、后端复用、virsh命令、快速搭建虚拟机

显示英文版本帮助

LANG=en_US.UTF-8 命令 --help

显示中文版本帮助

LANG=zh_CN.UTF-8 命令 --help

虚拟化
    定义: 把一个或者多个物理资源转换成一个或者多个逻辑资源,这些逻辑资源就可以用来创建虚拟机
    详细解释: 可以一个物理机中创建多个虚拟机,也可以多个物理机转换成一个虚拟机,但是因为网络速度远远打不到CPU的运行速度,所以一般不把多个真机制作为一个虚拟机
    一般 Linux 使用 KVM虚拟化

各个公司的虚拟化软件
VMware VMware Workstation、vSphere
Microsoft VirtualPC、Hyper-V
RedHat KVM、RHEV
Citrix Xen
Oracle Oracle VM VirtualBox

KVM虚拟化
    简介:KVM只是一个linux的内核模块,是内核用来实现虚拟化的一个技术模块,具体操作需要其他软件辅助完成,它的使用需要 CPU 的支持,通过一些硬件相关技术打成虚拟化,包括CPU方面的Intel-VT,AMD-V、以及内存相关的Intel的 EPT 和 AMD 的 RVI

    Qemu,用于操作内核运行的仿真工具,连接操作系统和KVM内核的命令
    Libvirt,是一个对虚拟化管理的接口和工具,提供用户端程序,让用户可以轻松控制KVM

    三者的关系: KVM是底层技术也是实现虚拟化的核心模块,Qemu是让KVM可以被通过系统命令控制,不过很繁琐并且复杂,Libvirt是让控制界面更加友好,用户可以更方便的进行控制虚拟化

必安装软件:yum install -y qemu-kvm libvirt-daemon libvirt-client libvirt-daemon-diver-qemu
qemu-kvm 为 kvm 提供底层仿真支持,也就是qemu的核心软件
libvirt-daemon libvirtd 守护进程,可以理解为一个控制服务,管理虚拟机
libvirt-client 用户端软件,提供客户端管理命令
libvirt-daemon-driver-qemu libvirtd 连接 qemu 的驱动
选择安装: virt-install virt-manager virt-v2v virt-p2v
virt-install 系统安装工具
virt-manager 图形管理工具
virt-v2v 虚拟机迁移工具
virt-p2v 物理机迁移工具

virsh命令
    命令格式: virsh  控制命令  虚拟机  参数

virsh nodeinfo 查看KVM节点信息
virsh console 虚拟机名 通过图形界面,进行控制虚拟机,不过需要虚拟机支持console(修改配置文件/etc/default/grub,再用命令grub2-mkconfig -o /boot/grub2/grub.cfg启动)
virsh list 列出开启的虚拟机
virsh list --all 列出所有虚拟机(包括没有开启的)
virsh net-list 列出启用的虚拟网络(虚拟交换机)
一个虚拟网络可以理解为一个交换机,网络交互和物理机器一样的原理,连一个虚拟交换机就是连在一个交换机上,从而可以通信
virsh net-list --all 列出所有虚拟网络(包括没有开启的)
virsh dominfo 虚拟机 查看某个虚拟机的信息(包括没有开启的)
virsh start 虚拟机 使虚拟机开机
virsh reboot 虚拟机 使虚拟机关闭
virsh shutdown 虚拟机 使虚拟机关机(自动关闭服务并关机)
virsh destroy 虚拟机 使虚拟机强制关机(直接切断电源)
virsh autostart 虚拟机 设置虚拟机为真机开机(通电)自启动
virsh auotstart --disable 虚拟机 设置为开机不自启动
virsh net-list  查看虚拟网络
virsh net-define 网络配置文件的地址  创建虚拟网络
virsh net-undefine 网络名 初除虚拟网络
virsh net-start 网络名 启动虚拟网络
virsh net-destroy 网络名 停止虚拟网络
virsh net-edit 网络名 修改vbr网络的配置
virsh net-autostart 网络名 设置vbr虚拟网络开机自启动
virsh dumpxml 虚拟机名 查看虚拟机的xml配置文件
virsh dumpxml 虚拟机名 > 虚拟机名.xml 备份虚拟机的xml配置文件

镜像盘
      一般存储镜像盘的位置是/var/lib/libvirt/images/
      可以理解为把真机的一部分存储空间划分出来作为虚拟机的存储空间,不过镜像盘文件格式有两个:RAW和QCOW2

      这两个格式,用的比较多的是QCOW2,RAW除了IO吞吐效率高之外没有优势,而QCOW2是占用空间的使用率远远高于RAW,支持压缩、后端盘复用、快照,

      QCOW2之所以节约空间,原因有两点,其一是他不会按照最大存储空间占用系统存储,而是按照磁盘真实存储的空间大小,什么意思呢,举个例子,加入磁盘a系统分配10个G的存储空间,实际用户使用了1个G而已,如果是RAW格式,他会从真机存储空间中取出10G作为其存储空间,而QCOW2不是,他只会占用真机1G的存储空间,所以,空间利用率就很高;其二就是,后端复用技术,他让一些公有数据存在一个地方,然后所有盘都可以读这个盘的内容,这样原来每个盘都要存一遍的数据最后一共只存了一遍,这样大大节约了空间,尤其是操作系统,多个虚拟机操作系统相同,那么操作系统就可以放在一个盘里面。

      什么是后端复用,其作用就是让一些公有数据存在一个盘内,其他盘以这个盘为模板,这样数据只存了一份,却有很多盘可以读,里面有些两个专有名词,前端盘和后端盘,后端盘就是作为模板的那个盘,前端盘就是以后端盘为模板创建的众多盘中的一个,用户可以通过这个盘访问前端盘。

      对于QCOW2用的后端盘复用的核心技术就是 COW (Copy On Write) 写时复制功能,什么是写时复制,分两个情况进行数据传递分析,一个是当客户读数据的时候,系统会先到前端盘找数据,如果前端盘有就会把数据返回个客户,如果没有就会到后端去调出来给客户;当客户要修改某个文件前端盘的数据的时候,比较麻烦,如果前端盘有这个数据,那好办直接修改,如果前端盘没有这个数据,COW技术会吧后端盘的相应文件拷贝到前端盘,并且存在前端盘,然后用户修改这个前端盘的数据。也就是说只有当用户修改一个前端盘不存在的文件而后端盘有的时候才会把后端文件拷贝存储到前端盘,而因为读的时候先读前端盘,所以实际上通过这个前端盘访问就是覆盖了后端盘的相应文件,但是其他前端盘访问的时候,数据不变,因为后端盘的数据没变

qemu-img命令
qemu-img create -f 格式 磁盘路径 最大空间大小 创建一个镜像存储盘
qemu-img info 磁盘路径 查看镜像盘信息
qemu-img create -b 作后端盘的磁盘路径 -f 格式 磁盘路径 最大空间大小 以一个后端盘为模板文件新建一个磁盘

创建虚拟网络(交换机)
修改配置文件/etc/libvirt/qemu/networks/交换机名.xml (建议下面的名字全部写成一样的)

<network>
  <name>名字(net-list查看的)</name>
  <bridge name='名字(ifconfig查看的)' stp='on' delay='0'/>
  <domain name='名字'/>
  <forward mode="nat"/>
  <ip address='设置真机IP地址' netmask='255.255.255.0(网段)'>
    <dhcp>
      <range start="设置虚拟机自动获取IP的范围起始值" end="设置虚拟机自动获取IP的范围终止值"/>
    </dhcp>
  </ip>
</network>

创建一个虚拟机的xml配置文件

<domain type='kvm'>
  <name>名字</name>
  <memory unit='KB(后面内存的单位)'>最大内存使用量</memory>
  <currentMemory unit='KB(后面内存的单位)'>当前内存使用量(一般等于最大内存)</currentMemory>
  <vcpu placement='static'>具体cpu个数</vcpu>
  <os>
    <type arch='x86_64(操作系统格式)' machine='pc'>hvm</type>
    <boot dev='hd(从硬盘引导、cd-rom是从光驱引导)'/>
    <bootmenu enable='yes'/>
    <bios useserial='yes'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough(使用真机cpu,也可以用虚拟cpu用于配置指令级)'>
  </cpu>
  <clock offset='localtime(使用系统事件)'/>
  <on_poweroff>destroy(强制关机命令)</on_poweroff>
  <on_reboot>restart(重启命令)</on_reboot>
  <on_crash>derestart(强制重启命令)</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm(用什么程序来模拟虚拟机)</emulator>

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/node.img'/>
      <target dev='vda' bus='virtio'/>
    </disk>

    <interface type='bridge'>
      <source bridge='vbr(虚拟交换机名)'/>
      <model type='virtio'/>
    </interface>

    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
    <serial type='pty'></serial>
    <console type='pty'>
      <target type='serial'/>
    </console>
    <memballoon model='virtio'></memballoon>
  </devices>
</domain>

搭建一个虚拟机模板:
   1. 创建一个镜像盘、一个虚拟网络,然后以这个虚拟网络为网络、以镜像盘为存储空间新建虚拟机

   2. 用正规的虚拟机安装过程安装这个虚拟机,再进行下面的配置

   3. 禁用selinux、卸载防火墙与NetworkManager、配置yum源

   4. 配置网卡(修改配置文件/etc/sysconfig/network-scripts/ifcfs-eth0)

# Generated by dracut initrd
DEVICE="eth0"
ONBOOT="yes"
NM_CONTROLLED="no"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="IP地址"
NETMASK="255.255.255.0"
GATEWAY="网关地址"

   5. 禁用空路由,注意:一个机器只能有一个网关,而不是一个网卡接口一个网关,所以写网络配置文件的时候只能有一个配置中有网关

echo 'NOZEROCONF="yes"' > /etc/sysconfig/network

   6. 添加console配置,修改配置文件/etc/default/grub

vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=115200"
GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0 console=tty0 console=ttyS0,115200"
GRUB_DISABLE_RECOVERY="true"

# 然后让配置文件生效
grub2-mkconfig -o /boot/grub2/grub.cfg

   7. 配置修改搭建yum服务:
      修改/etc/yum.repos.d/*.repo的文件,如果使用官网yum,可以不修改,如果用真机的yum,那么写完配置文件,导入数字签名

rpm --import ftp://网络yum源/RPM-GPG-KEY-CentOS-7

    根据需要安装一些需要的软件包

bash-completion 支持tab键,需要重新登录才生效
net-tools 支持ifconfig命令
vim 支持vim命令

   8. 作为后端盘必须修改挂载 / 的目录信息

sed -i 'UUID/c/dev/vda1(这个根据自己的虚拟机配置) / defaults 0 0' /etc/fstab 
echo 'GRUB_DISABLE_LINUX_UUID="true"
GRUB_ENABLE_LINUX_LABEL="true"' >> /etc/default/grub 
grub2-mkconfig -o /boot/grub2/grub.cfg

   9. 安装分区扩容软件

yum install -y cloud-utils-growpart
# 如果后端盘这个虚拟机确定是最后一次打开,那么可以修改一下rc.local让前端盘第一次打开的时候自动扩容,不过下面有个脚本,可以解决这个问题
echo 'LANG=en_US.UTF-8
growpart /dev/vda 1
xfs_growfs /
sed -i '/LANG=en_US.UTF-8/d' /etc/rc.d/rc.local
sed -i '/^growpart \/dev\/vda 1$/d' /etc/rc.d/rc.local
sed -i '/xfs_growfs \//d' /etc/rc.d/rc.local
' > /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

   10. 全部操作后,部署一些秘钥,真机清理一下后端虚拟机,并删除该虚拟机

yum install -y libguestfs-tools
ssh-copy-id 虚拟机IP
virsh shutdown 虚拟机名
virt-sysprep -d 虚拟机名
virsh undefine 虚拟机名

根据已经配置好基本系统配置后的后端盘快速生成有个虚拟机(也可以用脚本实现)
   1. 根据后端盘生成新的虚拟机的存储盘

qemu-img create -b 后端盘名字 -f qcow2 新建的虚拟机的名字 系统盘大小

   2. 根据具体数据,编写虚拟机的xml文件,并且生成虚拟机

vim /etc/libvirt/qemu/虚拟机名.xml
virsh define /etc/libvirt/qemu/虚拟机名.xml 

   3. 进入虚拟机进行扩容(如果在rc.local中写了自动扩容,那么可以不做)

growpart /dev/vda 1
xfs_growfs /

一键生成虚拟机(后端盘已经制作完毕后,如果配置一直不行,在资源中img.tar.gz是所有正确的配置文件,解压后会准确放到对应位置)
   两个脚本,一个是真机执行的启动生成虚拟机的脚本;另一个是将被传递到新生成的虚拟机中,做初始化配置
   不过需要书写一个虚拟机xml文件模板,虚拟机名字使用yzy_node,其使用的后端盘用node.img
   存储盘全放在 /var/lib/libvirt/images/

真机使用的脚本:clone.sh

#!/bin/bash
# 使用前需要根据自己做的后端盘的位置和名字自定义

# 书写虚拟机使用的网段
NET=192.168.1.
DISK=${2:-10}

# 下面协商预备传递给虚拟机的脚本名字
SHELL=yzy.sh
# 下面协商预备传递给虚拟机的脚本位置,最后必须有/
PATH=/var/

if [ $# -eq 0 ];then
  echo 'Error : you can try clone [number] [size(G)]'
  exit 1
else
  [ $1 -gt 0 &>/dev/null ]  && [ $1 -lt 100 ] && NUM=$1 || (echo 'Error : you can try clone [0<number<100] [size(G)]' ; exit 2)
fi

# 判断是否是否已经创建了该镜像
cd /var/lib/libvirt/images/
[ -f /var/lib/libvirt/images/node$NUM.img ] && echo 'this has been define' && ls node* && exit 3

# 根据后端盘创建镜像存储盘
qemu-img create -b node.qcow2 -f qcow2 node$NUM.img ${DISK}G
cd /etc/libvirt/qemu/

# 需要书写一个虚拟机xml文件模板
sed 's/node/node'$NUM'/' xml.example > yzy_node$NUM.xml
virsh define /etc/libvirt/qemu/yzy_node$NUM.xml
virsh start yzy_node$NUM

while [ -e $IP ]
do
IP=`arp -a | grep $(virsh dumpxml yzy_node$NUM | grep 'mac add' | awk -F\' '{print $2}') | awk -F\( '{print $2}' | awk -F\) '{print $1}'`
sleep 1
done

while :
do
  ssh $IP true
  [ $? -eq 0 ] && break
  sleep 1
done

scp -o StrictHostKeyChecking=no $PATH$SHELL $IP:/root/
ssh -o StrictHostKeyChecking=no $IP "bash /root/$SHELL $NUM"
ssh -o StrictHostKeyChecking=no $IP "reboot"

echo -e "\033[32m $NET$NUM is OK \033[0m"
传递给使用的脚本:yzy.sh

#!/bin/bash
# 书写虚拟机使用的网段
NET=192.168.1.
SHELL=yzy.sh
LANG=en_US.UTF-8
growpart /dev/vda 1
xfs_growfs /
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
# Generated by dracut initrd
DEVICE="eth0"
ONBOOT="yes"
NM_CONTROLLED="no"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="$NET$1"
NETMASK="255.255.255.0"
EOF
echo 'Smart_'$1'.Lyu.com' > /etc/hostname
hostname Smart_${1}.Lyu.com
rm -f /root/#SHELL

如果后端盘生成后需要修改,可以使用guestmount工具
   !但是,必须注意,一旦修改,所有以改后端盘生成的所有前端盘全部无效,并且因为会生成一个和真机一模一样的环境所以,操作必须慎之又慎
  优点:
    1. 支持离线挂载 raw、qcow2 格式虚拟机磁盘
    2. 可以在虚拟机关机的情冴下,直接修改磁盘中的文档
    3. 方便对虚拟机定制、修复、脚本维护

guestmount -a 虚拟机磁盘路径 -i /挂载点
chroot /挂载点

猜你喜欢

转载自blog.csdn.net/Yu1543376365/article/details/84035619