1

Я использую драйвер блока Datto, чтобы делать снимки моего работающего сервера каждую ночь. После того , как снимок берется, я dd снимок из /dev/datto0 через PipeViewer pv и gzip в файл в файловой системе. Затем файл загружается в DropBox и удаляется.

Я автоматизировал это с помощью Bash-скрипта и настроил его запускать по заданию cron каждую ночь. Вот фрагмент моего сценария Bash, который доставляет мне неприятности:

echo "$(date +"%r"): Calculating MD5 checksum of /dev/datto0..."
MD5=$(md5sum /dev/datto0)
echo "$(date +"%r"): MD5: $MD5"

echo "$(date +"%r"): Compressing /dev/datto0 via gzip to /tmp directory..."
dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

echo "$(date +"%r"): Compression complete. File size is: $(du -b /tmp/BACKUP_${TODAY}_${MD5}.dd.gz | cut -f1) bytes"

Вот ошибка, которая выбрасывается:

02:37:35 PM: Calculating MD5 checksum of /dev/datto0...
02:54:01 PM: MD5: 28a6a6c11f088d6149d178af6e45102a  /dev/datto0
02:54:01 PM: Compressing /dev/datto0 via gzip to /tmp directory...
dd: unrecognized operand ‘/dev/datto0.dd.gz’
Try 'dd --help' for more information.
 896kB 0:00:00 [42.7MB/s] [  <=>                                                                                                      ]
du: cannot access ‘/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a’: No such file or directory
du: cannot access ‘/dev/datto0.dd.gz’: No such file or directory
02:54:01 PM: Compression complete. File size is:  bytes

Вот часть ошибки, которая действительно заставляет меня чесать голову:

dd: unrecognized operand ‘/dev/datto0.dd.gz’

Я ни разу в своем сценарии не ссылаюсь на /dev/datto0.dd.gz

Может быть, часть моей команды dd по какой-то причине пропускается? dd: unrecognized operand ‘/dev/datto0.dd.gz’

2 ответа2

2

Проблема в том, что выходные данные из md5sum включают в себя как значение хеш-функции, так и исходное имя файла, поэтому для переменной MD5 задается что-то вроде «28a6a6c11f088d6149d178af6e45102a /dev /datto0». Таким образом, команда

dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

расширяется до

dd of=/tmp/BACKUP_09_21_2015_28a6a6c11f088d6149d178af6e45102a /dev/datto0.dd.gz

... что смущает dd много. Точно так же, когда вы используете > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz , он расширяется до двух слов, оболочка не знает, на какой вывод отправлять данные, и дает "неоднозначное перенаправление" ошибка.

Вы можете решить эту проблему, отправив вывод md5sum через awk '{print $1}':

MD5=$(md5sum /dev/datto0 | awk '{print $1}')

... или с помощью расширения переменной ${MD5%% *} , которое обрежет первый пробел и все после него. Кроме того, как правило, рекомендуется хранить ссылки на переменные в двойных кавычках - это позволяет избежать многих странных проблем с синтаксическим анализом, подобных этой. Сочетание этого с предложением JakeGould дает:

dd if=/dev/datto0 | pv | gzip -1 > "/tmp/BACKUP_${TODAY}_${MD5%% *}.dd.gz"
1

Эта команда dd выглядит странно. Почему dd if на одной стороне труб и dd of на другой стороне труб?

dd if=/dev/datto0 | pv | gzip -1 | dd of=/tmp/BACKUP_${TODAY}_${MD5}.dd.gz

Исходя из рекомендаций, приведенных на этой странице по использованию dd для резервного копирования, ваша команда должна выглядеть примерно так:

dd if=/dev/datto0 | pv | gzip -1 > /tmp/BACKUP_${TODAY}_${MD5}.dd.gz

Обратите внимание, как последний | dd of= теперь просто перенаправление вывода через стрелку вправо (>).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .