2012年11月15日 星期四

KVM with LVM snapshot



一般來說, 如果使用 KVM來進行VM的管理,多半採用
virsh snapshot-create (VM name)
virsh snapshot-create-as (VM name) (snapshot name)
virsh snapshot-list (VM name)   #查到snapshot name
virsh snapshot-revert (VM name) (snapshot name)  
但這種方式,只適用在qcow2的vm image上

若VM的disk 使用raw type, 那便沒辦法了
於是, LVM的idea一般人都會想到, 利用 LVM的logical volumn當成VM raw disk
再利用snapshot 搭配 rollback(lvconvert --merge),可以進行類似KVM snapshot功能

step 1)先在Host的VG建立一個LV
lvcreate -L 100G -n lv_test /dev/VolGroup

step 2)建立一個VM
virt-install -n vm_test -r 1024 --vcpus=1 --disk path=/dev/VolGroup/lv_test .....(略)

安裝完成後,用root登入,然後將VM關掉

step 3)測試VM raw disk snapshot
  take snapshots:

    time line       t0  ----->    t1          -----> t2           -------> t3            ------>  t4

    take snapshot                lv_test_ss1                               lv_test_ss2
    
    [action in VM]  init 0       boot                touch 1.txt           boot                  rm *
                                                     rm A.txt                                    touch 2.txt
                                                     init 0                                      init 0
    
    [files at ~/.]  A.txt                            B.txt                                       2.txt
                    B.txt                            1.txt                                       
                                                                                                 
                                                                                                 


  rollback:

    time line       t5  ----->    t6          -----> t7           -------> t8   

    rollback        lv_test_ss1                      lv_test_ss2           
    
    [action in VM]  boot         init 0              boot                       
                                    
                                                 
    
    [files at ~/.]  2.txt        A.txt               A.txt                 B.txt
                                 B.txt               B.txt                 1.txt
                               (回到t0)                                   (回到t2)


take snapshot lv_test_ss1)
    lvcreate -L 50G -s -n lv_test_ss1 /dev/VolGroup/lv_test   
take snapshot lv_test_ss2)
    lvcreate -L 50G -s -n lv_test_ss2 /dev/VolGroup/lv_test   
rollback to snapshot lv_test_ss1)
    lvconvert --merge /dev/VolGroup/lv_test_ss1   
rollback to snapshot lv_test_ss2)
    lvconvert --merge /dev/VolGroup/lv_test_ss2
     
    
註:1)對於snapshot本身不能再對它取snapshot,也就是說,下面是無效指令
    lvcreate -L 50G -s -n lv_test_xx /dev/VolGroup/lv_test_ss1    
   2)上例來看,rollback 至 lv_test_ss1時, 檔案回復至當時最原始的A.txt以及B.txt
              rollback 至 lv_test_ss2時, 檔案回復至剛做lv_test_ss2前的B.txt以及1.txt
   3)看來在進行snapshot rollback時, 對於中間的snapshot的內容,也會一一進行追蹤
     不會導致檔案的遺失. 例如上例中, 在rollback至lv_test_ss1時,早已沒有了1.txt
     但在進行lv_test_ss2 rollback時,卻還是正確的檔案數量(也沒受t4 rm *的影響)
   4)lvconvert --merge似乎是RHEL/CentOS 6之後才有提供
   5)如果執行 lvconvert --merge出現warning "Can't merge over open origin volume"時,那你可能會需要對LV做 deactivate and activate的動作
     lvchange -an /dev/VolGroup/lv_test     ##deactivate
     lvchange -ay /dev/VolGroup/lv_test     ##activate
   6)一般如果你直接對snapshot做lvremove的動作, 那所有的異動都會進到原本的LV
   
     
     

沒有留言:

張貼留言

文章分類