千家信息网

kvm介绍与操作文档

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,--虚拟化KVM (kernel-based virtual machine)xen kvm vmare esx openVZ Oracle VM VirtualBox vsphere企业级应用:非本
千家信息网最后更新 2024年11月23日kvm介绍与操作文档

--

虚拟化

KVM (kernel-based virtual machine)

xen kvm vmare esx openVZ Oracle VM VirtualBox vsphere



企业级应用:非本地的
分两部分:一,host虚拟机
二,management端



最早的虚拟化: 分时操作系统 单核CPU 同一时间点只能做一个任务 运行多个进程或线程就是一种虚拟化
cpu运行一个进程,中断,再运行另一个,因为CPU运行速度快,所以用户感觉不到这种切换,这种切换叫上下文切换


常见的虚拟化场景: 游戏模拟器:如使用X86的CPU模拟PSP或街机的CPU,使用X86的硬件模拟PSP或街机的硬件




vmware workstation的虚拟结构图:

OS1 OS2


vmware workstation


OS(内核)

硬件:CPU,mem,hd等


--上面的结构:OS1和OS2的操作,需要通过vmware来转化为进程对OS的请求,再由OS转化为对硬件的请求;
如果这里OS里跑的其它程序如果占用和资源多,那么必然会造成vmware的资源占用少,性能就会不太好,因为vmware的进程和其它进程是同级的


--如何把性能提高:跳过OS这一层
或者虚拟化和os同级
或者硬件本身支持虚拟化


所以就发展成下面这几种虚拟情况:
半(准)虚拟化:
完全虚拟化:




半(准)虚拟化:
客户机器操作系统必须是修改过的,才能使用半虚拟化。
硬件虚拟化技术。

典型代表: Xen


citrix: xen

xen半虚拟化结构图:


domain0 domain1 domain2 ...

xen

硬件:CPU,MEM,HD等



--上面的结构: xend取代了OS,domain0是用来控制xen的一个控制器(跑hypervisor),domain1,domain2...就是虚拟的操作系统;这样转化的效率就会高很多
但要注意的是:上层的domain1,domain2等的内核接口必须要与xen对应才可以;
xen要使用支持xen的专有内核才可以,原有的内核不行,原有的内核是直接与硬件进行通讯的;
开源的linux,freebsd都可以修改,但windows却不行;
xen已经加入到linux内核里去了,从2.6.18之后的内核就有xen
citrix把xen买下来了,所以redhat不再继续开发xen,就买了另一家kvm;并且citrix是微软的白金级合作伙伴,它可以要求MS去修改源代码支持xen,所以只有citrix的xen支持windows



Hypervisor--一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。
Hypervisors是一种在虚拟环境中的"元"操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。
Hypervisors不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。
当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。




全虚拟化:
必须cpu支持硬件虚拟化。
客户机器不需要修改内核,原则上可以安装任何的操作系统。
Intel # cat /proc/cpuinfo | grep vmx
AMD : svm

典型代表: kvm , VMware ESXi



KVM 完全虚拟化结构图:


OS1 OS2

KVM os

硬件:CPU,MEM,HD等

要求操作系统厂商按照它的虚拟化标准和规则编写



=============================================================



红帽官档下载路径

docs.redhat.com
https://access.redhat.com/documentation/en-US/


KVM官方安装文档(english)

Red_Hat_Enterprise_Linux-6-Virtualization_Host_Configuration_and_Guest_Installation_Guide-en-US.pdf


在宿主机安装kvm


1,配置好yum

# vim /etc/yum.repos.d/rhel-source.repo

[rhel-source]
name=rhel6.5
baseurl=file:///yum/
enabled=1
gpgcheck=0


# yum groupinstall "Virtualization"
# yum groupinstall "Virtualization Client"
# yum groupinstall "Virtualization Platform"
# yum groupinstall "Virtualization Tools"


# service libvirtd restart
# chkconfig libvirtd on


# cat /proc/cpuinfo |grep -E "vmx|svm" --查看CPU是否支持intel或AMD的虚拟技术

vmx ---intel
svm ---AMD

# modprobe kvm
# modprobe kvm_intel --如果不支持vmx指令,则加载不支持

# lsmod |grep kvm
kvm_intel 52570 0
kvm 314739 1 kvm_intel




开始安装kvm
1,图形安装

# virt-manager --和xen一样的命令,打开虚拟机管理器

安装名:kvm1 --名字随意
安装方式: --我这里选择第一个,使用iso直接安装

安装路径:/share/soft/rhel-server-6.5-x86_64-dvd.iso --写上iso的路径
OS type: linux
red hat enterprise linux 6


内存大小: 1024M -- 内存如果较小,安装时无法使用图形安装方式,只能使用文本安装方式
cpu个数:2 --不能大于宿主机器的cpu核数

