คุณจะตัดแต่งไฟล์โดยใช้บรรทัดคำสั่งได้อย่างไร


18

อะไรคือสิ่งที่เทียบเท่าคอนโซลของรหัสหลามต่อไปนี้:

target = file("disk", "w")    # create a file
target.seek(2*1024*1024*1024) # skip to 2 GB
target.write("\0")
target.close()

อาจจะมีคาถา DD แนวคิดคือการสร้างไฟล์ที่มีขนาดชัดเจน 2 GB สำหรับการใช้งานเช่นในการจำลองเสมือน

kvm disk -cd whatever.iso #Only allocate space as necessary

ddเป็นเครื่องมือแบบดั้งเดิมเพียงอย่างเดียวที่เปิดเผยการseekเรียกใช้ระบบ (ดูdd vs cat - dd ยังคงมีความเกี่ยวข้องในทุกวันนี้แต่มีวิธีอื่นในการทำให้แมวตัวนี้ใช้งานได้ตามปกติในปัจจุบัน
Gilles 'หยุดชั่วร้าย'

คำตอบ:


8

โดยทั่วไปใช้เพียงแค่ใช้dd; แต่เมื่อคุณพูดถึงการใช้งานการจำลองเสมือนของ KVM คุณอาจพิจารณาใช้qemu-img:

qemu-img create -f raw disk 2G

มันเหมือนกับddคำสั่งในคำตอบของ Chris Down อย่างมีประสิทธิภาพ

ไม่ว่าคุณจะใช้คำสั่งใดเพื่อใช้ในการจำลองเสมือนฉันขอแนะนำให้ใช้fallocateการจัดสรรบล็อกล่วงหน้าเพื่อป้องกันการแตกแฟรกเมนต์และเพิ่มประสิทธิภาพ

fallocate -l 2G disk

ไม่สามารถใช้ได้กับทุกแพลตฟอร์มและระบบไฟล์ สิ่งนี้จะไม่เขียนเลขศูนย์ แต่เพียงกำหนดบล็อกให้กับไฟล์แทนที่จะทำตามความต้องการในภายหลังทุกครั้งที่มีการขยายไฟล์


เป็นคำพูดที่พิมพ์ผิดหรือไม่?
badp

@badp ใช่แก้ไขแล้ว
gertvdijk

2
qemu-imgและddทั้งคู่ทำการเรียกระบบเพียงครั้งเดียวเพื่อตั้งค่าขนาดไฟล์ (ftruncate) แต่จะทำงานได้มากขึ้นในการโหลดตัวเองและไลบรารีที่ลิงก์ไป และในเรื่องddนั้นจะมีประสิทธิภาพมากกว่าqemu-img(ซึ่งใหญ่กว่ามากและเชื่อมโยงกับห้องสมุดมากขึ้น) GNU truncateจะมีประสิทธิภาพมากยิ่งขึ้น ddยังมีข้อได้เปรียบของการเป็นที่แพร่หลาย จุดดีเกี่ยวกับfallocateแม้ว่า
Stéphane Chazelas

@StephaneChazelas ฉันสองความคิดเห็นของคุณทั้งหมด ฉันได้แก้ไขคำตอบของฉันเพื่อชี้ให้เห็นว่าqemu-imgเป็นเพียงทางเลือกที่ชัดเจนในการใช้งานระบบเสมือนจริงของ KVM
gertvdijk

14

คุณสามารถสร้างไฟล์แบบกระจายได้ด้วยdd:

dd of=file bs=1 seek=2G count=0
$ du file
0       disk
$ du --apparent-size file
2097152 disk

4
นอกจากนี้ยัง2Gเป็นส่วนขยายของ GNU ddไป คุณสามารถใช้bs=1024 seek=2097152ถ้าคุณไม่ได้มี ddGNU
Chris Down

Heh Gเป็นส่วนเสริมและไม่ได้รับการสนับสนุนจากรุ่น OpenBSD ของ dd ... แต่MและKได้รับการสนับสนุนดังนั้นอาจseek=2048Mเป็นบิตที่อ่านได้มากขึ้นขึ้นอยู่กับแพลตฟอร์มที่คุณกำลังกำหนดเป้าหมาย
Earlz

คุณควรอ่านจาก / dev / zero: if = / dev / zero
Daniel Fanjul

@DanielFanjul ทำไม ไม่มีความแตกต่างอย่างแน่นอนไม่มีการเขียนไบต์
Chris Down

@ChrisDown เนื่องจาก / dev / null ไม่มีข้อมูลเมื่อคุณอ่าน แต่ / dev / ศูนย์มีศูนย์ infinte โอ้นับ = 1 จำนวนไบต์ที่จะเขียนต้องไม่เป็นศูนย์
Daniel Fanjul

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