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

#                                                                                                                                      #
posted @ 2023-02-28 12:39  麦恒  阅读(246)  评论(0编辑  收藏  举报