赞
踩
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。 但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU
Qemu是一套独立的虚拟化解决方案; KVM是另一套虚拟化解决方案, 不过因为这个方案实际上只实现了内核中对处理器(Intel VT, AMD SVM)虚拟化特性的支持,换言之,他缺乏设备虚拟化以及相应的用户空间管理虚拟化的工具, 所以他借用了QEMU的代码并加以精简, 连同KVM一起构成了另外一个独立的虚拟化解决方案, 称之为: KVM+QEMU
Linux 上的用户空间、内核空间和虚机:
Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
QEMU:修改过的被 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等在内的多种 Hypervisor。
Virsh:基于 libvirt 的 命令行工具 (CLI)
Virt-Manager:基于 libvirt 的 GUI 工具
virt-v2v:虚机格式迁移工具
virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等
sVirt:安全工具
RedHat 有两款产品提供 KVM 虚拟化:
Red Hat Enterprise Linux:适用于小的环境,提供数目较少的KVM虚机。
Red Hat Enterprise Virtualization (RHEV):提供企业规模的KVM虚拟化环境,包括更简单的管理、HA,性能优化和其它高级功能。
RedHat Linux KVM 有如下两种安装方式:
1.2.1 在安装redhat linux时安装KVM
在安装过程中安装源选择Virtualization Host的形式去安装
1.2.2 在已有的redhat linux中安装KVM
# 配置软件源 [root@localhost ~]# mount /dev/sr0 /mnt/ mount: /dev/sr0 is write-protected, mounting read-only [root@localhost ~]# cat /etc/yum.repos.d/local.repo [rhel] name=rhel baseurl=file:///mnt gpgcheck=0 enabled=1 # 安装kvm所需的所有组件 [root@localhost ~]# yum groupinstall # Virtualization Client # Virtualization Hypervisor # Virtualization Platform # Virtualization Tools [root@localhost ~]# yum groupinstall "Virtualization*"
安装好之后执行命令 virt-manager 基于 libvirt 的 GUI 工具也就是KVM的web界面
[root@localhost ~]# virt-manager
kvm虚拟机的网络配置有两种模式:桥接模式和NAT模式
两种模式区别如下
1)NAT模式:也是用户模式,数据包由NAT方式通过主机的接口进行传送,可以访问公网,但是无法从外部访问虚拟机网络,所以一般不会用到。
2)Bridge:也就是桥接模式,这种模式允许虚拟机像一个独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。
配置KVM桥接模式
复制出一份网卡 ifcfg-br0
- [root@localhost network-scripts]# cp ifcfg-eno16777736 ifcfg-br0
- [root@localhost network-scripts]# vi ifcfg-br0
- [root@localhost network-scripts]# cat ifcfg-br0
- TYPE="Bridge"
- BOOTPROTO=none
- NAME=br0
- DEVICE=br0
- DELAY=0 # 使用PXE去安装虚拟机时 延迟等于0 解决pxe延迟太长导致获取不到ip的问题
- ONBOOT=yes
- IPADDR=192.168.20.200
- NETMASK=255.255.255.0
- GATEWAY=192.168.20.254
- DNS1=8.8.8.8
配置物理网卡eno16777736 桥接到br0
- [root@localhost network-scripts]# vi ifcfg-eno16777736
- BRIDGE="br0"
重启网络
重启过程中可能会报错 因为rhel7 (rhel8.3中已解决)中NetworkManager不支持网卡的桥接模式,可以关闭NetworkManager然后再重启网络
- [root@localhost network-scripts]# systemctl restart network
- [root@localhost network-scripts]# ping baidu.com
- PING baidu.com (39.156.66.10) 56(84) bytes of data.
- 64 bytes from 39.156.66.10: icmp_seq=1 ttl=128 time=39.0 ms
- 64 bytes from 39.156.66.10: icmp_seq=2 ttl=128 time=37.4 ms
创建qcow2磁盘
KVM中只支持QCOW2格式的磁盘,如果是正常安装的话,默认安装磁盘就会在/var/lib/libvirt/images/里面, 也可以自己手动创建一个qcow2格式的磁盘 并且使用qemu-img创建的磁盘默认是精简模式 然后在安装的时候手动指定磁盘位置
- [root@localhost data]# qemu-img create -f qcow2 VM2.qcow2 10g
- Formatting 'VM2.qcow2', fmt=qcow2 size=10737418240encryption=off cluster_size=65536lazy_refcounts=off
- [root@localhost data]# ls -l
- total 196
- -rw-r--r--. 1 root root 197120 Mar 2223:39 VM2.qcow2
使用命令创建虚拟机
[root@localhost ~]# virt-install -n VM2 -r 1024 --vcpus=2 --location=/root/rhel-server-7.1-x86_64-dvd.iso --disk path=/data/VM2.qcow2 --network bridge=br0
参数详解
- -n: 虚拟机名字
- -r: 内存容量
- --vcpus: vcpu数量
- --location: 安装源位置 iso镜像位置
- --disk # 当磁盘存在时直接指定磁盘位置 当不存在时需要配置size和format
- # 示例 --disk path=/var/lib/libvirt/images/VM2.qcow2,size=10,format=qcow2
- path:安装位置
- size: 磁盘容器
- format: 磁盘格式
- --network 网络
登录创建的虚拟机 测试网络连通性
- # 配置kvm虚拟机网络
- [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens3
- TYPE=Ethernet
- BOOTPROTO=static
- ...
- ONBOOT=yes
- IPADDR=192.168.20.201
- NETMASK=255.255.255.0
- GATEWAY=192.168.20.254
- DNS1=8.8.8.8
- # 重启网络测试网络连通性 可以发现 因为网络设置的是桥接模式 所以kvm虚拟机是通过桥接到物理网卡去访问外网
- [root@localhost ~]# systemctl restart network
- [root@localhost ~]# ping ww.baidu.com
- PING ps_other.a.shifen.com (220.181.38.251) 56(84) bytes of data.
- 64 bytes from 220.181.38.251: icmp_seq=1 ttl=128 time=49.9 ms
同时物理机网络上会出现一个vnet0的网卡 这个就是kvm虚拟机使用的网卡
在KVM虚拟机内部编辑/etc/default/grub文件
- [root@localhost ~]# vi /etc/default/grub
- GRUB_TIMEOUT=5
- GRUB_DEFAULT=saved
- GRUB_DISABLE_SUBMENU=true
- GRUB_TERMINAL_OUTPUT="console"
- GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root rhgb quiet console=ttyS0" # 添加的参数 console=ttyS0
- GRUB_DISABLE_RECOVERY="true"
让grub配置生效再重启KVM虚拟机
- [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
- Generating grub configuration file ...
- Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
- Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
- Found linux image: /boot/vmlinuz-0-rescue-b2608aa19069469b840585520b323eb9
- Found initrd image: /boot/initramfs-0-rescue-b2608aa19069469b840585520b323eb9.img
- done
- [root@localhost ~]# reboot
KVM主机验证 通过console口去连接KVM虚拟机
- [root@localhost qemu]# virsh console VM6
- Connected to domain VM6
- Escape character is ^]
-
- Red Hat Enterprise Linux Server 7.1 (Maipo)
- Kernel 3.10.0-229.el7.x86_64 on an x86_64
-
- localhost login: root
- Password:
- Last login: Wed Mar 22 20:56:28 from 192.168.20.1
- [root@localhost ~]#
给已经创建好的虚拟机增加硬盘
1)创建一块磁盘
- [root@localhost data]# qemu-img create -f qcow2 disk15g.qcow2 15g
- Formatting 'disk15g.qcow2', fmt=qcow2 size=16106127360 encryption=off cluster_size=65536 lazy_refcounts=off
-
- # 查看磁盘信息
- [root@localhost data]# qemu-img info disk15g.qcow2
- image: disk15g.qcow2
- file format: qcow2
- virtual size: 15G (16106127360 bytes)
- disk size: 196K
- cluster_size: 65536
- Format specific information:
- compat: 1.1
- lazy refcounts: false
2)编辑虚拟机配置文件
- #编辑虚拟机 xml文件 (虚拟机的所有配置文件都存放在/etc/libvirt/qemu)
- #找到磁盘相关配置 关键词 disk 新增下面一段
- [root@localhost data]# virsh edit VM6
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <source file='/data/disk10g.qcow2'/> # 磁盘路径
- <target dev='hdc' bus='ide'/>
- <address type='drive' controller='0' bus='1' target='0' unit='0'/>
- # 这行可以不写 添加完后会自动生成
- </disk>
3)登录KVM虚拟机验证
磁盘添加成功
- [root@localhost ~]# lsblk
- NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
- sda 8:0 0 10G 0 disk
- ├─sda1 8:1 0 500M 0 part /boot
- └─sda2 8:2 0 9.5G 0 part
- ├─rhel-swap 253:0 0 1G 0 lvm [SWAP]
- └─rhel-root 253:1 0 8.5G 0 lvm /
- sdb 8:16 0 10G 0 disk # 新添加的10g硬盘
- sr0 11:0 1 1024M 0 rom
1)编辑KVM虚拟机xml文件添加如下配置
- [root@localhost ~]# vi /etc/libvirt/qemu/VM6.xml
- <interface type='bridge'>
- <mac address='52:54:00:4e:08:31'/> # mac地址必须和另一个网卡不同
- <source bridge='br0'/>
- <model type='rtl8139'/>
- </interface>
2)修改完配置文件之后重启libvirt服务并重启KVM虚拟机
- [root@localhost qemu]# systemctl restart libvirtd
-
- [root@localhost qemu]# virsh shutdown VM6
- Domain VM6 is being shutdown
-
- [root@localhost qemu]# virsh start VM6
- Domain VM6 started
3)登录到KVM虚拟机验证可以发现多了一张网卡
# 登录到KVM虚拟机查看状态 [root@localhost ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:4e:08:30 brd ff:ff:ff:ff:ff:ff inet 192.168.20.201/24 brd 192.168.20.255 scope global ens3 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe4e:830/64 scope link valid_lft forever preferred_lft forever 3: ens8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:4e:08:31 brd ff:ff:ff:ff:ff:ff # 同样的本地KVM主机会多一张网卡 vnet1 10: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500 link/ether fe:54:00:4e:08:31 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe4e:831/64 scope link valid_lft forever preferred_lft forever
- virsh list 查看运行的虚拟机
- virsh list -all 查看所有虚拟机
- virsh shutdown vm1 关闭虚拟机
- virsh reboot vm1 重启虚拟机
- virsh start vm1 启动虚拟机
- virsh destroy vm1 强制关机
- virsh save vm1 vm1file 休眠虚拟机 把正在开机的虚拟机的状态,从内存写入硬盘
- virsh restore vm1file 恢复虚拟在状态
- virsh autostart 物理机启动,之后虚拟机就会启动
- virsh undefine 删除虚拟机
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。