Полезные предложения для скрипта резервного копирования bash для общих ресурсов samba с использованием rsync - PullRequest
1 голос
/ 13 января 2011

Я написал небольшой скрипт bash (4) для резервного копирования общих ресурсов с моего компьютера с Windows.В настоящее время я создаю резервную копию только одного ресурса, и эта копия видна только пользователю root.Пожалуйста, дайте мне несколько советов по улучшению этого куска кода:

#!/bin/bash
# Script to back up directories on several windows machines
# Permissions, owners, etc. are preserved (-av option)
# Only differences are submitted
# Execute this script from where you want

# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

# Specify the current date for the log-file name
current_date=$(date +%Y-%m-%d_%H%M%S)

# Specify the path to a list of file patterns not included in backup
script_path=$(dirname $(readlink -f $0))
rsync_excludes=$script_path/rsync_exclude.patterns

# Specify mount/rsync options
credential_file="/root/.smbcredentials"
# Specify windows shares
smb_shares=( //192.168.0.100/myFiles )
# Specify the last path component of the directory name to backup shares 
# content into
smb_share_ids=( "blacksmith" )
# Specify with trailing '/' to transfer only the dir content
rsync_src="/mnt/smb_backup_mount_point/"
rsync_dst_root=(~/BACKUPS)

# Check if all arrays have the same size
if [ "${#smb_shares[@]}" -ne "${#smb_share_ids[@]}" ]; then
  echo "Please specify one id for each samba share!"
  exit 1
fi

# Run foor loop to sync all specified shares
for (( i = 0 ; i < ${#smb_shares[@]} ; i++ ))
do
  # Check if mount point already exists
  echo -n "Checking if mount point exists ... "
  if [ -d $rsync_src ]; then
    echo "Exists, exit!"
    exit 1
  else
    echo "No, create it"
    mkdir $rsync_src
  fi

  # Try to mount share and perform rsync in case of success
  echo -n "Try to mount ${smb_shares[$i]} to $rsync_src ... "
  mount -t cifs ${smb_shares[$i]} $rsync_src -o credentials=/root/.smbcredentials,iocharset=utf8,uid=0,file_mode=0600,dir_mode=0600
  if [ "$?" -eq "0" ]; then
    echo "Success"

    # Specify the log-file name
    rsync_logfile="$rsync_dst_root/BUP_${smb_share_ids[$i]}_$current_date.log"

    # Build rsync destination root
    rsync_dst=( $rsync_dst_root"/"${smb_share_ids[$i]} )

    # Check if rsync destination root already exists
    echo -n "Check if rsync destination root already exists ... "
    if [ -d $rsync_dst ]; then
      echo "Exists"
    else
      echo "Does not exist, create it"
      mkdir -p $rsync_dst
    fi

    # Run rsync process
    # -av                   > archieve (preserve owner, permissions, etc.) and verbosity
    # --stats               > print a set of statistics showing the effectiveness of the rsync algorithm for your files
    # --bwlimit=KBPS        > transfer rate limit - 0 defines no limit
    # --progress            > show progress
    # --delete              > delete files in $DEST that have been deletet in $SOURCE
    # --delete-after        > delete files at the end of the file transfer on the receiving machine
    # --delete-excluded     > delete excluded files in $DEST
    # --modify-window       > files differ first after this modification time
    # --log-file            > save log file
    # --exclude-from        > exclude everything from within an exclude file
    rsync -av --stats --bwlimit=0 --progress --delete --delete-after --delete-excluded --modify-window=2 --log-file=$rsync_logfile --exclude-from=$rsync_excludes $rsync_src $rsync_dst
  fi

  # Unmount samba share
  echo -n "Unmount $rsync_src ... "
  umount $rsync_src
  [ "$?" -eq "0" ] && echo "Success"

  # Delete mount point
  echo -n "Delete $rsync_src ... "
  rmdir $rsync_src
  [ "$?" -eq "0" ] && echo "Success"


done

Теперь мне нужна помощь по следующим темам:

  1. Проверка, есть ли такие условия, как существование общего ресурса, существование точки монтирования(чтобы создать надежный сценарий)
  2. Команда монтирования - это правильно, я даю правильные разрешения?
  3. Есть ли место для файлов резервных копий лучше, чем домашний каталогПользователь, если только root может видеть эти файлы?
  4. Как вы думаете, было бы полезно интегрировать резервную копию и в другие файловые системы?
  5. Резервное копирование выполняется довольно медленно (около 13 МБ / с), хотяУ меня есть гигабитная сетевая система - возможно, это из-за ssh-шифрования rsync?Система linux, на которой смонтирован общий ресурс, имеет контроллер pci sata и старую материнскую плату, 1 Гб оперативной памяти и Athlon XP 2400+.Могут ли быть другие причины такой медлительности?

Если у вас есть больше тем, которые можно затронуть здесь - не стесняйтесь размещать их.Я заинтересован =)

Ура

-Blackjacx

1 Ответ

0 голосов
/ 12 апреля 2011

1) Существует много проверок ошибок, которые вы можете сделать, чтобы сделать этот скрипт более устойчивым: проверить наличие и выполнить состояние внешних исполняемых файлов (rsync, id, date, dirname и т. Д.), Проверить выходные данные rsync ( с помощью [0 -ne $?]; затем), отправьте эхо-запрос на удаленный компьютер, чтобы убедиться, что он находится в сети, убедитесь, что у пользователя, для которого выполняется резервное копирование, есть домашний каталог на локальном компьютере, проверьте, чтобы сделать убедитесь, что в каталоге назначения достаточно места для rsync и т. д.

2) команда mount выглядит нормально, вы хотите попробовать монтировать только для чтения?

3) Зависит от количества пользователей и размера резервной копии. Для небольших резервных копий домашний каталог, вероятно, в порядке, но если резервные копии большие, особенно если у вас может быть недостаточно дискового пространства, было бы неплохо выделить специальное место для резервирования.

4) Зависит от того, какова цель резервного копирования. По моему опыту есть пять видов вещей, которые люди резервируют: пользовательские данные, системные данные, пользовательские конфигурации, системные конфигурации, целые диски или файловые системы. Существует ли отдельная системная задача, которая выполняет резервное копирование системных данных и конфигураций?

5) Какие другие задачи выполняются во время резервного копирования? Если резервное копирование выполняется автоматически, скажем, в 1:00, могут быть запланированы другие задачи с интенсивным использованием системы на то же время. Какова ваша типичная пропускная способность для других видов данных?

Вы выполняете проверку массива переменных, не являющихся массивами.

Используйте переменную для указания удаленного компьютера.

# Remote machine
declare remote_machine="192.168.0.100"
# Specify windows shares array
declare -a smb_shares=([0]="//$remote_machine/myFiles"
                       [1]="//$remote_machine/otherFiles" ) 
# Specify the last path component of the directory name to backup shares  
# content into 
declare -a smb_share_ids=( [1]="blacksmith" [2]="tanner") 

таким образом, вы можете

ping -c 1 $remote_machine
if [ 0 -ne $? ] ; then
   echo "ping on $remote_machine Failed, exiting..."
   exit 1
fi

Если rsync_src используется только для этого макета, вы можете попробовать

mnt_dir="/mnt"
rsync_src=`mktemp -d -p $mnt_dir`

и я бы сделал этот каталог перед циклом for, иначе вы создаете и уничтожаете его для каждого каталога, для которого вы создаете резервную копию.

...