热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

libvirt管理KVM虚拟机的使用方法

说明:这篇笔记为更好的管理虚拟化服务,如果仅仅是测试虚拟化,查看另一篇笔记:补充:这篇笔记使用的libvirt版本为0.6.3,kernel为2.6.18-194.26.1.el5遇到了几个bug,建议首先升级kernel,然后升级libvirt,kvm。yummakecache(一定要做)yumlist

说明:这篇笔记为更好的管理虚拟化服务,如果仅仅是测试虚拟化,查看另一篇笔记:

补充:这篇笔记使用的libvirt版本为0.6.3,kernel为2.6.18-194.26.1.el5

遇到了几个bug,建议首先升级kernel,然后升级libvirt,kvm。

yum makecache (一定要做)

yum list kernel

20110428:kernel 2.6.18-238.9.1.el5

一、安装虚拟化管理工具

1、yum install virt-manager libvirt libvirt-python python-virtinst

2、Start the libvirtd daemon service

service libvirtd start

关于错误:

注:该错误出现在centos5.4,libvirtd 0.6.3

重启libvirtd后,启动guest时会出现下面的问题。

Apr 22 09:16:20 srv4 kernel: libvirtd[27156]: segfault at 00000000444e3000 rip 0000003e5501e161 rsp 00000000444dfcd0 error 4

Apr 22 09:16:20 srv4 libvirtd: 09:16:20.739: error : internal error Unable to daemonize QEMU process 

重启了host,问题解决

原因:https://bugzilla.redhat.com/show_bug.cgi?id=505625

Everytime the virGetCapabilities() method is run, it destroys the existing virCapsPtr object and creates it again....without any of the selinux info. virt-manager runs this method. so once virt-manager has run, subsequent calls to get the security info will give the crash you see.

二、有关网络

1、一般网络(又名NAT):guest可以访问外网,外网不能访问guest。

安装了libvirt后,一个NAT网络即可用。host被设置为192.168.122.1(virbr0),所有的guest将被分配为192.168.122.x

如果看不到virbr0

或者在virsh start 时出现下面的错误:

Apr 22 08:50:37 srv4 libvirtd: 08:50:37.839: error : internal error Failed to add tap interface 'vnet%d' to bridge 'virbr0' : No such device 

查看/var/log/message.log

Apr 22 08:57:10 srv4 dnsmasq[26000]: failed to open pidfile /var/run/libvirt/network/default.pid: Permission denied

Apr 22 08:57:10 srv4 dnsmasq[26000]: FAILED to start up

手动启动default network

virsh net-start default

error: Failed to start network default

error: internal error '/usr/sbin/dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file=  --listen-address 192.168.122.1 --except-interface lo --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-lease-max=253' exited with non-zero status 3 and signal 0: 

dnsmasq: failed to open pidfile /var/run/libvirt/network/default.pid: Permission denied

解决办法:

我的当前系统:selinux-policy.noarch           2.4.6-203.el5  

yum updata selinux-policy.noarch

selinux-policy.noarch             2.4.6-279.el5_5.2 

service libvirtd restart

注:需要重启host,上面写了原因

# ifconfig virbr0

virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00

inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0

inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:57 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:0 (0.0 b) TX bytes:10962 (10.7 KiB)

一个故障:

不论是NAT,还是Bridge模式,guest都无法与其他服务器通信,而且NAT模式时无法通过dhcp获取IP。没有查到错误原因。

不使用virsh来启动,按照http://blog.chinaunix.net/space.php?uid=1838361&do=blog&id=234090文 章介绍的方法来启动时,NAT及bridge模式都可以正常访问其他服务器。所以按照该文章的方法,在guest的xml文件中定义interface的 部分,指定虚拟网卡为tap0,网络正常了,将指定的网卡名去掉,由virsh自动分配为vnet0,网络也是正常的,也可以通过dhcp获取IP了。原 因未知。

另:virsh启动的log文件位于:/var/log/libvirt/qemu/

关于NAT方式,guest可以获取ip,但无法与访问公网:

有多个网卡?你的物理机由哪个网卡访问公网?例如,我的物理机由br0访问公网,则,修改default.xml文件,添加forward的dev参数。

