centos 7.4 配置KVM 虚拟机

一、KVM环境搭建

1.检测系统是否支持

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

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

2.关闭SELinux

 /etc/sysconfig/selinux 中的SELinux=enforcing修改为 SELinux=disabled  

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,em1enp开头等(我的为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.重启网络服务,如果重启不成功,一般是em1br0配置文件中配置项冲突造成的  

#systemctl restart network.service  

3.查看网络配置是否正确(em1br0信息),推荐使用brctl show命令,如果提示没有brctl命令

#yum -y install bridge-utils安装  

#brctl show   

如果结果中出现类似下面的信息,则表明桥接初步设置成功,主要是第一项,第二项,第四项,常见的情况是第四项为空,原因是物理网卡配置文件中Bridge=br0这一项缺少  

 br0       8000.68f7289acdfd   no      em1  

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

https://www.ilanni.com/?p=7016 

如果外网卡不是外网地址,需要用到防火墙的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    

#测试  

 

 

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

 

 

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

启动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(默认,可以进行设置,后面会说到),有权限的账号密码都可以连接。

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

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

四、虚拟机安装

这一步操作需要注意的几个点:a、局域网内与主机传输文件用scpftp命令,要保证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=window

注意其中硬盘的格式一定要使用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  

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

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

我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,  

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

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

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

开始安装......  

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

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

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

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

 

 

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

 

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安装系统就会出现这种情况

 

 安装好以后直接用 virsh 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 tserver21

2.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

 https://www.cnblogs.com/jython/p/4301954.html

虚拟机相关的学习文档

http://blog.51cto.com/koumm/1288795

 

posted @ 2018-12-20 15:42  屌丝的IT  阅读(885)  评论(0编辑  收藏  举报