案情如下:
我们有两台服务器,一台只有 FTP 访问权限的远程服务器,以及一台本地 Linux 服务器,我们必须在其中配置一个脚本,以使用 dd 命令备份所有系统。备份必须保存在远程服务器上。
为此,我们已将远程服务器作为本地磁盘安装在 /mnt/remoteftp
为了挂载 ftp 服务器,我们使用了 curlftps: 如何将远程 ftp 目录主机本地挂载到 linux 文件系统
对于备份我们使用了 dd: 如何在整个磁盘上使用 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 压缩的数据)覆盖磁盘上所有未使用的空间来实际清除磁盘上所有未使用的空间。通常,您可以通过用零覆盖所有内容来实现此目的。
此后,结果应该如您所期望的那样。
就我个人而言,我不会在块设备级别运行备份。我只会使用实际了解并使用文件系统的现有备份工具。