virsh # net-dumpxml default

  default

  8d004490-ee73-4e36-b9ef-821d7e73f9f6

  dev='br0' mode='nat'/>

  

  

    

      

    

  

virsh # net-define /etc/libvirt/qemu/network/default.xml

virsh # net-destroy default

virsh # net-start  default

2、Bridge网络(又名:共享物理网卡):guest可以访问外网,外网也可以访问guest

# cd /etc/sysconfig/network-scripts/

# cp ifcfg-eth0 ifcfg-br0 

两个配置文件内容分别为:

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

TYPE=Ethernet

OnBOOT=yes

NM_COnTROLLED=no

BRIDGE=br0

/etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0

TYPE=Bridge

NM_COnTROLLED=no

BOOTPROTO=static

IPADDR=221.193.136.121

NETMASK=255.255.255.0

OnBOOT=yes

The NM_COnTROLLED=no option was added because both device should not be controlled by the Network Manager for bridge to work. 

重启network(当前连接会丢失,确保你总是可以访问host,否则要格外小心)

service network restart

Disable Netfilter processing in the bridged traffic.

/etc/sysctl.conf文件中添加:

net.bridge.bridge-nf-call-ip6tables = 0

net.bridge.bridge-nf-call-iptables = 0

net.bridge.bridge-nf-call-arptables = 0

net.bridge.bridge-nf-filter-vlan-tagged = 0

        验证是否生效

ifconfig

br0现在扮演eth0的角色。

br0       Link encap:Ethernet  HWaddr 00:14:5E:C2:1E:40  

          inet addr:221.193.136.121   Bcast:221.193.136.255  Mask:255.255.255.0 

          inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link 

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 

          RX packets:125 errors:0 dropped:0 overruns:0 frame:0 

          TX packets:81 errors:0 dropped:0 overruns:0 carrier:0 

          collisions:0 txqueuelen:0 

          RX bytes:16078 (15.7 KiB)  TX bytes:18542 (18.1 KiB) 

eth0      Link encap:Ethernet  HWaddr 00:14:5E:C2:1E:40  

          inet6 addr: fe80::214:5eff:fec2:1e40/64 Scope:Link 

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 

          RX packets:206 errors:0 dropped:0 overruns:0 frame:0 

          TX packets:58 errors:0 dropped:0 overruns:0 carrier:0 

          collisions:0 txqueuelen:1000 

          RX bytes:27308 (26.6 KiB)  TX bytes:13881 (13.5 KiB) 

          Interrupt:74 Memory:da000000-da012800

也可以通过下面的命令查看桥接网络,可以看到eth0加到了桥接设备br0中:

# brctl show

bridge name     bridge id               STP enabled     interfaces

virbr0          8000.000000000000       yes

br0             8000.000e0cb30550       no              eth0

三、创建KVM虚拟机的XML定义文件

关于KVM XML format  http://libvirt.org/formatdomain.html 

1.1 用于从磁盘启动的XML文件

1、kvm guest 定义开始

2、guest的short name。由字母和数字组成,不能包含空格

3、uuid,由命令行工具 uuidgen生成。

bdbb89fb-57d1-4d01-b3b7-ff33a9346ae6

4、在不reboot guest的情况下,guset可以使用的最大内存,以KB为单位

5、guest启动时内存,可以通过virsh setmem来调整内存,但不能大于最大可使用内存。

1024000

6、分配的虚拟cpu

7、有关OS

x86架构:i686  

hvm:全虚拟化

kernel:指定guest使用的内核,如果使用ISO(安装时)或guset系统中(系统已经安装完成)的内核,不需要指定该项

initrd:指定guest使用的ram disk,如果使用ISO(安装时)或guest系统中(系统已经安装完成)的ram disk,不需要指定该项

注:kernel 和initrd文件位于RHEL系统光盘的images/pxeboot目录,拷贝这两个文件到本地磁盘,并指定路径。

注:这两个元素,如果是为了安装guset而指定,在安装完成以后即可以删除。

如 果host开启了SELINUX,you also need to change the type of security context for the files to virt_image_t to allow libvirtd to access them for booting: 

# chcon -t virt_image_t /tmp/vmlinuz-rhel54

# chcon -t virt_image_t /tmp/initrd-rhel54.img

After you change the security context, verify that the correct security context is assigned to them as shown in the following example: 

# ls -Z /tmp|grep virt

