zoukankan      html  css  js  c++  java
  • Libvirt外部快照

    外部快照的创建

    实验环境

    CentOS 7

    • 升级QEMU

    CentOS 7自带的qemu版本太低需要升级

    $ sudo yum install -y gcc
    $ sudo yum install -y zlib-devel
    $ sudo yum install -y glib2-devel
    $ sudo yum install -y spice-server-devel.x86_64
    $ sudo yum install -y usbredir-devel
    
    $ ./configure --target-list=x86_64-softmmu --enable-spice --enable-usb-redir --enable-vnc --enable-kvm --disable-docs
    $ make
    $ make install
    $ sudo yum remove qemu-kvm
    
    $ ln -s qemu-kvm /usr/local/bin/qemu-system-x86_64
    # sed -e 's/SELINUX=.*/SELINUX=disabled/g' -i /etc/selinux/config && reboot
    # sed -e 's/#user = "root"/user = "root"/' /etc/libvirt/qemu.conf
    # sed -e 's/#group = "root"/group = "root"/' /etc/libvirt/qemu.conf
    # service libvirtd restart
    # /usr/libexec/qemu-kvm -M ?
    # virsh edit domain
    # 根据上面的结果修改machine
    # <os>
    #    <type arch='x86_64' machine=''>hvm</type>
    #  </os>
    

    创建外部快照

    • 查询主机上的虚拟机
    # virsh list --all
     Id    名称                         状态
    ----------------------------------------------------
     2     mos                            running
     -     ubuntu                         关闭
     -     winxp                          关闭
    
    • 查询虚拟机快照列表
    # virsh snapshot-list mos
     名称               生成时间              状态
    ----------------------------------------------------
    
    • 查询虚拟机的磁盘
    # virsh domblklist mos
    目标     源
    ------------------------------------------------
    hda        /var/lib/libvirt/images/mos.qcow2
    hdb        -
    
    • 创建外部快照
    # virsh snapshot-create-as mos fsnap "first snapshot" --atomic --disk-only --diskspec hda,snapshot=external,file=/var/lib/libvirt/images/snapshot.qcow2
    # virsh snapshot-list mos
     名称               生成时间              状态
    ------------------------------------------------------------
     fsnap                2016-07-03 10:52:15 +0800 disk-snapshot
    

    外部快照文件

    • 快照文件

    拍摄快照后会自动生成对应的快照文件,快照文件的根元素<domainsnapshot>下的<disks>元素记录了参与快照的磁盘信息;<domain>记录了快照前虚拟机的状态,即快照前virsh dumpxml domain的信息。通过快照文件我们可以知道哪些磁盘在快照中发生了变化,以及拍摄快照前磁盘的状态。

    # pwd
    /var/lib/libvirt/qemu/snapshot/mos
    # ls
    fsnap.xml
    

    外部快照的恢复

    目前virsh还不支持外部快照的恢复,所以直接使用virsh snapshot-revert命令是不行的,那么如何手工恢复到快照前的状态呢?

    Active层

    虚拟机磁盘链的最末端就是Active层,也就是保存磁盘数据变化的层

    • 快照前
    mos.qcow2(Active)
    
    • 快照后
    mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(Active)
    

    快照后新的磁盘变化将被写入snapshot.qcow2中,mos.qcow2的文件内容将不再改变

    • 再次快照
    mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(ssnap) <==[backing_file]== active.qcow2(Active)
    
    • 恢复快照

    从上面可以看出,恢复到快照fsnap,就是要再次重复次快照后的动作,以mos.qcow2作为backing_file再创建一个新的Active层。虽然fsnap保存了Active层的磁盘信息,但是Active层并不是快照,原先的Active层没有办法再回去,所以要删除对应磁盘文件。

    恢复步骤

    • 查询要恢复快照的状态

    根据域名和文件名在/var/lib/libvirt/qemu/snapshot/找到对应的快照文件,并找到参与快照的磁盘在<domain>元素中的file信息

    <source file='/var/lib/libvirt/images/mos.qcow2'/>
    
    • 创建新的Active层

    以找到的磁盘文件为backing_file创建新的Active层

    # qemu-img create -f qcow2 -o backing_file=/var/lib/libvirt/images/mos.qcow2,backing_fmt=qcow2 /var/lib/libvirt/images/revert_fsnap.qcow2
    
    • 编辑虚拟机配置文件

    根据新创建的Active层磁盘文件信息修改虚拟机的当前磁盘信息

    file='/var/lib/libvirt/images/snapshot.qcow2'
    修改为
    file='/var/lib/libvirt/images/revert_fsnap.qcow2'
    
    • 编辑虚拟机快照文件

    根据新创建的Active层磁盘文件信息使用命令virsh snapshot-edit修改根元素<domainsnapshot>下的<disks>元素

    file='/var/lib/libvirt/images/snapshot.qcow2'
    修改为
    file='/var/lib/libvirt/images/revert_fsnap.qcow2'
    
    • 修改虚拟机当前快照

    使用virsh snapshot-current命令修改虚拟机当前快照

    # virsh snapshot-current mos fsnap
    已将快照 fsnap 设定为 current
    
    • 删除旧Active层的磁盘文件
    # rm -rf snapshot.qcow2
    

    外部快照的删除

    假设虚拟机当前快照如下,要删除的快照为ssnap

    mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(ssnap) <==[backing_file]== active.qcow2(Active)
    
    • 合并Active层

    因为blockcommit的速度比blockpull要快,所以使用blockcommitActive层的磁盘文件合并到待删除的磁盘文件snapshot.qcow2,并自动更新Active层

    # virsh blockcommit mos hda --base snapshot.qcow2 --pivot --active
    # virsh domblklist mos
    目标     源
    ------------------------------------------------
    hda        /var/lib/libvirt/images/snapshot.qcow2
    

    如果快照链很长,只是删除其中的某个元素,那么不能从Active层开始合并,需要指定--top参数

    • 删除快照ssnap元数据
    # virsh snapshot-delete mos ssnap --metadata
    已删除域快照 ssnap
    
    • 删除Active层的磁盘文件
    # rm -rf active.qcow2
    

    问题处理

    虚拟机在启动后,很快就自动进入paused状态

    ### 解决办法:检查虚拟机对应的qemu日志,查看是否存在磁盘读写问题
    
  • 相关阅读:
    JS复制内容到剪切板
    mysql root密码的重设方法(转)
    php生成excel文件示例代码(转)
    php读取文件内容的三种方式(转)
    使用火蜘蛛采集器Firespider采集天猫商品数据并上传到微店
    Mac Android8.0源码编译笔记
    开源 高性能 高可用 可扩展
    开源 模式
    开源 算法 数据结构
    mdb
  • 原文地址:https://www.cnblogs.com/silvermagic/p/7666169.html
Copyright © 2011-2022 走看看