云计算是一种按量付费的模式,云计算的底层是通过虚拟化技术实现的。
2、云计算的服务类型
a、IAAS 基础设施即服务 (主要提供虚拟机,阿里云的esc相当于IAAS层,openstack能实现esc功能)
b、PAAS 平台即服务 (提供安装好的软件环境)
c、SAAS 软件即服务 (cdn服务)
小公司: 物理服务器还需要idc机房,服务器费用,带宽费用等等,云主机相比话费更少,若如企业不需要这么多服务器,直接释放云主机,但物理服务器是退不了的,云主机的风险小,立马就可以用,扩展灵活性高。
大公司: 比如京东618,用户流量疯长,不可能买那么多服务器遍布全国,618一过,用户量就降下来了,那么买的服务器就闲置了,闲置的服务器资源向外出租,超卖计算。
1、什么是虚拟化?
通过模拟计算机的硬件,来实现在同一台计算机上同时运行多个不同的操作系统的技术。
2、虚拟化软件的差别:
a、qemu 靠软件纯模拟硬件,全虚拟化软件,特别慢,兼容性好。
b、xen redhat 5.5以前用的xen,5.5以后换成了kvm,xen的性能特别好,需要使用专门修改后的内核,兼容性差。
c、KVM 有硬件支持cpu,基于内核,不需要使用专门的内核,性能好,兼容性较好,结合了上面两个优点。
KVM:Kernel-based Virtual Machine 基于内核的虚拟化工具
1、安装kvm需要的工具
yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer –y
**libvirt:**kvm虚拟机的管理软件
**virt-install:**虚拟机的安装工具
**qemu-kvm qemu-img(qcow2,raw):**管理虚拟机的虚拟磁盘
启动libvirt并设置开机自启动
[root@kvm ~]# systemctl start libvirtd [root@kvm ~]# systemctl enable libvirtd
2、环境要求
Centos7系统+2G内存+cpu开启虚拟化
3、安装一台kvm虚拟机
1、首先建立两个目录分别用来存放iso文件和生成的qcow2磁盘文件
[root@kvm ~]# mkdir /home/iso #存放镜像的目录
[root@kvm ~]# mkdir /home/images #存放磁盘文件的目录
2、这里我们选用vnc连接虚拟机的方法
安装VNC server/VNC客户端,使用VNC连接虚拟机
yum -y install tigervnc-server tigervnc vnc vnc-server
按下以下命令就可以连接上虚拟机了
virt-install --name=nebula --virt-type=kvm --memory 800,maxmemory=1024 --vcpus 1 --cdrom=/home/iso/CentOS-7-x86_64-Minimal-1708.iso --disk path=/home/images/nebula.qcow2,size=10 --network bridge=br0 --graphicsvnc --vncport=15950 --vnclisten=0.0.0.0 --noautoconsole --autostart
命令解释:
virt-install :虚拟机的安装工具
- -virt-type=kvm:虚拟化的类型
- -name=nebula:虚拟机的名字
- -memory 800 :虚拟机的内存(因为我上传的镜像是792M的,所以给它800M内存)
maxmemory=1024:最大内存
- -vcpus 1 虚拟cpu的核数
--cdrom=/home/iso/CentOS-7-x86_64-Minimal-1708.iso :镜像的存放位置
- -disk path=/home/images/nebula.qcow2,size=10 :存放磁盘文件的目录,以及磁盘类型的大小,大小为10G
- -network network=default :使用默认的NAT网络
- -graphics vnc --vncport=15950 --vnclisten=0.0.0.0 :默认显示器为vnc,指定端口号
- -noautoconsole --autostart :可加可不加
以上的配置其实和虚拟机的配置是对应的
云主机为了提高性能,都没有swap分区。
以下就是通过vnc连接进入到虚拟机的页面
1、列出运行的虚拟机
[root@kvm images]# virsh list
Id Name State
----------------------------------------------------
2、启动虚拟机
[root@kvm images]# virsh start nebula1
Domain nebula1 started
3、列出所有的虚拟机(运行的或者关机的)
[root@kvm images]# virsh list --all
Id Name State
----------------------------------------------------
- nebula1 shut off
4、如果执行了shutdown但是vnc的虚拟机仍在运行,此时要强制关机(拔电源关机,数据会丢失)
[root@kvm images]# virsh destroy nebula1
5、重启虚拟机
[root@kvm images]# virsh reboot nebula1
6、查看配置文件
[root@kvm images]# virsh dumpxml nebula1
将这个配置文件写入到一个文件里,就可以看到内存,cpu,磁盘等情况。
[root@kvm images]# virsh dumpxml nebula1>>nebula1.xml
只要有磁盘文件+配置文件,虚拟机就可以迁移到任何电脑上,将配置文件导入,就可以迁移到其他主机上了
[root@kvm images]# virsh define nebula1.xml
7、删除虚拟机(undefine的本质是删掉了.xml文件)
[root@kvm images]# virsh undefine nebula1
删除了虚拟机如何恢复呢?只需要恢复其之前导入的配置文件就行,命令如下:
[root@kvm images]# virsh define nebula1.xml
再virsh list就可以看到nebula1了。
以下命令,有几个xml文件就代表有几台虚拟机
[root@kvm images]# ls /etc/libvirt/qemu
autostart nebula1.xml networks
用 ps -ef |grep qemu可以看到正在运行的虚拟机的磁盘内容等。
8、如果df-h看到磁盘快满了,可以将虚拟机安装到别的目录
[root@kvm images]# mkdir /data
[root@kvm images]# mv mv nebula1.qcow2 /data/
再virsh start nebula1会出错:
[root@kvm images]# virsh start nebula1
error: Failed to start domain nebula1
error: Cannot access storage file '/home/images/nebula1.qcow2' (as uid:107, gid:107): No such file or directory
因为我们把磁盘文件挪地方了,所以在启动时找不到磁盘文件,这是我们修改配置文件里磁盘文件的路径,cd /etc/libvirt/qemu, virsh edit nebula1,搜索disk,将磁盘路径换为data,再启动就可以启动成功。
[root@kvm images]# cd /etc/libvirt/qemu
[root@kvm images]# ls /etc/libvirt/qemu
autostart nebula1.xml networks
[root@kvm images]# virsh edit nebula1(其实就是vim nebula1.xml,不过为了安全起见,配置文件里面让我们选择这种修改方式)
<driver name='qemu' type='qcow2'/>
<source file='/data/nebula1.qcow2'/>
9、重命名:我们虚拟机的名字要让我们知道这个虚拟机跑的是什么服务,所以名字要一目了然:
[root@kvm images]# virsh domrename nebula1 web-blog
将nebula1的名字改成跑博客的web服务,开机状态下不可以重命名。
10、挂起虚拟机
[root@kvm qemu]# virsh suspend nebula1
Domain nebula1 suspended
[root@kvm qemu]# virsh list --all
Id Name State
----------------------------------------------------
9 nebula1 paused
11、恢复状态
[root@kvm qemu]# virsh resume nebula1
Domain nebula1 resumed
[root@kvm qemu]# virsh list --all
Id Name State
----------------------------------------------------
9 nebula1 running
12、查看vnc端口号
[root@kvm ~]# virsh vncdisplay nebula1
:10050
13、设置kvm开机自启,为了不影响业务
[root@kvm ~]# virsh autostart nebula1 ###设置开机自启
Domain nebula1 marked as autostarted
[root@kvm ~]# virsh list --all ###看状态
Id Name State
----------------------------------------------------
- nebula1 shut off
[root@kvm ~]# systemctl restart libvirtd ###启动libvirtd
[root@kvm ~]# virsh list --all ###nebula1也开机自启动了
Id Name State
----------------------------------------------------
1 nebula1 running
14、看谁是开机自启动的机器
[root@kvm ~]# cd /etc/libvirt/qemu
[root@kvm qemu]# ls ###看到有一个autostart,就是开机自启动的目录
autostart nebula1.xml networks
[root@kvm qemu]# cd autostart/ ###进入到此目录,看有哪些是开机自启动
[root@kvm autostart]# ls ###看到nebula1是设置了开机自启动
nebula1.xml
[root@kvm autostart]# ll -h nebula1.xml ###这是一个软链接文件,如果把源文件删除掉了,那么即使给它设置了开机自启动,它也启动不起来
lrwxrwxrwx 1 root root 29 May 1 15:15 nebula1.xml -> /etc/libvirt/qemu/nebula1.xml
[root@kvm autostart]# ln -s /etc/libvirt/qemu/nebula1.xml /etc/libvirt/qemu/autostart #如果没有设置开机自启动,也可以直接给它做软链接
15、取消开机自启动:
[root@kvm autostart]# virsh autostart --disable nebula1
Domain nebula1 unmarked as autostarted
[root@kvm autostart]# ls ###这个目录下没内容了,实质上就是删除了软链接
[root@kvm autostart]#
16、进入到命令行版的控制台页面:(可以代替vnc,console登录)
[root@kvm autostart]# virsh console nebula1
Connected to domain nebula1
Escape character is ^] ###用^和 ]才可以退出来,长按Ctrl+]
[root@kvm autostart]#
改kvm的虚拟机的内核参数:
[root@kvm ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
reboot,必须重启才有效
重启之后virsh console nebula1就可以进入到登录界面了
17、kvm虚拟机虚拟磁盘格式转化:
raw:裸格式,占用空间大,有多少空间直接占满,不支持快照,性能较好,不方便传输;
qcow2:cow(copy on write),要用多少内存给多少内存,不会一下子占完,占用空间小,支持快照,性能比raw能差一点,方便传输。
虚拟机磁盘工具的常用命令:
qemu -img info,create,resize,covert
18、查看是否是磁盘文件(用这个命令qemu -img info)
[root@kvm data]# ls
nebula1.qcow2
[root@kvm data]# qemu-img info nebula1.qcow2
image: nebula1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.3G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
19、创建一块大小为1G的qcow2格式的虚拟磁盘:
[root@kvm data]# qemu-img create -f qcow2 /data/ll.qcow2 1G
image: ll.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
20、调整磁盘容量(给磁盘加1G容量)
[root@kvm data]# qemu-img resize /data/ll.qcow2 +1G
Image resized.
[root@kvm data]# ll -h ll.qcow2
-rw-r--r-- 1 root root 257K May 1 16:44 ll.qcow2
[root@kvm data]# qemu-img info ll.qcow2
image: ll.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes) ###可以看到内存由1G加到了2G(qcow2格式的磁盘只能加不能减,raw格式的盘可以减)
21、给raw盘缩容(生产上不要缩容,会丢失数据!!!)只能扩!!!不能缩!!!
[root@kvm data]# qemu-img info liyu.raw
image: liyu.raw
file format: raw
virtual size: 2.0G (2147483648 bytes) ###可以看到原来是2G内存
给它减掉1G内存:
[root@kvm data]# qemu-img resize liyu.raw -1G
Image resized.
[root@kvm data]# qemu-img info liyu.raw
image: liyu.raw
file format: raw
virtual size: 1.0G (1073741824 bytes) ###缩容成功
22、转化格式:
[root@kvm data]# qemu-img convert -f raw -O qcow2 liyu.raw liyu.qcow2 #-f指定将raw格式,转化为-O,qcow2格式,后面跟着两个要转化的文件
[root@kvm data]# ll -h
total 1.3G
-rw-r--r-- 1 root root 193K May 1 17:03 liyu.qcow2
-rw-r--r-- 1 root root 1.0G May 1 16:50 liyu.raw
-rw------- 1 qemu qemu 11G May 1 17:03 nebula1.qcow2
格式转化完之后,要修改配置文件才起效:(以liyu举例)
[root@kvm data]# virsh edit liyu
修改disk里的raw为qcow2,修改type的raw为qcow2。修改两处
再开启它:
[root@kvm data]# virsh start liyu
qcow2是一个写时复制的磁盘格式,你给这个磁盘写入2G的内容,ll -h看就增加了2G,如果此时你觉得占用空间,删掉了2G的内容,再df -h查看,原来增加的2G内存还在,因为qcow2格式文件只能增,不能减。
创建快照:(快照会保存在磁盘文件里,所以每创建一个快照,磁盘文件的内存就会越变越大)
[root@kvm ~]# virsh snapshot-create nebula1
Domain snapshot 1619861008 created
[root@kvm ~]# virsh snapshot-list nebula1
Name Creation Time State
------------------------------------------------------------
1619861008 2021-05-01 17:23:28 +0800 running
[root@kvm ~]# date +%s #上列1619861008为unix时间戳(距离1970年0分0秒过了多少秒),和date +%s时间差不多
1619861052
删除快照:
[root@kvm ~]# virsh snapshot-delete nebula1 --snapshotname 1619861008
Domain snapshot 1619861008 deleted
我们不想以时间戳为名字命名快照,比如想以安装环境配置好了为快照名字,可以采取以下命令:
[root@kvm ~]# virsh snapshot-create-as --name env_ok nebula1
Domain snapshot env_ok created
[root@kvm ~]# virsh snapshot-list nebula1
Name Creation Time State
------------------------------------------------------------
env_ok 2021-05-01 17:34:11 +0800 running
还原快照:比如我们不小心删根了,我们可以还原快照:
[root@kvm ~]# virsh snapshot-revert nebula1 --snapshotname env_ok
-o指定旧的虚拟机,-n指定新的虚拟机
[root@kvm ~]# virt-clone --auto-clone -o nebula1 -n backup
WARNING Setting the graphics device port to autoport, in order to avoid confli cting.
WARNING The requested volume capacity will exceed the available pool space whe n the volume is fully allocated. (10240 M requested capacity > 4194 M available )
Allocating 'backup.qcow2' | 10 GB 00:08
Clone 'backup' created successfully.
再进行查看就可以看到克隆的虚拟机了,磁盘文件存放在和克隆虚拟机一样的位置
[root@kvm ~]# virsh list --all
Id Name State
----------------------------------------------------
- backup shut off
- nebula1 shut off
[root@kvm ~]# virsh dumpxml backup|grep -i 'qcow2'
<driver name='qemu' type='qcow2'/>
<source file='/data/backup.qcow2'/>
链接克隆没有纯自动克隆,所以得手动克隆,手动克隆需要有磁盘文件加配置文件,自动克隆我们可以写个脚本如下。
磁盘文件创建如下:
[root@kvm data]# qemu-img create -f qcow2 -b nebula1.qcow2 web01.qcow2
Formatting 'web01.qcow2', fmt=qcow2 size=10737418240 backing_file='nebula1.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
[root@kvm data]# ll -h #可以看到占用空间很小
total 2.9G
-rw------- 1 root root 1.3G May 4 17:46 backup.qcow2
-rw------- 1 root root 11G May 4 17:42 nebula1.qcow2
-rw-r--r-- 1 root root 193K May 4 18:30 web01.qcow2
[root@kvm data]# qemu-img info web01.qcow2
image: web01.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: nebula1.qcow2 #源克隆文件是nebula1.qcow2
Format specific information:
compat: 1.1
lazy refcounts: false
配置文件创建如下:
[root@kvm data]# virsh dumpxml nebula1 >> web01.xml #随便找一个xml文件导入给新克隆的虚拟机
[root@kvm data]# ls
backup.qcow2 nebula1.qcow2 web01.qcow2 web01.xml
[root@kvm data]# vim web01.xml #修改配置文件
<name>web01</name>
<source file='/data/web01.qcow2'/>
<graphics type='vnc' port='15954' autoport='no' listen='0.0.0.0'>
#因为我们创建nebula1时的端口号是指定的,所以这里端口号也要修改,不然会冲突
再将uuid和mac地址那两行全部删掉,启动时系统会重新生成新的uuid和mac地址
再导入配置文件,进行启动
[root@kvm data]# virsh define web01.xml
Domain web01 defined from web01.xml
[root@kvm data]# virsh list --all
Id Name State
----------------------------------------------------
- backup shut off
- nebula1 shut off
- web01 shut off
[root@kvm data]# virsh start web01
Domain web01 started
[root@kvm scripts]# sh conle-vm.sh centos7 test
Domain test defined from /tmp/test.xml
Domain test started
全自动链接克隆脚本就写好了
如果用NAT模式,在浏览器上会找不到网页,而且会生成一个新的网段,使用桥接模式不用端口映射,直接连接,给虚拟机分配的ip也是宿主机网段的。
在安装kvm虚拟机时也要指定网络为桥接模式 –network bridge=br0
1、创建桥接模式
virsh iface-bridge ens33 br0
2、取消桥接模式
virsh iface-unbridge br0
3、也可以修改网卡配置文件,不过我觉得第一种方法更简便
这个是ens33的网卡配置内容
这个是桥接网络virbr0的配置文件
所谓热添加就是在开机状态下添加
先给nebula1的磁盘加5G容量
[root@kvm data]# qemu-img create -f qcow2 nebula1-add.qcow2 5G
然后再来创建磁盘(源虚拟机,源虚拟机磁盘路径,目标磁盘)
[root@kvm data]# virsh attach-disk nebula1 /data/nebula1-add.qcow2 vdb
Disk attached successfully
此时vdb磁盘已经添加成功,在kvm虚拟机里执行fdisk -l就可以看到添加的磁盘
可是为什么刚才明明加了5G内容,vdb上面却显示0MB呢?因为添加硬盘的时候要指定磁盘类型,不指定默认为raw类型,qcow2的磁盘肯定显示不了raw磁盘的大小,所以我们现在要把添加的硬盘剥离出来,使用以下命令:(临时剥离硬盘),要想永久剥离硬盘和下面永久添加硬盘一样,加上- -config参数
[root@kvm data]# virsh detach-disk nebula1 vdb
Disk detached successfully
然后要指定添加硬盘的类型为qcow2,添加最后一个参数
[root@kvm images]# virsh attach-disk nebula1 /data/nebula1-add.qcow2 vdb --subdriver qcow2
Disk attached successfully
这下再进到kvm虚拟机里fdisk -l就可以看到刚才添加的5G硬盘容量了
但是!在我们强制关机之后,再次开机进入到kvm虚拟机以后,添加的硬盘又不见了,因为这只是临时添加,所以我们想要以后开机添加的硬盘永久存在就得永久添加,加上下列参数即可。
[root@kvm images]# virsh attach-disk nebula1 /data/nebula1-add.qcow2 vdb --subdriver qcow2 --config
- -config这个参数是在下次重启的时候才生效。
要想这块添加的盘能用还得格式化(mkfs.xfs /dev/vdb),再进行挂载,查看
在进行扩容时,必须要将刚才挂载的硬盘卸载掉
umount /mnt
还要把刚才添加的硬盘剥离出来
[root@kvm images]# virsh detach-disk nebula1 vdb
Disk detached successfully
再给它进行扩容然后进行查看,磁盘容量已经由我们添加的5G变为8G了
[root@kvm images]# qemu-img resize /data/nebula1-add.qcow2 +3G
Image resized.
[root@kvm images]# qemu-img info /data/nebula1-add.qcow2
image: /data/nebula1-add.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 16M
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
现在再将磁盘添加上去
[root@kvm images]# virsh attach-disk nebula1 /data/nebula1-add.qcow2 vdb --subd river qcow2
Disk attached successfully
再在kvm虚拟机的磁盘挂载上去,我们看到之前拷贝的文件也没有丢失,但是df -h时看到磁盘还是5G,并没有更新到8G
为什么呢?因为我们在格式化时已经规定了inode和block大小(超级块),但是我们扩容的盘在后面,所以得更新一下超级块信息
用以下命令更新超级块信息,可以看到block信息已经更新了
再次df -h查看,由5G变成8G了
如果是ext3/ext4文件系统,则用resize2fs /dev/vdb来更新
扩容的思路:
添加- -model virtio参数,附加的网卡就是按顺序来的,eth0,eth1
[root@kvm ~]# virsh attach-interface nebula1 --type bridge --source virbr0 --model virtio
Interface attached successfully
在kvm虚拟机里可以查看IP,看到新增网卡eth1
移除网卡:
[root@kvm images]# virsh detach-interface nebula1 --type bridge
error: Domain has 2 interfaces. Please specify which one to detach using --mac
error: Failed to detach interface
上述方式移除网卡会提示有两块接口都是bridge类型,需要指定mac地址进行移除,看到上图eth1的mac地址为52:54:00:2f:f2:5f,所以加上mac参数
[root@kvm images]# virsh detach-interface nebula1 --type bridge --mac 52:54:00: 2f:f2:5f
Interface detached successfully
可以看到kvm虚拟机里的eth1没了,移除网卡成功
这只是临时修改,要想永久生效还得加上- -config参数
注意这里刚开始安装的Kvm虚拟机要指定现有内存以及最大内存,才方便以后添加内存
virt-install --name=nebula --virt-type=kvm --memory 800,maxmemory=1024 --vcpus 1 --cdrom=/home/iso/CentOS-7-x86_64-Minimal-1708.iso --disk path=/home/images/nebula.qcow2,size=10 --network bridge=br0 --graphicsvnc --vncport=15950 --vnclisten=0.0.0.0 --noautoconsole --autostart
添加内存的命令如下
[root@kvm images]# virsh setmem nebula1 1024M
在kvm虚拟机里查看内存容量,就看到增加了
但是如果我们安装kvm虚拟机的时候没有指定最大内存,那么就要进入到配置文件里面修改了,你可以将单位修改为MIB,保存文件再次进入时系统就会自动转换单位为KB
[root@kvm images]# vim nebula1.xml
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>819200</currentMemory>
如果修改的虚拟机处于运行状态,那么修改的配置文件是不会生效的,需要重启才会生效。
用下列命令安装kvm虚拟机的时候,就有添加cpu信息,最大cpu数量
virt-install --name=nebula --virt-type=kvm --memory 800,maxmemory=1024 --vcpus 1,maxvcpus=10 --cdrom=/home/iso/CentOS-7-x86_64-Minimal-1708.iso --disk path=/home/images/nebula.qcow2,size=10 --network bridge=br0 --graphicsvnc --vncport=15950 --vnclisten=0.0.0.0 --noautoconsole --autostart
然后再设置CPU数量,将nebula1的CPU调整为2
[root@kvm images]# virsh setvcpus nebula1 2
再lscpu查看就可以看到两个cpu了,原来只有0,现在是0和1
那么cpu可以加,可以减吗?我们试一下,可以看到之前的cpu数量是6,现在设置为2,提示不支持CPU回收
见下一篇,这一篇写不下了