После прочтения вот этой статьи в базе знаний решил написать данную заметку о том, как можно спасти/забэкапить данные на запущенной ВМ с Unix-Like ОС, когда другие методы для спасения данных недоступны или неприменимы. В общем, вот выдержка из приведенной выше статьи:

This article provides information on the alternative Linux command to clone vmdks without powering off a virtual machine. You may want to use this command when:


  • Metadata is corrupted or lost
  • Part of the LUN has been over-written, for example, by an installation of ESX to incorrect LUN

This method may present some advantages over alternatives where the virtual machine is powered on:

  • It is faster than Converter as data is transferred directly to SAN instead of over network
  • It is possible to restart the guest operating system if the procedure fails

vmkfstools -i is not an option where:

  • The virtual machine is powered on and the vmdk is locked
  • You cannot create snapshot because you cannot risk an update to metadata

VMware Converter may not be an option where:

  • The guest operating system is non-Windows. For example, Linux (pre-VMware Converter 4.0), Netware or Solaris
  • Insufficient diskspace on LUN for snapshots continue to grow while the guest operating system is running

То есть, достаточно много случаев, когда нас может выручить или даже спасти утилита dd. Более подробную информацию о программе dd вы можете получить, прочитав соответствующую статью на википедии. И так, чтобы склонировать жесткий диск на запущенной ВМ с Unix-Like системой, вам нужно в эту виртуальную машину дополнительно добавить новый жесткий диск (vHDD) и, затем, выполнить следующую команду:

# dd if=/dev/sda of=/dev/sdb bs=16M conv=sync,noerror

/dev/sda - это диск с важными данными, /dev/sdb - пустой диск, на который будут скопированы все данные с диска /dev/sda. Синтаксис команды для разных систем может слегка отличаться, поэтому перед выполнением команды загляните в man. После завершения клонирования вы можете второй жесткий диск отцепить от виртуальной машины и прицепить его к другой ВМ, чтобы убедиться, что все данные на месте. Лично я использую dd уже достаточно давно. У меня есть почтовый сервер на базе FreeBSD, на котором периодически по крону запускается скрипт, который, в свою очередь, запускает команду dd для копирования всех данных на удаленный FTP сервер. Вот содержание моего скрипта (может, кому пригодится):

#!/usr/local/bin/bash
######################################
#       -= sfull_backup.sh =-        #
######################################

   VERSION="0.3";
   OK_CODE=0;
   ERROR_CODE=1;
   DUMP_PARTITION='root var usr data';
   FS="";

   bkp_date="`date +%Y-%m-%d`";
   bkp_time="`date +%H:%M:%S`";
   EMAIL="postmaster@example.org";
   ARCH_DIR="/data/msrv/arch";
   LOG_FILE="/var/log/sfull_backup.log";

   FTP_SERVER="10.5.5.21"
   FTP_USER="user"
   FTP_PASS="password"

   #-----------------------------------------------------------------------------------------
   function write_log () { local _WLOG_LOG_FILE="$LOG_FILE"; printf "$1" >> "$_WLOG_LOG_FILE" 2>/dev/null; return $OK_CODE; }
   function email_report_send () { local _ERS_EMAIL="$EMAIL"; local _ERS_LOG_FILE="$LOG_FILE"; write_log "=================================================================================================================\n\n"; cat $_ERS_LOG_FILE 2>/dev/null | mail -sSYSTEM_FULL_BACKUP ${_ERS_EMAIL} 2>/dev/null; return $OK_CODE; }
   #-----------------------------------------------------------------------------------------
   if ! [[ -f "$LOG_FILE" ]]
   then
      touch "$LOG_FILE" >/dev/null 2>&1; if [[ $? -ne 0 ]]; then exit $ERROR_CODE; fi
      chown root:wheel "$LOG_FILE" >/dev/null 2>&1;
      chmod 744 "$LOG_FILE" >/dev/null 2>&1;
   else
      cat /dev/null > "$LOG_FILE" 2>/dev/null;
   fi
   write_log "\n========================================\n";
   write_log "System Full Backup [$bkp_date $bkp_time]\n";
   write_log "=================================================================================================================\n";
   write_log "#################################################################################################################\n";

   chflags -R nodump $ARCH_DIR >/dev/null 2>&1;
   if [[ $? -ne 0 ]]; then write_log "ERROR: chflags\n"; email_report_send; exit $ERROR_CODE; else write_log "INFO: chflags successfully.\t[ `ls -ldo $ARCH_DIR` ]\n"; fi

   #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
   for i in $DUMP_PARTITION; do
      if [[ "$i" == "root" ]]; then FS="/"; else FS="/$i"; fi
      if [[ "$1" == "debug" ]]
         then /sbin/dump -h 0 -0auL -P "/usr/bin/ftp -u ftp://$FTP_USER:$FTP_PASS@$FTP_SERVER/$i.dump -" "$FS";                 if [[ $? -ne 0 ]]; then write_log "ERROR: $i.dump\n"; else write_log "INFO: $i.dump successfully.\n"; fi
         else /sbin/dump -h 0 -0auL -P "/usr/bin/ftp -u ftp://$FTP_USER:$FTP_PASS@$FTP_SERVER/$i.dump -" "$FS" >/dev/null 2>&1; if [[ $? -ne 0 ]]; then write_log "ERROR: $i.dump\n"; else write_log "INFO: $i.dump successfully.\n"; fi
      fi
   done
   write_log "#################################################################################################################\n";
   #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

   write_log "\n/etc/dumpdates:\n";
   cat /etc/dumpdates >> "$LOG_FILE" 2>/dev/null;
   email_report_send;

exit $OK_CODE;
######################################

Если выполнить данный скрипт с единственным параметром debug:

# ./sfull_backup.sh debug

то на stdout можно будет подробно наблюдать весь процесс создания резервной копии системы, отдельного диска или раздела. Если запустить скрипт без параметров, то он молча отработает, отправив по окончанию отчет о своей работе на электронный адрес. У меня данный скрипт без параметров запускается по крону каждую ночь. Работает стабильно. По крайней мере, у меня. Чуть ниже, на всякий случай, прикладываю файл данного скрипта.