一、KVM环境搭建

1.检测系统是否支持

#cat /proc/cpuinfo | egrep 'vmx|svm'  

KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件,所以查看 CPU 是否支持 VT 技术,就可以判断是否支持KVM。有返回结果,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。  

2.关闭SELinux

3.安装KVM环境

1.安装kvm包  

#yum -y install kvm   

2.安装kvm核心包——虚拟操作系统模拟器加速模块  

#yum -y install qemu-kvm qemu-kvm-tools    
#yum -y install libvirt python-virtinst libvirt-python virt-manager 
libguests-tools bridge-utils virt-install  
libvirt:必须要装的核心工具  
virt-manager:虚拟机图形管理工具(宿主机有桌面环境时可以考虑安装,命令操作或者远程控制则不需要)  
bridge-utils:虚拟机与外界通信的命令管理工具  
virt-install:虚拟机安装工具  
pyhon-virtinst: 包含python模块和工具(virt-install,virt-clone和virt-image)

3.重启宿主机,加载kvm相关模块  

#reboot 
4.查看kvm模块是否被正确加载  
#lsmod | grep kvm  
出现以下信息则表示正确加载
 kvm_intel               162153 0  
 kvm                     525259 1 kvm_intel  
 irqbypass               13503  1 kvm   
5.开启kvm服务,并设置开机启动  
#systemctl start libvirtd.service  
#systemctl enable libvirtd.service 
6.查看操作结果,出现Active:active(running)字样则说明运行情况良好  
#systemctl status libvirtd  
#systemctl is-enabled libvirtd

二、网桥搭建

1.查看宿主机网卡信息

#ip a  

或者 #ifconfig a  一般网卡名称为eth0,em1,enp开头等(我的为em1)

复制em0网卡配置文件到br0文件  

#cd /etc/sysconfig/network-scripts/  
#cp ifcfg-em1 ifcfg-br0

2.宿主机物理网卡配置

在修改配置文件之前,最好做好文件备份,以防万一

修改网卡配置文件,需要注意的几点下面都有备注

#vim ifcfg-em1    
TYPE=Ethernet  
DEVICE=em1  
NAME=em1  
TYPE:必须为Ethernet  
DEVICE:设备名称为查看到的物理网卡名称,NAME可有可无    
BRIDGE=br0  
#在原来的ifcfg-em1配置文件中必须添加的(这块网卡桥接到br0设备上)  
#BOOTPROTO=static  
#DEFROUTE=yes  
#PEERDNS=yes  
#PEERROUTES=yes  
ONBOOT=yes  
ONBOOT:系统启动时是否激活网卡,一般都要设置yes    
IPV4_FAILURE_FATAL=no  
IPV6INIT=yes  
IPV6_AUTOCONF=yes  
IPV6_DEFROUTE=yes  
IPV6_FAILURE_FATAL=no  
NM_CONTROLLED=no

NM_CONTROLLED:是否由NetworkManger服务控制该网络接口,修改后立即生效,无需重启,一般设置成no(有时要手动关闭NetworkManager服务),这里设置成yes后面会遇到坑,想深入研究可以试试  

#IPADDR=192.168.8.10  
#GATEWAY=192.168.8.1

因为要设置桥接,这几项IP地址等原来的配置信息必须关闭,在br0配置文件中再设置  

3. 桥接网卡配置

#vim br0
TYPE=Bridge  
DEVICE=br0  
NAME=br0  
TYPE:必须为Bridge(按照规范首字母大写)    
BOOTPROTO=static  
DEFROUTE=yes  
是否使用默认路由
PEERDNS=no  
是否指定DNS,如果使用DHCP协议,默认为yes  
PEERROUTES=no  
是否指定路由
ONBOOT=yes  
同样设置成开机启动br0(虚拟)网卡  
NM_CONTROLLED=no  
同样设置为no,不让NetworkManager服务管理br0网卡  
IPV4_FAILURE_FATAL=no  
IPV6INIT=yes  
IPV6_DEFROUTE=yes  
IPV6_AUTOCONF=yes  
IPADDR=192.168.8.10  
GATEWAY=192.168.8.1

4.查看设置结果

