Назад | Перейти на главную страницу

Как сжать и разделить резервную копию на удаленном 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,1 ГБ, поэтому я ожидаю 3 файла, когда мой скрипт завершится:

1 файл размером 1 ГБ, другой файл размером 1 ГБ и последний файл размером 100 МБ.

Вместо этого у меня есть

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# 

Почему такое поведение?

Когда вы используете dd вы копируете данные на уровне блока. Раздел ничего не знает о файловой системе или о том, что на ней находится.

Если вы скопируете файл размером 10 ГБ на сервер и сразу удалите его, вы удалите только ссылки на него в файловой системе. Сами данные по-прежнему будут там. Итак, когда вы впоследствии копируете раздел с помощью dd, вы также скопируете этот «призрачный» файл.

Чтобы получить ожидаемый результат, вам нужно фактически стереть все неиспользуемое пространство на диске, перезаписав его другими данными, предпочтительно чем-то, что легко сжимается с помощью gzip. Обычно вы делаете это, перезаписывая все нулями.

После этого результат должен быть таким, как вы ожидаете.


Лично я бы не стал запускать резервное копирование на уровне блочного устройства. Я бы просто использовал существующий инструмент резервного копирования, который действительно знает и использует файловую систему.