วิธีการตั้งค่าการโคลนดิสก์ด้วย dd, netcat และ ssh tunnel


26

ฉันต้องการคัดลอกเนื้อหาเป็นกลุ่ม (reimage disk โดยใช้dd) กับ netcat จากโฮสต์ A ถึง B ผ่านช่องทางเข้ารหัส ssh บน Linux

คำสั่งใดที่ฉันควรพิมพ์ที่ปลายทั้งสอง?

คำตอบ:


28

การคัดลอกจากต้นทางไปยังเป้าหมายโดยที่เป้าหมายมี sshd ที่ทำงานอยู่:

  • dd if=/dev/sda | gzip | ssh root@target 'gzip -d | dd of=/dev/sda'

การคัดลอกจากต้นทางไปยังเป้าหมายผ่าน sshd_host เมื่อเป้าหมายไม่ได้รัน sshd

  • เป้าหมาย: nc -l -p 62222 | dd of=/dev/sda bs=$((16 * 1024 * 1024))
  • ที่มา: ssh -L 62222:target:62222 sshd_host &
  • ที่มา: dd if=/dev/sda | nc -w 3 localhost 62222

    dd - if =เป็นแหล่งที่มาของ =เป็นปลายทางbs =คือขนาดบล็อก ขนาดบล็อกแตกต่างกันอาจปรับปรุงประสิทธิภาพ 16 มักเป็นจุดเริ่มต้นที่สมเหตุสมผล คุณยังสามารถใช้count =เพื่อระบุจำนวนบล็อกที่ต้องการคัดลอก

    nc - -pหมายถึงพอร์ตที่จะใช้สำหรับการบริการ -lใช้เพื่อเริ่มบริการ -wตั้งค่าเวลาเพื่อรอข้อมูลในไปป์ไลน์ก่อนที่จะออก

    ssh - -Lตั้งค่าช่องสัญญาณบนโฮสต์ระยะไกล local_port:target_host:target_portรูปแบบของการโต้แย้งคือ โปรแกรมโลคัล (nc) ของคุณเชื่อมต่อกับ local_port การเชื่อมต่อนี้เป็นช่องสัญญาณและเชื่อมต่อกับ target_port บน target_host

ตัวเลือกที่กำหนดเป็นเพียงตัวเลือกที่ใช้สำหรับสิ่งนี้ ดูรายละเอียดเพิ่มเติมจาก man man

หมายเหตุเล็กน้อย:

  1. หากคุณกำลังทำสิ่งนี้นอกเหนือจาก LAN ฉันขอแนะนำให้บีบอัดดาต้าสตรีมด้วย gzip หรือบีบอัด Bzip2 ก็ใช้งานได้เช่นกัน แต่ใช้เวลา CPU นานขึ้น คนแรกมีตัวอย่างของการใช้งานที่
  2. จะดีกว่าถ้าพาร์ติชันต้นทางไม่ได้ถูกเมาท์หรือถูกเมาท์แบบอ่านอย่างเดียว ถ้าไม่คุณจะต้อง fsck ภาพปลายทาง
  3. ยกเว้นว่าหนึ่งในเครื่องมี netcat แต่ไม่ใช่ ssh, netcat ไม่จำเป็นต้องใช้ที่นี่จริงๆ กรณีนี้จะมีลักษณะดังนี้:

source machine dd -> nc -> ssh -> ssh tunnel -> sshd server -> nc on target -> dd

  1. ทำงานได้ดีที่สุดถ้าแหล่งที่มาและเป้าหมายมีขนาดเท่ากัน หากไม่ใช่เป้าหมายจะต้องมีขนาดใหญ่กว่าของ 2
  2. หากคุณใช้ ext2 / 3 หรือ xfs ดัมพ์ (หรือ xfsdump) และการกู้คืนอาจเป็นตัวเลือกที่ดีกว่า มันจะไม่จัดการกับบูตเซกเตอร์ แต่จะทำงานเมื่อเป้าหมายและแหล่งที่มามีขนาดแตกต่างกัน

4

ถ้าคุณต้องการใช้ netcat ที่ไม่มี ssh ฉันคิดว่าเป็นวิธีที่เร็วที่สุดและไม่ใช่อันที่ปลอดภัยคุณสามารถคัดลอกและกู้คืนดิสก์ทั้งหมดเช่นนี้:
บนคอมพิวเตอร์ A ด้วย IP 192.168.0.1

cat /dev/hdb | nc -p 9000
บนคอมพิวเตอร์ B
nc -l 192.168.0.1 9000 > /dev/hdb

จำไว้ว่าตาม man nc ตัวเลือก -l คือ:

  -l ใช้เพื่อระบุว่า nc ควรฟังการเชื่อมต่อขาเข้าแทนที่จะเริ่มต้นการเชื่อมต่อกับโฮสต์ระยะไกล เป็นข้อผิดพลาดในการใช้ตัวเลือกนี้ร่วมกับตัวเลือก -p, -s หรือ -z

3

ไม่จำเป็นต้องใช้ netcat

บน src machine run:

dd if=/dev/sdX bs=1M | ssh root@dstMachine " dd of=/dev/sdY bs=1M"

ฉันถือว่าไม่มีพาร์ติชันบน sdX และ sdY ติดตั้งอยู่ คุณสามารถบูตกล่องทั้งสองด้วยknoppixหรือ distro สดอื่นที่คล้ายคลึงกัน

