OpenStack02-虚拟化之KVM
1、什么是虛拟化?
- 虚拟化是一种具体技术,把实体资源进行虚拟化。
- 虚拟化技术根据对象可以分成计算虚拟化、存储虚拟化、网络虚拟化等。
- 虚拟化是一种具体技术,指是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。
- 虚拟化软件:
- qemu:(全虚拟)几乎可以模拟所有的硬件和操作系统。性能特别差,兼容性好。
- xen:(半虚拟)需要使用专门修改之后的内核。性能特别好,兼容性差。(redhat 5.5之前使用的就是xen)
- KVM:(全虚拟)基于内核,而且不需要使用专门的内核。性能较好,兼容较好。(centos6使用的是kvm)
2、创建KVM虚拟机
- 环境要求
- 可以使用centos7.4、7.6等,但不要使用7.5。
- CPU开启虚拟化。
- 在10.1.1.13上创建虚拟机
2.1、安装创建虚拟机的工具
1、安装KVM工具
]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install
- libvirt:管理KVM虚拟机。可以操作KVM、vmware、XEN、Hyper-v、LXC等Hypervisor。
- virsh:创建、暂停和关闭domain(域)。libvirt的命令行工具(CLI)。
- virt-manager:管理虚拟机的桌面工具。libvirt的GUI工具。
- virt-install:创建KVM虚拟机的命令行工具。
- virt-clone:克隆虚拟机的命令行工具。
- qemu-img:允许离线创建、转换和修改镜像。可以处理QEMU格式的的所有镜像。
2、启动libvirtd
]# systemctl start libvirtd.service ]# systemctl status libvirtd.service
2.2、创建虚拟机
- 下载centos的ISO镜像
- http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
2.2.1、使用nat网络创建虚拟机
]# virt-install --name CentOS71-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 1024 --vcpus 1 --disk /apps/images/CentOS71-x86_64.raw,format=raw,size=10 --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole --cdrom /apps/iso/CentOS-7-x86_64-Minimal-2009.iso
- 参数说明:
- --name:虚拟机的名称
- --virt-type:虚拟化的类型 (kvm, qemu, xen, ...),默认qemu。
- --os-variant:虚拟机的操作系统,例如fedora18、rhel6、winxp等。(rhel7是RedHat Enterprise Linux 7)
- --memory:虚拟机的内存大小,单位MB。
- --vcpus:虚拟机的cpu核数
- --disk PATH,format=raw,size=10:PATH虚拟机磁盘在宿主机的路径,format磁盘的格式(raw和qcow2),size磁盘的大小(单位GB)
- raw:分配多少空间就立即占用多少。不支持快照,不方便传输,性能较好。
- qcow2:不会立即占用所有分配的空间,而是使用多少就占用多少,直到使用完毕。支持快照,方便传输,性能比raw差一点。
- --network network=defaul:虚拟机的网络类型,默认是nat。
- --graphics vnc,listen=0.0.0.0:显示器通过VNC输出
- --noautoconsole:不要自动尝试连接到客户端控制台
- --cdrom:操作系统镜像
- 也可以先创建磁盘,再创建虚拟机(与上等价)。
//(1)创建虚拟机镜像文件 ]# qemu-img create -f raw /apps/images/CentOS71-x86_64.raw 10G //(2)创建虚拟机 ]# virt-install --name CentOS71-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 1024 --vcpus 1 --disk /apps/images/CentOS71-x86_64.raw --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole --cdrom /apps/iso/CentOS-7-x86_64-Minimal-2009.iso
2.2.2、使用桥接网络创建虚拟机
1、创建桥接网络
//将eth0网络接口 桥接 到br0网桥上 ]# virsh iface-bridge eth0 br0 Created bridge br0 with attached device eth0 Bridge interface br0 started
2、创建虚拟机
]# virt-install --name CentOS72-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 1024 --vcpus 1 --disk /apps/images/CentOS72-x86_64.raw,format=raw,size=10 --network bridge=br0 \ --graphics vnc,listen=0.0.0.0 --noautoconsole --cdrom /apps/iso/CentOS-7-x86_64-Minimal-2009.iso
- 参数说明:
- --network bridge=br0:虚拟机的网络类型,使用桥接网络。
2.2.3、查看虚拟机
- 两种网络的虚拟机可以同时存在。
- 两种网络之间转换,只需修改虚拟机配置文件的如下内容:
//nat网络 <interface type='network'> <source network='default'/> //桥接网络 <interface type='bridge'> <source bridge='br0'/>
1、查看虚拟机
]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running
2、查看以太网网桥
]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c292158ff yes eth0 vnet1 virbr0 8000.52540042df18 yes virbr0-nic vnet0
2.3、安装虚拟机
- 使用VNC Viewer连接虚拟机进行安装
1、获取连接虚拟机的VNC编号
]# virsh vncdisplay CentOS71-x86_64 :0
2、连接到虚拟机
- 在进入安装界面的时候把光标移动到Install CentOS7,按下tab键,在后面输入“net.ifnames=0 biosdevname=0”回车即可。
- virt-install命令执行后,要赶紧连接到虚拟机,否则看不到该页面。
3、配置虚拟机
3、virsh命令
3.1、管理虚拟机
1、查看虚拟机
virsh list --all
2、开关虚拟机
//开启虚拟机 virsh start <domain> //重启虚拟机 virsh reboot <domain> //关闭虚拟机(正常关机) virsh shutdown <domain> //关闭虚拟机(关闭电源) virsh destroy <domain>
3、将虚拟机设置为开机自启
//将虚拟机设置为开机自启 virsh autostart <domain> //取消开机自启 virsh autostart --disable <domain> //设置开机自启后,会创建该目录,并创建其软链 ]# ls -l /etc/libvirt/qemu/autostart/
4、挂起和恢复虚拟机
//挂起虚拟机 virsh suspend <domain> //恢复虚拟机 virsh resume <domain>
5、VNC连接虚拟机
- VNC可以通过虚拟机的编号或虚拟机的端口连接虚拟机。
//显示连接虚拟机的URI virsh domdisplay <domain> //显示虚拟机的VNC编号 virsh vncdisplay <domain> //当有多个虚拟机时,端口会从5900递增 ]# sudo netstat -ntpl | sort -k 7 tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 1897/qemu-kvm tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 1937/qemu-kvm
6、使用console登录虚拟机(命令行控制台,代替VNC)
//(1)修改KVM虚拟机的内核参数(/boot/grub2/grub.cfg) ]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8" //(2)重启KVM虚拟机 ]# reboot //(3)连接虚拟机(“Ctrl + ]”退出虚拟机) virsh console <domain>
7、虚拟机的配置文件
- 一个虚拟机有两个文件:
- 磁盘文件:
- 配置文件:/etc/libvirt/qemu
//备份配置文件 virsh dumpxml <domain> > <domain>.xml //修改配置文件 virsh edit <domain>.xml //导入配置文件 virsh define <domain>.xml
8、删除虚拟机
//(1)关闭虚拟机 virsh destroy <domain> //(2)删除虚拟机的配置文件 virsh undefine <domain> //(3)删除虚拟机的磁盘文件 rm /apps/images/<domain>.raw
9、迁移虚拟机到其他磁盘
//(1)将虚拟机镜像文件迁移到其他磁盘 //(2)修改虚拟机的配置文件中的磁盘路径
3.2、管理快照
//查看快照 virsh snapshot-list <domain> //还原快照 virsh snapshot-revert <domain> --snapshotname Snapshot_Name //创建快照 virsh snapshot-create-as <domain> --name Snapshot_Name //删除快照 virsh snapshot-revert <domain> --name Snapshot_Name
4、virt-clone命令-克隆虚拟机
]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running
1、完整克隆(自动)
//(1)完整克隆(克隆前要关闭虚拟机) ]# virt-clone --auto-clone -o CentOS71-x86_64 -n CentOS73-x86_64 //(2)启动虚拟机 ]# virsh start CentOS73-x86_64
2、完整克隆(手动)
//(1)复制虚拟机磁盘 ]# cp /apps/images/CentOS71-x86_64.qcow2 /apps/images/CentOS74-x86_64.qcow2 //(2)创建虚拟机配置文件 ]# virsh dumpxml CentOS71-x86_64 > /etc/libvirt/qemu/CentOS74-x86_64.xml ]# vim /etc/libvirt/qemu/CentOS74-x86_64.xml #修改虚拟机的名字 #删除虚拟机uuid #删除mac地址 #修改磁盘路径 //(3)导入虚拟机配置文件 ]# virsh define /etc/libvirt/qemu/CentOS74-x86_64.xml //(4)启动虚拟机 ]# virsh start CentOS74-x86_64
3、连接克隆(手动)
//(1)基于磁盘CentOS71-x86_64.raw创建磁盘CentOS75-x86_64.qcow2(新创建的磁盘的格式必须是qcow2) ]# qemu-img create -f qcow2 -b /apps/images/CentOS71-x86_64.raw /apps/images/CentOS75-x86_64.qcow2 //(2)启动CentOS75-x86_64虚拟机 ]# virt-install --name CentOS75-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 1024 --vcpus 1 --disk /apps/images/CentOS75-x86_64.qcow2 --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole
5、qemu-img命令-管理虚拟磁盘
]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running
1、qemu-img常用命令
//创建磁盘 ]# qemu-img create -f qcow2 /apps/images/CentOS73-x86_64.qcow2 10G Formatting '/apps/images/CentOS73-x86_64.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off //查看磁盘信息 ]# qemu-img info /apps/images/CentOS73-x86_64.qcow2 image: /apps/images/CentOS73-x86_64.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 196K cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false //扩容磁盘。raw格式的镜像支持增大或缩小,而qcow2格式只支持增大。(注意,一定不要进行缩容) ]# qemu-img resize /apps/images/CentOS73-x86_64.qcow2 100G //将raw格式转换为qcow2(转换格式后,KVM虚拟机的配置文件要修改磁盘路径和格式两个地方) ]# qemu-img convert -f raw -O qcow2 /apps/images/CentOS71-x86_64.raw /apps/images/CentOS74-x86_64.qcow2
2、转换磁盘格式
//将raw格式转换为qcow2(转换格式后,KVM虚拟机的配置文件要修改磁盘路径和格式两个地方) ]# qemu-img convert -f raw -O qcow2 /apps/images/CentOS71-x86_64.raw /apps/images/CentOS75-x86_64.qcow2 ]# virsh dumpxml CentOS71-x86_64 > CentOS75-x86_64.xml ]# vim CentOS75-x86_64.xml #修改虚拟机的名字 #删除虚拟机uuid #删除mac地址 #修改磁盘格式 #修改磁盘路径 ]# virsh define CentOS75-x86_64.xml ]# virsh start CentOS75-x86_64
6、热添加技术
6.1、动态添加磁盘
6.1.1、常用命令
//添加磁盘,临时生效 virsh attach-disk <domain> <source> <target> [--subdriver <string>] //添加磁盘,永久生效 virsh attach-disk <domain> <source> <target> [--subdriver <string>] [--config] //剥离磁盘,临时生效 virsh detach-disk <domain> <target> //剥离磁盘,永久生效 virsh detach-disk <domain> <target> [--config]
- 参数说明:
- <domain>:虚拟机
- <source>:磁盘设备的来源(绝对路径)
- <target>:磁盘设备的目标
- [--subdriver <string>]:磁盘设备的子驱动器
- [--config]:重启生效
6.1.2、动态添加和扩容磁盘示例
1、查看虚拟机
//(1)查看虚拟机名称 ]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running //(2)查看虚拟机现有的磁盘文件 ]# ls -lh /apps/images/ -rw------- 1 qemu qemu 10G Mar 3 02:15 CentOS71-x86_64.raw //(3)查看虚拟机的VNC编号 ]# virsh vncdisplay CentOS71-x86_64 :0 //(4)连接到虚拟机中,查看磁盘大小 ]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/vda1 10G 1.4G 8.7G 14% / ...
2、创建一个磁盘
]# qemu-img create -f qcow2 /apps/images/CentOS71-x86_64-2.qcow2 20G
3、将新磁盘添加到虚拟机上
//临时和永久生效都要执行 ]# virsh attach-disk CentOS71-x86_64 /apps/images/CentOS71-x86_64-2.qcow2 vdb --subdriver qcow2 ]# virsh attach-disk CentOS71-x86_64 /apps/images/CentOS71-x86_64-2.qcow2 vdb --subdriver qcow2 --config
4、格式化并挂载新磁盘
- 连接到虚拟机中,进行操作。
//(1)查看磁盘信息 ]# fdisk -l Disk /dev/vda: 10.7 GB, 10737418240 bytes, 20971520 sectors Device Boot Start End Blocks Id System /dev/vda1 * 2048 20971519 10484736 83 Linux Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors //(2)查看磁盘格式 ]# lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT vda └─vda1 xfs c4d392df-d657-4103-a3b3-0a77752f1c9b / vdb //(3)格式化新磁盘 ]# mkfs.xfs /dev/vdb //(4)挂载新磁盘 ]# mount /dev/vdb /mnt //(5)查看磁盘大小 ]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/vda1 10G 1.4G 8.7G 14% / /dev/vdb 20G 33M 20G 1% /mnt ...
5、向新磁盘中写入数据
//模拟数据,用于扩容后观察数据是否丢失 ]# cp -rf /etc/yum.repos.d /mnt
6、扩容新磁盘
//(1)在虚拟机中,将要扩容的磁盘卸载掉 ]# umount /mnt/ //(2)临时剥离磁盘 ]# virsh detach-disk CentOS71-x86_64 vdb //(3)调整磁盘容量 ]# qemu-img resize /apps/images/CentOS71-x86_64-2.qcow2 +10G //(4)将磁盘临时添加到虚拟机上 ]# virsh attach-disk CentOS71-x86_64 /apps/images/CentOS71-x86_64-2.qcow2 vdb --subdriver qcow2 //(5)在虚拟机中,再次挂载磁盘 ]# mount /dev/vdb /mnt //(6)在虚拟机中,更新扩容磁盘的超级块信息(resize2fs用于ext4) ]# xfs_growfs /dev/vdb
7、验证是否扩容成功
]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/vda1 10G 1.4G 8.7G 14% / /dev/vdb 30G 33M 30G 1% /mnt ... ]# ls -lh /mnt drwxr-xr-x. 2 root root 220 Mar 3 02:44 yum.repos.d
6.2、动态添加网卡
6.2.1、常用命令
//添加网卡,临时生效 virsh attach-interface <domain> <type> <source> [--model <string>] //添加网卡,临时生效 virsh attach-interface <domain> <type> <source> [--model <string>] [--config] //剥离网卡,临时生效 detach-interface <domain> <type> [--mac <string>] //剥离网卡,永久生效 detach-interface <domain> <type> [--mac <string>] [--config]
- 参数说明:
- <domain>:虚拟机
- <type>:网络接口类型
- <source>:网络接口来源(绝对路径)
- [--model <string>]:模型类型
- [--config]:重启生效
- [--mac <string>]:MAC地址
6.2.2、动态添加网卡示例
1、查看虚拟机信息
//查看虚拟机 ]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running //查看以太网网桥 ]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c292158ff yes eth0 vnet1 virbr0 8000.52540042df18 yes virbr0-nic vnet0
2、添加网络接口
//为虚拟机添加nat网络接口 ]# virsh attach-interface CentOS71-x86_64 network default --model virtio ]# virsh attach-interface CentOS71-x86_64 network default --model virtio --config //为虚拟机添加桥接网络接口 ]# virsh attach-interface CentOS71-x86_64 bridge br0 --model virtio ]# virsh attach-interface CentOS71-x86_64 bridge br0 --model virtio --config
3、验证添加网卡是否成功
- (1)查看以太网网桥
]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c292158ff yes eth0 vnet1 vnet3 virbr0 8000.52540042df18 yes virbr0-nic vnet0 vnet2
- (2)连接到虚拟机上,查看网络接口
6.3、动态添加CPU
6.3.1、常用命令
- CPU只能增加,不能减少。
//添加CPU,临时有效 setvcpus <domain> <count> //添加CPU,永久有效 setvcpus <domain> <count> [--config]
6.3.2、动态添加CUP
1、查看虚拟机
//查看虚拟机 ]# virsh list --all Id Name State ---------------------------------------------------- - CentOS71-x86_64 shut off - CentOS72-x86_64 shut off
2、创建虚拟机
- 要动态添加CUP,在创建虚拟机时必须使用特殊的选项“--vcpus 1,maxvcpus=5”
]# qemu-img create -f qcow2 -b /apps/images/CentOS71-x86_64.raw /apps/images/CentOS73-x86_64.qcow2 ]# virt-install --name CentOS73-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 1024 --vcpus 1,maxvcpus=5 --disk /apps/images/CentOS73-x86_64.qcow2 --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole
3、动态添加CPU
]# virsh setvcpus CentOS73-x86_64 2 ]# virsh setvcpus CentOS73-x86_64 2 --config
6.3、动态添加内存
6.3.1、常用命令
- 内存可以动态扩缩容。
//修改内存大小,临时有效 setmem <domain> <size> //修改内存大小,永久有效 setmem <domain> <size> [--config]
6.3.2、动态添加内存示例
1、查看虚拟机
//查看虚拟机 ]# virsh list --all Id Name State ---------------------------------------------------- - CentOS71-x86_64 shut off - CentOS72-x86_64 shut off
2、创建虚拟机
- 要动态扩缩容内存,在创建虚拟机时必须使用特殊的选项“--memory 512,maxmemory=2048”
]# qemu-img create -f qcow2 -b /apps/images/CentOS71-x86_64.raw /apps/images/CentOS73-x86_64.qcow2 ]# virt-install --name CentOS73-x86_64 --virt-type kvm --os-variant rhel7 --boot hd \ --memory 512,maxmemory=2048 --vcpus 1 --disk /apps/images/CentOS73-x86_64.qcow2 --network network=default \ --graphics vnc,listen=0.0.0.0 --noautoconsole
3、修改内存大小
//修改内存大小 ]# virsh setmem CentOS73-x86_64 1024 ]# virsh setmem CentOS73-x86_64 1024 --config
1
# #