硬盘大小: 12 G --我这里定义12G大小,不马上分配;它的默认路径会在/var/lib/libvirt/p_w_picpaths/kvm1.img;也可以自定义路径


第五步:网络现在只能选择default --这是一个nat网络(私有网络),桥接网络不能选,需要后面单独配置后才能选择




2,命令行交互式安装
[root@li ~]# virt-install --prompt
What is the name of your virtual machine?
kvm2
How much RAM should be allocated (in megabytes)?
800
What would you like to use as the disk (file path)?
/var/lib/libvirt/p_w_picpaths/kvm2.img
How large would you like the disk (/var/lib/libvirt/p_w_picpaths/kvm2.img) to be (in gigabytes)?
12
What is the install CD-ROM/ISO or URL?
/share/soft/rhel-server-6.5-x86_64-dvd.iso




3,直接使用命令行来安装
# virt-install --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/p_w_picpaths/kvm3.img,size=12 -l /share/soft/rhel-server-6.5-x86_64-dvd.iso --network bridge=virbr0




hvm是指全虚拟化
p是指半虚拟化


4,使用kc.cfg自动安装

# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/p_w_picpaths/kvm3.img,size=12 --location=
ftp://172.16.2.9/ --extra-args="ks=nfs:172.16.2.9:/ks/ks.cfg" --network bridge=virbr0


# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm3" -r 800 --vcpus 2 --os-type="linux" --os-variant="rhel6" --disk path=/var/lib/libvirt/p_w_picpaths/kvm3.img,size=12 --location=
ftp://172.16.2.9/ --extra-args="ks=http://172.16.2.9/ks.cfg" --network bridge=virbr0

virt-install --help
帮助手册

[root@i ~]# virt-install --vnc --noautoconsole --arch=x86_64 --hvm -n "kvm4" -r 800 --vcpus 1 --os-type="linux" --os-variant="rhel6" --disk /var/lib/libvirt/p_w_picpaths/kvm4.img,size=9 --location=
ftp://192.168.0.254/pub/rhel6/dvd --extra-args="ks=
ftp://192.168.0.254/kvm.cfg" --network bridge=virbr0

==========================================================


主要的管理命令:
virsh help
virsh help domain
virsh help network
virsh help monitor --因为参数很多,可以用象domain,network,monitor这种关键字,只查看与关键字有关的参数帮助
......




# virsh list
Id Name State
----------------------------------------------------
1 kvm1 running

# virsh list --all
Id Name State
----------------------------------------------------
1 kvm1 running
- kvm2 shut off



# virsh start kvm1 --启动一个虚拟机
# virsh shutdown kvm1 --正常在一分钟后关闭一个虚拟机(如果都没有登录进去,则会马上关闭)
# virsh reboot kvm1 --正常重启一个虚拟机,一样会在关闭时要一分钟
# virsh destroy kvm1 --强制关闭一个虚拟机,类似断电,可以瞬间关闭虚拟机

# virsh save kvm1 /etc/libvirt/qemu/kvm1.save --把kvm1关闭,并把当前状态保存为一个文件 <开启状态>
# virsh restore /etc/libvirt/qemu/kvm1.save --通过保存的文件,恢复当时save时的状态 <关闭状态>

# virsh suspend kvm1 --暂停kvm1的状态
# virsh resume kvm1 --由暂停切换为继续的状态

# virt-viewer kvm1 --连接一个已经启动的虚拟机,并使用图形查看


# virsh console kvm1 --字符连接一个虚拟机,但是现在连接不了;因为需要一个串口的授权才可以;下面的例8会说明

--这里要注意,console连接会卡死在那;只能杀进程退出;但其实是有快捷键的;是ctrl+ ] (也就是右中框号的这个键)来退出


虚拟机相关的文件:
以kvm1为例:
配置文件在:/etc/libvirt/qemu/kvm1.xml
磁盘文件默认在:/var/lib/libvirt/p_w_picpaths/kvm1.img




命令删除一个虚拟机的做法(假设为kvm3)

virsh destroy kvm3
virsh undefine kvm3
rm -rf /var/lib/libvirt/p_w_picpaths/kvm3.img


=====================================================================

网络管理
console连接
克隆
添加或删除硬件
远程虚拟机管理
迁移
快照

================================================================



kvm 网络管理

# virsh help network --只查看与网络有关的帮助参数


# virsh net-list --all
Name State Autostart
-----------------------------------------
default active yes --这是一个NAT网络,私有网络


# virsh net-info default
Name default
UUID 704eb1b7-3feb-4a38-8642-9c3fe2f023bb
Active: yes
Persistent: yes
Autostart: yes
Bridge: virbr0


default网段的配置文件的路径为:
/etc/libvirt/qemu/networks/default.xml


