openstack虛擬機內文件遭破壞的急救方案

一、場景:

    openstack虛擬機存放於ceph存儲,由於用戶將系統的grub誤刪除,導致系統無法正常引導。現在用戶要求搶救文件。

二、可行的方案:

    1、將虛擬機保存爲鏡像,將鏡像轉換成雲硬盤,將雲硬盤掛載到其他虛擬機上鏡像搶救。

        優點:依賴默認的dashboard就能完成操作,較爲簡單,不需要openstack命令行基礎;

        缺點:只能搶救文件,不能修復原系統。

    2、將ceph中 虛擬機對應的rbd映射到到本地,掛載爲本機的一個目錄,進行搶救工作

       優點:可以直接修復原虛擬機的系統;

       缺點:需要一定的openstack命令行技能。

三、修復經過

    本文主要介紹 第二種的修復方法

    (一)、找出虛擬機對應的rbd

      1、查找虛擬機的宿主機

nova show a7584a2f-7b37-4a21-ae2f-3f244da49686 |grep hypervisor
| OS-EXT-SRV-ATTR:hypervisor_hostname  | server-85.105.nanshu.polex.io

        2、關閉該虛擬機、

 

 nova stop a7584a2f-7b37-4a21-ae2f-3f244da49686


        3、登陸宿主機,查看xml文件  

ps -ef |grep a7584a2f-7b37-4a21-ae2f-3f244da49686
qemu      67511      1 17 14:17 ?        00:17:32 /usr/libexec/qemu-kvm -name instance-0000444a -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu Broadwell,+abm,+pdpe1gb,+rdrand,+f16c,+osxsave,+dca,+pdcm,+xtpr,+tm2,+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme,+rtm,+hle -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid a7584a2f-7b37-4a21-ae2f-3f244da49686 -smbios type=1,manufacturer=Fedora Project,product=OpenStack Nova,version=13.1.2-1.el7.centos,serial=8153ba5c-de78-47c7-bc4c-c86b0d429f75,uuid=a7584a2f-7b37-4a21-ae2f-3f244da49686,family=Virtual Machine -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-instance-0000444a/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -drive file=rbd:pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da49686_disk:id=admin:key=AQAG1vlXEVDPIhAAyi0tZ3qZwt1HewbQHh731A==:auth_supported=cephx\;none:mon_host=10.48.106.247\:6789\;10.48.106.248\:6789\;10.48.106.249\:6789\;10.48.106.250\:6789\;10.48.106.251\:6789,if=none,id=drive-virtio-disk0,format=raw,cache=writeback,bps_rd=104857600,bps_wr=31457280,iops_rd=2000,iops_wr=500 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=rbd:pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da4968_disk.config:id=admin:key=AQAG1vlXEVDPIhAAyi0tZ3qZwt1HewbQHh731A==:auth_supported=cephx\;none:mon_host=10.48.106.247\:6789\;10.48.106.248\:6789\;10.48.106.249\:6789\;10.48.106.250\:6789\;10.48.106.251\:6789,if=none,id=drive-ide0-1-1,readonly=on,format=raw,cache=writeback,bps_rd=104857600,bps_wr=31457280,iops_rd=2000,iops_wr=500 -device ide-cd,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 -netdev tap,fd=32,id=hostnet0,vhost=on,vhostfd=34 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:4d:5e:ad,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/var/lib/nova/instances/a7584a2f-7b37-4a21-ae2f-3f244da49686/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-0000444a.sock,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device usb-tablet,id=input0 -vnc 0.0.0.0:5 -k en-us -vga cirrus -incoming fd:25 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6 -msg timestamp=on
 
  
  
cat /run/libvirt/qemu/instance-0000444a.xml |grep rbd
        <source protocol='rbd' name='pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da49686_disk'>
        <source protocol='rbd' name='pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da49686_disk.config'>

可以看到 虛擬機對應是ceph中 叫 pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da49686_disk 的 rbd

   4 掛載 rbd到本地的/dev/rbd0

rbd map pool-3aae4178cb8a470aab3dfcea9307e5c9/a7584a2f-7b37-4a21-ae2f-3f244da49686_disk 
 /dev/rbd0


5、 掛載本地的/dev/rbd0 到 目錄

   虛擬機是以raw格式的虛擬磁盤存放在ceph中,在掛在時候要計算偏移量,

  偏移量計算 參考文章 http://smilejay.com/2012/08/mount-an-image-file/

 

 

mount -o offset=
1048576
 
/dev/rbd0 /mnt

 

至此 虛擬機的硬盤已經變成了我們節點上的一個目錄,可以進去修復文件了。

6 撤退工作

 

 

   
 
umount /mnt    rbd unmap /dev/rbd0

 

四、需要注意的地方

    1、虛擬機一定要關機,不然文件系統在兩處同時掛載的話會產生髒數據

    2、偏移量的計算

    3、快速迭代的虛擬機還是不要使用lvm



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章