วิธี dd รีโมตดิสก์โดยใช้ SSH บนเครื่องโลคัลและบันทึกลงในโลคัลดิสก์


85

ฉันจะสร้างการสำรองข้อมูลของดิสก์ระยะไกลโดยใช้ SSH บนเครื่องของฉันและบันทึกลงในดิสก์ภายในเครื่องได้อย่างไร


ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

ssh hostname@my.ip.address "sudo dd if=/dev/sdX " | \
  dd of=/home/username/Documents/filename.image`

อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้:

ไม่มี tty ปัจจุบันและไม่ได้ระบุโปรแกรม askpass

คำตอบ:


114

หากเจตนาของคุณคือการสำรองข้อมูลHDD Aของคอมพิวเตอร์ระยะไกลผ่าน SSH ไปยังไฟล์เดียวที่อยู่บน HDD ของคอมพิวเตอร์คุณสามารถทำอย่างใดอย่างหนึ่งต่อไปนี้

ตัวอย่าง

เรียกใช้จากคอมพิวเตอร์ระยะไกล

$ dd if=/dev/sda | gzip -1 - | ssh user@local dd of=image.gz

เรียกใช้จากเครื่องคอมพิวเตอร์

$ ssh user@remote "dd if=/dev/sda | gzip -1 -" | dd of=image.gz

ตัวอย่างสด

$ ssh skinner "dd if=/dev/sda5 | gzip -1 -" | dd of=image.gz
208782+0 records in
208782+0 records out
106896384 bytes (107 MB) copied, 22.7608 seconds, 4.7 MB/s
116749+1 records in
116749+1 records out
59775805 bytes (60 MB) copied, 23.9154 s, 2.5 MB/s

$ ll | grep image.gz
-rw-rw-r--.   1 saml saml  59775805 May 31 01:03 image.gz

วิธีการตรวจสอบ?

  1. ลงชื่อเข้าใช้ผ่านsshเทอร์มินัลอื่นและls -lไฟล์เพื่อดูขนาดของไฟล์
  2. คุณสามารถใช้pvเพื่อตรวจสอบความคืบหน้าของการดำเนินการ dd ขนาดใหญ่เช่นสำหรับตัวอย่างจากระยะไกลข้างต้นคุณสามารถทำได้:

    $ dd if=/dev/sda | gzip -1 - | pv | ssh user@local dd of=image.gz
    
  3. ส่งสัญญาณ "SIGUSR1" ไปที่ddและมันจะพิมพ์สถิติ สิ่งที่ต้องการ:

    $ pkill -USR1 dd
    

อ้างอิง

วิธีการดังกล่าวข้างต้นสำหรับการตรวจสอบที่ถูกทิ้งไว้ แต่เดิมผ่านทางความคิดเห็นโดย@Ryan & @bladtและตัวผมเอง ฉันย้ายคำตอบไปให้ชัดเจนยิ่งขึ้น


ฉันลองสิ่งนี้เพื่อปัญหาที่คล้ายกัน (สำรองข้อมูลONEฮาร์ดไดรฟ์ของคอมพิวเตอร์ระยะไกลไปยังที่TWOเก็บข้อมูลของคอมพิวเตอร์ระยะไกล) เช่นนี้: <br /> [root @ ONE] # dd if = / dev / sda1 | ssh root @ TWO dd of=/root/Public/ONE/sda1.img<br /> 409600 + 0 บันทึกใน 409600 + 0 บันทึก 209715200 ไบต์ (210 MB) คัดลอก, 0.894929 วินาที, 234 MB / s Pseudo-terminal จะไม่ถูกจัดสรรเพราะ stdin ไม่ใช่รหัสผ่านของ terminal @ TWO : ปัญหาคือ/root/Public/ONE/sda1.imgไฟล์ถูกสร้างขึ้นONEไม่ใช่เปิดTWOอย่างที่คาดไว้ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
Urhixidur

1
ใครช่วยให้เราตัวอย่างจากการใช้pvจากเครื่องท้องถิ่นหรือไม่ ขอขอบคุณ.
TCB13

มันจะดีกว่าที่จะใช้ lbzip2 หรือ pigz ติดตั้งของ gzip
Shimon Doodkin

เหตุใดฉันจึงต้องการ "| dd of = image.gz" ที่ส่วนท้าย (ไม่ใช่แค่ "> image.gz") เพราะ dd ใช้ 100% ของซีพียูตัวเดียว
Shimon Doodkin

6
เกี่ยวกับการตรวจสอบ: dd รุ่นใหม่กว่านี้ยังมีstatus=progressตัวเลือก ดังนั้นคุณไม่จำเป็นต้องเรียกใช้pkill -USR1 ddจากเทอร์มินัลอื่นอีกต่อไป
จนถึงSchäfer

12

ข้อผิดพลาดที่คุณได้รับเกิดจากการใช้ sudo จากระยะไกล (คุณจะถูกขอรหัสผ่าน แต่คุณไม่มี tty ให้ป้อน) ในทางกลับกันในฐานะผู้ใช้ทั่วไปคุณไม่สามารถใช้งานได้ตามปกติddในคำตอบอื่น ๆ (คุณไม่มีสิทธิ์ที่จำเป็นสำหรับอุปกรณ์) คุณสามารถแก้ปัญหาด้วยการให้สิทธิ์กับตัวเองในการดำเนินการddเป็น sudo โดยไม่ต้องใช้รหัสผ่าน คุณสามารถทำได้โดยแก้ไขไฟล์ sudoers (บนรีโมท!):

sudo visudo

เพิ่มบรรทัดต่อไปนี้:

userfoo ALL=(ALL) NOPASSWD: /bin/dd if=/dev/sdX

ตอนนี้คุณสามารถออก:

ssh userfoo@host "sudo /bin/dd if=/dev/sdX" | dd of=test.dd

และมันควรจะทำงาน คุณสามารถสร้างรายการทั่วไปเพิ่มเติมใน sudoers ช่วยให้คุณเรียกใช้ddกับพารามิเตอร์ใด ๆ แต่มันก็ฉลาดที่จะรักษาสิทธิ์ฟรีนี้ให้น้อยที่สุดที่คุณต้องการ


หรือคุณสามารถเรียกใช้ 'sudo ls' ที่ส่วนท้ายที่เกี่ยวข้อง (และพิมพ์รหัสผ่าน) ก่อนที่จะเรียกใช้คำสั่ง 'sudo dd ... '
MikeW

ด้วยรุ่นที่ใหม่กว่าของการเพิ่ม dd status = ความคืบหน้าแม้จะช่วยให้การตรวจสอบความคืบหน้าการคัดลอก
sensslen

7

ฉันเพิ่งใช้เวอร์ชันดัดแปลงบนกล่อง Linux Mint เสมือนเพื่อโคลนฮาร์ดไดรฟ์ทางกายภาพบนเซิร์ฟเวอร์ RedHat ที่มีอายุมาก

ฉันวิ่งต่อไปนี้เป็น root ในกล่องเสมือน:

ssh root@192.168.1.5 "dd if=/dev/cciss/c0d0" | dd of=/dev/sdb
  • 192.168.1.5 เป็นกล่อง Red Hat Enterprise Linux 2.1 จริง
  • / dev / sdb เป็นดิสก์เสมือนใหม่ซึ่งเมื่อเสร็จสิ้นการโคลนจะเป็นพื้นฐานของรุ่นเสมือนจริงของกล่องทางกายภาพที่กำลังจะตาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.