KVM虚拟化

0.kvm应用范围

前言:我们多数时候并不直接使用虚拟化技术,但像阿里云提供的云服务器中,之所以有那么多的主机提供给用户,是因为他们使用了虚拟化技术,我们直接使用这些技术。

附:在私有云的应用中,可能需要自己搭建kvm虚拟的机器。

1.虚拟化分类

半虚拟化:在没有操作系统的裸机上进行虚拟化,虚拟软件可以充当一个临时的操作系统,需要修改内核权限,才能执行底层指令。

硬件辅助全虚拟化:在基础操作系统基础上,虚拟出一套虚拟硬件平台,在里面根据需要安装不同的操作系统和应用软件。

操作系统虚拟化:虚拟机与物理机共用物理机的操作系统内核,性能最好,耗费最小。但操作系统必须和虚拟机的通用。

 

2.QEMU,KVM 与 Libvirt

KVM:一套虚拟化方案,专长负责vcpu内核虚拟化。

QEMU:另一套虚拟化方案,此处仅借用他负责IO硬件设备模拟的部分。

Libvirt:一个C语言类库,为KVM在内的多种虚拟化程序提供程序接口。虚拟化工具virt,virsh都基于Libvirt。

 

3.KVM安装

# yum install qemu-kvm libvirt virt-install libvirt-python virt-manager libvirt-client virt-viewer -y
# systemctl start libvirtd
# systemctl enable libvirtd
# systemctl status libvirtd

KVM图形界面打开方式
# virt-manager
然后点点点

KVM命令行安装
# virt-install  --name "自定义名字" --memory 内存大小K,maxmemory=内存上限K --vcpus cpu核数,maxvcpus=核数上限 --disk=目标路径,size=硬盘容量G -l 镜像路径 --network bridge=网卡名字
# virt-install  --name "kvm2" --memory 2048,maxmemory=4096 --vcpus 2,maxvcpus=4 --disk=/home/kvm_images/kvm2.qcow2,size=15 -l /share/iso/CentOS-7-x86_64-DVD-1810.iso --network bridge=virbr0

如果有图形界面,则会进入图形界面安装操作系统。(点点点)

如果没有图形界面,则参照下面这篇文档,过程及其折磨。
https://blog.csdn.net/mshxuyi/article/details/99852820

4.操作虚拟机

查看所有存在的虚拟机
# virsh list --all
开机、关机、强制关机、重启
# virsh start kvm
# virsh shutdown kvm
# virsh destroy kvm
# virsh start kvm

删除虚拟机
# virsh undefine kvm
然后删掉kvm路径李的kvm.qcow2文件
# rm -rf kvm.qcow2

kvm虚拟机的配置文件路径为
# ll /etc/libvirt/qemu/
-rw-------  1 root root 4517 12月 21 19:55 kvm.xml

添加虚拟机(前提,qcow2文件存在,并且配置文件内容正确)
# virsh define /etc/libvirt/qemu/kvm.xml
适合移动kvm的场景。



5.克隆虚拟机

前提:KVM虚拟机要关机才能克隆。

图形克隆:略
命令克隆:
# virt-clone -o 源kvm名 -n 新名 -f KVMqcow2文件路径
# virt-clone -o kvm2 -n kvm3 -f /var/lib/libvirt/images/kvm3.qcow2
此处的进度条不可信,等一会就能好了。别以为速度慢给关了。

# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     kvm2                           关闭
 -     kvm3                           关闭
成功

注意:我当前的版本,在第一此安装虚拟机之后发现,你给虚拟机设定多大硬盘空间,他qcow2文件就会真实的占用多大空间,这与windows中VMware里不同,正常此处应该是虚拟的空间。如果你克隆它一次,克隆文件的大小就小很多,然后再给第一次的删掉,从而节省空间。

6.连接KVM

1.图形界面:略
2.virt-viewer kvm 本质还是图形界面
3.ssh IP 但这需要知道IP
4.virsh console kvm

# virsh console kvm
连接到域 kvm
换码符为 ^]

注:退出要按 ctrl + ]
不是exit
不是quit
不是Ctrl + C !!!!

