Madao No More

你的努力程度之低,根本轮不到拼天赋.


  • 首页

  • 底层基础

  • 人文书籍

  • 日记

  • 面试问题

  • Linux

  • 编程语言

  • 服务器应用

  • 各种工具软件

  • 工作中的问题

  • 归档

  • 关于

  • 搜索
close

13-KVM虚拟化

时间: 2019-05-19   |   分类: Linux     |   阅读: 4191 字 ~9分钟
  • 1. 概念
    • 1.1. 常用虚拟化软件
    • 1.2. KVM简介
  • 2. 安装使用KVM
  • 3. 克隆虚拟机
    • 3.1. 迁移虚拟机
  • 4. 快照管理
  • 5. 磁盘管理
    • 5.1. 磁盘扩容
  • 6. 调整CPU和内存等硬件

1. 概念

  • 虚拟化:就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源
  • Hypervisor(VMM):虚拟机管理器
  • 虚拟化技术分为全虚拟化和半虚拟化:http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html
    • 全虚拟化:早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(guestos)要想使用cpu资源,需要通过VMM来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化(VMware Workstation) 全虚拟化
      • 比如: VMware,KVM
    • 半虚拟化:半虚拟化技术通过修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(XEN) 后续cpu厂商直接支持虚拟化,不需要通过VMM翻译指令了,无所谓半虚拟化和全虚拟化 半虚拟化
      • 比如: XEN,XEN现在也支持全虚拟化
    • 容器:算是内核虚拟化 容器虚拟化
    • 虚拟化技术之间的区别:http://itoedr.lofter.com/post/1472ba_69c62fa

1.1. 常用虚拟化软件

全虚拟化:

  • VMware系列:全部收费
    • VMware workstation:单机
    • VMware vSphere(原名VMware esxi):多台机器,如5台物理机==>100台虚拟机===>并且做集群
    • VMware Fusion:用于Mac,Unix虚拟化
  • VirtualBox:开源,Sun公司开发 Oracle收购Sun
  • KVM:开源,基于linux内核模块
  • Hyper-V:商业,厂商微软
    • 不是Win10系统中的HyperV

半虚拟化:

  • Xen:开源,半虚拟化
    • XenServer:商业,厂商Ctirx,基于Xen的,也是
      • 现在改成: Citrix Hypervisor
  • Openvz:开源,基于linux,虚拟机和宿主机共用一个内核
    • Docker可以使用其模板

type-I和type-II:

type

  • type-I:
    • VMware vSphere:
    • HyperV:
    • XenServer(现在是Citrix Hypervisor)
  • type-II:
    • KVM:kvm是Linux内核的一部分

1.2. KVM简介

  • KVM是以色列初创公司Qumranet开发,2008年9月RedHat公司收购了Qumranet
  • KVM是Linux内核的一个模块,它把Linux内核变成了一个Hypervisor
  • KVM是完全开源的,RedHat基于KVM的虚拟化解决方案叫做RHEV
  • KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能
  • 只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样
  • QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所有的硬件,性能不强
  • KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM
  • 磁盘,网络设备等都是通过QEMU-KVM这个工具模拟出来的
  • KVM和QEMU-KVM通信是通过/dev/kvm实现的
  • libvirt是用来管理KVM虚拟机的API,其命令为virsh

type

2. 安装使用KVM

准备:

  • 前提是CPU支持虚拟化
  • VirtualBox6.0.6支持嵌套虚拟化,但是必须是AMD的CPU
    • AMD启用嵌套虚拟化:
      • 系统->硬件加速
        • 启用VT-x/AMD-V
        • 启用嵌套分页
    • 所以还是使用VMWare吧.
  • VMware创建虚拟机
    • 内存2G
    • 处理器2核
      • 虚拟化引擎全部勾选
        • 虚拟化Intel VT或AMDV
        • 虚拟化CPU性能计数器
        • 虚拟化IOMMU
    • 在系统磁盘外增加一个40G的虚拟磁盘
      • 直接格式化,不需要分区

        sudo mkfs.xfs /dev/sdb
        sudo blkid
        sudo vim /etc/fstab
        # 如下
        UUID=8b16021a-f76e-498d-a8d4-18caf93bade7       /kvm_data       xfs     defaults        0       0
        sudo mkdir /kvm_data
        sudo mount -a
        
# 关闭iptables或者firewalld
sudo systemctl stop firewalld
  # 方便而已 kvm会自动生成阿飞能够火枪贵鹅
# 关闭selinux
sudo setenforce 0
# 格式化新磁盘,挂载到/kvm_data
# 下载一个centos7的镜像文件
# 检查cpu参数是否支持虚拟化  
sudo grep -Ei 'vmx|svm' /proc/cpuinfo
  # 有输出就ok
  # vmx:intel
  # svm:amd

# 安装kvm
sudo yum install -y virt-* libvirt bridge-utils qemu-img