1.关闭NetworkManager服务,也可以用

#service  stop NetworkManager
注:systemctl是通用的服务管理工具,CentOS中使用service命令会自动调用systemctl工具  
#systemctl stop NetworkManager.service  
2.重启网络服务,如果重启不成功,一般是em1和br0配置文件中配置项冲突造成的  
#systemctl restart network.service  
3.查看网络配置是否正确(em1和br0信息),推荐使用brctl show命令,如果提示没有brctl命令
#yum -y install bridge-utils安装  
#brctl show   
如果结果中出现类似下面的信息,则表明桥接初步设置成功,主要是第一项,第二项,第四项,常见的情况是第四项为空,原因是物理网卡配置文件中Bridge=br0这一项缺少  
 br0       8000.68f7289acdfd   no      em1

nat的网络配置比较简单,可以参考

如果外网卡不是外网地址,需要用到防火墙的nat(这是关键)

#iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o br0 -J SNAT --to 192.168.8.10

#iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o br0 -j MASQUERADE(外网卡是多个地址池)

三、VNC环境搭建(这个不是必须的,如果需要连接宿主机图形化界面可以用)

1.安装vnc服务

#yum -y install tigervnc tigervnc-server  
tigervnc包替代了vnc包,有些文章建议同时安装vnc,其实是不需要的  
2.vnc服务配置——宿主机远程控制
将/lib/systemd/system/vncserver@.service文件复制一份  
#cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service    
编辑刚刚复制得到的文件,将文件中的<USER>修改为VNC Client(或者VNC Viewer)连接的账号,我只设置一个用户root,多用户再增加对应的vncserver@:2.service文件即可  
#vim /etc/systemd/system/vncserver@:1.service  
修改以后的文件部分内容(只修改文件下半部分)  
[Unit]  
Description=Remote desktop service (VNC)  
After=syslog.target network.target  
[Service]  
Type=forking  
User=root 
# Clean any existing files in /tmp/.X11-unix environment  
ExecStartPre=/bin/sh -c '-/usr/bin/vncserver -kill :1 > /dev/null 2>&1 || :'  
ExecStart=/user/sbin/runuser -l root -c "/usr/bin/vncserver :1 -geometry 1280*720 -depth 24"  
PIDFile=/home/root/.vnc/%H%i.pid  
ExecStop=-/bin/sh -c '/usr/bin/vncserver -kill :1 > /dev/null 2>&1 || :'    
[Install]  
WantedBy=multi-user.target 
设置vnc连接密码,输入命令vncpasswd以后连续输入两次密码,然后直接连续回车(回车以后还要设置几项,直接回车没有影响,未做深入研究)  
#vncpasswd    
启动vncserver@:1.service并设置开机启动  
#systemctl start vncserver@:1.service  
#systemctl enable vncserver@:1.service    
# 启动VNC服务  
vncserver  
会出现以下信息:其中说明VNC客户端连接账号为root,端口号为5901(文章最后会有端口说明),在局域网内其他电脑上用VNC客户端连接  
New 'dev:1 (root)' desktop is dev:1  
Starting applications specified in /root/.vnc/xstartup  
Log file is /root/.vnc/dev:1.log

#测试  

KVM安装虚拟机 Linux CentOS7的步骤 centos7安装kvm虚拟机详解_运维

 

 

如果出现下面的提示信息,则表明前面的设置是没有问题的,点击Continue继续

KVM安装虚拟机 Linux CentOS7的步骤 centos7安装kvm虚拟机详解_配置文件_02

 

 

这里遇到的一个坑,做个备注:

启动vncserver@:1.service的时候会出现错误  
#systemctl start vncserver@:1.service    
Job for vncserver@:1.service failed because the control process exited with error code. See   "systemctl status vncserver@:1.service" and "journalctl -xe" for details. 
解决办法:删除/tmp/.X11-unix/ 目录,并重新设置一次密码,然后再次启动这个服务即可  
#rm -R /tmp/.X11-unix/  
#vncpasswd  
#systemctl start vncserver@:1.service  
3.vnc服务配置——虚拟机远程控制

