【图文】KVM 虚拟机安装详解

发表于2017-07-19   2236次阅读

【图文】KVM 虚拟机安装详解

本文详细介绍了 KVM 的命令行的安装方式。基于 CentOS 7 的环境下安装 KVM。

准备工作

  1. 查看 CPU 是否支持 VT 技术,KVM 是基于 x86 虚拟化扩展(Intel VT 或者 AMD-V) 技术的虚拟机软件。
    $ cat /proc/cpuinfo | egrep 'vmx|svm'
    flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid
    ...

    有返回结果表示支持VT技术,能够安装KVM。

安装 KVM 软件环境

安装 kvm 基础包

$ sudo yum -y install kvm

安装 kvm 管理工具

$ sudo yum install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install

重启宿主机,以便加载 kvm 模块

$ sudo reboot

查看KVM模块是否被正确加载

$ sudo lsmod | grep kvm
kvm_intel             162153  0 
kvm                   525259  1 kvm_intel

配置宿主机网络

默认情况下,KVM 虚拟机是基于 NAT 的网络配置,只有同一宿主机的虚拟键之间可以互相访问,跨宿主机是不能访问的。所以需要和宿主机配置成桥接模式,以便虚拟机可以在局域网内可见。

配置宿主机的桥接模式

创建桥接网卡

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

修改 ifcfg-br0 文件

# vim ifcfg-br0
DEVICE=br0  #将em1改为br0
NAME=br0    #同上
TYPE=bridge #将br0指定为桥接类型

修改 ifcfg-em1, ifcfg-em1 为宿主机的物理网卡配置文件

# vim ifcfg-em1
BRIDGE=br0  #指定桥接网卡的名称

最终 ifcfg-br0 和 ifcfg-em1 的文件内容参考如下:

# cat ifcfg-br0
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br0
UUID=52095a3c-da29-42f5-a310-339e1de29bc0
DEVICE=br0
ONBOOT=yes
TYPE=bridge

# cat ifcfg-em1
BOOTPROTO=dhcp
NAME=em1
UUID=52095a3c-da29-42f5-a310-339e1de29bc0
DEVICE=em1
ONBOOT=yes
BRIDGE="br0"

配置好之后重启网卡

# ifdown br0
# ifdown em1
# ifup em1
# ifup br0

安装虚拟机(Guest OS)

注意:安装前要设置环境语言为应为,如果是中文的话某些版本可能会报错。

# export LANG=en_US.UTF-8
# virt-install --name vm_192.168.0.201 --ram 4096 --vcpus 2 --network bridge=br0,mac=00:00:00:00:00:01 --disk /home/admin/vms/vm1.img,size=60,format=qcow2 --location /home/admin/download/CentOS-7-x86_64-Minimal-1611.iso --graphics none --extra-args='console=ttyS0'

这里为什么将虚拟机名称命名为 vm_192.168.0.201,是为了便于识别,在没有自建DNS服务器的情况下,把 IP 地址作为虚拟机名称的一部分,便于管理和使用。将网卡自定义为 00:00:00:00:00:01 ,以及便于配置虚拟机的网络环境,后面我们会介绍,可以通过路由器设置,将网卡地址和IP地址一一绑定。

virt-install 的常用参数说明

  • --name 虚拟机名称
  • --ram 虚拟机内存大小,以 MB 为单位
  • --vcpus 虚拟机的 CPU 个数
  • --network 虚拟机网络配置

    其中子选项,bridge=br0 指定桥接网卡的名称。

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

    • size,初始磁盘大小,以 GB 为单位。
  • --location 指定安装介质路径,如光盘镜像的文件路径。
  • --graphics 图形化显示配置

    全新安装虚拟机过程中可能会有很多交互操作,比如设置语言,初始化 root 密码等等。graphics 选项的作用就是配置图形化的交互方式,可以使用 vnc(一种远程桌面软件)进行链接。我们这列使用命令行的方式安装,所以这里要设置为 none,但要通过 --extra-args 选项指定终端信息,这样才能将安装过程中的交互信息输出到当前控制台。

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

    比如本例中,我们使用命令行终端的方式进行安装交互,这里就要指定我们的终端设备名称。

更多关于 virt-install 的选项信息参考这篇文章《kvm virt-install命令选项参数说明》

安装过程中会如下交互界面: 有 “!” 标记的选项是需要手动设置的,按对用的数字以此进行设置。

安装完成之后可以通过 virsh console <虚拟机名称> 链接虚拟机的 shell 终端进行管理。

注意,使用 CentOS7 的最小安装,网卡默认是没有启动的,需要手动启动,并且修改为启动时联网,操作方式参考如下:

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes #将 ONBOOT 改为yes,表示启动时联网

$ sudo ifup eth0

# 另外最小安装也没有 ifconfig 工具,需要通过 yum 手动安装
$ sudo yum -y install net-tools

快速创建虚拟机

安装前配置网络环境

前面我们手动配置了初始安装的虚拟机的网络,但如果虚拟机多了,一台一台手动配置会很麻烦,想想一下 BAT 这样量级的互联网企业维护着成千上万的服务器,如果每一台虚拟机都要手动配置网络工作量是无法想象的,而且后期也难以维护,所以就要寻求自动化的解决方案