# 配置网卡,增加桥接网卡,类似之前Docker的桥接模式
# 设置一个br0网卡,TYPE为Bridge,IP地址设置为ens33的ip
# ens33配置文件里把IP地址去掉,增加BRIDGE=br0
sudo cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33br0
sudo vim !$
# 修改NAME和DEVICE为ens33br0,TYPE=Bridge
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33
# UUID,IPADDR,NETMASK,GATEWAY,DNS全部注释掉,添加
BRIDGE=ens33br0

sudo systemctl restart network

# 检查KVM模块是否加载
sudo lsmod|grep kvm

# 启动libvirtd服务
sudo systemctl start libvirtd

# 查看网卡
sudo brctl show
  # 可以看到两个网卡ens33br0和virbr0
  # ens33br0: 自己配配置的桥接,桥接
  # virbr0: kvm,相当于VMnet8,虚拟机桥接virbr0,相当于NAT

# 把CentOS7的iso上传,lszrz最大只能传输2G
# 命令行安装centos7
sudo virt-install --name=testc7 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-Minimal-1810.iso --disk path=/kvm_data/testc7.img,size=10 --check disk_size=off --bridge=ens33br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
  # 基本上一目了然
  # --os-variant具体版本
  # --location: 比如http,也行
  # --check disk_size=off 或者 --check all=off :因为VMware的磁盘是动态调节的.刚开始并没有那么大
  # path 磁盘位置 size 10g

  # ctrl + ] 跳出终端
  # 进入安装
  # ctrl + u 清空光标前输入
  # 安装完后 如果提示需要重启且直接回车整个虚拟机(外面的宿主机)也会被重启,可以直接ctrl ],然后virsh shutdown+virsh start
  # [x]表示已经配置了
  # 语言,分区等等.网络可以先不配置

# 管理KVM虚拟机
ps aux |grep kvm
  # 查看kvm进程
sudo virsh list
  # 查看虚拟机列表,只能看到运行的虚拟机
sudo virsh list --all
  # 查看虚拟机列表,包括未运行的虚拟机
sudo virsh console testc7
  # 进入指定虚拟机,出现提示后,按一下回车
  # 在宿主机,只能有一个console
  dhclient eth0
    # 通过桥接的获取一个地址 应该是192.168.137.xxx
  # 可以从真机直接ssh
sudo virsh shutdown testc7
  # 关闭虚拟机,特别块
sudo virsh start testc7
  # 开启虚拟机,启动就跟正常的启动一样
sudo virsh destroy testc7
  # 类似stop,这个是强制停止
sudo virsh undefine testc7
  # 彻底销毁虚拟机,会删除虚拟机配置文件,virsh list --all就看不到了
  # 还需要删除磁盘文件
ls /etc/libvirt/qemu/
  # 可以查看虚拟机配置文件
  # xml格式的
sudo virsh autostart testc7
  # 宿主机开机该虚拟机也开机
sudo virsh autostart --disable testc7
  # 解除开机启动
sudo virsh suspend testc7
  # 挂起
sudo virsh resume testc7
  # 恢复

3. 克隆虚拟机

sudo virsh shutdown testc7
sudo virt-clone  --original testc7 --name testclone --file /kvm_data/testclone.img
  # --original指定克隆源虚拟机
  # --name指定克隆后的虚拟机名字
  # --file指定目标虚拟机的虚拟磁盘文件
  # 如果testc7虚拟机开机状态,则提示先关闭或者暂停虚拟机

3.1. 迁移虚拟机

从一个真机,迁移到另外一个真机上,把磁盘和配置文件一起弄过去就行,和克隆差不多

#该方式要确保虚拟机是关机状态
sudo virsh shutdown testc7
sudo su
virsh dumpxml testc7 > /etc/libvirt/qemu/move.xml
  # 如果是远程机器,需要把该配置文件拷贝到远程机器上
sudo virsh domblklist testc7
  # 查看虚拟机磁盘所在目录
sudo rsync -av /kvm_data/testc7.img  /kvm_data/move.img
  # 如果是迁移到远程,则需要把该磁盘文件拷贝到远程机器上
sudo vi /etc/libvirt/qemu/move.xml
  # 因为是迁移到本机,配置文件用的是testc7子机的配置,不改会有冲突,所以需要修改该文件,如果是远程机器不用修改
  # 修改domname:   <name>move</name>
  # 修改uuid(随便改一下数字,位数不要变)
  # 修改磁盘路径
sudo virsh define /etc/libvirt/qemu/move.xml
  # 定义新虚拟机
sudo virsh list --all
  # 会发现新迁移的move子机
sudo virsh start move

4. 快照管理

# 创建快照
sudo virsh snapshot-create testc7
  # raw格式的虚拟磁盘不支持做快照
  # qcow2支持
sudo qemu-img info /kvm_data/testc7.img
  # 查看testc7.img信息,同时会查看到快照列表
  # 可以查看其是raw 还是qcow2