上面是VNC连接主机的VNC服务时设置的情况,如果是要远程连接主机安装虚拟机,可以不进行上面的设置,安装虚拟机的时候用主机ip,端口号5900(默认,可以进行设置,后面会说到),有权限的账号密码都可以连接。

这里也有一个坑:5900是VNC里面远程连接虚拟机用的端口(安装和安装好以后都用这个端口),能远程操作安装过程;5901,5902等端口是VNC中设置的远程连接主机的端口号,这里要做好区分。

还有一种用virt-manager虚拟机图形管理的方式安装虚拟机,这里有个前提,主机必须安装好GNOME等桌面环境,CentOS中安装有点复杂,很难安装成功(踩过的第一个坑),个人觉得还是用VNC的方式安装比较好,服务器安装桌面环境多少有点累赘。

四、虚拟机安装

这一步操作需要注意的几个点:a、局域网内与主机传输文件用scp或ftp命令,要保证ISO镜像文件在主机上有操作权限的目录下,比如 /home等;b、不管安装什么系统的虚拟机,创建的磁盘类型,分配的虚拟内存等参数可能有所不同,但有几个参数必须要正确对应,否则安装不成功。需要注意的几个参数:--disk,--cdrom或者--location,--cpu(这个必须和主机的cpu型号一直),--network(首先要确定需要安装虚拟机网络的类型,是Bridge模式还是NAT模式),--graphics和--os-type。

1. 创建磁盘(安装系统的空间)

在KVM中安装操作系统一般是分为三步:

创建虚拟机所需要的硬盘,使用qemu-img命令

开始虚拟机,使用virt-install命令

按照正常安装系统,进行安装
现在开始第一步,创建虚拟机的硬盘。使用如下命令:
#qemu-img create -f qcow2 windows.img  10G
#qemu-img info /bigdata/vm/windows.img
image: /bigdata/vm/windows.img 
file format: qcow2  
virtual size: 10G (10737418240 bytes)  
disk size: 0

创建类型为的qcows2磁盘,10G容量其实没有意义,还有另外两种格式img和raw,区别后面补充

2.virt-install命令以及VNC远程控制安装虚拟机

Windows系统安装

#virt-install --virt-type kvm  --name  win2016 --ram 10240 --cdrom=/bigdata/iso/windows_2016.iso  --boot cdrom --vcpus 16  --network  network=default  --graphics vnc,listen=0.0.0.0,port=5900 --disk path=/bigdata/vm/windows2016.raw,bus='ide' --noautoconsole --os-type=windows 

注意其中硬盘的格式一定要使用IDE格式,如果没有添加格式说明的话,默认是virtio格式。如果使用virtio格式的话,需要加载virtio驱动。网络模式是默认的NAT 如果需要桥接 --network bride=br0

  

 新版本的写法  

--name      指定虚拟机名称  

--ram       虚拟机内存大小,以 MB 为单位  

--vcpus     分配CPU核心数,最大与实体机CPU核心数相同  

–-vnc       启用VNC远程管理,一般安装系统都要启用。  

–-vncport   指定VNC监控端口,默认端口为5900,端口不能重复。  

–-vnclisten  指定VNC绑定IP,默认绑定127.0.0.1,这里改为0.0.0.0。  

--network   虚拟机网络配置默认是default(nat ),bridge=br0 指定桥接网卡的名称。  

--os-type=linux,windows 

--os-variant=rhel7.2  

--disk 指定虚拟机的磁盘存储位置  

size,初始磁盘大小,以 GB 为单位。  

--location 指定安装介质路径,如光盘镜像的文件路径。  

--graphics 图形化显示配置  

--cdrom指定安装镜像iso  

全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化

graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。  

我们这列使用命令行的方式安装,所以这里要设置为

这样才能将安装过程中的交互信息输出到当前控制台。

--extra-args 根据不同的安装方式设置不同的额外选项  

此时如果virt-install命令参数没有问题,会有提示信息:  

开始安装......  

域安装仍在进行。您可以重新连接

到控制台(virsh console)以便完成安装进程  

执行以后只看到提示连接成功,其他没有变化,所以不用执行这个命令,暂时没发现有什么用处

局域网内的任意一台同网段的电脑通过vnc client或者vnc viewer连接虚拟机  