方案一:通过路由器将IP地址和网卡绑定

路由器都有这样的功能,就是给指定网卡地址分配固定的IP地址,下面的截图是家用路由器的例子: 家用路由器一般只能手动指定,企业级路由器可以通过工具批量指定。另外由于我们的虚拟机都在我们的局域网内,所以网卡地址可以自定义,只要互不冲突即可。

方案二:通过启动脚本指定静态IP

这属于一个变通的方案,就是在操作系统启动时,执行指定的脚本,修改网卡的配置文件(比如 ifcfg-eth0 文件),由于虚拟机的网卡地址是我们自定义的,所以可以通过网卡地址计算出对应的IP地址,比如 00:00:00:00:00:01 就对应 192.168.0.201,00:00:00:00:00:02 对应 192.168.0.202。 (一般企业机房用交换机而不是路由器,而且如果服务器很多,都集中在路由器配置难于维护)

克隆虚拟机

使用 virt-clone 命令克隆虚拟机。该命令主要用于本非,但创建虚拟机非常快。

克隆之前原始虚拟机要暂停。

# virsh shutdown vm_192.168.0.201
# virt-clone -o vm_192.168.0.201 -n vm_192.168.0.202 -f /home/admin/vms/vm2.img -m 00:00:00:00:00:02
# virsh start vm_192.168.0.202

virt-clone 的常用选项如下:

  • -o ORIGINAL_GUEST, 原始虚拟机名称,必须为关闭或者暂停状态
  • -n NEW_NAME, --name 新虚拟机名称
  • -m 为克隆客户机生成新的固定 MAC(网卡) 地址。默认为随机生成 MAC。我们前面在路由器上将自定义的 Mac 地址和IP地址一一对应,设置新的地址能自动获得新的IP。
  • -f 为新客户机使用新的磁盘镜像文件地址。

通过镜像创建虚拟机

前面介绍的 virt-clone 方式只能在单机使用,如果在规模较大的集群下,这种方式就不够灵活方面了。其实可以使用之前创建的虚拟机文件创建新的虚拟机,步骤如下:

创建虚拟机镜像文件

非常简单,只需要复制即可。

# 复用之前建立的虚拟机镜像文件,作为基础镜像文件,以后的虚拟机都要用这个镜像。
$ cp /home/admin/vms/vm1.img /home/admin/vms/basevm.img
# 使用基础镜像文件创建新的虚拟机镜像
$ cp /home/admin/vms/basevm.img /home/admin/vms/vm3.img

创建虚拟机配置文件

# 复用之前建立的虚拟机配置文件,作为基础配置文件。
$ virsh dumpxml vm_192.168.0.201 > /home/admin/vms/basevm.xml
# 创建新的虚拟机配置文件
$ cp /home/admin/vms/basevm.xml /home/admin/vms/vm3.xml
# 编辑虚拟机配置文件
$ vim /home/admin/vms/vm3.xml

主要是修改虚拟机文件名,UUID,镜像地址和网卡地址,其中 UUID 在 Linux 下可以使用 uuidgen 命令生成:

<domain type='kvm'>
  <name>vm_192.168.0.203</name>
  <uuid>e18a0e8f-4560-4122-a8d6-88b032033aed</uuid>
  <devices>
    <disk type='file' device='disk'>
      <source file='/home/admin/vms/vm3.img'/>
    </disk>
    <interface type='bridge'>
      <mac address='00:00:00:00:00:03'/>
    </interface>    
    </devices>
</domain>

注册新虚拟机

注册并启动

$ sudo virsh define /home/admin/vms/vm3.xml
Domain vm_192.168.0.203 defined from /home/admin/vms/vm3.xml
$ sudo virsh start vm_192.168.0.203

测试:

[root@bogon ~]# ping 192.168.0.203
PING 192.168.0.203 (192.168.0.203) 56(84) bytes of data.
64 bytes from 192.168.0.203: icmp_seq=1 ttl=64 time=10.6 ms

[root@bogon ~]# virsh console vm_192.168.0.203
Connected to domain vm_192.168.0.203
Escape character is ^]

CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64

bogon login: root
Password: 
Last login: Thu Jun  8 20:46:48 on ttyS0
[root@192.168.0.203 ~]$ 

小结

如果是批量大规模安装,可以参考上面的例子,镜像文件可以通过 NFS 服务器取得,配置文件可通过 shell 脚本自动生成,编写一些脚本完全可以实现批量的自动部署。 另外,上面只是演示了安装的例子,如果用好虚拟机还要调优,Linux 版本也需要按需裁剪,还有很多工作要做。

KVM 管理

常用 KVM 管理命令

  • virsh start | shutdown | reboot <虚拟机名称>

    启动 | 关闭 | 重启 虚拟机

  • virsh list --all

    显示所有可用虚拟机

  • virsh dumpxml <虚拟机名称>

    打印出当前虚拟机的 xml 模板配置内容

  • virsh console <虚拟机名称>

    链接到虚拟机的控制台,退出虚拟机快捷键 ctrl + ]

  • virsh undefine <虚拟机名称>

    注销虚拟机,但虚拟机的镜像文件需要手动删除,或通过 vol-delete 指令删除。

  • virsh dominfo <虚拟机名称>

    查看虚拟机详情。

扩展阅读