ls -lh /kvm_data/*
  # 开机时,其属组是qemu
  # 关机时,是root
  # 显示大小是11G(testc7===>从0创建的),1.4G(克隆的)
sudo df -h
  # kvm_data 总使用大小是2.8G

sudo virsh snapshot-list testc7
  # 列出所有快照
  # 最新的在最上面
sudo virsh snapshot-current testc7
  # 查看当前快照版本,xml格式的详情
ls /var/lib/libvirt/qemu/snapshot/testc7
  # 查看所有快照配置文件,也就是上面显示的xml
sudo virsh snapshot-revert testc7 1558352512
  # 恢复指定快照,上面的 xml前面的数字
sudo virsh snapshot-delete testc7 1558352512
  # 删除快照

5. 磁盘管理

# 虚拟磁盘常用格式raw,qcow2
sudo qemu-img info /kvm_data/testc7.img
  # 查看虚拟磁盘格式
sudo qemu-img create -f raw /kvm_data/testc7_2.img 2G
  # 创建2G的raw格式磁盘

# 把raw格式的磁盘转换为qcow2格式
sudo qemu-img convert -O qcow2 /kvm_data/testc7_2.img /kvm_data/testc7_2.qcow2
  # qcow2文件比较小(类似VMwarer的动态磁盘大小),raw文件大小就是制定的大小
  # raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法做快照
  # -O qcow2 目标格式 源文件 目标文件
  # 源文件不会被删除

# testclone转换为raw格式的磁盘
sudo virsh shutdown testclone
sudo qemu-img convert -O raw /kvm_data/testclone.img /kvm_data/testclone_3.raw
sudo virsh edit testclone
  # 更改格式和文件路径
  # 编辑后,会自动检查语法等
  # 主要是<disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/testclone_3.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

sudo rm /kvm_data/testclone.img
  # 删除原来的磁盘
sudo virsh start testclone

5.1. 磁盘扩容

raw格式:

# 增加大小
sudo qemu-img resize /kvm_data/testclone_2.raw +1G
  # 可以不用关机
sudo qemu-img info /kvm_data/testclone_2.raw
  # 查看一下

sudo virsh destroy testclone
sudo virsh start testclone
sudo virsh console testclone
  # 重启后生效
  # 这个新的空间,不能追加到现有的分区.
  # 如果系统是lvm,就可以直接扩展卷
  # 如果是标准分区,只能fdisk新建分区了

# 除了对已有磁盘扩容外,还可以额外增加磁盘
sudo qemu-img create -f raw /kvm_data/testclone_3.raw 5G
  # -f raw 格式
sudo virsh edit testclone
  # 增加<disk>...</disk>,注意更改source,target,slot,删除注释
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm_data/testclone_3.raw'/>
      <target dev='vdb' bus='virtio'/>
      # vda,vdb...
      <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/>
      # slot 必须不一样如0x07
    </disk>

sudo virsh destroy testclone
sudo virsh start testclone

qcow2格式:

sudo qemu-img resize /kvm_data/testc7.img +2G
 # 若提示qemu-img: Can't resize an image which has snapshots,需要删除快照
sudo qemu-img info /kvm_data/testc7.img

sudo virsh destroy testc7
sudo virsh start testc7
sudo virsh console testc7
  # 重启后生效

# 除了对已有磁盘扩容外,还可以额外增加磁盘
sudo qemu-img create -f qcow2 /kvm_data/testc7_3.img 5G
sudo virsh edit testc7
  # 增加<disk>...</disk>,注意更改source,target,slot ,删除下面的注释,slot要越来越大
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/testc7_3.img'/>
      <target dev='vdb' bus='virtio'/>
      # vda,vdb...
      <address type='pci' domain='0x0000' bus='0x00' slot='0x10' function='0x0'/>
      # slot 必须不一样如0x07
    </disk>
sudo virsh destroy testc7
sudo virsh start testc7

6. 调整CPU和内存等硬件

sudo virsh dominfo testc7
  # 查看配置
sudo virsh edit testc7
  # 更改如下部分内容,最大768
  <memory unit='KiB'>786432</memory>
  <currentMemory unit='KiB'>409600</currentMemory>
  <vcpu placement='static' current='1'>2</vcpu>

sudo virsh shutdown testc7
sudo virsh start testc7

sudo virsh setmem testc7 800m
  # 动态调整内存,不能超过你设置的最大内存,可以增加也可以减小
sudo su
virsh dumpxml testc7 > /etc/libvirt/qemu/testc7.xml
  # 当前配置写入到配置文件里
sudo virsh setvcpus testc7 2
  # 动态调整cpu数量,可以增加,不能减小
sudo virsh domiflist testc7
  # 查看网卡
sudo virsh attach-interface testc7 --type bridge  --source virbr0
  # 增加一块新的网卡,并设置为nat网络模式(virbr0类似vmware的vmnet8),这里如果写--source ens33br0,则网络模式为桥接
sudo su
virsh dumpxml testc7 > /etc/libvirt/qemu/testc7.xml
  # 需要把配置写入到配置文件里

sudo virsh destroy testc7
sudo virsh start testc7
#Linux - CentOS7#
14-Kubernetes(k8s)
12-Elastic_Stack日志管理
Madao

Madao

人的一切痛苦,本质上都是对自己无能的愤怒.

505 日志
8 分类
78 标签
GitHub E-mail
© 2009 - 2022 Madao No More
Powered by - Hugo v0.89.4
Theme by - NexT
0%