-r--r--r-- root root root:object_r:virt_image_t initrd-rhel54.img

-r--r--r-- root root root:object_r:virt_image_t vmlinuz -rhel54

boot:指定启动设备,可以重复多行,指定不同的值,作为一个启动设备列表。

可以在cmdline元素中添加启动参数,例如,使用kickstart文件:

method=http://10.1.1.212/install/rhel5.4/x86_64 

ks=http://10.1.1.212/install/autoinst/c20m2n05v3

      hvm

      /tmp/vmlinuz-rhel54

      /tmp/initrd-rhel54.img

      

    

8、处理器特性

      

      

      

    

9、时钟。使用本地时间:localtime

   

仍然需要再计划任务中添加时间同步:

*/15 * * * * (/usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1;/sbin/hwclock -w)

10、定义了在kvm环境中power off,reboot,或crash时的默认的动作为destroy。其他允许的动作包括:restart,preserve,rename-restart.

在 这个例子中,destory之所以也用在了on_reboot元素中,是因为一旦安装完成,期望的guest动作是stop,以便从the installed guest operating system而不是从the installation kernel or ISO编辑guest的定义。

destroy:停止该虚拟机。相当于关闭电源

    destroy

    destroy

    destroy

11、设备定义开始

12、模拟元素,此处写法用于kvm的guest(xen怎么写?)

/usr/libexec/qemu-kvm  

13、用于kvm存储的文件。在这个例子中,在guest中显示为IDE设备。

使用qemu-img命令创建该文件,kvm image的默认目录为:/var/lib/libvirt/images/

        

        

      

这里需要注意:使用libvirt 0.6.3写的xml,没有参数,当将该xml放到libvirt 0.8版本时,该参数会默认为raw,所以会造成在0.6中可以启动的guest无法启动,更改参数即可

补充:可以定义多个磁盘,其他可行的磁盘定义:

Logical volume device:

            

            

        

Disk partition:

            

            

        

CD-ROM device:

            

            

            

        

 14、使用网桥类型。确保每个kvm guest的mac地址唯一。将创建tun设备,名称为vnetx(x为0,1,2...)

        

        

 补充:使用默认的虚拟网络代替网桥,即guest为NAT模式。也可以省略mac地址元素,这样将自动生成mac地址。

            

            

        

 默认分配192.168.122.x/24的地址,也可以手动指定。网关为192.168.122.1

 15、输入设备

 16、定义与guset交互的图形设备。在这个例子中,使用vnc协议。listen的地址为host的地址。prot为-1,表示自动分配端口号,通过以下的命令查找端口号:

virsh vncdisplay     

注意:是passwd 而不是password 

  

 17、设备定义结束

18、KVM定义结束

  完整的xml

  centoskvm3

  bdbb89fb-57d1-4d01-b3b7-ff33a9346ae6

  2048000

  1024000

  2

  

    hvm

    

  

  

    

    

    

  

  

  destroy

  destroy

  destroy

  

    /usr/libexec/qemu-kvm

    

      

      

    

    

      

      

    

    

    

  

   1.2 用于从ISO启动的XML文件

    kvm4

    85badf15-244d-4719-a2da-8c3de0641373

    1677721

    1677721

    1

    

      hvm

      

   

   

     

     

     

   

   

   destroy

   destroy

   destroy

   

     /usr/libexec/qemu-kvm

     

       

       

     

     

       

       

       

     

     

       

       

       

     

     

       

      

     

     

     

   

 

 四、 使用virsh创建一个kvm虚拟机

 当创建或编辑了一个kvm xml文件后,使用virsh tool创建kvm。

 1、定义KVM

virsh define

For example:

# virsh define /usr/local/kvm/centvm3.xml

在后台,这个命令拷贝该xml文件到/etc/libvirt/qemu目录,文件名为xml里定义的kvm名称。并且正式定义一个新的kvm。

如何修改?

方法1:

virsh edit

virsh define

方法2:

virsh undefine

virsh define

2、启动KVM

virsh start

For example:

# virsh start centosvm3

查看vnc信息:

virsh vncdisplay centosvm3

也可以通过virt-viewer查看

virt-viewer

关闭kvm虚拟机:virsh destory

查看运行中的虚拟机:

virsh list


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
名将箱包_714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有