这个模式需要授权
在虚拟机中运行
# grubby --update-kernel=ALL --args="console=ttyS0"
# reboot

# virsh console kvm
连接到域 kvm3
换码符为 ^]

重点!!!!此处没有提示,需要一脚回车!!!
弹出:
CentOS Linux 7 (Core)
Kernel 3.10.0-1062.el7.x86_64 on an x86_64

kvm login:
正常使用吧~

记得:退出要按 ctrl + ]

7.KVM配置文件

# virsh edit kvm
打开的文件路径是/etc/libvirt/qemu/下的xml

<domain type='kvm'>
<name>kvm1</name>	虚拟机名称
  <uuid>904d629d-964e-4a5d-b103-1934c579db27</uuid>				
  <memory unit='KiB'>1048576</memory>	内存大小
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>2</vcpu>	cpu核数


下面这一段代表磁盘文件
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>    qcow2为磁盘格式
      <source file='/var/lib/libvirt/images/kvm1.qcow2'/>	磁盘文件路径
      <target dev='vda' bus='virtio'/>	    磁盘名称(kvm默认使用virtio总线,磁盘名以v开头)
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>					
    
    
下面这一段代表光驱    
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    
    
下面这一段代表网卡 
    <interface type='bridge'>
      <mac address='52:54:00:b3:cf:3a'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

可以修改上述参数,对虚拟机进行配置。

有一种克隆方法是复制一份qcow2文件,然后复制一份配置文件,修改好之后用前面define命令加入list

 8.KVM网络配置文件

# virsh net-list --all
default是一个NAT类型的私有网络

# virsh net-info default
Name            default
UUID            704eb1b7-3feb-4a38-8642-9c3fe2f023bb
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

virbr0是宿主机连接default网络的网卡名。

网络配置文件
# vim /etc/libvirt/qemu/networks/default.xml
或
# virsh net-edit default

<network>
  <name>default</name>
  <uuid>8b175966-55b2-469d-8685-5820050e9d86</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:af:b2:fd'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>


网络的停止与启动

停掉default网络,由virsh net-list --all去查看,状态变为inactive
# virsh net-list --all
# virsh net-destroy default
启动default网络,状态变为active
# virsh net-start default

增删新网络

1.先把已有的配置文件复制一份
# cp /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/network2.xml

2.修剪新配置文件
# vim /etc/libvirt/qemu/networks/network2.xml

<network>
  <name>network2</name>	   自定义名称为network2
  <uuid>d1203347-bc49-40dc-bd26-d25dfb47647a</uuid> uuid随便改几个字符
  <bridge name='virbr2' stp='on' delay='0'/>	 改为一个ifconfig中没有的网卡名
  <mac address='52:54:00:53:59:df'/>	 随便改1个字符就OK了
  <domain name='network2'/>	 改为network2
  <ip address='192.168.101.1' netmask='255.255.255.0'> 修改原则是不能与本机别的网卡同网段
    <dhcp>
      <range start='192.168.101.128' end='192.168.101.254'/> dhcp范围也要改成对应网段
    </dhcp>
  </ip>
</network>

配置文件写好
添加进入网络列表
# virsh net-define 网络配置文件.xml

# virsh net-define /etc/libvirt/qemu/networks/network2.xml
# virsh net-list --all

Name                 State      Autostart     Persistent
----------------------------------------------------------
network2             inactive   no            yes

开启State
# virsh net-start network2

自动启动autostart
# virsh net-autostart network2

网络停止incative
# virsh net-destroy default

删除网络
# virsh net-undefine default2

# virsh net-list --all

 9.快照

虚拟机kvm1的快照列表
# virsh snapshot-list kvm1

给虚拟机kvm1拍摄快照名叫snap1
# virsh snapshot-create-as --domain kvm1 snap1

还原虚拟机kvm1为快照snap1
# virsh snapshot-revert kvm1 snap1

删除虚拟机kvm1下的快照snap1
# virsh snapshot-delete kvm1 snap1

10.设备管理

列表查看虚拟机的磁盘
# virsh domblklist kvm1

创建一个虚拟磁盘
# qemu-img create -f qcow2 虚拟磁盘路径.qcow2 容量
# qemu-img create -f qcow2 /var/lib/libvirt/images/kvm1-2.qcow2 1G

