KVM虚拟化

一、什么是虚拟化

最常见的VMware Workstation Pro、Oracle VM VirtualBox就是可以实现虚拟化的软件。虚拟化,把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源。

虚拟化技术分为:全虚拟化和半虚拟化。

·早期的CPU硬件不支持虚拟化,虚拟机上的操作系统(guestos)想要使用cpu资源,需要通过VMM(Hypervisor,虚拟机管理器)来翻译指令,这个过程比较耗费资源,这种虚拟化技术叫做全虚拟化。

·半虚拟化技术,通过修改guestos内核,让guestos可以直接使用cpu资源,而不需要翻译指令了,从而节省了资源,但修改内核比较鸡肋(XEN)。

现在的CPU基本直接支持虚拟化,不需要通过VMM翻译指令了,也就无所谓半虚拟化和全虚拟化了。

二、KVMKernel-bases Virtual Machine

结构简单,包含两个部分:

·设备驱动/dev/kvm

·针对模拟PC硬件的用户控件组件

·KVM需要CPU中虚拟化功能的支持,只可在具有虚拟化的CPU上运行,即具有VT功能的Intel CPU和具有AMD-V功能的AMD CPU。

三、KVM虚拟化特性

·嵌入到Linux内核中(提高兼容性)

·代码级资源调用(提高性能)

·虚拟机就是一个进程(内存易于管理)

·直接支持NUMA技术(提高扩展性)

·Red Hat收购了KVM

·保持开源发展模式

·更好的商业支持及服务保障

四、RHEL7.0安装KVM

实验环境:RHEL7.0 RAM:4G  ip:192.168.10.201 主机名:node1

所需软件:虚拟机VMware Workstation 14 Pro、TightVNC

实验关闭防火墙和SELinux

0、查看是否cpu支持虚拟化

[root@node1 ~]# grep -E ‘(vmx|svm)’ /proc/cpuinfo

blob.png

1、安装kvm相关包

kvm是内核的一个模块,模块只需调用即可。

[root@node1 ~]# yum install -y qeum-kvm qemu-kvm-tools virt-manager libvirt virt-install

或者yum install -y virt-* libvirt bridge-utils qemu-img

2、创建硬盘

[root@node1 ~]# qemu-img create -f raw /opt/rhel-7.0-x86_64.raw 10G

blob.png

-f:格式,这里使用raw格式

/opt/rhel-7.0-x86_64.raw:磁盘存放路径

10G:磁盘的大小

3、启动libvirtd服务

查看kvm模块:[root@node1 ~]# lsmod | grep kvm

启动libvirtd服务:[root@node1 ~]# systemctl start libvirtd

设置开机启动:[root@node1 ~]# systemctl enable libvirtd

4、准备rhel7.0 ISO镜像。

4.1、准备rhel7.0的光盘

blob.png

设置完成之后,光盘放在/dev/cdrom中

4.2、制作iso镜像

[root@node1 ~]# dd if=/dev/cdrom of=/opt/rhel-7.0.iso

7311360+0 records in

7311360+0 records out

3743416320 bytes (3.7 GB) copied, 169.061 s, 22.1 MB/s

5、图形化安装

[root@node1 ~]# virt-install –name mykvm-rhel-7.0 –virt-type kvm –ram 1024 –cdrom=/opt/rhel-7.0.iso –disk path=/opt/rhel-7.0-x86_64.raw –network network=default –graphics vnc,listen=0.0.0.0 –noautoconsole

blob.png
blob.png

报错:ERROR    Error in network device parameters: Virtual network ‘default’ does not exist: Network not found: no network with matching name ‘default’

默认网络不存在

解决方法:查找一个跟libvirt相关的default文件

[root@node1 ~]# find / -name “default.xml”

blob.png

设置default网络:

[root@node1 ~]# virsh net-define /usr/share/libvirt/networks/default.xml

[root@node1 ~]# virsh net-start default

blob.png

重新运行安装命令:

blob.png

6、打开TightVNC

TightVNC下载地址:http://www.tightvnc.com/download.php

blob.png

输入远程主机:192.168.10.201:5900

然后连接。进入非常熟悉的图形化安装界面:

blob.png

如果要设置网卡名字为et0的话,选择第一项安装的时,再按Tab键,输入:net.ifnames=0  biosdevname=0

然后按回车键

blob.png

如果不需要修改网卡名,则选择Install Red Hat Enterprise Linux 7.0直接按回车键进入系统安装。这里使用默认的,不修改网卡名。

blob.png

安装过程略。

这个虚拟机的XML放在/etc/libvirt/qemu/目录中

[root@node1 qemu]# ls /etc/libvirt/qemu

mykvm-rhel-7.0.xml  networks

五、KVM管理

·查看所有虚拟机:[root@node1 ~]# virsh list –all

blob.png

·启动虚拟机:[root@node1 ~]# virsh start mykvm-rhel-7.0

·编辑虚拟机:[root@node1 ~]# virsh edit mykvm-rhel-7.0

blob.png

可以根据实际情况修改这个配置文件。

1、修改CPU(只能在7.x版本),当前是1,最大是4

<vcpu placement=’auto’ current=”1″>4</vcpu>

修改配置需要虚拟机重启才能生效。

重启:关闭再启动

[root@node1 ~]# virsh shutdown mykvm-rhel-7.0

Domain mykvm-rhel-7.0 is being shutdown

[root@node1 ~]# virsh start mykvm-rhel-7.0

Domain mykvm-rhel-7.0 started

设置2个cpu:

[root@node1 ~]# virsh setvcpus mykvm-rhel-7.0 2

用TightVNC登录虚拟机,然后激活cpu

echo 1 > /sys/devices/system/cpu/cpu1/online

查看一下:

blob.png

只支持热添加,不能热减少。

2、修改内存:

[root@node1 ~]# virsh edit mykvm-rhel-7.0

<memory unit=’KiB’>2048576</memory>

重启后:

查看当前内存:

[root@node1 ~]# virsh qemu-monitor-command mykvm-rhel-7.0 –hmp –cmd info balloon

balloon: actual=1024

修改内存为600M:

[root@node1 ~]# virsh qemu-monitor-command mykvm-rhel-7.0 –hmp –cmd  balloon 600

blob.png

3、硬盘

全镜像模式:raw

稀疏模式:qcow2

[root@node1 ~]# qemu-img –help

Supported formats: vvfat vpc vmdk vhdx vdi sheepdog sheepdog sheepdog raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd nbd nbd iscsi gluster gluster gluster gluster dmg cow cloop bochs blkverify blkdebug

硬盘支持的格式

4、网络设置

4.1在node1中添加网桥

 [root@node1 ~]# brctl addbr br0

blob.png

4.2将node1的eno16777736网卡添加到br0中

[root@node1 ~]# brctl addif br0 eno16777736

blob.png

4.3配置br0、eno16777736网卡

blob.png

复制/etc/sysconfig/network-script/目录中的ifcfg-eno16777736文件,命名为ifcfg-br0

[root@node1 network-scripts]# cp ifcfg-eno16777736 ifcfg-br0

blob.png

编辑ifcfg-br0,其内容为:

TYPE=Bridge

BOOTPROTO=none

NAME=br0

DEVICE=br0

ONBOOT=yes

IPADDR0=192.168.10.201

PREFIX0=24

GATEWAY0=192.168.10.2

DNS1=119.29.29.29

DNS2=182.254.116.116

编辑ifcfg-eno16777736文件,其内容:

DEVICE=eno16777736

NAME=eno16777736

ONBOOT=yes

BRIDGE=br0

之后重启网络: # systemctl restart network

如果重启网络失败,就重启机子。

如果是临时配置,上面步骤4.2、4.3的操作可以使用一条命令完成:

[root@node1 ~]# brctl addif br0 eno16777736 && ip addr del dev eno16777736 192.168.10.201/24 && ifconfig br0 192.168.10.201/24 up && route add default gw 192.168.10.2

blob.png

这是临时配置,机子重启后失效。建议还是修改配置文件可以永久保存的

5、从node1中登录kvm虚拟机

5.1配置console:

修改/etc/default/grub,把GRUB_CMDLINE_LINUX_DEFAULT这一行添加:console=ttyS0

blob.png

保存退出

更新grub2:

[root@node1 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

重启。

5.2登录:

重启之后,得运行虚拟机才可以登录。

[root@node1 ~]# systemctl start serial-getty@ttyS0

[root@node1 ~]# virsh start mykvm-rhel-7.0

[root@node1 ~]# virsh console mykvm-rhel-7.0

进入系统登录界面:

blob.png

6、删除虚拟机

先停止虚拟机,再删除:virsh undefine 名称

Ctrl+]:可以从kvm虚拟机中退出。

补充:RHEL7.3非图形化安装kvm

实验环境:rhel7.3,主机名:node2,ip:192.168.10.202

1、安装kvm包

#yum install -y virt-* libvirt bridge-utils qemu-img

2、磁盘挂载

blob.png

添加一块硬盘用于安装kvm虚拟机,格式化为ext4,挂载到/kvm_data目录。事先创建好/kvm_data目录。

3、准备iso镜像

3.1编辑虚拟机设置,选择下载好的rhel7.3 iso镜像

blob.png

3.2使用dd命令制作iso镜像,放在/tmp目录中

