
외부 드라이브의 이미지를 현재 상태로 유지하기 위해 rsync를 설정하려고 합니다. 처리해야 할 파티션은 4개입니다: /, /boot, /home, /usr. 각각을 차례로 마운트하고 각각을 내부 드라이브와 동기화하고 싶습니다. 제가 겪고 있는 한 가지 문제는 제외된 파일이 제외되지 않는다는 것입니다. 몇 가지 패턴을 실험해 보았지만 아무 것도 효과가 없었습니다. 소스를 기준으로 제외 패턴을 설정하고 있는데 작동하지 않습니다.
/home/ sync의 이 로그 조각은 복사되는 제외된 파일을 보여줍니다.
--begin snippet--
backing up /home/ via rsync to: /media/Ubuntu_Backup...
sudo rsync -a -x -i -h -v -A -X -H --delete --inplace --numeric-ids --compare-dest=./ -n --exclude='*/lost+found/**' --exclude='*/Downloads/**' --exclude='*/.cache/**' --exclude='*/.thumbnails' --exclude='*/.mozilla/firefox/*.default/Cache' /home/ /media/Ubuntu_Backup
sending incremental file list
.d..t...... kmiller/
>f..t...... kmiller/.vim_mru_files
>f.st...... kmiller/.viminfo
>f.st...... kmiller/.zsh_history
>f.st...... kmiller/backup.log
>f.st...... kmiller/cron.log
.d..t...... kmiller/.cache/google-chrome-beta/Default/Cache/
*deleting kmiller/.cache/google-chrome-beta/Default/Cache/f_000806
>f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_0
>f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_1
>f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_2
>f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_3
>f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080a
>f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080b
>f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080c
>f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080d
>f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080e
--end of snippet--
내가 겪고 있던 또 다른 문제는 rsync가 대상 디렉토리 내에 중복 디렉토리 구조, 즉 대상의 /usr 내부에 /usr/ 디렉토리를 생성했다는 것입니다. --compare-dest=./는 그것을 멈추는 것처럼 보였지만 그 이유를 완전히 이해하지 못합니다.
이 작업을 수행하기 위해 개발 중인 스크립트는 다음과 같습니다.
#!/usr/bin/zsh
typeset -A FILESYSTEMS
typeset -A NAMES
MOUNTPOINT='/media/Ubuntu_Backup'
LOGFILE='/home/kmiller/backup.log'
OPTIONS=('-a') #archive
OPTIONS+=('-x') #don't cross file system boundaries
OPTIONS+=('-i') #itemize changes
OPTIONS+=('-h') #human readable output
OPTIONS+=('-v') #verbose
OPTIONS+=('-A') #preserve ACLS
OPTIONS+=('-X') #preserve extended attributes
OPTIONS+=('-H') #preserve hard links
OPTIONS+=('--delete') #delete extraneous
OPTIONS+=('--inplace') #update files directly (faster - no building temp copies)
OPTIONS+=('--numeric-ids') #no translation of UID,GID - needed for proper restores
OPTIONS+=('--compare-dest=./') #
OPTIONS+=('-n') #dry run
FILESYSTEMS=('/' '/dev/sdb6')
FILESYSTEMS+=('/boot/' '/dev/sdb1')
FILESYSTEMS+=('/usr/' '/dev/sdb8')
FILESYSTEMS+=('/home/' '/dev/sdb7')
ROOTEXCLUDES=("--exclude='boot/*'")
ROOTEXCLUDES+=("--exclude='usr/*'")
ROOTEXCLUDES+=("--exclude='home/*'")
ROOTEXCLUDES+=("--exclude='dev/*'")
ROOTEXCLUDES+=("--exclude='proc/*'")
ROOTEXCLUDES+=("--exclude='sys/*'")
ROOTEXCLUDES+=("--exclude='tmp/*'")
ROOTEXCLUDES+=("--exclude='run/*'")
ROOTEXCLUDES+=("--exclude='mnt/*'")
ROOTEXCLUDES+=("--exclude='media/*'")
ROOTEXCLUDES+=("--exclude='lost+found/*'")
ROOTEXCLUDES+=("--exclude='etc/fstab'")
BOOTEXCLUDES=("--exclude='lost+found/*'")
BOOTEXCLUDES+=("--exclude='grub/grub.cfg'")
USREXCLUDES=("--exclude='lost+found/*'")
HOMEEXCLUDES=("--exclude='*/lost+found/*'")
HOMEEXCLUDES+=("--exclude='*/Downloads/*'")
HOMEEXCLUDES+=("--exclude='*/.cache'")
HOMEEXCLUDES+=("--exclude='*/.thumbnails'")
NAMES=('/' 'ROOT' '/boot/' 'BOOT' '/usr/' 'USR' '/home/' 'HOME')
is_mounted () {
mount | grep "$1" || return 1
return 0
}
if [[ ! -d $MOUNTPOINT ]];then
echo "creating $MOUNTPOINT..."
sudo mkdir $MOUNTPOINT || {echo "$0 failed - Problem creating mount dir: $MOUNTPOINT" && exit;}
fi
rm -rf $LOGFILE
#unmount any target backup partitons if they happen to be mounted
for FS in ${(k)FILESYSTEMS};do
if is_mounted ${FILESYSTEMS[$FS]};then
sudo umount ${FILESYSTEMS[$FS]} || {echo "$0 - Problem unmounting: $MOUNTPOINT" && exit;}
fi
done
echo -e "\nStarting partition backups..."
for FS in ${(k)FILESYSTEMS};do
EXCLUDES=$(eval echo \$${NAMES[${FS}]}EXCLUDES)
echo "-------------------------------------------------------"
echo "mounting ${FS} partition: ${FILESYSTEMS[$FS]}..."
sudo mount ${FILESYSTEMS[$FS]} $MOUNTPOINT || {echo "$0 - Problem mounting: ${FILESYSTEMS[$FS]} $MOUNTPOINT" && exit;}
echo "backing up ${FS} via rsync to: $MOUNTPOINT..." | tee -a $LOGFILE 2>&1
echo "sudo rsync ${OPTIONS} ${EXCLUDES} ${FS} /media/Ubuntu_Backup" >> ${LOGFILE} 2>&1
eval sudo rsync ${OPTIONS} ${EXCLUDES} ${FS} /media/Ubuntu_Backup >> ${LOGFILE} 2>&1 || {echo -e "WARNING: rsync returned an error: $rc\nSee backup.out for details!" && exit;}
df ${FILESYSTEMS[$FS]} | tee -a $LOGFILE 2>&1
echo "unmounting ${FILESYSTEMS[$FS]}"
sleep 2
sudo umount ${FILESYSTEMS[$FS]} || {echo "$0 failed - Problem unmounting partition: ${FILESYSTEMS[$FS]}" && exit;}
done
echo -e "Finished partition backups...\n"
어떤 조언이나 통찰력이라도 환영합니다...
답변1
더 많은 테스트를 거쳐 스크립트에 생성된 rsync 명령을 명령줄에서 실행하면 완벽하게 작동한다는 것을 깨달았습니다. 따라서 스크립팅 환경 내 확장이나 해석에 내가 완전히 이해하지 못하는 문제가 있다고 가정할 수 밖에 없습니다. 수정 사항은 rsync 명령을 평가하는 것이며 이를 반영하기 위해 원본 게시물을 편집했습니다.