虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源,VMware Workstation就是最常见的虚拟化软件
虚拟化技术分为全虚拟化和半虚拟化:早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(guestos)要想使用cpu资源,需要通过VMM(Hypervisor虚拟机管理器)来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化(VMware Workstation;半虚拟化技术通过修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(XEN);后续cpu厂商使cpu处理器直接支持虚拟化,不需要通过VMM翻译指令了,也就无所谓半虚拟化和全虚拟化
常见的虚拟化软件:
VMware系列:VMware workstation、VMware vsphere(VMware esxi)、VMware Fusion(Mac)
Xen 开源 半虚拟化
XenServer 商业,厂商Ctirx,基于Xen的
KVM 开源 基于linux内核模块
Hyper-V 商业,厂商微软
Openvz 开源 基于linux 虚拟机和宿主机共用一个内核
VirtualBox 开源 Sun公司开发 Oracle收购Sun
4.虚拟化架构:
VMware workstation以及之后要安装的KVM属于type2,是基于OS的虚拟OS资源的虚拟化工具,它能将OS闲置的资源加以充分利用,如果你的这台OS机器性能足够好,可以通过VMware Workstation创建DNS,DHCP,Apache等许多服务器,一个机子运行多个服务,节省了许多开支,这个作用是虚拟化所共有的特点。
VMware vSphere属于type1,是一种虚拟化方案包括很多东西,其核心是ESXi,ESXi独立安装在裸机上的操作系统(注意它不基于任何OS,它本身就是OS),通过它物理机的硬件资源被虚拟化为虚拟资源,之后再通过vCenter就能将安装了ESXi操作系统的物理机的资源进行整合,化为一个总的资源池,在这个资源池里面我们为各个部门划分不同大小的资源池方便其使用。
准确来说这两个不属于一个概念
VMware Workstation是一个基于OS的软件,而VMware vSphere则是根据企业的实际情况设计的一个虚拟化方案,它设计的软件,技术和要考虑的问题都要比VMware Workstation要多,要详细,要具体。
简单来说
VMware Workstation是一款基于OS的虚拟化软件
VMware vSphere则是一个具体的虚拟化方案
kvm属于linux内核的一个模块,qemu-kvm作用于用户空间,通过/dev/kvm设备实现与内核的交互
安装前需要先查看cpu是否支持虚拟化:grep -Ei 'vmx|svm' /proc/cpuinfo
如果能匹配到关键字则表示cpu支持虚拟化,vmx为Intel的cpu、svm为svm的cpu
关闭虚拟机后,新增一块50G硬盘,以及勾选虚拟化引擎的相关选项:
启动后关闭selinux:
[root@linux ~]# setenforce 0
[root@linux ~]# getenforce
Permissive
#永久关闭还需编辑配置文件/etc/selinux/config
关闭firewalld或iptables:
[root@linux ~]# systemctl stop firewalld
[root@linux ~]# systemctl disable firewalld
查看新添加的硬盘:
[root@linux ~]# fdisk -l
磁盘 /dev/sda:32.2 GB, 32212254720 字节,62914560 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a90c0
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 526335 262144 83 Linux
/dev/sda2 526336 62914559 31194112 8e Linux LVM
磁盘 /dev/sdb:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-root:29.8 GB, 29796335616 字节,58195968 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/mapper/centos-swap:2143 MB, 2143289344 字节,4186112 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
格式化:
[root@linux ~]# mkfs.ext4 /dev/sdb
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdb is entire device, not just one partition!
无论如何也要继续? (y,n) y
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3276800 inodes, 13107200 blocks
655360 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2162163712
400 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
[root@linux ~]# blkid /dev/sdb
/dev/sdb: UUID="548a46cf-5d13-47d0-b7dc-37669e0375d7" TYPE="ext4"
挂载到指定目录:
[root@linux ~]# mkdir /kvm_data
[root@linux ~]# mount /dev/sdb /kvm_data/
编辑配置文件,开机自动挂载:[root@localhost ~]# vi /etc/fstab
[root@linux ~]# yum install -y virt-* libvirt bridge-utils qemu-img
#安装kvm所需的包centos默认的yum源仓库已包含
启动服务:
[root@linux ~]# systemctl start libvirtd
查看生成的虚拟网卡:
[root@linux ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254009fbf2d yes virbr0-nic
使用kvm创建虚拟机之前需要先准备好iso镜像文件:
[root@linux ~]# ll /tmp/CentOS-7-x86_64-Everything-1908.iso
-rw-r--r--. 1 root root 11026825216 2月 21 15:42 /tmp/CentOS-7-x86_64-Everything-1908.iso
安装虚拟机:
[root@linux ~]# virt-install --name=kvm01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-Everything-1908.iso --disk path=/kvm_data/kvm01.img,size=10 --bridge=virbr0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
name 表示虚拟机名称
memory 表示设定的内存大小,maxmemory 表示最大内存大小,单位M,可以通过修改该虚拟机配置文件不关机的情况下调整
vcpus 表示cpu核数,maxvcpus 表示cpu最大核数,同上
os-type 表示系统类型,os-variant 表示系统版本
location 表示镜像文件位置
disk path 表示虚拟磁盘文件路径,size 表示虚拟磁盘大小,单位G
bridge 表示指定的虚拟网卡
执行后出现下图:
每个选项后的括号显示×,表示配置通过,显示!表示需要配置
1.语言设置,选择68)chinese后选择1) Simplified Chinese即可
2.时间设置,选择1)set timezone后选择亚洲然后选择上海即可
3.安装源和4.选择安装的软件保存默认最小安装即可
5.硬盘分区,选择对应的硬盘序号,显示×后,按c(continue)跳过,选择use all 使用所有空间后按c跳过,选择1)standard partition 标准分区
8.设置root密码
都配置好后输入b即可开始安装:
centos7.7版本安装完后会直接重启并提示登录,但centos7.7以下,centos6以上个别版本可能会出现kvm虚拟机重启导致宿主机也一起重启的问题(在kvm虚拟机操作init0,shutdown等命令也会使宿主机关闭),可以按 ctrl+] 退出kvm虚拟机的安装终端,再宿主机通过管理命令启动或关闭kvm虚拟机
完成后即可登录获取ip:
说明:需要注意的是该ip与宿主机不在同一网段,可以使用宿主机的网络访问外网,但不能在Windows上使用xshell等工具连接,只能在Windows连接宿主机,通过宿主机登录kvm虚拟机,原因是使用的虚拟网卡为virbr0,这是kvm服务自动生成的支持nat模式的虚拟网卡,如果需要kvm创建的虚拟机与宿主机在同一网段,需要使用桥接模式
使用桥接模式需要在宿主机拷贝一份ifcfg-ens33网卡文件,设定网卡名称(比如ifcfg-br0),type改为Bridge,ip位ens33网卡的地址,ens33配置文件中再讲ip相关的信息去掉,添加BRIDGE=br0,重启网络服务后再重启kvm,通过brctl show即可显示使用桥接模式的虚拟网卡br0,在安装kvm虚拟机时,命令中的bridge=br0即可
进入虚拟机:
[root@linux ~]# virsh console kvm01
#类似ssh+ip登录
按ctrl+] 关闭kvm虚拟机的终端即可回到宿主机的终端:
连接到域 kvm01
换码符为 ^]
[root@localhost ~]#
[root@linux ~]#
查看kvm虚拟机列表:
[root@linux ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 kvm01 running
#不加–all只显示运行中的kvm虚拟机,不会显示关闭中的虚拟机
启动虚拟机:
[root@linux ~]# virsh start kvm01
关闭虚拟机:
root@linux ~]# virsh shutdown kvm01
强制停止虚拟机:
[root@linux ~]# virsh destroy kvm01
删除虚拟机:
[root@linux ~]# virsh undefine kvm01
#会彻底删除该虚拟机配置文件(配置文件路径:/etc/libvirt/qemu/
),virsh list --all 无法查看了,但不会删除虚拟硬盘文件
宿主机开机也自动开启虚拟机:
[root@linux ~]# virsh autostart kvm01
域 kvm01标记为自动开始
取消虚拟机跟随宿主机开机:
[root@linux ~]# virsh autostart --disable kvm01
域 kvm01取消标记为自动开始
挂起虚拟机:
[root@linux ~]# virsh suspend kvm01
域 kvm01 被挂起
恢复虚拟机:
[root@linux ~]# virsh resume kvm01
域 kvm01 被重新恢复
在克隆虚拟机之前需要先关闭源虚拟机:
[root@linux ~]# virsh shutdown kvm01
克隆虚拟机:
[root@linux ~]# virt-clone --original kvm01 --name kvm02 --file /kvm_data/kvm02.img
正在分配 'kvm02.img' | 10 GB 00:00:06
成功克隆 'kvm02'。
[root@linux ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- kvm01 关闭
- kvm02 关闭
- -original指定克隆源虚拟机
- -name指定克隆后的虚拟机名字
- -file指定目标虚拟机的虚拟磁盘文件
补充:克隆完成的虚拟机避免ip冲突,需要修改网卡配置文件的ip以及删除uuid
创建快照:
[root@linux ~]# virsh snapshot-create kvm01
根据虚拟机名称查看生成的快照:
[root@linux ~]# virsh snapshot-list kvm01
名称 生成时间 状态
------------------------------------------------------------
1582361249 2020-02-22 16:47:29 +0800 shutoff
查看当前快照的版本信息:
[root@linux ~]# virsh snapshot-current kvm01
快照配置文件路径:
[root@linux ~]# ls /var/lib/libvirt/qemu/snapshot/kvm01/
1582361249.xml
恢复指定的快照:
[root@linux ~]# virsh snapshot-revert kvm01 1582361249
#先指定目标虚拟机名称,再指定快照名称
删除快照:
[root@linux ~]# virsh snapshot-delete kvm01 1582361249
#指定虚拟机名称后输入该虚拟机生成的快照中的某个快照名即可
查看指定虚拟机的虚拟磁盘信息,也会显示快照信息:
[root@linux ~]# qemu-img info /kvm_data/kvm01.img
image: /kvm_data/kvm01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.5G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 1582361249 0 2020-02-22 16:47:29 00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: true
说明:file format的qcow2为虚拟磁盘的文件格式(只有qcow2格式的虚拟磁盘支持快照,raw格式的不支持),虚拟大小10G,实际使用硬盘大小1.5G,Snapshot list显示的内容即是快照信息,TAG标签名称就是使用virsh snapshot-list kvm01命令显示的快照列表的快照名称
kvm虚拟机常用磁盘格式为qcow2和raw,上面的file format就是指磁盘格式,通过qemu-img info 磁盘路径查看磁盘信息
创建指定格式的虚拟磁盘:
[root@linux ~]# qemu-img create -f raw /kvm_data/test.img 2G
Formatting '/kvm_data/test.img', fmt=raw size=2147483648
[root@linux ~]# ll -h /kvm_data/test.img
-rw-r--r--. 1 root root 2.0G 2月 23 16:42 /kvm_data/test.img
[root@linux ~]# qemu-img info /kvm_data/test.img
image: /kvm_data/test.img
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
#创建一块2G的raw格式的虚拟磁盘,大小2G
转换磁盘格式:
[root@linux ~]# qemu-img convert -O qcow2 /kvm_data/test.img /kvm_data/test_2.qcow2
[root@linux ~]# qemu-img info /kvm_data/test_2.qcow2
image: /kvm_data/test_2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
#相当于将源磁盘复制了一份,生成的新磁盘为-O参数指定的格式,raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法做快照
将虚拟机kvm01的磁盘格式转换为raw:
关闭虚拟机:
[root@linux ~]# virsh shutdown kvm01
域 kvm01 被关闭
变更虚拟磁盘的格式:
[root@linux ~]# qemu-img convert -O raw /kvm_data/kvm01.img /kvm_data/kvm01_2.raw
编辑配置文件:
[root@linux ~]# virsh edit kvm01
在disk处更改类型以及虚拟磁盘路径:
启动虚拟机即可完成:
[root@linux ~]# virsh start kvm01
[root@linux ~]# ll /kvm_data/kvm01*
-rw-r--r--. 1 qemu qemu 10737418240 2月 23 17:28 /kvm_data/kvm01_2.raw
-rw-------. 1 root root 10739384832 2月 23 17:19 /kvm_data/kvm01.img
#新建的raw格式的虚拟磁盘属主属组已经变更为qemu,表示kvm01虚拟机正在使用该磁盘
补充:老的qcow2格式的虚拟磁盘文件kvm01.img需要手动删除,变换格式不影响数据
磁盘扩容有两种方式,一种是增加当前使用的虚拟磁盘的大小,还有一种是新添加一块虚拟磁盘
第一种方式:
增加当前磁盘大小:
[root@linux ~]# qemu-img resize /kvm_data/kvm01_2.raw +2G
Image resized.
[root@linux ~]# qemu-img info /kvm_data/kvm01_2.raw
image: /kvm_data/kvm01_2.raw
file format: raw
virtual size: 12G (12884901888 bytes)
disk size: 1.4G
#扩容2G大小,查看已变为12G,若提示qemu-img: Can’t resize an image which has snapshots,需要删除快照
增加后需要重启虚拟机,不能在虚拟机终端init6或reboot等方式重启,必须宿主机用virsh命令操作:
[root@linux ~]# virsh destroy kvm01
[root@linux ~]# virsh start kvm01
进入终端:
[root@linux ~]# virsh console kvm01
查看磁盘已显示添加的2G大小:
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a5c20
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/vda3 4196352 20971519 8387584 83 Linux
将新添加的容量新建分区:
[root@localhost ~]# fdisk /dev/vda
命令(输入 m 获取帮助):n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): p
已选择分区 4
起始 扇区 (20971520-25165823,默认为 20971520):
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-25165823,默认为 25165823):
将使用默认值 25165823
分区 4 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
再次查看即可显示新分区/dev/vda4:
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a5c20
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/vda3 4196352 20971519 8387584 83 Linux
/dev/vda4 20971520 25165823 2097152 83 Linux
#将新的分区挂载后即可使用
第二种方式:(这种方式是直接给虚拟机增加一块磁盘,准确说不是给虚拟机的磁盘扩容,而是给虚拟机扩容)
创建新的磁盘文件,大小2G:
[root@linux ~]# qemu-img create -f raw /kvm_data/kvm01_3.raw 2G
Formatting '/kvm_data/kvm01_3.raw', fmt=raw size=2147483648
#如果是qcow2格式,-f参数指定的格式为qcow2
编辑虚拟机配置文件:
[root@linux ~]# virsh edit kvm01
新增disk标签:
#source file 指定新增虚拟磁盘文件路径,target dev需要与之前disk标签的不同,slot也不能相同
重启虚拟机:
[root@linux ~]# virsh destroy kvm01
[root@linux ~]# virsh start !$
进入虚拟机:
[root@linux ~]# virsh console kvm01
查看磁盘信息:
[root@localhost ~]# fdisk -l
磁盘 /dev/vda:12.9 GB, 12884901888 字节,25165824 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a5c20
设备 Boot Start End Blocks Id System
/dev/vda1 * 2048 2099199 1048576 83 Linux
/dev/vda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/vda3 4196352 20971519 8387584 83 Linux
/dev/vda4 20971520 25165823 2097152 83 Linux
磁盘 /dev/vdb:2147 MB, 2147483648 字节,4194304 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
#新增磁盘/dev/vdb已显示,接下来分区后挂载后即可使用
查看配置:
[root@linux ~]# virsh dominfo kvm01
Id: 7
名称: kvm01
UUID: 73e8dfa2-bf15-4f38-a3df-26bcabd782f0
OS 类型: hvm
状态: running
CPU: 1
CPU 时间: 24.3s
最大内存: 1048576 KiB
使用的内存: 524288 KiB
持久: 是
自动启动: 禁用
管理的保存: 否
安全性模式: selinux
安全性 DOI: 0
安全性标签: system_u:system_r:svirt_t:s0:c154,c838 (permissive)
调整配置需要编辑配置文件:
[root@linux ~]# virsh edit kvm01
修改下图内容:
如需增加内存,修改currentMemory标签的数值即可,但不能超过memory标签中的最大数值,修改cpu核数变更current即可,2表示最大为2核,修改后需重启才能生效
动态调整内存为800m:
[root@linux ~]# virsh setmem kvm01 800m
修改cpu核数为2核:
[root@linux ~]# virsh setvcpus kvm01 2
注意:动态调整的情况下,内存可以增加或减少,但cpu核数只能增加,不能减少
修改后需要将配置写入配置文件:
[root@linux ~]# virsh dumpxml kvm01 > /etc/libvirt/qemu/kvm01.xml
写入配置文件后,virsh edit 进入虚拟机配置文件内容还没更新的话(在内存中打开),重启虚拟机配置文件即可更新
查看网卡:
[root@linux ~]# virsh domiflist kvm01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge virbr0 virtio 52:54:00:da:04:f5
增加网卡:
[root@linux ~]# virsh attach-interface kvm01 --type bridge --source virbr0
[root@linux ~]# virsh domiflist kvm01
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 bridge virbr0 virtio 52:54:00:da:04:f5
vnet1 bridge virbr0 rtl8139 52:54:00:22:10:0c
如果源指定的是桥接网卡,新网卡即为桥接模式,如果源指定的是nat模式网卡,新网卡即为nat模式
还需写入配置文件:
[root@linux ~]# virsh dumpxml kvm01 > /etc/libvirt/qemu/kvm01.xml
迁移kvm虚拟机一般用于迁移到远程机器,在本地操作一般情况下使用克隆虚拟机即可,在迁移虚拟机之前一定要先关闭虚拟机:
[root@linux ~]# virsh shutdown kvm01
复制一份虚拟机配置文件:
[root@linux ~]# virsh dumpxml kvm01 > /etc/libvirt/qemu/kvm03.xml
如果是迁移到远程机器,直接拷贝到远程机器即可
查看虚拟机磁盘所在路径:
[root@linux ~]# virsh domblklist kvm01
目标 源
------------------------------------------------
vda /kvm_data/kvm01.img
复制一份磁盘文件:
[root@linux ~]# rsync -av /kvm_data/kvm01.img /kvm_data/kvm03.img
如果是迁移到远程机器,直接拷贝到远程机器即可
编辑配置文件:
[root@linux ~]# vi /etc/libvirt/qemu/kvm03.xml
如果是迁移到远程机器,就不用修改,在本地操作的话会和kvm01的配置文件冲突
需要修改的地方:
完成后,需要根据配置文件生成虚拟机:
[root@linux ~]# virsh define /etc/libvirt/qemu/kvm03.xml
然后virsh lish - -all 即可查看到新的虚拟机
补充:如果是远程迁移,关机后直接将要迁移的虚拟机的配置文件和磁盘文件拷贝到远程机器,配置文件路径没问题的情况下,直接根据配置文件virsh define 生成虚拟机即可。