通过实例来学习使用Linux KVM

KVM是Kernel-based Virtual Machine的缩写,从名字上可以知道,KVM是在支持虚拟化硬件环境上,基于Linux操作系统内核的虚拟化技术。

其上的客户操作系统可以完全虚拟化或者半虚拟化。半虚拟化允许多个客户操作系统在一套硬件上运行,可以更有效的使用系统资源,如:内存,处理器。在半虚拟化中,客户端操作系统被修改得适合在虚拟机上运行,最小化那些不适合在虚拟环境中执行的操作的执行时间。

1. 管理VM的工具

KVM包提供特定的工具来管理虚拟机管理程序qemu-kvm

不过建议使用libvirt软件包来管理虚拟机,它相对来说更容易使用。libvirt包含了API库、守护进程libvirtd以及命令行工具virsh。可以使用它来管理多种类型的虚拟机,如:KVM、Xen、VMWare ESX等。更详细的列表请参考libvirt。

下面是其他的一些可以用来管客户端虚拟机的工具:

  • vir-manager(Virtual Machine Manager):管理虚拟机的图形化工具
  • vm-install:菜单驱动的脚本工具,可以用来配置和安装客户操作系统。
  • virt-viewer:用来访问客户操作系统的X viewer工具,支持X509证书认证和SASL认证的TLS/ SSL加密。

2. 检查硬件是否支持虚拟化

使用下面命令检查迎检是否支持虚拟化:

# egrep '(vmx|svm)' /proc/cpuinfo

如果在flags部分看到vms或者svm,那么硬件(CPU)是支持虚拟化技术的。

3. 安装KVM软件包

可以使用你Linux发行版的软件包管理工具来安装KVM(比如:debian上的apt,Redhat和CentOS上的yum)

# yum install kvm

KVM安装完成后,建议安装一下KVM相关工具包,他们可以帮助管理系统上的虚拟机

# yum install qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools

下面是系统上将要安装的KVM相关软件包列表,版本号可能与你的系统略有不同

# rpm -qa | egrep "virt|kvm|qemu"python-virtinst-0.600.0-18.el6.noarchqemu-img-0.12.1.2-2.415.el6.x86_64
libvirt-0.10.2-29.el6.x86_64
virt-viewer-0.5.6-8.el6.x86_64
qemu-kvm-0.12.1.2-2.415.el6.x86_64
libvirt-python-0.10.2-29.el6.x86_64
virt-manager-0.9.0-19.el6.x86_64
virt-top-1.0.4-3.15.el6.x86_64
libvirt-client-0.10.2-29.el6.x86_64
gpxe-roms-qemu-0.9.7-6.10.el6.noarch
virt-what-1.11-1.2.el6.x86_64

所有需要的软件包安装完成后,虽然我们可以使用modprob命令来重新加载模块,但还是推荐重启系统来加载KVM,libvirt相关的模块,

可以使用vm-install(SUSE Linux)或者virt-install(RedHat)虚拟机管理工具来安装客户操作系统。

如果你配置了X服务器(exceedreflectionX或其它X服务器),那么就可以使用图形界面来管理虚拟机,图形界面会使用向导来一步步指导你安装过程。如果没有配置X服务器比如使用ssh(没有用X11-forwarding),那么vm-install会提供命令行交互方式来配置客户操作系统。

4. 创建虚拟机的网络要求

默认情况下,虚拟机只能访问同一个Server的其他虚拟机(以及Server自己)。如果你希望虚拟机可以访问VLAN,你需要为你的主机操作系统配置一个桥接网络(Network Bridge)。

修改/etc/sysconfig/network-scripts/ifcfg-eth0文件,增加一行 BRIDGE=br0 (确保已删除所有静态IP配置)

创建文件 /etc/sysconfig/network-scripts/ifcfg-br0 并添加下面内容:

DEVICE="br0"BOOTPROTO="static"IPADDR="xxx.xxx.xxx.xxx"NETMASK="255.255.255.0"ONBOOT="yes"TYPE="Bridge"NM_CONTROLLED="no"

