免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2938 | 回复: 0
打印 上一主题 下一主题

[KVM] 让KVM飞——瑞士军刀 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-09 17:32 |只看该作者 |倒序浏览
本帖最后由 风影刃 于 2013-07-09 17:37 编辑

这是让KVM飞系列的第三篇,
[url=让KVM飞——初识 http://bbs.linuxtone.org/forum.p ... 24347&fromuid=18819]让KVM飞——初识[/url]
[url=让KVM飞——最佳实践 http://bbs.linuxtone.org/forum.p ... 24353&fromuid=18819]让KVM飞——最佳实践[/url](觉得帖子太长,文学功底驾驭不了,导致结构有点乱,再加上是一篇入门的帖子,所以就不转帖过来了,想看的朋友可以直接点链接:wink:

KVM的管理与使用的时候,接触最多的可能就是虚拟机的虚拟磁盘,因为只有它是具象的,其他资源都是抽象的。如何灵活的操作KVM的虚拟磁盘,对于管理虚拟机来说是至关重要的。下面要介绍的是我认为可以在KVM中称王称霸称王八的瑞士军刀级别的工具——libguestfs
为了方便,使用yum安装:
  1. yum install libguestfs
复制代码
使用-a 参数添加一个虚拟磁盘,用guestfish挂载
  1. guestfish -a root.img
复制代码
进入到一个shell中,输入 run 回车,进行加载,加载需要的时间与虚拟磁盘的大小有关。此处无返回信息。然后通过内部命令 mount 挂载虚拟机的分区到挂载点上。
注:此处进入到另一个Shell的终端,所以与我们本地的命名空间是不同的,所以这里挂载的根并不是操作系统上的根。
你也可以使用更便捷的方式。直接加入-i参数,它会自动的挂载分区。
值得留意的是,在我使用-i自动挂载的时候,有一个vdb找不到文件,因为在我虚拟机内部的fstab是有vdb1这个分区的挂在信息的,由此可以判定,加入-i参数是,会跟去fstab挂载指定的分区。
上边的命令就是我通过内部shell直接执行的cat,获取的虚拟机内部的文件信息。
亦可以使用其他命令,操作与正常的Shell无明显差别。
只是这样挂载使用还是略有些不方便,所以,基于guestfish开发出一些脚本和命令工具。
比如挂载虚拟机磁盘文件,我们可以使用guestmount
之后我们就可以和对一个正常的文件系统处理操作了。比如我们想在虚拟机创建之前对其做初始化操作,配置ip、域名、或者配置一些环境变量之类的,都可以通过这种方式挂载注入。
而且,此方法并不区别qcow2还是raw……
不过如果你认为仅仅如此的话呢,就大错特错了……

你可以用
  1. yum -y install virt-*
复制代码
安装基于guestfish一系列的工具。
  1. virt-df –a root.img
复制代码
可以直接查询虚拟机磁盘的使用状态。
-d参数可以加domain,返回虚拟机内所有磁盘的挂载和使用情况
  1. virt-cat -a root.img /etc/sysconfig/network-scripts/ifcfg-eth0
复制代码
     可以直接查看虚拟磁盘内部某个文件的内容
  1. virt-edit  root.img /etc/sysconfig/network-scripts/ifcfg-eth0
复制代码
         可以直接编辑虚拟机磁盘内部的某个文件的内容
virt-resize 可以离线修改虚拟机分区大小(后边的情景分析会用到)
virt-what   可以获取虚拟机上层的Hypervisor信息。在Host上执行没有返回值,在虚拟机内执行则会返回虚拟机Hyper的名称。
(这个命令是比较有趣的,很多时候我们在使用云主机或者vps的时候,作为一个虚拟化的使用者,老是想弄清对方用的是什么Hypervisor,网上有一些通过查看/proc下的文件来查看的,也有其他方法,但对于全虚拟化,很难从虚拟机中找到蛛丝马迹可以判定,virt-what封装了一个C程序,获取cpu内部一个保留的字段,通过此方法辨别使用的是哪种Hypervisor,感兴趣的可以尝试下)
  1. virt-inspector2 vm-name
复制代码

可以获取guest内部的详细信息,包括虚拟机具体的OS版本,和以安装软件包信息。
更多内容,可以自行尝试。这里只做一个抛砖引玉的过程。

情景分析:学以致用——如何增加磁盘或分区容量
虚拟化带来的并不仅仅是更少的硬件支出,更低的功耗,更高的使用率,还有更多的扩展能力。下面为大家介绍几种磁盘扩展的解决方法。
在生产环境中,因为规划问题或者临时数据,有很大可能遇到磁盘容量无法满足需求的情况。在虚拟化的环境中,资源是弹性的,当磁盘不够用,我们可以从宿主机上划一块区域供虚拟机使用。
1 添加磁盘
         对于宿主机来说,虚拟机的磁盘只不过是一个镜像文件。我们可以通过qemu-img的命令创建个要添加大小的文件,添加到虚拟机的xml配置中,然后重启虚拟机,重新加载配置文件即可。
可对于有些业务是不允许停机,或者尽量避免停机的,那此时可以选择动态添加磁盘。
同样先创建一个虚拟机磁盘文件,使用命令
  1. virsh attach-disk domain_name /path/to/disk.img vdb --cache=none
复制代码
但是这种方式只允许添加支持热插拔的scsi接口的磁盘,在宿主机上的表现是virtio的磁盘。
这里默认是使用的raw格式的磁盘,如果使用的是qcow2,在参数中不指明会导致添加成功后,虚拟机内无法识别。
  1. virsh attach-disk domain_name /path/to/disk.img vdb --cache= none --subdirver=qcow2
复制代码
这种添加方式对于libvirt管理的虚拟机是临时的,我们还需要通过
  1. virsh dumpxml domain_name
复制代码

将磁盘对应的xml部分,复制,通过edit 编辑虚拟机的配置,粘贴到磁盘位置,等下次重启的时候,仍会保证添加的磁盘存在。
2 添加磁盘分区
         大部分情况,添加磁盘并不能满足我们的需求,我们需要对原有的磁盘做操作,添加磁盘容量或者分区容量。
首先使用qemu-img resize 静态的增加磁盘容量(所谓的静态,就是将虚拟机关闭,然后做操作)
查看磁盘信息
  1. qemu-img info domain_disk
复制代码
启动虚拟机查看是否在原有的分区上有多余的容量,创建分区,格式化,挂载。
但是这种操作的意义不大,真心不大,因为在虚拟机上的磁盘不是像物理盘磁盘,增加分区,不如添加磁盘来得实在。而且,不要讲鸡蛋放到一个篮子里的道理我们都懂。
经常遇到的情况可能是增加分区的容量,也就是说我们的根分区不够了,要增加根分区的容量,亦或是我们的data分区太小了,需要扩容。
下面针对两种情况对磁盘进行操作。
         如果你使用的是LVM,那指直接把视线上移,因为LVM自己的扩容能力是非常强大的,可以拿新的磁盘空间,多余的分区也好,磁盘也好,创建pv,添加到vg,扩展lv,然后resize2fs 一下即可。
         如果不是LVM的话,只是稍微麻烦一点,在虚拟机的目录下创建一个新的磁盘,大小为你想扩展的大小,比如我原先的磁盘是10G,现在想扩展为20G。则创建一个20G 的新磁盘,然后使用libguestfish提供的工具virt-resize
  1. qemu-img create new.img 20G
  2. virt-resize --expand /dev/sda1 old.img new.img
复制代码
注:之前的帖子可以了解到guestfish对磁盘操作时使用的是独立的命名空间,所以此处值得sda1 并不是宿主机上的sda1 而是虚拟磁盘中的第一个分区。

如果哪位朋友有针对于libguestfs更好的应用思路,可以回复,一起讨论学习……

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP