本文详细介绍了 KVM 的命令行的安装方式。基于 CentOS 7 的环境下安装 KVM。
$ 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 基础包
$ 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
注意:安装前要设置环境语言为应为,如果是中文的话某些版本可能会报错。
# 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 的常用参数说明
--network 虚拟机网络配置
其中子选项,bridge=br0 指定桥接网卡的名称。
--disk 指定虚拟机的磁盘存储位置
--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地址,下面的截图是家用路由器的例子:
家用路由器一般只能手动指定,企业级路由器可以通过工具批量指定。另外由于我们的虚拟机都在我们的局域网内,所以网卡地址可以自定义,只要互不冲突即可。
这属于一个变通的方案,就是在操作系统启动时,执行指定的脚本,修改网卡的配置文件(比如 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 的常用选项如下:
前面介绍的 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 管理命令
virsh start | shutdown | reboot <虚拟机名称>
启动 | 关闭 | 重启 虚拟机
virsh list --all
显示所有可用虚拟机
virsh dumpxml <虚拟机名称>
打印出当前虚拟机的 xml 模板配置内容
virsh console <虚拟机名称>
链接到虚拟机的控制台,退出虚拟机快捷键 ctrl + ]
virsh undefine <虚拟机名称>
注销虚拟机,但虚拟机的镜像文件需要手动删除,或通过 vol-delete 指令删除。
virsh dominfo <虚拟机名称>
查看虚拟机详情。
出处:https://www.coderxing.com/kvm-install.html
本文为原创文章,采用署名-相同方式共享 3.0 中国大陆(CC BY-SA 3.0 CN))进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。