你可以使用DHCP或者静态IP地址,在上面的配置中我使用的时静态IP地址。如果你的主机上配置了类似于iptables之类的防火墙,需要增加一个规则允许桥接网络的流量。

5. 其他创建虚拟机前要配置的内容

默认情况下虚拟机的镜像文件保存在/var/lib/libvirt/images,请确保那个位置有足够的空间。如果没有足够的空间,你可以在创建虚拟机时将镜像文件保存在其他位置。

/etc/sysctl.conf增加以下配置启用IP转发(IP forwarding):

inet.ipv3.ip_forward=1

修改完成后重新启动系统。

6. 使用virt-install创建虚拟机

使用virt-install工具来创建虚拟机,这个工具可以在交互或非交互模式下使用。

在下面的例子中,我提供了创建虚拟机必须的命令行参数:

# virt-install \ -n myRHELVM1 \
 --description "Test VM with RHEL 6" \
 --os-type=Linux \
 --os-variant=rhel6 \
 --ram=2048 \
 --vcpus=2 \
 --disk path=/var/lib/libvirt/images/myRHELVM1.img,bus=virtio,size=10 \
 --graphics none \
 --cdrom /var/rhel-server-6.5-x86_64-dvd.iso \
 --network bridge:br0

我们逐个解释一下上面的各个参数:

  • -n: 虚拟机的名字
  • --description: 虚拟机的描述,比如:应用服务器、数据库服务器、Web服务器等
  • --os-type:操作系统的类型,可以是:Linux、Solaris、Unix或Windows
  • --os-variant:上面参数所指定的操作系统版本。比如:对于Linux有 rhel6、centos6、ubuntu14、suse11、fedora6等,对于Windows有win2k、win2k8、win8、win7
  • --ram:虚拟机的内存大小
  • --vcpu:虚拟机的处理器个数
  • --disk path:虚拟机镜像文件保存路劲,size的单位是GB。在这个例子中,镜像文件的大小是10GB。
  • --graphic none:这个参数告诉virt-install使用虚拟机的字符终端而不是用图形界面(VNC)。如果你的主机上安装了xmanager,可以忽略这个参数。
  • --cdrom:指定安装镜像的路径。除了cdrom意外也可以使用NFS或者http安装位置。比如:--location=http://www.4byte.cn/pub/rhel6/x86_64
  • --network bridge:br0:这个例子中使用桥接网络适配器br0。当然你可以使用自己的网络配置或者特定的端口来替换桥接网络。如果你计划使用NAT网络可以像这样配置:–network network=VMnetwork1。所有虚拟机的网络配置文件都保存在/etc/libvirt/qemu/networks/

7. 列出所有虚拟机

你可以在grub menu中增加console=tty0 console=ttyS0,115200 在安装过程中将控制台重定向到你的SSH窗口。另外,你也可以使用X server来显示安装过程。

下面的命令用来列出目前主机上已安装的虚拟机,可以看到当前我们已经安装了两个虚拟机:

# virsh list --all Id    Name                           State---------------------------------------------------- 1     dev-dev-vm                     running
 2     myRHELVM1                      running

8. 修改虚拟机配置文件

虚拟机创建完成后,可以在下面位置找到虚拟机的配置文件,配置文件是以"虚拟机名称.xml"来命名的。

# ls -l /etc/libvirt/qemu/myRHELVM1.xml-rw-------. 1 root root 2109 Oct 15 12:30 /etc/libvirt/qemu/myRHELVM1.xml

不建议手工修改这个配置文件,应该使用virsh edit命令来修改,要修改domain(虚拟机)使用以下命令:

virsh edit myRHELVM1

9.连接虚拟机控制台

使用以下命令来连接虚拟机控制台,要退出控制台的话使用Ctrl+]

virsh console myRHELVM1

如果主机上没有安装X server并且网络也没有配置,那么只能通过连接虚拟机的串口控制来登录到虚拟机

配置虚拟机的控制台访问与配置一个物理主机没有什么区别,只需要为虚拟机增加合适的内核启动参数即可。