KVM安装虚拟机 Linux CentOS7的步骤 centos7安装kvm虚拟机详解_数据结构与算法_03

 

 

如果连接成功,就会出现熟悉的windows安装界面:

KVM安装虚拟机 Linux CentOS7的步骤 centos7安装kvm虚拟机详解_桥接_04

 

3. 文本安装,不需要宿主机图像接口,也不需要VNC(操作复杂,不推荐使用)

#virt-install \
--name centos7 \
--ram 4096 \
--disk path=/bigdata/vm/centos7.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant rhel7 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://192.168.8.10/RHEL7' \
--extra-args 'console=ttyS0,115200n8 serial' Starting install...
# start installation

退出按^]

进入

virsh console  centos7

如果是在安装的时候没有选择输出的终端(--extra-args 'console=ttyS0,115200n8 serial')

需要用console连接

http://www.aikaiyuan.com/5084.html

选择文本安装模式
Text mode
  Unable to read group information from repositories.
  This is a problem with the generation of your install tree.之前报这个错,是因为网络安装中yum 用的仓库重新加载过

解决办法:还原镜像中repodata下的repomd.xml文件,如果你有自定义的rpm包加入源,

然后createrepo --update 后再用ks安装系统就会出现这种情况

 

安装好以后直接用clonse  centos7 连接,优化好可以用SSH 连接。

 http://www.server-world.info/en/note?os=CentOS_7&p=kvm&f=2

 

五、虚拟机管理—命令行方式

#virsh list                 # 查看在运行的虚拟机  

#virsh dumpxml vm-name      # 查看kvm虚拟机配置文件  

#virsh edit vm-name         # 修改虚拟机的配置文件(部分选项修改以后start虚拟机就可以生效)  

#virsh start vm-name        # 启动kvm虚拟机  

#virsh shutdown vm-name     # 正常关机   

#virsh destroy vm-name      # 非正常关机,强制关闭虚拟机(相当于物理机直接拔掉电源)  

#virsh undefine vm-name     # 删除vm的配置文件    

#ls  /etc/libvirt/qemu  

查看删除结果,配置文件被删除,但磁盘文件不会被删除

#virsh define file-name.xml # 根据配置文件定义虚拟机  

#virsh suspend vm-name      # 挂起,终止  

#virsh resumed vm-name      # 恢复被挂起的虚拟机  

#virsh autostart vm-name    # 开机自启动vm  

#virsh console <虚拟机名称>   # 连接虚拟机  

彻底删除虚拟机的方法:

虚拟机启动的情况下先关闭虚拟机

#virsh destroy vm-name  

删除vm配置文件  

#virsh undefine vm-name  

查看删除结果(是否删除了配置文件),如果没有vm-name.xml文件则删除成功  

#ls /etc/libvirt/qemu 

 删除虚拟机磁盘(安装的时候创建的kvm.raw文件)  

#rm -rf /bigdata/vm/kvm.raw 

显示虚拟机屏幕:

#virt-viewer vm1

克隆虚拟机:

#virt-clone -o vm1 -n vm5 -f /bigdata/vm/vm5.img -d

远程linux通过virt-viewer+ssh管理虚拟机

#virt-viewer -c qemu+ssh://root@192.168.8.40/system vm5 

 

虚拟机的迁移

1.Vmware ESXi到KVM的迁移

在 KVM 主机上创建或修改 $HOME/.netrc 文件,添加 VMware ESXi 服务器的用户名和密码。
# cat ~/.netrc
machine 192.168.2.251 login root password xxxxxx
[root@target ~]# chmod 0600 ~/.netrc
[root@target ~]# virt-v2v -ic esx://192.168.2.251/?no_verify=1 -op virhost -b br0 ipserver  
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 401 Unauthorized
** HEAD https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK
** GET https://192.168.2.251/folder/tserver21/RHEL4.6-flat.vmdk?dcPath=ha-datacenter&dsName=ESX35-bak%3Astorage1 ==> 200 OK (2084s)
unknown filesystem /dev/hda
unknown filesystem /dev/fd0
virt-v2v: Installation failed because the following files referenced in the configuration file are required, but missing: rhel/4/kernel-smp-2.6.9-89.EL.i686.rpm
virt-v2v: 非 virtio 驱动程序配置的 tserver21#所有选项可通过配置文件/etc/virt-v2v.conf来指定
#-op:指定用于转换后的存储域(pool),virhost
#-b:指定网络为网桥br0
#-ic:指定要转换的源地址# virsh list --all
 Id 名称               状态