dd - รับข้อมูลจากถ้า [หากไม่ได้ให้ไว้ - นำมาจาก stdin] ส่งข้อมูลไปที่ของ [หากไม่ได้ระบุไว้ - ข้อมูลจะถูกส่งไปยัง stdout] bs - ขนาดบล็อก ... จะช่วยให้สิ่งต่าง ๆ เร็วขึ้น

ssh - รันคำสั่งที่ระบุไว้ในเครื่องหมายคำพูดบนกล่องรีโมตข้อมูลทั้งหมดที่ปั๊มไปยัง stdin ของ ssh จะถูกส่งสัญญาณไปยังเครื่องระยะไกลและ porovided เป็น stdin เพื่อดำเนินการคำสั่งที่นั่น


ดังนั้นจึงเป็นไปไม่ได้ในดิสก์ที่ติดตั้ง
Evgeny

@Evgeny มันจะโอเคถ้าดิสก์นั้นถูกเมาท์เป็นแบบอ่านอย่างเดียว มิฉะนั้น - อย่าทำ ... สำเนาของคุณจะไม่สอดคล้องกัน
pQd

3

โฮสต์ A คือรูปภาพหนึ่งโฮสต์ B คือรูปภาพที่จะถูกเก็บไว้ใน:

root@A# dd if=/dev/sda | ssh root@B "dd of=/some/file"

การกู้คืนไปยังดิสก์จะแลกเปลี่ยนสองสิ่งนี้


1

สำเนาขั้นพื้นฐานที่มี netcat อธิบายไว้ที่นี่

หากคุณต้องการให้SSHมีส่วนร่วมในเรื่องนี้คุณสามารถใช้การส่งต่อพอร์ตเหนือ

-R [bind_address:]port:host:hostport

แต่โดยรวมคุณสามารถทำการโอน SSH ได้ตั้งแต่แรก (โดยไม่ใช้ netcat)


1

ตราบใดที่ระบบไฟล์ทั้งคู่ไม่ถูกถอดออก dd ก็ทำงานได้ดี

(from server1) dd if=/dev/sda bs=32k | ssh <server2> dd of=/dev/sda bs=32k

คุณจะต้องตั้งค่าการรับรองความถูกต้องของโฮสต์ก่อนเวลามิฉะนั้นการแจ้งรหัสผ่านจะทำให้การคัดลอกล้มเหลว

การทำเช่นนี้กับปริมาณที่เมานต์จะให้ผลลัพธ์ที่ไม่ดี


ขอบคุณ คำพูดที่จำเป็น?
Evgeny

1

หรือคุณสามารถใช้ clonezilla และ "mount" ที่เก็บข้อมูลระยะไกลของคุณผ่าน sshfs


หากคุณกำลังคัดลอกพาร์ติชันคุณไม่ต้องการให้พาร์ติชันเป้าหมายยกเลิกการเมานท์หรือไม่? รายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือกนี้จะเป็นประโยชน์
Mark Stosberg

1

ฉันลองใช้ตัวเลือกต่าง ๆ ที่มีให้ด้านบนและกำลังแบ่งปันผลลัพธ์กับคุณ เร็วที่สุดถึงช้าที่สุดโดยใช้การรวมกันของขนาดบล็อก dd, gzip และอัลกอริทึมการบีบอัด gzip

อย่างที่คุณเห็น gzip ให้ฉันปรับปรุงเมื่อใช้อัลกอริทึมเร็วร่วมกับขนาดบล็อก 1M

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 326.045 s, 39.5 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | gzip --fast | ssh hyp5 'gzip -d | dd of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 370.158 s, 34.8 MB/s

time dd if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 370.274 s, 34.8 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | ssh hyp5 dd bs=1M of=/dev/HypGroup00/stage
12884901888 bytes (13 GB) copied, 372.906 s, 34.6 MB/s

time dd bs=1M if=/dev/HypGroup00/stage-snapshot  | gzip | ssh hyp5 'gzip -d | dd bs=1M of=/dev/HypGroup00/stage'
12884901888 bytes (13 GB) copied, 520.116 s, 24.8 MB/s

มีการใช้เซิร์ฟเวอร์ที่รวดเร็วสองตัวเชื่อมต่อกับ GigE ผ่านสวิตช์ Enterprise GigE โดยใช้ดิสก์ภายในเครื่องผ่านทาง LVM


0

ดูเหมือนว่าคุณกำลังใช้ค้อนขนาดใหญ่ที่จะแตกน็อตที่นี่ - หรืออาจจะเป็นการเปรียบเทียบที่ดีกว่าคือพยายามตัดหญ้าด้วยกรรไกร :)

ฉันขอแนะนำอย่างยิ่งให้คุณดูเครื่องมือบางอย่างที่นั่นสำหรับการทำงานเช่นนี้เว้นแต่คุณจะมีเหตุผลที่ยอดเยี่ยมที่จะทำในบ้าน

Trinity Rescue Kitเป็น liveCD ฟรีที่รองรับไดรฟ์ภาพบนมัลติคาสต์และอาจทำในสิ่งที่คุณต้องการ (หรือใครก็ตามที่คิดในบรรทัดเดียวกัน) โดยไม่ต้องใช้ระบบการถ่ายภาพแบบเต็มแรง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.