6.10.2.2 方法2: 個々のゲストのバックアップ

/EXAVMIMAGESの下にある特定のフォルダをバックアップすることで、個々のゲストをバックアップできます。

バックアップ先は、書込み可能なNFSの場所など、KVMホスト・サーバーとは別の場所で、バックアップを保持できる十分な大きさにする必要があります。個々のゲストのバックアップに必要な領域は、約200GBです。

  1. ゲスト・イメージを準備します。

    次のスクリプトを使用して、/EXAVMIMAGES/Backupの下で、ゲスト・イメージのバックアップを準備します。

    #!/bin/bash
    
    ScriptStarttime=$(date +%s)
    
    printf "This script is going to remove the directory /EXAVMIMAGES/Backup if it exists. If that is not acceptable, exit the script by typing n, manually remove /EXAVMIMAGES/Backup and come back to rerun the script.  Otherwise, press y to continue :"
    
    read proceed
    
    if [[ ${proceed} == "n" ]] || [[ ${proceed} == "N" ]]
    then
      exit 0
    elif [[ ${proceed} != "n" ]] && [[ ${proceed} != "N" ]] && [[ ${proceed} != "y" ]] && [[ ${proceed} != "Y" ]]
    then
      echo "Invalid input"
      exit 1
    fi
    
    rm -rf /EXAVMIMAGES/Backup
    
    printf "Enter the name of the KVM guest to be backed up :"
    
    read KVMGuestName
    
    ## Create the Backup Directory
    
    if [ ! -d /EXAVMIMAGES/GuestImages/${KVMGuestName} ]
    then
      echo "Guest ${KVMGuestName} does not exist"
      exit 1
    fi
    
    mkdirStartTime=$(date +%s)
    
    find /EXAVMIMAGES/GuestImages/${KVMGuestName} -type d|grep -v 'lost+found'|awk '{print "mkdir -p /EXAVMIMAGES/Backup"$1}'|sh
    
    mkdir -p /EXAVMIMAGES/Backup/XML
    
    mkdirEndTime=$(date +%s)
    mkdirTime=$(expr ${mkdirEndTime} - ${mkdirStartTime})
    echo "Backup Directory creation time :" ${mkdirTime}" seconds"
    
    cp /etc/libvirt/qemu/${KVMGuestName}.xml /EXAVMIMAGES/Backup/XML
    
    ## Pause the guest
    
    PauseStartTime=$(date +%s)
    virsh suspend ${KVMGuestName}
    PauseEndTime=$(date +%s)
    PauseTime=$(expr ${PauseEndTime} - ${PauseStartTime})
    echo "PauseTime for guest - ${KVMGuestName} :" ${PauseTime}" seconds"
    
    ## Create reflinks for all the files in /EXAVMIMAGES/GuestImages/${KVMGuestName}
    
    relinkStartTime=$(date +%s)
    
    find /EXAVMIMAGES/GuestImages/${KVMGuestName} -type f|awk '{print "cp --reflink", $0,"/EXAVMIMAGES/Backup"$0}'|sh
    
    relinkEndTime=$(date +%s)
    reflinkTime=$(expr ${relinkEndTime} - ${relinkStartTime})
    echo "Reflink creation time for guest - ${KVMGuestName} :" ${reflinkTime}" seconds"
    
    ## Unpause the guest
    
    unPauseStartTime=$(date +%s)
    virsh resume ${KVMGuestName}
    unPauseEndTime=$(date +%s)
    unPauseTime=$(expr ${unPauseEndTime} - ${unPauseStartTime})
    echo "unPauseTime for guest - ${KVMGuestName} :" ${unPauseTime}" seconds"
    
    ScriptEndtime=$(date +%s)
    ScriptRunTime=$(expr ${ScriptEndtime} - ${ScriptStarttime})
    echo ScriptRunTime ${ScriptRunTime}" seconds"
  2. ゲスト・イメージのバックアップを作成します。

    /EXAVMIMAGES/Backupの下のreflinkファイルをリモートの場所にバックアップします。KVMホストが恒久的に破損したり紛失した場合は、バックアップを使用して特定のゲストをリストアできます。

    次に例を示します:

    # mkdir -p /remote_FS
    # mount -t nfs -o rw,intr,soft,proto=tcp,nolock ip_address:/nfs_location/ /remote_FS
    # cd /EXAVMIMAGES/Backup
    # tar --acls --xattrs --xattrs-include=* --format=pax -pjcvf /remote_FS/exavmimage.tar.bz2 * > /tmp/exavmimage_tar.stdout 2> /tmp/exavmimage_tar.stderr

    mountコマンドで、ip_addressはNFSサーバーのIPアドレス、nfs_locationはバックアップを保持するNFSの場所です。

    この例では、バックアップ・ファイルの名前はexavmimage.tar.bz2です。別の名前を選択して、バックアップするゲストを指定することもできます。

    バックアップの完了後に、tarコマンドから、重大なエラーがないかを確認します。前述の例では、tarコマンドによって、/tmp/exavmimage_tar.stderrのファイルにエラーが書き込まれます。

  3. /EXAVMIMAGES/Backupディレクトリとその内容を削除します。

    次に例を示します:

    # cd /
    # rm -rf /EXAVMIMAGES/Backup
  4. NFSバックアップの場所をアンマウントして、マウント・ポイント・ディレクトリを削除します。

    次に例を示します:

    # umount /remote_FS
    # rmdir /remote_FS