virsh net-destroy default --停掉default网络,由virsh net-list --all去查看,状态变为inactive
virsh net-start default --启动default网络,状态变为active




-----------------------------------------------------



例一:图形增加私有网络

virt-manager打开图形--》edit --》connections details --》 virtual networks--》点左下角的+号增加一个私有网络(选择名字,网络分配地址范围,dhcp的分配范围)
--注意:这里最后一步有三种网络:
1,isolated 相当vmware的hostonly,没有NAT,也没有网关
2,NAT 有网关,有NAT,可以通过宿主上外网
3,routed 也是相当于hostonly,在isolated的基础上就是加了一个网关

把上面的步骤做完后,直接在宿主机用ifconfig或virsh net-list --all,就可以看到新加的网络了


例二:手动加一个私有网络
1,# cp /etc/libvirt/qemu/networks/default1.xml /etc/libvirt/qemu/networks/default2.xml

# vim /etc/libvirt/qemu/networks/default2.xml

default2 --修改名字为default2
243166ddb-e2fd-9983-1997-5e8efdc06c42 --uuid随便修改一下
--virbr1改成virbr2
--MAC地址改一下,只改后面三位
--IP改为101

--dhcp地址范围也改成101的





2,# virsh net-define /etc/libvirt/qemu/networks/default2.xml --定义一下,然后你可以使用virsh net-list --all去查看,状态为inactive,autostart的状态为no
3,# virsh net-start default2 --启动
4,# ifconfig virbr2 |head -2 --查看就有了
virbr2 Link encap:Ethernet HWaddr 52:54:00:AF:27:25
inet addr:192.168.101.1 Bcast:192.168.101.255 Mask:255.255.255.0



# ls /etc/libvirt/qemu/networks/autostart/
default1.xml default.xml

5,# virsh net-autostart default2 --让他开机自动启动

# ls /etc/libvirt/qemu/networks/autostart/ --这里就会多了default2.xml了,其实都是网络配置文件的软链接
default1.xml default2.xml default.xml


刚加的网络配置文件都在下面的目录
# ls /etc/libvirt/qemu/networks
autostart default1.xml default2.xml default.xml




例三:修改一个网络
1,# vim /etc/libvirt/qemu/networks/default2.xml



default2
243166ddb-e2fd-9982-1996-5e8efdc06c42





--我这里把以前的192.168.101.0的IP范围都改成了192.168.102.0







保存后,使用ifconfig virbr1 查看,还是192.168.102.1,没有改变
需要做下面三步:

2,# virsh net-define /etc/libvirt/qemu/networks/default2.xml --定义一个网络,使你的修改被他知道
Network default2 defined from /etc/libvirt/qemu/networks/default3.xml

3,# virsh net-destroy default2 --停一下这个网络
Network default2 destroyed

4,# virsh net-start default2 --再启这个网络
Network default2 started


ifconfig virbr2查看,成功修改成192.168.102.1


上面的第一步和第二步可以统一成一步来做:
# virsh net-edit default2 --使用这个命令打开,修改,然后就直接net-destroy和net-start,不需要去net-define



例四:
图形删除一个网络
virt-manager打开图形--》edit --》connections details --》 virtual networks--》选择你要删除的网络,然后左下角,先停,再删除就可以了


用命令删除一个网络

# virsh net-destroy default2 --停掉要删除的网络,用virsh net-list --all命令去查就变成了inactive状态

# virsh net-undefine default2  --这下就删除了这个网络定义了,并且物理上的配置文件也没了



例五:增加一个桥接网络:
把物理网卡eth0桥接到br0(这个名字是自己定义的)

在rhel6里有一个networkmanger这个服务,可以图形管理所有的网络链接。但这个服务不支持kvm的桥接,所以要关掉这个服务,或者在eth0的配置文件里加上NM_CONTROLLED="no",让eth0不受networkmanger服务的控制




1,在宿主机上创建一个桥接网络

# /etc/init.d/NetworkManager stop
# chkconfig NetworkManager off


# vim /etc/sysconfig/network-scripts/ifcfg-br0 --此文件不存在,br0这个名字是自定义的
DEVICE=br0 --名字对应好
TYPE=Bridge --这里的Birdge,B要大写,后面的irdge要小写
BOOTPROTO=static
IPADDR=172.16.2.9
NETMASK=255.255.0.0
GATEWAY=172.16.1.1
ONBOOT=yes



2,把一个物理网卡加到一个桥接网络里,我这里是把eth0加到br0
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BRIDGE=br0 --这句就是把eth0桥接到br0
NM_CONTROLLED="no" --这句就是让eth0不受networkmanager的控制
ONBOOT="YES"




[root@li ~]# brctl show --重启网络前的情况
bridge name bridge id STP enabled interfaces
virbr0 8000.5254004e4c3f yes virbr0-nic
virbr1 8000.5254004cf4e4 yes virbr1-nic