比如,对于一台RHEL虚拟机(或者CentOS虚拟机),增加以下内容到/etc/grub.conf文件中内核启动部分然后重启虚拟机:

console=tty0 console=ttyS0,115200

或者,也可以在/etc/grub.conf增加以下内容达到同样目的:

serial --unit=0 --speed=115200terminal --timeout=5 serial console

10.显示虚拟机信息

使用以下命令显示虚拟机的信息

# virsh dominfo myRHELVM1Id:             5Name:           myRHELVM1
UUID:           58083ae7-51db-50c3-64d8-bc4c49f642d0
OS Type:        LinuxState:          running
CPU(s):         2CPU time:       207.6sMax memory:     2097152 KiBUsed memory:    2097152 KiBPersistent:     yesAutostart:      disableManaged save:   noSecurity model: selinuxSecurity DOI:   0Security label: system_u:system_r:svirt_t:s0:c698,c788 (permissive)

11. 显示虚拟机内存和CPU使用情况

使用virt-top命令来显示虚拟机内存和CPU使用情况

# virt-topvirt-top 07:14:44 - x86_64 8/8CPU 1600MHz 32094MB3 domains, 2 active, 2 running, 0 sleeping, 0 paused, 1 inactive D:0 O:0 X:0CPU: 0.1%  Mem: 4096 MB (4096 MB by guests)   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME
    5 R    0    0 1546    0  0.0  6.0   3:29.55 dev-dev-vm
    8 R    0    0 1546    0  0.0  6.0   1:42.17 myRHELVM2
    -

12. 启动、关闭以及重启虚拟机

使用virsh命令来启动、关闭以及重启虚拟机

使用下面命令关闭虚拟机:

# virsh shutdown myRHELVM1Domain myRHELVM1 is being shutdown

使用下面命令重启虚拟机:

# virsh reboot myRHELVM1

使用下面命令启动虚拟机,一旦虚拟机启动可以使用 virsh list –all 来查看所有运行中得虚拟机

# virsh start myRHELVM1Domain myRHELVM1 started

来源:How to Install Linux KVM and Create Guest VM with Examples

翻译:4byte.cn

本文链接:http://www.4byte.cn/learning/119992/tong-guo-shi-li-lai-xue-xi-shi-yong-linux-kvm.html

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云原生架构实践

Jenkins 配置CI/CD任务

任务内容是部署/更新一个mysql数据库的容器,类似任务都在yourcompany-database任务视图下。

25050
来自专栏魏艾斯博客www.vpsss.net

centOS 如何安装 lnmp 环境

47540
来自专栏惨绿少年

inotify+rsync实现实时同步

1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服务推送...

25300
来自专栏惨绿少年

inotify+rsync实现实时同步

第1章 数据实时同步介绍 1.1 什么是实时同步:如何实现实时同步 A. 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 B. 发现目录中...

62800
来自专栏Linux运维学习之路

day10、nfs+rsync全网备份及实时同步

题目要求 注意:博主使用的系统为: [root@web01 ~]# uname -a Linux web01 2.6.32-696.el6.x86_64 #1...

76460
来自专栏finleyMa

docker学习系列14 使用haproxy实现mysql集群的负载均衡

在上节中我们创建了 mysql 集群。 实际工作中,我们不希望让某一数据库节点处理所有的请求,这样的话单个负载高,性能差。

91320
来自专栏达摩兵的技术空间

docker下部署jenkins(一)

本文带你在docker中安装jenkins服务,为入门级别的介绍,建议阅读时间10-15min.

1.3K30
来自专栏Rainbond开源「容器云平台」

敲黑板 | 云帮平台maven仓库对接自有仓库

15560
来自专栏叔叔的博客

Docker Swarm

docker-machine ls, 看看有没有虚拟主机,没有就Docker Machine创一个

18020
来自专栏Laoqi's Linux运维专列

安装配置kibana+logstash

18620

扫码关注云+社区

领取腾讯云代金券