一、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的网络配置比较简单,可以参考
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(默认,可以进行设置,后面会说到),有权限的账号密码都可以连接。
这里也有一个坑: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连接虚拟机
如果连接成功,就会出现熟悉的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安装系统就会出现这种情况
安装好以后直接用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
虚拟机相关的学习文档
http://blog.51cto.com/koumm/1288795