3,重启网络 /etc/init.d/network restart


# brctl show --重启网络后查看的情况
bridge name bridge id STP enabled interfaces
br0 8000.0030677653f7 no eth0
virbr0 8000.5254004e4c3f yes virbr0-nic
virbr1 8000.5254004cf4e4 yes virbr1-nic




有了上面这些网络,如果你再建立虚拟机,就会有多种网络可选


在宿主机上ifconfig 查看就会有br0这个网卡,有IP;而eth0网卡也有,但没有IP;这是正常的



例六:图形修改一个虚拟机网卡链接


virt-manager打开图形,双击你要修改的虚拟机 --》点击左上的一个!号按钮show hardware detail-->>找个网卡,修改成你想要改的网络(但这里报需要重启虚拟机才能生效)

# virsh shutdown kvm1
# virsh start kvm1 --重启后,就改成了你想要的虚拟网络了



--问题:可能有些人在图形选择时看不到br0,但是brctl show能查看到,那么你在选择时选择specify shared device name,然后再下面手动在bridge name后写br0





例七:文本修改一个虚拟机的网卡连接


1,# vim /etc/libvirt/qemu/kvm1.xml --直接打开修改
2,# virsh define /etc/libvirt/qemu/kvm1.xml --vim修改后要define一下



# virsh edit kvm1 --或者使用edit命令打开修改,就可以替代前面的1,2步
40
--接口类型把network改成bridge
41
42
--把原来默认的network改成bridge,把原来的网络default改成br0
43
44





# virsh shutdown kvm1
# virsh start kvm1 --重启后,虚拟机就是桥接网络了



--KVM现在修改一个网卡的类型(比如NAT改桥接),需要重启才能生效;但如果你是加网卡或者删网卡,是不需要重启生效的(rhel6.5环境下测试为,图形加或删网卡不用重启,但命令加或删网卡要重启)



======================================================================



例八:解决virsh console kvm1 连接不上去的错误

1,在kvm1虚拟机里操作
vim /boot/grub/grub.conf

kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=UUID=f900cbb3-c0cf-440c-94f6-0c208f1da6e0 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0,115200 --在内核参数这里加上console=ttyS0,115200,表示这个串口以115200的波特率可以连接;注意ttyS0里的S一定要大写;


如果小写会造成这个虚拟机启动不了,解决方法:
1,挽救模式进去修改
2,用虚拟化的一个交互编辑工具
# yum install libguestfs-tools
# virt-edit -a /var/lib/libvirt/p_w_picpaths/kvm1.img /boot/grub/grub.conf去修改;
同理这个工具也可以用于完全没有图形的宿主机上无法通过virt-viewer或者ssh(因为找不到虚拟机的IP)或者virsh console来连接虚拟机的情况;
可以先用virt-edit来修改加上上面的console=ttyS0,115200;再用virsh console去连接

--如果上面的virt-edit打不开,可以使用# libguestfs-test-tool来调试错误(我这里以前讲库的时候做了一个小实验,把/lib64/libselinux.so.1改名成了/lib64/libselinux.so.1.bak,然后用软链接链接回来。但在这里就会造成错误。解决方法:mv /lib64/libselinux.so.1.bak /lib64/libselinux.so.1)



2,重启kvm1
# virsh reboot kvm1 --直接destroy再start,可能无法生效,建议这样重启

3,再在宿主机上
# virsh console kvm1 --然后回车就可以直接连你本地的这个虚拟机了;虚拟机没有IP一样可以连


4,退出的方式
exit只是退出登录的用户而已
要完全退出这个console连接,需要使用的是ctrl+ ] (也就是右中框号的这个键)



========================================




kvm 的克隆

--注意:克隆都需要源虚拟机器是关闭或暂停状态


例九:图形克隆
1,先关闭kvm1或 virsh suspend kvm1暂停kvm1(使用virsh resume kvm1恢复)



2,virt-manager--》右键点kvm1--》选择clone-->修改克隆后的名字或其它参数--》点clone



例十:文本克隆
1,拷贝配置文件和磁盘文件
# cp /etc/libvirt/qemu/kvm1.xml /etc/libvirt/qemu/kvm3.xml
# cp /var/lib/libvirt/p_w_picpaths/kvm1.img /var/lib/libvirt/p_w_picpaths/kvm3.img


2,修改拷贝的配置文件
# vim /etc/libvirt/qemu/kvm3.xml



kvm3 --名字改成kvm3
811d69e8-b1d8-cfbf-684a-69f2e0af6b88 --uuid随便改几个数字
1048576
1048576
2

hvm








destroy
restart
restart

/usr/libexec/qemu-kvm


--磁盘路径改成kvm3.img的路径
















--网卡地址随便改下,只改后三位





--第二张网卡也随便改下
















0