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