ฉันมีพื้นที่ว่างบนดิสก์ 200 GB, RAM 16 GB (ที่เดสก์ท็อปและเคอร์เนลประมาณ ~ 1 GB) และ swap 6 GB
ฉันมี SSD ภายนอก 240 GB ที่มี 70 GB ใช้1และที่เหลือฟรีซึ่งฉันต้องสำรองข้อมูลลงดิสก์
โดยปกติแล้วฉันต้องการdd if=/dev/sdb of=Desktop/disk.img
ดิสก์ก่อนแล้วจึงบีบอัด แต่การสร้างอิมเมจก่อนไม่ใช่ตัวเลือกเนื่องจากการทำเช่นนั้นจะต้องใช้พื้นที่ดิสก์มากกว่าที่ฉันมีแม้ว่าขั้นตอนการบีบอัดจะส่งผลให้พื้นที่ว่างถูกบีบอัดดังนั้น ไฟล์เก็บถาวรสุดท้ายสามารถใส่ลงในดิสก์ของฉันได้อย่างง่ายดาย
dd
เขียนไป STDOUT โดยค่าเริ่มต้นและgzip
สามารถอ่านได้จาก STDIN ดังนั้นในทฤษฎีฉันจะเขียนdd if=/dev/sdb | gzip -9 -
แต่gzip
จะใช้เวลานานมากในการอ่านไบต์กว่าdd
สามารถผลิตได้
จากman pipe
:
ข้อมูลที่เขียนไปยังปลายการเขียนของไพพ์จะถูกบัฟเฟอร์โดยเคอร์เนลจนกว่าจะถูกอ่านจากการอ่านที่ปลายของไพพ์
ฉันเห็นภาพความ|
เป็นเหมือนไพพ์จริง - แอปพลิเคชั่นตัวหนึ่งผลักข้อมูลเข้าและอีกอันนำข้อมูลออกจากคิวของไพพ์โดยเร็วที่สุด
จะเกิดอะไรขึ้นเมื่อโปรแกรมทางด้านซ้ายเขียนข้อมูลได้เร็วกว่าอีกด้านหนึ่งของไปป์สามารถหวังที่จะประมวลผลได้ มันจะทำให้เกิดการใช้หน่วยความจำมากหรือการแลกเปลี่ยนหรือเคอร์เนลจะพยายามสร้าง FIFO บนดิสก์จึงเติมดิสก์? หรือมันจะล้มเหลวSIGPIPE Broken pipe
ถ้าบัฟเฟอร์มีขนาดใหญ่เกินไป?
โดยพื้นฐานแล้วสิ่งนี้จะลดลงเหลือสองคำถาม:
- อะไรคือความหมายและผลลัพธ์ของการผลักข้อมูลเข้าสู่ท่อมากกว่าที่อ่านได้ในแต่ละครั้ง?
- อะไรคือวิธีที่เชื่อถือได้ในการบีบอัดดาต้าสตรีมไปยังดิสก์โดยไม่ต้องบีบอัดดาต้าสตรีมทั้งหมดลงบนดิสก์
หมายเหตุ 1: ฉันไม่สามารถคัดลอก 70 GB แรกที่ใช้ไปอย่างแน่นอนและคาดว่าจะได้รับระบบการทำงานหรือระบบไฟล์เนื่องจากการแตกแฟรกเมนต์และสิ่งอื่น ๆ ซึ่งจะต้องใช้เนื้อหาแบบเต็มเพื่อให้สมบูรณ์
lzop
แทนgzip
; มันบีบอัดได้เร็วขึ้นมากโดยมีอัตราส่วนการบีบอัดที่ลดลงเล็กน้อย ฉันคิดว่ามันเหมาะสำหรับภาพดิสก์ที่ความเร็วการบีบอัดอาจเป็นปัญหาคอขวดจริง