ปัญหาการสำรองข้อมูล DD Bash -“ ตัวถูกดำเนินการที่ไม่รู้จัก”


1

ฉันใช้Datto Block Driverเพื่อถ่ายภาพสแนปชอตของเซิร์ฟเวอร์ที่เปิดอยู่ทุกคืน หลังจากที่ถ่ายภาพสแนปชอตฉันจะddถ่ายภาพสแนปชอตจาก/dev/datto0ผ่าน PipeViewer ( pv) และgzipไปยังไฟล์ในระบบไฟล์ ไฟล์จะถูกอัปโหลดไปยัง DropBox และลบ

ฉันทำสิ่งนี้โดยอัตโนมัติด้วยสคริปต์ Bash และตั้งให้ทำงานผ่าน cron job ทุกคืน นี่เป็นตัวอย่างของสคริปต์ 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

ปัญหาคือว่าเอาต์พุตจากนั้น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ส่งออกของpiping ผ่าน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=ตอนนี้เป็นเพียงแค่การเปลี่ยนเส้นทางแบบง่ายๆผ่านลูกศรขวา ( >)


ฉันจะให้ช็อตนั้นและรายงานกลับ ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว
Andrew Paglusch

ฉันลองทำดู ยังคงได้รับข้อผิดพลาด แต่เป็นรายการใหม่:./backup.sh: line 61: /tmp/BACKUP_${TODAY}_${MD5}.dd.gz: ambiguous redirect 0B 0:00:00 [ 0B/s] [<=>
Andrew Paglusch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.