如何压缩和拆分远程 ftp 服务器上的备份以避免空白空间并使用 dd

如何压缩和拆分远程 ftp 服务器上的备份以避免空白空间并使用 dd

案情如下:

我们有两台服务器,一台只有 FTP 访问权限的远程服务器,以及一台本地 Linux 服务器,我们必须在其中配置一个脚本,以使用 dd 命令备份所有系统。备份必须保存在远程服务器上。

这是我的脚本

CT=$(fdisk -l | awk '$1 == "/dev/sda1" { print $3 }') dd if=/dev/sda1 bs=512 count=$CT | gzip | /mnt/remoteftp/PATH/sda_$(uname -r).img.gz

脚本可以运行,但我遇到了一个问题,因为脚本应该避免空白,但结果却不同,事实上

root@linuxserver:~/# df -h
Filesystem                           Size  Used Avail Use% Mounted on
udev                                 961M     0  961M   0% /dev
tmpfs                                195M  3,1M  192M   2% /run
/dev/sda1                             20G  2,1G   18G  11% /
tmpfs                                973M     0  973M   0% /dev/shm
tmpfs                                5,0M     0  5,0M   0% /run/lock
tmpfs                                973M     0  973M   0% /sys/fs/cgroup
/dev/sda15                           105M  3,6M  101M   4% /boot/efi
tmpfs                                195M     0  195M   0% /run/user/1001
curlftpfs#ftp://ftp.remotesrv.com/   954G     0  954G   0% /mnt/remoteftp

/dev/sda1 磁盘仅分配了 2.1GB,因此当我的脚本完成时我预计会有 3 个文件:

1 个文件大小为 1GB,另一个文件大小为 1GB,最后一个文件大小为 100MB。

相反,我有

root@linuxserver:~/batch# ls -lah /mnt/remoteftp/
total 17G
drwxr-xr-x 2 ubuntu ubuntu  4,0K nov 20  2019 .
drwxr-xr-x 7 ubuntu ubuntu  4,0K nov 20 12:02 ..
-rwxr-xr-x 0 ubuntu ubuntu   13G nov 20  2019 .fuse_hidden0000007900000001
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzaa
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzab
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzac
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzad
-rwxr-xr-x 1 ubuntu ubuntu  326M nov 20  2019 sda_4.15.0-70-generic.img.gzae
root@linuxserver:~/batch# ls -lah /mnt/remoteftp/
total 17G
drwxr-xr-x 2 ubuntu ubuntu  4,0K nov 20  2019 .
drwxr-xr-x 7 ubuntu ubuntu  4,0K nov 20 12:02 ..
-rwxr-xr-x 0 ubuntu ubuntu   13G nov 20  2019 .fuse_hidden0000007900000001
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzaa
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzab
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzac
-rwxr-xr-x 1 ubuntu ubuntu 1000M nov 20  2019 sda_4.15.0-70-generic.img.gzad
-rwxr-xr-x 1 ubuntu ubuntu  374M nov 20  2019 sda_4.15.0-70-generic.img.gzae
root@linuxserver:~/batch# 

为什么会有这种行为?

答案1

使用时,dd您将在块级别复制数据。分区对文件系统及其上的内容一无所知。

如果您在服务器上复制一个 10GB 的文件,然后立即删除它,那么您只会删除文件系统中对它的引用。数据本身仍会存在。因此,当您随后使用 复制分区时dd,您也会复制这个“幽灵”文件。

为了获得预期的结果,您需要通过用其他数据(最好是易于通过 gzip 压缩的数据)覆盖磁盘上所有未使用的空间来实际清除磁盘上所有未使用的空间。通常,您可以通过用零覆盖所有内容来实现此目的。

此后,结果应该如您所期望的那样。


就我个人而言,我不会在块设备级别运行备份。我只会使用实际了解并使用文件系统的现有备份工具。

相关内容