我目前正在为 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
请注意,此处两个目录树似乎都使用了大约 8 MB。现在我们一起看看这两棵树:
du -ms /tmp/a /tmp/b # Disk usage summaries
8 /tmp/a
1 /tmp/b
您可以看到/tmp/a
仍然使用大约 8 MB,但/tmp/b
现在不再使用 8 MB,而是仅使用额外的 1 MB。这是因为其他文件已经被计算在内,因此它们不会占用任何额外的磁盘空间。 (目录结构占用额外的空间。)
数据集越大,比率就会好得多;下面是从我的一个较小的系统中获取的备份片段rsnapshot
,显示了 30 GB 左右的备份在这些备份之间的 24 小时内发生了不到 1 GB 的变化:
du -ms daily.{0,1}
30752 daily.0
782 daily.1