----------------------------------
  1 node4                running
  - node5                关闭
  - tserver21            关闭
  - win8                 关闭
# virsh start tserver212.KVM到KVM迁移
[root@target kvm_node]# virt-v2v -ic qemu+ssh://192.168.32.179/system -op virhost -b br0 node6
root@192.168.32.179's password:
root@192.168.32.179's password:
unknown filesystem label SWAP-vda3
virt-v2v: The connected hypervisor does not support a machine type of rhel5.4.0. It will be set to the current default.
virt-v2v: virtio 驱动程序配置的 node6[root@target kvm_node]# virsh list --all
 Id 名称               状态
----------------------------------
  1 node4                running
  - node5                关闭
  - node6                关闭
  - tserver21            关闭
  - win8                 关闭[root@target kvm_node]# virsh start node6

 

常见的错误:

device eth0 does not seem to be present, delaying initialization

KVM虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 does not seem to be present, delaying initialization,然后想到是不是ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡,还是一样的错误,随后网上查了下资料,把/etc/udev/rules.d/70-persistent-net.rules 删除后重启机器就可以了,因为这个文件绑定了网卡和mac地址,所以换了网卡以后MAC地址变了,所以不能正常启动,也可以直接编辑这个配置文件把里面的网卡和mac地址修改乘对应的,不过这样多麻烦,直接删除重启,它会自动生成个。

Vim /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0的配置文件里保存了以前的MAC地址,就把这一行删除掉在重启网卡
/etc/udev/rules.d/70-persistent-net.rules 删除后重启机器
虚拟机的快照和备份
 KVM可以使用两种方法生成虚拟机的快照。
方法一、使用qemu-img snapshot命令进行生成快照
方法二、使用virsh snapshot-create-as命令进行生成快照

其实经过我的测试,发现使用qemu-img snapshot命令生成快照后,即使恢复快照也是没有用的。虚拟机还是当前的状态,而不是快照之前的状态。不知道为什么,而且还不稳定,经常报错。

 注意要使用KVM的快照功能,虚拟机的硬盘一定要是qcow2格式,否则无法使用快照功能。

有关硬盘的格式,可以在创建虚拟机硬盘时指定,也可以使用相关命令进行转换。

在这篇文章中,我们重点介绍有关virsh snapshot-create-as命令生成快照。

我们来介绍使用virsh snapshot-create-as来生成虚拟机快照的方法。

#virsh
为虚拟机centos创建快照,快照名称为centos7-sn1
virsh#snapshot-create-as centos7 centos7-sn1 
查看虚拟机centos所有的快照
virsh#snapshot-list centos7
查看虚拟机centos快照centos7-sn1
virsh#snapshot-info centos7 centos7-sn1
如果要恢复虚拟机快照

我们只需要使用virsh snapshot-revert命令即可。但是在使用virsh snapshot-revert命令恢复虚拟机centos状态之前,我们必须要把虚拟机关闭。

关闭虚拟机,我们可以使用#virsh destroy centos7命令进行强制性关机,我们也可以使用#virsh shutdown 命令进行关机。

注意要使用virsh shutdown命令进行关闭虚拟机的话,一定要安装acpid服务。同时经过多次测试证明如果虚拟机有快照的话,就无法使用virsh shutdown/reboot,命令进行关机或者重启。

安装acpid服务

yum -y install acpid 
查看acpid服务是否运行
 #/etc/init.d/acpid status 
强制关闭虚拟机centos
#virsh destroy centos7
恢复虚拟机centos7的快照
 #virsh snapshot-revert centos7  centos7-sn1
注意:快照恢复完毕后,强烈建议把现在的虚拟机关闭重新启动下。
如果要删除一个快照,可以使用如下命令:
 snapshot-delete centos7 centos7-sn1