查看qcow2文件属性
# qemu-img info /var/lib/libvirt/images/虚拟磁盘路径.qcow2
# qemu-img info /var/lib/libvirt/images/kvm1-2.qcow2

将上面的磁盘文件加入虚拟机(必须开启虚拟机进行)
# virsh attach-disk 虚拟机 --source 虚拟磁盘路径 --target vdb --subdriver qcow2
# virsh attach-disk kvm1 --source /var/lib/libvirt/images/kvm1-2.qcow2 --target vdb --subdriver qcow2

检查kvm1拥有的磁盘
# virsh domblklist kvm1

删掉kvm1的一块磁盘
# virsh detach-disk kvm1 vdb

最后删掉磁盘文件,从此销声匿迹。

调整cpu,内存

查看kvm2的基础信息
# virsh dominfo kvm2

修改kvm2的内存大小为1024,不能超过最大内存值
# virsh qemu-monitor-command kvm2 --hmp --cmd balloon 1024

在线修改kvm2的cpu为4核,不能超过最大核数
# virsh setvcpus kvm2 4 --live

11.镜像文件与qcow2

WinVM克隆虚拟机有两个模式,一个是完全克隆,一个是链接克隆。
完全克隆:略
链接克隆:基本信息读取克隆源,变化的部分记录在链接克隆文件中。只记录变化的部分。文件小,克隆快。

在KVM中

源镜像==克隆源

差量镜像==链接克隆

# qemu-img create -f qcow2 -b 源镜像路径  差量镜像路径
# qemu-img create -f qcow2 -b /var/lib/libvirt/images/kvm2.qcow2 /var/lib/libvirt/images/kvm3.qcow2

将差量镜像和源镜像拼凑成一个完整的镜像
# qemu-img convert -f qcow2 -O qcow2 差量镜像路径 新完整镜像路径
# qemu-img convert -f qcow2 -O qcow2 kvm3.qcow2 kvm3.new.qcow2

12.操作镜像文件

在特定的场景中,比如虚拟机root密码遗失。

# yum install libguestfs-tools-c
使用guestfish可以直接对镜像文件内部内容进行修改
注:必须关机使用。

先关机
# virsh destroy kvm3

打开镜像
# guestfish --rw -a 镜像路径.qcow2
# guestfish --rw -a /var/lib/libvirt/images/kvm3.qcow2


><fs> run   执行run命令,加载虚机镜像,需要等一会,别着急
><fs> list-filesystems	查看镜像中的文件系统
/dev/sda1: xfs
/dev/sda2: swap
/dev/sda3: xfs

将xfs文件系统的挂载到/根下。通常是sda3,需要一个一个尝试
><fs> mount /dev/sda3 /
><fs> ls 查看文件列表,看看文件都在不,不是就换一个xfs挂载。

可以使用各种linux命令了。
><fs> vi /etc/shadow
删掉root的密码

就可以无密码正常登陆了。

13.自动创建差量镜像

根据各自情况,修改第三行,源镜像的名字。

#!/bin/bash

muji=kvm3
muji_xml=/etc/libvirt/qemu/${muji}.xml
muji_qcow2=/var/lib/libvirt/images/${muji}.qcow2

uuid=$(uuidgen)
vmmac="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed -r 's/^(..)(..)(..)(..).*$/\1:\2:\3:\4/')"
read -p "输入你要创建的虚拟机名称:" name

configname=/etc/libvirt/qemu/${name}.xml
diskpath=/var/lib/libvirt/images/${name}.qcow2

cp $muji_xml  $configname

qemu-img create -f qcow2 -b $muji_qcow2 $diskpath


sed -ri "s#<name>.*</name>#<name>$name</name>#" $configname
sed -ri "s#<uuid>.*</uuid>#<uuid>$uuid</uuid>#" $configname
sed -ri "s#<source file=.*/>#<source file='$diskpath'/>#" $configname
sed -ri "s#<mac address=.*/>#<mac address='$vmmac'/>#" $configname


virsh define $configname
echo "$name创建成功"
virsh list --all

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值