Дело обстоит так:
у нас есть два сервера, удаленный сервер с ТОЛЬКО 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,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. Обычно вы делаете это, перезаписывая все нулями.
После этого результат должен быть таким, как вы ожидаете.
Лично я бы не стал запускать резервное копирование на уровне блочного устройства. Я бы просто использовал существующий инструмент резервного копирования, который действительно знает и использует файловую систему.