#dd  if=/dev/cdrom  of=/tmp/ rhel7.3.iso

4、网络设置

将复制一份ifcfg-ens33文件,名字为ifcfg-br0

[root@node2 ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-br0

blob.png

ifcfg-ens33文件的内容为:

NAME=”ens33″

DEVICE=”ens33″

ONBOOT=yes

BOOTPROTO=none

BRIDGE=br0

ifcfg-br0文件的内容为:

NAME=”br0″

DEVICE=”br0″

ONBOOT=yes

NETBOOT=yes

BOOTPROTO=static

TYPE=Bridge

IPADDR=192.168.10.202

NETMASK=255.255.255.0

GATEWAY=192.168.10.2

DNS1=119.29.29.29

DNS2=114.114.114.114

配置好ifcfg-ens33、 ifcfg-br0文件之后重启网络

[root@node2 ~]# systemctl restart network

5、安装

[root@node2 ~]# virt-install –name=kvm01 –virt-type kvm  –memory=512,maxmemory=1024 –vcpus=1,maxvcpus=2 –os-type=linux –os-variant=rhel7.3 –location=/tmp/rhel7.3.iso –disk path=/kvm_data/kvm01.img,size=10 –bridge=br0 –graphics=none –console=pty,target_type=serial –extra-args=”console=tty0 console=ttyS0″

等待一会,进入以下界面:

blob.png

·设置时区:输入2,按回车键,输入1,按回车键,输入5

blob.png
blob.png

输入5,按回车键,

blob.png

输入62,按回车键

·磁盘设置:

blob.png

输入5,按回车键,进入:

blob.png

输入c,按回车键,进入:

blob.png

输入c,按回车键,进入:

blob.png

输入1,按回车键,再输入c,按回车键。

·设置root密码

blob.png

输入8,按回车键,进入:

blob.png

设置好密码,之后输入yes,按回车键。回到主页面:

blob.png

输入b,按回车键,开始安装系统。

等待几分钟之后,安装完成:

blob.png

按回车键,系统将重启。不单kvm的虚拟机重启,就连实验机(node2)也跟着重启。node2重启后,远程ssh登录。

查看kvm虚拟机:

blob.png

启动虚拟机:

[root@node2 ~]# virsh start kvm01

Domain kvm01 started

连接虚拟机:

[root@node2 ~]# virsh console kvm01

Connected to domain kvm01

Escape character is ^]

blob.png

卡在这里。

解决方法:修改/etc/default/grub.cfg文件,如下图所示,在文件GRUB_CMDLINE_LINUX_DEFAUL这一行中添加console=ttyS0

blob.png

[root@node2 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

[root@node2 ~]# init 6

重启之后,启动kvm虚拟机,并连接

[root@node2 ~]# virsh start kvm01

Domain kvm01 started

连接虚拟机:

[root@node2 ~]# virsh console kvm01

blob.png

输入root和密码,按回车键进入系统。

配置网络:

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

blob.png

修改内容如上图所示。

因为宿主机的ip网段是:192.168.10.0,并且使用了桥连方式,所以kvm里面的虚拟机的ip必须在192.168.10.0网段中。

重启网络:[root@localhost ~]# systemctl restart network

ping www.baidu.com

blob.png

OK网络正常了。

至此。kvm安装系统成功。

Ctrl+]:可以退出kvm虚拟机。

使用VNC连接KVM虚拟机的方法:

1、修改宿主机的qemu配置

[root@node2 ~]# vim /etc/libvirt/qemu.conf

将#vnc_listen = “0.0.0.0”的#去掉,如下图所示:

blob.png

保存退出。

2、由于安装的时候没有启用图形界面,所以的修改kvm01机子的配置

[root@node2 ~]# virsh edit kvm01

添加以下内容:

<graphics type=’vnc’ port=’5900′ autoport=’no’ listen=’0.0.0.0′>      

  <listen type=’address’ address=’0.0.0.0’/>       

</graphics>

如下图所示:

blob.png

保存退出。

关闭kvm01机子再开启。

并且宿主机node2清空防火墙,关闭selinux。

如果不清空或关闭防火墙,不关闭selinux,则:

设置防火墙规则和selinux:

·防火墙设置:

[root@node2 ~]# firewall-cmd –permanent –add-port=5900/tcp

[root@node2 ~]# firewall-cmd –reload

·SELinux设置:

[root@node2 ~]# semanage port -a -t http_port_t -p tcp 5900

如果semanage命令不存在,则装selinu相关包:

[root@node2 ~]# yum  install  setools*  policycoreutils*  -y

blob.png

3、打开TightVNC

blob.png

输入ip:端口,点击Connect即可。

blob.png

输入root和密码即可登录系统。

发表回复