KVM虚拟化进阶学习
一,KVM命令行安装
图形化安装教程:https://blog.csdn.net/weixin_53678904/article/details/125950867?spm=1001.2014.3001.5501
1.存储池管理
KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录,我们称这个⽬录为存储池
1.创建存储池
qemu-img create -f qcow2 /kvm/images/vmtest1.qcow2 8G
注意:如果不指定文件类型的话,默认为raw类型
2.转换磁盘格式为qcow2
qemu-img convert -f raw -O qcow2 /kvm/images/vmtest1.raw /kvm/images/vmtest1.qcow2
选项:
-f:当前磁盘格式
-O:转换为的磁盘格式
3.查看详细信息
[root@localhost images]# qemu-img info vmtest1.qcow2
image: vmtest1.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 1.2G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
2.创建虚拟机
1.virt-install命令参数
1.通用选项
-n NAME, --name=NAME 虚拟机名称
-r MEMORY, --ram=MEMORY 以MB为单位为客户端事件分配的内存
--vcpus=VCPUS 配置虚拟机的虚拟CPU(vcpu)数量,如:
--vcpus 5
--vcpus 5, maxcpus=10
--vcpus socket=2,cores=4,threads=2
--cpuset=CPUSET Set which physical CPUs domain can use.
--cpu=CPU CPU型号及功能,如:--cpu coreduo,+x2apic
--description=DESCRIPTION 在生成的XML中保存的可读VM描述。
--security=SECURITY 设定域安全驱动器配置。
--numatune=NUMATUNE 为域进程调整NUMA策略。
2.安装方式选项
-c CDROM, --cdrom=CDROM 光驱安装介质
-l LOCATION, --location=LOCATION
安装源(例如:nfs:host:/path、http://host/path、ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在磁盘映像中构建客户机
--livecd 将光驱介质视为 Live CD
-x EXTRA, --extra-args=EXTRA 附加到使用--location引导的内核的参数
--os-type=DISTRO_TYPE 操作系统类型,'linux'、'unix'、'windows'
--os-variant=DISTRO_VARIANT 操作系统版本,如: 'fedora6','rhel5', 'solaris10', 'win2k'
--boot=BOOTOPTS 自选配置后安装引导顺序、菜单、永久kernel引导,等等。
3.存储配置
--disk=DISKOPTS 用各种选项指定存储。 Ex.
--disk path=/my/existing/disk
--disk path=/my/new/disk,size=5 (单位GB)
--disk vol=poolname:volname,device=cdrom,bus=scsi,...
--nodisks 不要为该客户端设置任何磁盘。
--filesystem=FILESYSTEMS
将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
4.联网配置
-w NETWORK, --network=NETWORK
配置客户网络接口。 Ex:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--nonetworks 不要为该客体创建网络接口。
5.图形配置
--graphics=GRAPHICS
配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--noautoconsole 不要自动尝试连接到客户端控制台
6.设备选项
--serial=SERIALS 配置虚拟机串口设备
--parallel=PARALLELS 配置虚拟机并口设备
--channel=CHANNELS 配置虚拟机沟通频道
--console=CONSOLES 配置虚拟机与主机之间的文本控制台连接
--host-device=HOSTDEVS 配置与客户相连的物理主机设备
--soundhw=SOUNDHW 配置客户声音设备仿真
--watchdog=WATCHDOG 配置虚拟机 watchdog 设备
--video=VIDEO 配置虚拟机视频硬件。
--smartcard=SMARTCARD 配置虚拟机智能卡设备。
例如:--smartcard mode=passthrough
--redirdev=REDIRDEV Configure a guest redirection device.
例如:--redirdev usb,type=tcp,server=192.168.1.1:4000
7.虚拟化平台选项
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 这个客户端是一个半虚拟客户端
--container This guest should be a container guest
--virt-type=HV_TYPE 要使用的管理程序名称(kvm、qemu、xen)
--arch=ARCH 模拟的 CPU 构架
--machine=MACHINE The machine type to emulate
--noacpi 为全虚拟客户端禁用 ACPI(在 os-type/os-variant db 中覆盖数值)
-u UUID, --uuid=UUID 客户端 UUID。
8.其他权限
--autostart 引导主机时自动启动域。
--print-xml 输出所生成域的XML,而不是定义虚拟机。
--print-step=XMLSTEP 输出具体安装步骤
--noreboot 完成安装后不要引导虚拟机。
--wait=WAIT 要等待的时间(以分钟为单位)
--dry-run 完成安装步骤,但不要创建设备或者定义虚拟机。
--force 对任意应用程序提示强制回答‘yes’,终止其它提示
-q, --quiet 禁止无错误输出
--prompt 要求用户为模糊情况或者需要的选项输入
-d, --debug 输入故障排除信息
2.常用创建虚拟机选项
1.最小化安装
virt-install -n vm1 -r 1024 --vcpus=1 -l=/kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --disk path=/kvm/images/vmtest1.qcow2 --nographics
选项:
-n:指定虚拟机名称
-r:指定内存大小
--vcpus:CPU核数
-l:安装源
--disk path:存储池位置
--nographics:不安装图形化界面
2.VNC图形化安装
virt-install --name grap -r 1024 --vcpus=1 -l /kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --accelerate --disk path=/kvm/images/vmtest2.qcow2 --graphics vnc,listen=0.0.0.0,port=5924 --noautoconsole --autostart
选项:
-n:指定虚拟机名称
-r:指定内存大小
--vcpus:CPU核数
-l:安装源
--disk path:存储池位置
--graphics:指定图形化连接服务端口
--noautoconsole 不要自动尝试连接到客户端控制台
--autostart 引导主机时自动启动域
3.实战安装
1.命令行安装
到当前shell终端进行安装系统
virt-install --name centos6.9 -r 2048 --vcpus=2 --location=/home/softs/iso/CentOS-6.9-x86_64-bin-DVD1.iso --network bridge=br0 --disk path=/home/kvmos/centos6.9.qcow2,size=60,format=qcow2,sparse --nographics -x 'console=ttyS0'
2.vnc安装
virt-install --name user_1604 \
--ram 2048 \
--vcpus=2 \
--disk path=/home/kvmos/user_1604.qcow2,size=60,format=qcow2,sparse \
--accelerate \
--cdrom /home/softs/iso/ubuntu-16.04.4-server-amd64.iso \
--graphics vnc,listen=0.0.0.0,port=5924, \
--noautoconsole \
--network bridge=br0 \
--autostart
二,KVM管理命令
1.基本管理命令
1.查看命令帮助
virsh -h
2.KVM配置文件存放位置
[root@localhost ~]# ll /etc/libvirt/qemu/
总用量 8
drwxr-xr-x 2 root root 22 6月 8 22:26 autostart
-rw------- 1 root root 3823 6月 8 22:26 grap.xml
drwx------ 3 root root 42 5月 26 17:21 networks
-rw------- 1 root root 3514 6月 8 22:12 vm1.xml
通过虚拟机配置文件定义虚拟机
virsh edit vm1 #编辑虚拟机配置文件
virsh dominfo vm1 #查看虚拟机信息
3.查看虚拟机状态
[root@localhost ~]# virsh list #查看开启状态虚拟机
Id 名称 状态
----------------------------------------------------
1 grap running
[root@localhost ~]# virsh list --all #查看所有的虚拟机
Id 名称 状态
----------------------------------------------------
1 grap running
- vm1 关闭
[root@localhost ~]# virsh list --inactive #查看关闭状态的虚拟机
Id 名称 状态
----------------------------------------------------
- vm1 关闭
4.虚拟机开机与关机,恢复
1.关机虚拟机
[root@localhost ~]# virsh shutdown grap
域 grap 被关闭
[root@localhost ~]# virsh destroy grap #强制关闭
域 grap 被删除
[root@localhost ~]# virsh list --inactive
Id 名称 状态
----------------------------------------------------
- grap 关闭
- vm1 关闭
2.开启虚拟机
[root@localhost ~]# virsh start vm1
域 vm1 已开始
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm1 running
- grap 关闭
3.暂停和恢复
[root@localhost ~]# virsh suspend vm1 #暂停虚拟机
域 vm1 被挂起
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm1 暂停
- grap 关闭
[root@localhost ~]# virsh resume vm1 #恢复虚拟机
域 vm1 被重新恢复
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm1 running
- grap 关闭
4.重启虚拟机
[root@localhost ~]# virsh reboot vm1
域 vm1 正在被重新启动
[root@localhost ~]# virsh reset vm1 #去电重启,速度快,但是不安全
重新设定域 vm1
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm1 running
- grap 关闭
5.通过配置文件启动虚拟机实例
virsh create /etc/libvirt/qemu/vm1.xml
5.虚拟机开机自启
[root@localhost ~]# virsh autostart vm1 #设置为开机自启
域 vm1标记为自动开始
[root@localhost ~]# virsh list --all --autostart #查看开机自启
Id 名称 状态
----------------------------------------------------
2 vm1 running
- grap 关闭
[root@localhost ~]# virsh autostart --disable vm1 #去除开机自启
域 vm1取消标记为自动开始
[root@localhost ~]# virsh list --all --autostart
Id 名称 状态
----------------------------------------------------
- grap 关闭
6.删除虚拟机
[root@localhost ~]# virsh undefine vm1 #删除之前需要将虚拟机关机
[root@localhost ~]# virsh destroy vm1 #强制关机虚拟机
7.连接虚拟机
virsh console vm1 #连接虚拟机
#进入虚拟机后 ctrl+] 退出虚拟机
2.克隆+快照管理命令
1.导出虚拟机配置
[root@localhost ~]# virsh dumpxml vm1 > /root/vm1.xml
2.克隆
1.创建克隆
[root@localhost ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- grap 关闭
- vm1 关闭
[root@localhost images]# virt-clone -o vm1 -n vm1-01 -f /kvm/images/vmtest4.qcow2
正在分配 'vmtest4.qcow2' | 8.0 GB 00:00:12
成功克隆 'vm1-01'。
[root@localhost images]# virsh list --all
Id 名称 状态
----------------------------------------------------
- grap 关闭
- vm1 关闭
- vm1-01 关闭
3.快照
1.创建快照
[root@localhost images]# virsh snapshot-create vm1
已生成域快照 1686304703
[root@localhost images]# virsh snapshot-create-as vm1 vm1-init
已生成域快照 vm1-init
[root@localhost images]# virsh snapshot-list vm1
名称 生成时间 状态
------------------------------------------------------------
1686304703 2023-06-09 17:58:23 +0800 shutoff
vm1-init 2023-06-09 17:59:17 +0800 shutoff
2.查看虚拟机的快照信息
[root@localhost images]# virsh snapshot-current vm1
3.恢复快照
[root@localhost images]# virsh snapshot-revert vm1 vm1-init
4.删除快照信息
[root@localhost images]# virsh snapshot-delete vm1 1686304703
已删除域快照 1686304703
三,KVM文件管理
1.常用文件管理命令
注意:在操作虚拟机文件时,需要将电源关闭,个别命令需要将其关机,否则会报错
1.安装离线访问工具
yum -y install libguestfs libguestfs-tools
2.所有命令
[root@localhost images]# virt-
virt-admin virt-copy-out virt-format virt-log virt-resize virt-xml
virt-alignment-scan virt-customize virt-get-kernel virt-ls virt-sparsify virt-xml-validate
virt-builder virt-df virt-host-validate virt-make-fs virt-sysprep
virt-cat virt-diff virt-index-validate virt-manager virt-tar-in
virt-clone virt-edit virt-inspector virt-pki-validate virt-tar-out
virt-copy-in virt-filesystems virt-install virt-rescue virt-win-reg
3.查看系统详细信息
格式:virt-inspector [实例名]
[root@localhost images]# virt-inspector vm1
[root@localhost images]# virt-inspector --format=qcow2 -a /kvm/images/vmtest1.qcow2
选项:
--format:文件类型
-a:存储文件位置
4.查看文件
格式:virt-cat [-a] {实例名}
[root@localhost ~]# virt-cat vm1 /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# virt-cat -a /kvm/images/vmtest1.qcow2 /etc/hosts
选项:
-a:指定存储文件位置
5.编辑文件
[root@localhost ~]# virt-edit vm1 /etc/hosts
6.查看虚拟机磁盘情况
[root@localhost ~]# virt-df vm1
文件系统 1K-blocks 已用空间 可用空间 使用百分比%
vm1:/dev/sda1 1038336 108080 930256 11%
vm1:/dev/cl/root 6486016 939816 5546200 15%
7.复制文件
#将文件拷贝到虚拟机内
#格式:virt-copy-in -d {虚拟机名} /拷贝宿主机文件 /拷贝到虚拟机位置
[root@localhost ~]# virt-copy-in -d vm1 /root/hello.txt /tmp
#将虚拟机文件拷贝出来
#格式:virt-copy-out -d {虚拟机名} /虚拟机文件位置 /拷贝到宿主机位置
[root@localhost ~]# virt-copy-out -d vm1 /etc/passwd /tmp
[root@localhost ~]# ls /tmp
passwd
2.实时挂载目录
guestfish是什么?
- guestfish是一套虚拟机镜像管理的利器,提供一系列对镜像管理的工具,也提供对外的API。
- guestfish主要包含以下工具:
- guestfish interactive shell 挂载镜像,并提供一个交互的shell。
- guestmount mount guest filesystem in hos 将镜像挂载到指定的目录。
- guestumount unmount guest filesystem 卸载镜像目录。
格式:
挂载格式:
guestmount -a {存储文件} -m {虚拟机挂载目录} --rw {挂载位置}
选项:
--ro:只读
--rw:可读可写
-i:文件系统类型
-a:存储文件存放位置
1.挂载虚拟机根目录
[root@localhost ~]# virt-df vm1 #查看当前虚拟机的根目录位置
文件系统 1K-blocks 已用空间 可用空间 使用百分比%
vm1:/dev/sda1 1038336 108080 930256 11%
vm1:/dev/cl/root 6486016 939816 5546200 15%
[root@localhost ~]# guestmount -a /kvm/images/vmtest1.qcow2 -m /dev/cl/root --rw /kvmmount/
[root@localhost ~]# ls /kvmmount/
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
2.取消挂载
[root@localhost ~]# guestunmount /kvmmount/
3.克隆
1.完整克隆
[root@localhost images]# virt-clone -o vm1 -n vm1-01 -f /kvm/images/vmtest4.qcow2
2.链接克隆
[root@localhost images]# qemu-img create -f qcow2 -o backing_file=/kvm/images/vmtest1.qcow2 oa-disk0.qcow2
启动
virt-install \
> --import \
> --name=oa \
> --vcpus=1 --ram=1024 \
> --disk path=oa-disk0.qcow2 \
> --network netwrok=default \
> --graphics vnc,listen=0.0.0.0 \
> --os-type=linux \
> --os-variant=centos7.0
4.磁盘管理
1.格式转换
qemu-img convert -f raw -O qcow2 /kvm/images/vmtest1.raw /kvm/images/vmtest1.qcow2
选项:
-f:当前磁盘格式
-O:转换为的磁盘格式
2.调整虚拟机磁盘大小
格式:resize [-q] filename [+ | -]size
5.快照
命令格式:
qemu-img snaphost [option] [选项需要内容] {存储文件位置}
选项:
-a:切换到指定摸一个快照点
-c:创建一个快照
-d:删除一个快照
-l:列出指定虚拟机的所有快照
1.查看快照
[root@localhost images]# qemu-img snapshot -l /kvm/images/vmtest1.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
2 vm1-init 0 2023-06-09 17:59:17 00:00:00.000
3 1686474246 215M 2023-06-11 17:04:06 00:00:18.744
2.删除快照
[root@localhost images]# qemu-img snapshot -d 2 /kvm/images/vmtest1.qcow2
[root@localhost images]# qemu-img snapshot -l /kvm/images/vmtest1.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
3 1686474246 215M 2023-06-11 17:04:06 00:00:18.744
3.创建快照
[root@localhost ~]# qemu-img snapshot -c init /kvm/images/vmtest1.qcow2
[root@localhost ~]# qemu-img snapshot -l /kvm/images/vmtest1.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
3 1686474246 215M 2023-06-11 17:04:06 00:00:18.744
4 init 0 2023-06-12 23:57:29 00:00:00.000
4.恢复快照
[root@localhost ~]# qemu-img snapshot -a init /kvm/images/vmtest1.qcow2
四,KVM存储池和卷
1.KVM存储池
1.查看系统中的存储池
[root@localhost ~]# virsh pool-list --details
名称 状态 自动开始 持久 容量 分配 可用
------------------------------------------------------------------------
default running 是 是 37.02 GiB 8.73 GiB 28.28 GiB
test running 是 是 37.02 GiB 8.73 GiB 28.28 GiB
2.查看池的详细信息
[root@localhost ~]# virsh pool-info test
名称: test
UUID: 1e9c1654-e5fc-48b9-9dd8-233caf748cb6
状态: running
持久: 是
自动启动: 是
容量: 37.02 GiB
分配: 8.73 GiB
可用: 28.28 GiB
3.查看池中有哪些卷
[root@localhost ~]# virsh vol-list test
名称 路径
------------------------------------------------------------------------------
vm1.qcow2 /var/lib/libvirt/images/test/vm1.qcow2
4.创建存储池
1.基于目录创建存储池
1.创建存储卷
[root@localhost ~]# mkdir /dir_image
[root@localhost ~]# virsh pool-define-as dir-test dir --target '/dir_image/'
定义池 dir-test
2.查看池
[root@localhost ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
dir-test 不活跃 否
iso 活动 是
test 活动 是
3.开启池
[root@localhost ~]# virsh pool-start dir-test
池 dir-test 已启动
4.设置为开机自启池
[root@localhost ~]# virsh pool-autostart dir-test
池 dir-test 标记为自动启动
5.查看池的详细信息
[root@localhost ~]# virsh pool-info dir-test
名称: dir-test
UUID: e3ba0635-82df-4d89-a905-8e9e40f1d297
状态: running
持久: 是
自动启动: 否
容量: 37.02 GiB
分配: 8.79 GiB
可用: 28.23 GiB
6.关机和取消开机自启并删除
[root@localhost ~]# virsh pool-destroy dir-test
销毁池 dir-test
[root@localhost ~]# virsh pool-autostart --disable dir-test
取消将池 dir-test 标记为自动启动
[root@localhost ~]# virsh pool-undefine dir-test
池 dir-test 已经被取消定义
注意:如果创建的存储池的目录不存在的时候,需要先通过pool-build命令构建然后才能启动成功
[root@kvm001 ~]# virsh pool-build test
2.基于LVM创建存储池
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# vgcreate kvmvg /dev/sdb1
Volume group "kvmvg" successfully created
[root@localhost ~]# virsh pool-define-as kvmvg logical --source-name=kvmvg --target=/dev/kvmvg
定义池 kvmvg
[root@localhost ~]# virsh pool-start kvmvg
池 kvmvg 已启动
[root@localhost ~]# virsh pool-info kvmvg
名称: kvmvg
UUID: 4c5f7322-53ed-424d-a393-df4e37d74beb
状态: running
持久: 是
自动启动: 否
容量: 20.00 GiB
分配: 0.00 B
可用: 20.00 GiB
3.基于NFS创建存储池
[root@localhost ~]# mkdir /nfs
[root@localhost ~]# vi /etc/exports
/nfs *(rw,sync,no_root_squash)
[root@localhost ~]# systemctl start nfs-server
#以上是NFS服务器端的配置
[root@localhost ~]# mkdir /kvmnfs
[root@localhost ~]# virsh pool-define-as --name kvmnfs --type netfs --source-host 192.168.2.12 --source-path /nfs --target /kvmnfs/
定义池 kvmnfs
[root@localhost ~]# virsh pool-start kvmnf
2.存储卷管理
1.目录存储卷管理
1.列出存储池
[root@localhost ~]# virsh pool-list
名称 状态 自动开始
-------------------------------------------
dir-test 活动 否
iso 活动 是
kvmnfs 活动 否
kvmvg 活动 否
test 活动 是
2.查看存储池的信息
[root@localhost ~]# virsh pool-info dir-test
名称: dir-test
UUID: e3ba0635-82df-4d89-a905-8e9e40f1d297
状态: running
持久: 是
自动启动: 否
容量: 37.02 GiB
分配: 8.79 GiB
可用: 28.23 GiB
3.查看存储池中的卷
[root@localhost ~]# virsh vol-list dir-test
名称 路径
------------------------------------------------------------------------------
4.创建一个qcow2格式的卷
[root@localhost ~]# virsh vol-create-as dir-test test-voll.qcow2 4G --format qcow2
创建卷 test-voll.qcow2
[root@localhost ~]# virsh vol-list dir-test
名称 路径
------------------------------------------------------------------------------
test-voll.qcow2 /dir_image/test-voll.qcow2
2.LVM存储池中的存储卷管理
1.基于LVM池创建卷
[root@localhost ~]# virsh vol-create-as kvmvg vg-vol 4G
创建卷 vg-vol
[root@localhost ~]# virsh vol-list kvmvg
名称 路径
------------------------------------------------------------------------------
vg-vol /dev/kvmvg/vg-vol
3.常用的KVM存储管理命令
1.存储池相关命令
pool-autostart 自动启动某个池
pool-build 建立池
pool-create-as 从一组变量中创建一个池
pool-create 从一个 XML 文件中创建一个池
pool-define-as 在一组变量中定义池
pool-define 在一个XML文件中定义(但不启动)一个池或修改已有池
pool-delete 删除池
pool-destroy 销毁(删除)池
pool-dumpxml 将池信息保存到XML文档中
pool-edit 为存储池编辑 XML 配置
pool-info 查看存储池信息
pool-list 列出池
pool-name 将池 UUID 转换为池名称
pool-refresh 刷新池
pool-start 启动一个(以前定义的)非活跃的池
pool-undefine 取消定义一个不活跃的池
pool-uuid 把一个池名称转换为池 UUID
2.存储卷常用相关命令
vol-clone 克隆卷。
vol-create-as 从一组变量中创建卷
vol-create 从一个 XML 文件创建一个卷
vol-create-from 生成卷,使用另一个卷作为输入。
vol-delete 删除卷
vol-download 将卷内容下载到文件中
vol-dumpxml 保存卷信息到XML文档中
vol-info 查看存储卷信息
vol-key 根据卷名或路径返回卷的key
vol-list 列出卷
vol-name 根据给定卷key或者路径返回卷名
vol-path 根据卷名或key返回卷路径
vol-pool 为给定密钥或者路径返回存储池
vol-resize 重新定义卷大小
vol-upload 将文件内容上传到卷中
vol-wipe 擦除卷
五,KVM网络管理
一,桥接网络
1.桥接网络
桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位
2.桥接视图
3.KVM虚拟机桥接模式
创建桥接网卡
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br1
修改桥接网卡br1
[root@localhost network-scripts]# cat ifcfg-br1
DEVICE="br1"
NAME=br1
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=static
IPADDR=192.168.2.12
NETMASK=255.255.255.0
GATEWAY=192.168.2.254
DNS1=8.8.8.8
DEFROUTE=yes
修改交换虚拟机交换机网卡
[root@localhost network-scripts]# cat ifcfg-ens33
DEVICE="ens33"
ONBOOT="yes"
TYPE=Ethernet
BOOTPROTO=none
BRIDGE="br1"
NAME=ens33
重启
systemctl restart network
查看是否关联
[root@localhost network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br1 8000.000c29386a0c no ens33
vnet0
virbr0 8000.5254001fa3cf yes virbr0-nic
创建虚拟机
virsh pool-define-as kvmimage dir --target '/kvm/images/'
virsh pool-start kvmimage
virsh vol-create-as kvmimage kvmvol 5G
virt-install -n vm1 -r 1024 --vcpus=1 -l=/kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --network bridge=br1 --disk vol=kvmimage/kvmvol,format=qcow2 --nographics -x 'console=ttyS0'
进入虚拟机进行修改网卡内容
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=3138a40e-5ad1-4bc0-b7c1-094b6afecc25
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.2.10
GATEWAY=192.168.2.254
DNS1=8.8.8.8
测试:
- 外部是否可以访问到内部虚拟机地址
二,NAT网络
1.NAT模式
使用NAT模式可以实现在虚拟系统里访问互联网。就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。
2.NAT视图
3.虚拟机默认的NAT环境配置
1.在kvm安装完成后会有一个虚拟机网卡
[root@localhost networks]# ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:1f:a3:cf txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2.关联网卡
默认还关联了一个虚拟网卡
[root@localhost networks]# brctl show virbr0
bridge name bridge id STP enabled interfaces
virbr0 8000.5254001fa3cf yes virbr0-nic
3.KVM默认虚拟网卡
[root@localhost networks]# cat default.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>default</name>
<uuid>b96ea92e-d6f6-48f5-aa9c-4ed78d9ed32f</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:55:7a:56'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
4.宿主机开启路由转发
[root@localhost network-scripts]# vi /etc/sysctl.conf
#最后添加一下
net.ipv4.ip_forward=1
[root@localhost network-scripts]# sysctl -p
5.创建一个默认的虚拟机
virsh vol-create-as kvmimage kvm-nat 5G
virt-install -n vm2 -r 1024 --vcpus=1 -l=/kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --network network=default,model=virtio --disk vol=kvmimage/kvm-nat,format=qcow2 --nographics -x 'console=ttyS0'
6.获取IP地址测试
[root@localhost ~]# dhclient
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:cf:80:3f brd ff:ff:ff:ff:ff:ff
inet 192.168.122.79/24 brd 192.168.122.255 scope global dynamic eth0
valid_lft 3598sec preferred_lft 3598sec
inet6 fe80::5054:ff:fecf:803f/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (182.61.200.6) 56(84) bytes of data.
64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=1 ttl=127 time=12.5 ms
64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=2 ttl=127 time=18.7 ms
64 bytes from 182.61.200.6 (182.61.200.6): icmp_seq=3 ttl=127 time=7.94 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 7.947/13.111/18.797/4.444 ms
7.测试
- 是否可以访问到外网
- 外网是否不能访问到KVM虚拟机
4.自定义NAT网络环境
1.复制默认的NAT配置文件
[root@localhost networks]# cp default.xml nat1.xml
2.编辑网卡文件
[root@localhost networks]# vi nat1.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit nat1
or other application using the libvirt API.
-->
<network>
<name>nat1</name>
<uuid>b96ea93e-d6f6-48f5-aa9c-4ed78d9ed32f</uuid>
<forward mode='nat'/>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:55:8a:56'/>
<ip address='192.168.121.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.121.2' end='192.168.121.254'/>
</dhcp>
</ip>
</network>
3.定义网卡文件
[root@localhost networks]# virsh net-define /etc/libvirt/qemu/networks/nat1.xml
从 nat1定义网络/etc/libvirt/qemu/networks/nat1.xml
4.启动网卡
[root@localhost networks]# virsh net-start nat1
网络 nat1 已开始
5.定义虚拟机安装网卡
[root@localhost networks]# virt-install -n vm2 -r 1024 --vcpus=1 -l=/kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --network network=net1,model=virbr1 --disk vol=kvmimage/kvm-nat,format=qcow2 --nographics -x 'console=ttyS0'
三,自定义隔离网络
1.创建隔离网卡内容
[root@localhost networks]# cp default.xml private.xml
2.修改网卡内容
[root@localhost networks]# cat private.xml
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->
<network>
<name>private</name>
<uuid>b96ea9ee-d6f6-48f5-aa9c-4ed78d9ed32f</uuid>
<bridge name='private1' stp='on' delay='0'/>
<mac address='52:54:00:55:9a:56'/>
<ip address='192.168.9.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.9.2' end='192.168.9.254'/>
</dhcp>
</ip>
</network>
3.启动网卡
[root@localhost networks]# virsh net-define private.xml
从 private定义网络private.xml
[root@localhost networks]# virsh net-start private
网络 private 已开始
4.测试
- 在安装好的虚拟机配置文件中修改
- 创建一个新的虚拟机时添加该网卡
四,常用网络命令
1.管理网卡命令
virsh net-edit default #编辑网卡信息
virsh net-define /etc/libvirt/qemu/networks/default.xml #重新定义网卡
virsh net-destory default #停止网卡
virsh net-start default #启动网卡
其他选项:
net-autostart 自动开始网络
net-create 从一个 XML 文件创建一个网络
net-define define an inactive persistent virtual network or modify an existing persistent one from an XML file
net-destroy 销毁(停止)网络
net-dhcp-leases print lease info for a given network
net-dumpxml XML 中的网络信息
net-edit 为网络编辑 XML 配置
net-event Network Events
net-info 网络信息
net-list 列出网络
net-name 把一个网络UUID 转换为网络名
net-start 开始一个(以前定义的)不活跃的网络
net-undefine undefine a persistent network
net-update 更新现有网络配置的部分
net-uuid 把一个网络名转换为网络UUID
六,KVM迁移
静态迁移(冷迁移) 对于静态迁移,你可以在宿主机上保存一个完整的客户机镜像快照,然后在宿主机中关闭或 者暂停该客户机,然后将该客户机的镜像文件复制到另一台宿主机中,使用在源主机中启动该客户 机时的命令来启动复制过来的镜像。
动态迁移(热迁移) 如果源宿主机和目的宿主机共享存储系统,则只需要通过网络发送客户机的 vCPU 执行状 态、内存中的内容、虚机设备的状态到目的主机上。否则,还需要将客户机的磁盘存储发到目的主 机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。
一,冷迁移
1.拷贝虚拟机文件
1.创建一台虚拟机
[root@localhost ~]# qemu-img create -f qcow2 /kvm/images/vm1.qcow2 8G
Formatting '/kvm/images/vm1.qcow2', fmt=qcow2 size=8589934592 encryption=off cluster_size=65536 lazy_refcounts=off
[root@localhost ~]# virt-install -n vm1 -r 1024 --vcpus=1 -l=/kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --disk path=/kvm/images/vm1.qcow2 --nographics -x 'console=ttyS0'
2.拷贝存储文件和配置文件
注意:需要在关机情况下,如果在拷贝是一直卡着不动,就是没关机
[root@localhost network-scripts]# scp /kvm/images/vm1.qcow2 root@192.168.2.13:/kvm/images/
[root@localhost network-scripts]# scp /etc/libvirt/qemu/vm1.xml root@192.168.2.13:/etc/libvirt/qemu/
3.在迁移到的虚拟机操作
[root@localhost ~]# virsh define /etc/libvirt/qemu/vm1.xml
定义域 vm1(从 /etc/libvirt/qemu/vm1.xml)
[root@localhost ~]# virsh start vm1
域 vm1 已开始
[root@localhost ~]# virsh list
Id 名称 状态
----------------------------------------------------
1 vm1 running
[root@localhost ~]# virsh console vm1
2.NFS共享
二,热迁移
案例实施步骤如下:
注意:将两台主机设置为桥接模式,创建虚拟机的网卡也是,方便测试
1、设置主机名、/etc/hosts 互相解析,保证网络连接和ssh互信
2、两台主机的KVM连接NFS共享存储
3、在源主机的KVM中新建虚拟机并安装操作系统
4、连接KVM,并进行迁移。
1. 初始化(两台互做)
[root@localhost ~]# hostnamectl set-hostname vm2
[root@vm2 ~]# vi /etc/hosts
192.168.2.12 vm1
192.168.2.13 vm2
[root@localhost network-scripts]# ssh-keygen
[root@localhost network-scripts]# ssh-copy-id 192.168.2.12
2.搭建NFS,基于NFS创建虚拟机
[root@vm1 ~]# virsh pool-define-as --name kvmnfs --type netfs --source-host 192.168.2.5 --source-path /kvmdata --target /kvmnfs
定义池 kvmnfs
[root@vm1 ~]# virsh pool-start kvmnfs
池 kvmnfs 已启动
[root@vm1 ~]# virsh vol-create-as kvmnfs vm1.qcow2 8G --format qcow2
创建卷 vm1.qcow2
[root@vm1 ~]# virt-install -n vm2 -r 1024 --vcpus=1 -l /kvm/iso/CentOS-7.3-x86_64-DVD-1611.iso --disk vol=kvmnfs/vm1.qcow2 --nographics -x 'console=ttyS0'
3.在虚拟机中搭建http服务方便测试
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl stop firewalld
[ 1067.622493] Ebtables v2.0 unregistered
4.第二台主机进行创建存储池
[root@vm2 ~]# mkdir /kvmnfs
[root@vm2 ~]# virsh pool-define-as --name kvmnfs --type netfs --source-host 192.168.2.5 --source-path /kvmdata --target /kvmnfs
定义池 kvmnfs
[root@vm2 ~]# virsh pool-start kvmnfs
池 kvmnfs 已启动
5.开始ping和访问网站
6.开始迁移
[root@localhost ~]# virsh migrate --live --unsafe --verbose vm2 qemu+ssh://192.168.2.13/system
迁移: [100 %]
7.查看第一台KVM和二台的信息
[root@vm1 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
5 vm1 running
- vm2 关闭
[root@vm2 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 vm2 running
测试:
- 在迁移过程中ping和网页是否终端
- 当前迁移的虚拟机是否自动关机
三,常用热迁移的命令
1.常用命令选项
[root@vm2 ~]# virsh migrate --help
NAME
migrate - 将域迁移到另一个主机中
SYNOPSIS
migrate <domain> <desturi> [--live] [--offline] [--p2p] [--direct] [--tunnelled] [--persistent] [--undefinesource] [--suspend] [--copy-storage-all] [--copy-storage-inc] [--change-protection] [--unsafe] [--verbose] [--compressed] [--auto-converge] [--rdma-pin-all] [--abort-on-error] [--postcopy] [--postcopy-after-precopy] [--migrateuri <string>] [--graphicsuri <string>] [--listen-address <string>] [--dname <string>] [--timeout <number>] [--timeout-suspend] [--timeout-postcopy] [--xml <string>] [--migrate-disks <string>] [--disks-port <number>] [--comp-methods <string>] [--comp-mt-level <number>] [--comp-mt-threads <number>] [--comp-mt-dthreads <number>] [--comp-xbzrle-cache <number>] [--auto-converge-initial <number>] [--auto-converge-increment <number>]
DESCRIPTION
将域迁移到另一个主机中。热迁移时添加 --live。
OPTIONS
[--domain] <string> 域名,id 或 uuid
[--desturi] <string> 客户端(常规迁移)或者源(p2p 迁移)中看到到目的地主机连接 URI
--live 热迁移
--offline 离线迁移
--p2p 点对点迁移
--direct 直接迁移
--tunnelled 管道迁移
--persistent 目的地中的持久 VM
--undefinesource 在源中取消定义 VM
--suspend 部启用目的地主机中的域
--copy-storage-all 使用全磁盘复制的非共享存储进行迁移
--copy-storage-inc 使用增值复制(源和目的地共享同一基础映像)的非共享存储进行迁移
--change-protection 迁移结束前不得对域进行任何配置更改
--unsafe 即使不安全也要强制迁移
--verbose 显示迁移进程
--compressed 实时迁移过程中压缩重复的页
--auto-converge force convergence during live migration
--rdma-pin-all support memory pinning during RDMA live migration
--abort-on-error 在迁移过程中忽略软错误
--postcopy enable post-copy migration; switch to it using migrate-postcopy command
--postcopy-after-precopy automatically switch to post-copy migration after one pass of pre-copy
--migrateuri <string> 迁移 URI, 通常可省略
--graphicsuri <string> 无空隙图形迁移中使用的图形 URI
--listen-address <string> listen address that destination should bind to for incoming migration
--dname <string> 在迁移过长中重新命名为一个新名称(如果支持)
--timeout <number> run action specified by --timeout-* option (suspend by default) if live migration exceeds timeout (in seconds)
--timeout-suspend suspend the guest after timeout
--timeout-postcopy switch to post-copy after timeout
--xml <string> 包含为目标更新的 XML 的文件名
--migrate-disks <string> comma separated list of disks to be migrated
--disks-port <number> port to use by target server for incoming disks migration
--comp-methods <string> comma separated list of compression methods to be used
--comp-mt-level <number> compress level for multithread compression
--comp-mt-threads <number> number of compression threads for multithread compression
--comp-mt-dthreads <number> number of decompression threads for multithread compression
--comp-xbzrle-cache <number> page cache size for xbzrle compression
--auto-converge-initial <number> initial CPU throttling rate for auto-convergence
--auto-converge-increment <number> CPU throttling rate increment for auto-convergence
2.实战命令
[root@localhost ~]# virsh migrate --live --unsafe --verbose vm2 qemu+ssh://192.168.2.13/system
迁移: [100 %]
--live:热迁移
--unsafe:即使不安全也要强行迁移
--verbose:显示迁移进度