วิธีเติมฮาร์ดไดรฟ์ใน Linux


24

ฉันกำลังทำการทดสอบโค้ดบางส่วนและต้องการเติมข้อมูลลงในฮาร์ดไดรฟ์ ฉันพบว่าddสามารถสร้างไฟล์ขนาดใหญ่ได้ในทันที แต่dfไม่เห็นด้วย นี่คือสิ่งที่ฉันพยายาม:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhแสดงไฟล์ 10G อย่างไรก็ตามdf -hแสดงให้เห็นว่าพาร์ติชันไม่ได้ลดขนาดลง ดังนั้นฉันต้องทำอย่างไรเพื่อให้dfทราบว่าข้อมูลได้ถูกใช้ไปแล้ว ฉันหวังว่าจะมีบางสิ่งที่รวดเร็วที่ฉันเขียนขึ้นในการทดสอบหน่วย


คุณจะโชคดีมากขึ้นถ้าคุณถามที่ serverfault.com

BTW, 10 * 1024 * 1024 * 1024 จะเหมือนกับ 10 * 2 ** 30 ซึ่งง่ายกว่าเล็กน้อย
deltaray

คำตอบ:


26

ปัญหาของseek=<big number>กลอุบายคือระบบไฟล์นั้นฉลาด (โดยทั่วไป): ถ้าส่วนหนึ่งของไฟล์ไม่เคยถูกเขียนลงไป (และเป็นศูนย์ทั้งหมด) มันก็ไม่ได้ยุ่งเกี่ยวกับการจัดสรรพื้นที่สำหรับมัน - ดังนั้นในขณะที่คุณ ' คุณเห็นว่าคุณสามารถมีไฟล์ 10GB ที่ไม่มีพื้นที่ว่าง (ซึ่งรู้จักกันในชื่อ "ไฟล์กระจัดกระจาย" และมีประโยชน์มากในบางกรณีเช่นการใช้ฐานข้อมูลบางอย่าง)

คุณสามารถบังคับให้มีการจัดสรรพื้นที่ด้วย (ตัวอย่าง):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

ซึ่งจะใช้เวลานานกว่า แต่จะเติมดิสก์จริง ฉันขอแนะนำให้สร้างขนาดบล็อกให้ใหญ่กว่าขนาดหนึ่งเพราะจะกำหนดว่าระบบจะเรียกใช้ddกระบวนการจำนวนเท่าใด - ขนาดบล็อกยิ่งมีขนาดเล็กเท่าใดsyscalls ก็จะยิ่งทำงานช้าลงเท่านั้น (แม้ว่าจะเกิน 1MB หรือมากกว่านั้นมันอาจจะไม่สร้างความแตกต่างและอาจทำให้สิ่งต่าง ๆ ช้าลง ... )


ฉันมักจะใช้ bs = (ครึ่งหนึ่งของขนาดแคชที่อยู่บนไดรฟ์ที่ฉันกำลังเขียน) สิ่งนี้ได้ผลดีเมื่อการแบ่งพาร์ติชั่นอิมเมจลงบนฮาร์ดไดรฟ์ขนาดใหญ่เพื่อปรับขนาดในภายหลัง ETA: คำสำคัญ HALF
atroon

20

เป็นอีกตัวเลือกหนึ่งสำหรับสิ่งนี้คุณสามารถใช้ yes พร้อมกับสตริงเดียวและเร็วกว่าการรัน dd ประมาณ 10 เท่าหาก = / dev / urandom ของ = largefile อย่างนี้

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile

นี่คือที่น่าแปลกใจเกี่ยวกับเร็วที่สุดเท่าที่ใช้ dd if = / dev / zero of = filename bs = 1M
# # # bhinesley

ไวยากรณ์ก็จดจำได้ง่ายเช่นกัน
AWT

7

คุณได้สร้างสิ่งที่เรียกว่า "ไฟล์กระจัดกระจาย" - ไฟล์ที่เพราะส่วนใหญ่ว่างเปล่า (เช่นอ่านกลับเป็น \ 0) ไม่ใช้พื้นที่บนดิสก์นอกเหนือจากสิ่งที่เขียนจริง (1B หลังจาก 10GB ของช่องว่าง)

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

ฉันคิดว่าคุณติดอยู่กับ "dd if = / dev / zero of = ชื่อไฟล์ bs = 100M count = 100" ซึ่งถูก จำกัด ด้วยความเร็วในการเขียนตามลำดับไดรฟ์ของคุณ


6

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

fallocate -l 150G


3
ต้องระบุชื่อไฟล์: fallocate -l 150G foo. อย่างไรก็ตาม +1 สำหรับการกล่าวถึงเครื่องมือ
Kamil Maciorowski


3

หากคุณต้องการเติมฮาร์ดไดรฟ์ให้ทำดังนี้:

dd if=/dev/zero of=zeros bs=1M

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

dd if=/dev/zero of=zeros bs=1M count=10240

ดังที่ psmears กล่าวไว้คุณจะได้ประสิทธิภาพที่ดีขึ้นหากคุณตั้งขนาดบล็อกเป็น 1 MB (bs = 1M) แทน 1 B (bs = 1) สิ่งนี้จะใช้เวลาสักครู่ แต่ถ้าคุณต้องการตรวจสอบความคืบหน้าของคำสั่งของคุณให้เปิดคอนโซลแยกต่างหากและรันคำสั่งเหล่านี้:

ps aux | grep dd

ใช้ PID ของ dd ในคำสั่งนี้ (แทนที่ PID ด้วย PID ของ dd):

kill -USR1 PID

จากนั้นไปดูที่ terminal dd ของคุณ แน่นอนว่านี่เป็นการใช้งานที่ จำกัด เมื่อคุณพยายามเติมไดรฟ์ให้เต็ม (คุณสามารถใช้ df หรือ du เพื่อตรวจสอบพื้นที่ว่างในดิสก์หรือขนาดไฟล์ตามลำดับ) อย่างไรก็ตามมีบางครั้งที่สะดวกในการสร้างความก้าวหน้าของ dd

เครดิตพิเศษ: การใช้งานจริงหนึ่งครั้งสำหรับ zeroing พื้นที่ว่างคือหลังจากนั้นคุณสามารถลบไฟล์ "zero" และ dd ทั้งพาร์ติชั่น (หรือดิสก์ถ้าคุณ zeroed พาร์ติชั่นทั้งหมด) เป็นไฟล์อิมเมจดิสก์ (พูด , disk-backup.dd) จากนั้นทำการบีบอัดไฟล์ ขณะนี้พื้นที่ว่างสามารถบีบอัดได้สูงดังนั้นรูปภาพ dd ที่ถูกบีบอัดของคุณจะเล็กกว่าอุปกรณ์บล็อกดั้งเดิมที่มีเนื้อหาอยู่

Shenanigans: บีบอัดไฟล์ศูนย์ขนาดใหญ่แล้วส่งอีเมลให้เพื่อนของคุณทุกคน บอกพวกเขาว่ามันเป็นสิ่งที่ยอดเยี่ยมจริงๆ


2

คุณสร้างไฟล์ 1 TB แบบไม่กระจายด้วยคำสั่งต่อไปนี้:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

สิ่งนี้มีประโยชน์ในการทดสอบว่าจะเกิดอะไรขึ้นเมื่อโควต้าเกินหรือระบบไฟล์เต็ม

df -h แสดงให้เห็นถึงพื้นที่ว่างที่มีขนาดเล็กลง

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