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工具
1 | ]# 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
1 2 | ]# 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网络创建虚拟机
1 2 3 | ]# 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 2 3 4 5 6 7 | //(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、创建桥接网络
1 2 3 4 | //将eth0网络接口 桥接 到br0网桥上 ]# virsh iface-bridge eth0 br0 Created bridge br0 with attached device eth0 Bridge interface br0 started |
2、创建虚拟机
1 2 3 | ]# 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、查看虚拟机
- 两种网络的虚拟机可以同时存在。
- 两种网络之间转换,只需修改虚拟机配置文件的如下内容:
1 2 3 4 5 6 7 | //nat网络 < interface type= 'network' > <source network= 'default' /> //桥接网络 < interface type= 'bridge' > <source bridge= 'br0' /> |
1、查看虚拟机
1 2 3 4 5 | ]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running |
2、查看以太网网桥
1 2 3 4 5 6 | ]# 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编号
1 2 | ]# virsh vncdisplay CentOS71-x86_64 :0 |
2、连接到虚拟机
- 在进入安装界面的时候把光标移动到Install CentOS7,按下tab键,在后面输入“net.ifnames=0 biosdevname=0”回车即可。
- virt-install命令执行后,要赶紧连接到虚拟机,否则看不到该页面。
3、配置虚拟机
3、virsh命令
3.1、管理虚拟机
1、查看虚拟机
1 | virsh list --all |
2、开关虚拟机
1 2 3 4 5 6 7 8 9 10 | //开启虚拟机 virsh start <domain> //重启虚拟机 virsh reboot <domain> //关闭虚拟机(正常关机) virsh shutdown <domain> //关闭虚拟机(关闭电源) virsh destroy <domain> |
3、将虚拟机设置为开机自启
1 2 3 4 5 6 7 8 | //将虚拟机设置为开机自启 virsh autostart <domain> //取消开机自启 virsh autostart --disable <domain> //设置开机自启后,会创建该目录,并创建其软链 ]# ls -l /etc/libvirt/qemu/autostart/ |
4、挂起和恢复虚拟机
1 2 3 4 5 | //挂起虚拟机 virsh suspend <domain> //恢复虚拟机 virsh resume <domain> |
5、VNC连接虚拟机
- VNC可以通过虚拟机的编号或虚拟机的端口连接虚拟机。
1 2 3 4 5 6 7 8 9 | //显示连接虚拟机的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 2 3 4 5 6 7 8 | //(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
1 2 3 4 5 6 7 8 | //备份配置文件 virsh dumpxml <domain> > <domain>.xml //修改配置文件 virsh edit <domain>.xml //导入配置文件 virsh define <domain>.xml |
8、删除虚拟机
1 2 3 4 5 6 7 8 | //(1)关闭虚拟机 virsh destroy <domain> //(2)删除虚拟机的配置文件 virsh undefine <domain> //(3)删除虚拟机的磁盘文件 rm /apps/images/<domain>.raw |
9、迁移虚拟机到其他磁盘
1 2 3 | //(1)将虚拟机镜像文件迁移到其他磁盘 //(2)修改虚拟机的配置文件中的磁盘路径 |
3.2、管理快照
1 2 3 4 5 6 7 8 9 10 11 | //查看快照 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命令-克隆虚拟机
1 2 3 4 5 | ]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running |
1、完整克隆(自动)
1 2 3 4 5 | //(1)完整克隆(克隆前要关闭虚拟机) ]# virt- clone --auto- clone -o CentOS71-x86_64 -n CentOS73-x86_64 //(2)启动虚拟机 ]# virsh start CentOS73-x86_64 |
2、完整克隆(手动)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //(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 2 3 4 5 6 7 | //(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命令-管理虚拟磁盘
1 2 3 4 5 | ]# virsh list --all Id Name State ---------------------------------------------------- 1 CentOS71-x86_64 running 2 CentOS72-x86_64 running |
1、qemu-img常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //创建磁盘 ]# 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、转换磁盘格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //将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、常用命令
1 2 3 4 5 6 7 8 9 | //添加磁盘,临时生效 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //(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、创建一个磁盘
1 | ]# qemu-img create -f qcow2 /apps/images/CentOS71-x86_64-2.qcow2 20G |
3、将新磁盘添加到虚拟机上
1 2 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //(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、向新磁盘中写入数据
1 2 | //模拟数据,用于扩容后观察数据是否丢失 ]# cp -rf /etc/yum.repos.d /mnt |
6、扩容新磁盘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //(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、验证是否扩容成功
1 2 3 4 5 6 7 8 | ]# 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、常用命令
1 2 3 4 5 6 7 8 9 | //添加网卡,临时生效 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、查看虚拟机信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //查看虚拟机 ]# 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、添加网络接口
1 2 3 4 5 6 7 | //为虚拟机添加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)查看以太网网桥
1 2 3 4 5 6 7 8 | ]# 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只能增加,不能减少。
1 2 3 4 | //添加CPU,临时有效 setvcpus <domain> < count > //添加CPU,永久有效 setvcpus <domain> < count > [--config] |
6.3.2、动态添加CUP
1、查看虚拟机
1 2 3 4 5 6 | //查看虚拟机 ]# virsh list --all Id Name State ---------------------------------------------------- - CentOS71-x86_64 shut off - CentOS72-x86_64 shut off |
2、创建虚拟机
- 要动态添加CUP,在创建虚拟机时必须使用特殊的选项“--vcpus 1,maxvcpus=5”
1 2 3 4 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
1 2 | ]# virsh setvcpus CentOS73-x86_64 2 ]# virsh setvcpus CentOS73-x86_64 2 --config |
6.3、动态添加内存
6.3.1、常用命令
- 内存可以动态扩缩容。
1 2 3 4 | //修改内存大小,临时有效 setmem <domain> <size> //修改内存大小,永久有效 setmem <domain> <size> [--config] |
6.3.2、动态添加内存示例
1、查看虚拟机
1 2 3 4 5 6 | //查看虚拟机 ]# virsh list --all Id Name State ---------------------------------------------------- - CentOS71-x86_64 shut off - CentOS72-x86_64 shut off |
2、创建虚拟机
- 要动态扩缩容内存,在创建虚拟机时必须使用特殊的选项“--memory 512,maxmemory=2048”
1 2 3 4 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 512,maxmemory=2048 --vcpus 1 --disk /apps/images/CentOS73-x86_64.qcow2 --network network= default \ --graphics vnc,listen=0.0.0.0 --noautoconsole |
3、修改内存大小
1 2 3 | //修改内存大小 ]# virsh setmem CentOS73-x86_64 1024 ]# virsh setmem CentOS73-x86_64 1024 --config |
1
1 | # # |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现