현재 rsync용 bash 스크립트를 작성 중입니다. 나는 내가 뭔가 잘못하고 있다고 확신합니다. 그러나 나는 그것이 무엇인지 말할 수 없습니다. 나는 모든 것을 자세히 설명하고 누군가가 나를 도울 수 있기를 바랍니다.
스크립트의 목표는 전체 및 증분 백업에 rsync를 사용하는 것입니다. 한 가지 중요한 점을 제외하고는 모든 것이 잘 작동하는 것 같았습니다. 해당 --link-dest
매개변수를 사용하더라도 여전히 모든 파일을 복사하는 것처럼 보입니다 . 파일 크기를 확인해 봤습니다 du -chs
.
먼저 이것은 내 스크립트입니다.
#!/bin/sh
while getopts m:p: flags
do
case "$flags" in
m) mode=${OPTARG};;
p) prev=${OPTARG};;
*) echo "usage: $0 [-m] [-p]" >&2
exit 1 ;;
esac
done
date="$(date '+%Y-%m-%d')";
#Create Folders If They Do Not Exist (-p paramter)
mkdir -p /Backups/Full && mkdir -p /Backups/Inc
FullBackup() {
#Backup Content Of Website
mkdir -p /Backups/Full/$date/Web/html
rsync -av user@IP:/var/www/html/ /Backups/Full/$date/Web/html/
#Backup All Config Files NEEDED. Saving Storage Is Key ;)
mkdir -p /Backups/Full/$date/Web/etc
rsync -av user@IP:/etc/apache2/ /Backups/Full/$date/Web/etc/
#Backup Fileserver
mkdir -p /Backups/Full/$date/Fileserver
rsync -av user@IP:/srv/samba/private/ /Backups/Full/$date/Fileserver/
#Backup MongoDB
ssh user@IP /usr/bin/mongodump --out /home/DB
rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
ssh user@IP rm -rf /home/DB
}
IncrementalBackup(){
Method="";
if [ "$prev" == "full" ]
then
Method="Full";
elif [ "$prev" == "inc" ]
then
Method="Inc";
fi
if [ -z "$prev" ]
then
echo "-p Parameter Empty";
else
#Get Latest Folder - Ignore the hacky method, it works.
cd /Backups/$Method
NewestBackup=$(find . ! -path . -type d | sort -nr | head -1 | sed s@^./@@)
IFS='/'
read -a strarr <<< "$NewestBackup"
Latest_Backup="${strarr[0]}";
cd /Backups/
#Incremental-Backup Content Of Website
mkdir -p /Backups/Inc/$date/Web/html
rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/html/ user@IP:/var/www/html/ /Backups/Inc/$date/Web/html/
#Incremental-Backup All Config Files NEEDED
mkdir -p /Backups/Inc/$date/Web/etc
rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Web/etc/ user@IP:/etc/apache2/ /Backups/Inc/$date/Web/etc/
#Incremental-Backup Fileserver
mkdir -p /Backups/Inc/$date/Fileserver
rsync -av --link-dest /Backups/$Method/"$Latest_Backup"/Fileserver/ user@IP:/srv/samba/private/ /Backups/Inc/$date/Fileserver/
#Backup MongoDB
ssh user@IP /usr/bin/mongodump --out /home/DB
rsync -av root@BackupServerIP:/home/DB/ /Backups/Full/$date/DB
ssh user@IP rm -rf /home/DB
fi
}
if [ "$mode" == "full" ]
then
FullBackup;
elif [ "$mode" == "inc" ]
then
IncrementalBackup;
fi
내가 사용한 명령: 전체 백업
bash script.sh -m full
증가
bash script.sh -m inc -p full
스크립트를 실행하면 전혀 오류가 발생하지 않습니다. 위에서 언급했듯이 여전히 모든 파일을 복사하는 것 같습니다. 제가 수행한 몇 가지 테스트는 다음과 같습니다.
du -chs의 출력
root@Backup:/Backups# du -chs /Backups/Full/2021-11-20/*
36K /Backups/Full/2021-11-20/DB
6.5M /Backups/Full/2021-11-20/Fileserver
696K /Backups/Full/2021-11-20/Web
7.2M total
root@Backup:/Backups# du -chs /Backups/Inc/2021-11-20/*
36K /Backups/Inc/2021-11-20/DB
6.5M /Backups/Inc/2021-11-20/Fileserver
696K /Backups/Inc/2021-11-20/Web
7.2M total
ls -li의 출력
root@Backup:/Backups# ls -li /Backups/Full/2021-11-20/
total 12
1290476 drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
1290445 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290246 drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web
root@Backup:/Backups# ls -li /Backups/Inc/2021-11-20/
total 12
1290506 drwxr-xr-x 4 root root 4096 Nov 20 19:28 DB
1290496 drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
1290486 drwxr-xr-x 4 root root 4096 Nov 20 19:28 Web
증분 백업을 수행하고 파일을 변경/추가할 때 Rsync 출력
receiving incremental file list
./
lol.html
sent 53 bytes received 194 bytes 164.67 bytes/sec
total size is 606 speedup is 2.45
receiving incremental file list
./
sent 33 bytes received 5,468 bytes 11,002.00 bytes/sec
total size is 93,851 speedup is 17.06
receiving incremental file list
./
sent 36 bytes received 1,105 bytes 760.67 bytes/sec
total size is 6,688,227 speedup is 5,861.72
*Irrelevant MongoDB Dump Text*
sent 146 bytes received 2,671 bytes 1,878.00 bytes/sec
total size is 2,163 speedup is 0.77
나는 이것이 ./
그것과 관련이 있다고 의심합니다. 제가 틀렸을 수도 있지만 의심스러워 보입니다. 같은 명령을 다시 실행하면 ./
로그에는 남지 않지만, 같은 날 실행한 탓인지 /Backup/Inc/2021-11-20
폴더에 덮어씌워졌습니다.
ls -l의 출력
root@Backup:/Backups# ls -l /Backups/Inc/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:49 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:49 Web
root@Backup:/Backups# ls -l /Backups/Full/2021-11-20/
total 12
drwxr-xr-x 4 root root 4096 Nov 20 19:26 DB
drwxrwxr-x 6 root root 4096 Nov 20 18:54 Fileserver
drwxr-xr-x 4 root root 4096 Nov 20 19:26 Web
편집자 코멘트:
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Full/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 19:49:31.701680076 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:17.586745740 +0000 ..
-rw-r--r-- 2 root root 158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root 34 2021-11-20 19:49:31.701680076 +0000 lol.html
-rw-r--r-- 2 root root 414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css
root@Backup:/Backups# ls -al --time-style=full-iso /Backups/Inc/2021-11-20/Web/html/
total 20
drwxr-xr-x 2 root root 4096 2021-11-20 23:16:47.673977833 +0000 .
drwxr-xr-x 4 root root 4096 2021-11-20 23:16:54.903294115 +0000 ..
-rw-r--r-- 2 root root 158 2021-11-16 15:40:30.000000000 +0000 index.html
-rw-r--r-- 1 root root 44 2021-11-20 23:16:47.673977833 +0000 lol.html
-rw-r--r-- 2 root root 414 2021-11-16 15:53:52.000000000 +0000 stylesheet.css
자세한 내용은 알려주시기 바랍니다. 나는 오랫동안 노력해 왔습니다. 어쩌면 링크를 만들고 디스크 공간을 절약하는 것이 틀렸을 수도 있습니다.
답변1
링크된 파일이 파일 시스템의 두 위치에 존재하기 때문에 혼란이 발생합니다. 사용된 디스크 보기를 사용하면 du
파일이 두 트리 모두에 위치하므로 각 호출에서 du
모든 파일을 찾습니다. 상위 결과를 합산하고 파일이 원하는 것보다 두 배의 공간을 차지한다는 결론을 내렸습니다. 즉, 하드 링크가 작동하지 않습니다.
오류는 최고 디스크 사용량 결과를 합산하는 데 있습니다. 대신, du
두 백업 트리를 모두 포함하는 단일 트리를 실행해 보십시오. du
파일은 검색 횟수에 관계없이 한 번만 계산되므로 디스크 절약 효과가 나타나기 시작합니다 .
다음은 실제 예입니다.
mkdir /tmp/a # Working directories
cp -a /etc/* /tmp/a 2>/dev/null # Generate some data in /tmp/a
cp -al /tmp/a /tmp/b # Link it into /tmp/b
이제 각 트리에서 사용되는 디스크의 양을 측정해 보겠습니다. 모든 파일이 링크되어 있으므로 동일해야 합니다. ( ls -l
모든 파일의 링크 수를 보면 이를 확인할 수 있습니다 .)
du -ms /tmp/a # Disk usage summary
8 /tmp/a # Result
du -ms /tmp/b # Disk usage summary
8 /tmp/b # Result
여기서 두 디렉터리 트리 모두 약 8MB를 사용하는 것으로 나타납니다. 이제 이 두 트리를 함께 살펴보겠습니다.
du -ms /tmp/a /tmp/b # Disk usage summaries
8 /tmp/a
1 /tmp/b
/tmp/a
여전히 8MB 정도가 사용되는 것을 볼 수 있는데 , /tmp/b
이제는 8MB 대신 1MB만 추가로 사용됩니다. 이는 다른 파일이 이미 고려되었기 때문에 추가 디스크 공간을 차지하지 않기 때문입니다. (디렉토리 구조가 추가 공간을 차지합니다.)
데이터 세트가 클수록 비율은 더 좋아집니다. 아래는 내 작은 시스템 중 하나에서 가져온 백업 조각으로 rsnapshot
, 이러한 백업 사이 24시간 동안 1GB 미만의 백업이 발생하는 것을 보여줍니다.
du -ms daily.{0,1}
30752 daily.0
782 daily.1