ล้างพื้นที่ที่ไม่ได้ใช้ด้วยค่าศูนย์ (ext3, ext4)


73

วิธีการล้างช่องว่างที่ไม่ได้ใช้ด้วยเลขศูนย์ (ext3, ext4)

ฉันกำลังมองหาบางสิ่งที่ฉลาดกว่า

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

เช่นเดียวกับFSArchiverกำลังมองหา "พื้นที่ใช้แล้ว" และไม่สนใจที่ไม่ได้ใช้ แต่เป็นเว็บไซต์ที่ตรงกันข้าม

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

Btw สำหรับ btrfs: ล้างพื้นที่ที่ไม่ได้ใช้ด้วยค่าศูนย์ (btrfs)


4
ตรวจสอบนี้: superuser.com/questions/19326/...
จ้า

1
มีคำตอบสองแบบที่แตกต่างกัน คุณพยายามทำอะไรให้สำเร็จ ทั้ง1)การรักษาความปลอดภัยโดยห้ามคนที่จะอ่านข้อมูลเหล่านั้นหรือ2)การเพิ่มประสิทธิภาพการบีบอัดของพาร์ทิชันทั้งหมดหรือ [ประสิทธิภาพ SSD] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

คำตอบ:


77

zerofreeดังกล่าวเป็นยูทิลิตี้

จากคำอธิบาย:

Zerofree ค้นหาบล็อกที่ไม่ได้ถูกจัดสรรและไม่เป็นศูนย์ในระบบไฟล์ ext2 หรือ ext3 และเติมให้เต็มด้วยเลขศูนย์ สิ่งนี้มีประโยชน์หากอุปกรณ์ที่ระบบไฟล์นี้อยู่นั้นเป็นดิสก์อิมเมจ ในกรณีนี้ขึ้นอยู่กับชนิดของดิสก์อิมเมจยูทิลิตีรองอาจสามารถลดขนาดของอิมเมจดิสก์หลังจาก zerofree ถูกเรียกใช้ Zerofree ต้องการให้ระบบไฟล์ถอดหรือติดตั้งแบบอ่านอย่างเดียว

วิธีปกติเพื่อให้ได้ผลลัพธ์เดียวกัน (การ zeroing บล็อกที่ไม่ได้ใช้) คือการเรียกใช้ "dd" เพื่อสร้างไฟล์ที่เต็มไปด้วยเลขศูนย์ที่ใช้พื้นที่ว่างทั้งหมดบนไดรฟ์แล้วลบไฟล์นี้ มีข้อเสียมากมายซึ่ง zerofree ช่วยบรรเทา:

  • มันช้า
  • มันทำให้ดิสก์อิมเมจ (ชั่วคราว) เติบโตในระดับสูงสุด
  • มัน (ชั่วคราว) ใช้พื้นที่ว่างทั้งหมดบนดิสก์ดังนั้นการดำเนินการเขียนพร้อมกันอื่น ๆ อาจล้มเหลว

Zerofree ถูกเขียนขึ้นเพื่อให้ทำงานได้จากระบบ GNU / Linux ที่ติดตั้งเป็นระบบปฏิบัติการของแขกภายในเครื่องเสมือน หากนี่ไม่ใช่กรณีของคุณคุณแทบไม่ต้องการแพ็คเกจนี้เลย

อัปเดต # 1

คำอธิบายของแพคเกจ. deb ประกอบด้วยย่อหน้าต่อไปนี้ซึ่งหมายความว่าสิ่งนี้จะใช้ได้กับ ext4 เช่นกัน

คำอธิบาย: ศูนย์บล็อกฟรีจากระบบไฟล์ ext2, ext3 และ ext4 Zerofree ค้นหาบล็อกที่ไม่ได้ถูกจัดสรรด้วยเนื้อหาที่ไม่เป็นศูนย์ในระบบไฟล์ ext2, ext3 หรือ ext4 และเติมด้วยศูนย์ ...

การใช้งานอื่น ๆ

แอปพลิเคชั่นอื่นยูทิลิตี้นี้คือการบีบอัดภาพดิสก์ที่มีการสำรองข้อมูลของดิสก์จริง ตัวอย่างทั่วไปของสิ่งนี้คือดัมพ์ของการ์ด SD ใน BeagleBone หรือ Raspberry Pi เมื่อพื้นที่ว่างเปล่าเป็นศูนย์ภาพสำรองจะถูกบีบอัดได้อย่างมีประสิทธิภาพมากขึ้น


1
มันเป็นหน้าอย่างเป็นทางการของเครื่องมือintgat.tigress.co.uk/rmy/uml/index.htmlหรือไม่ คุณคิดว่ามันปลอดภัยที่จะใช้กับ ext4 หรือไม่?
Grzegorz Wierzowiecki

2
@GrzegorzWierzowiecki: ใช่นั่นคือหน้าเว็บ แต่สำหรับเดเบียนและเพื่อนมันมีอยู่แล้วใน repos ฉันใช้พาร์ติชัน ext4 บนดิสก์เสมือนเพื่อลดขนาดอิมเมจไฟล์ดิสก์อย่างต่อเนื่องและไม่มีปัญหา
enzotib

1
สิ่งนี้ไม่เทียบเท่ากับddวิธีหยาบคายในคำถามเดิมเนื่องจากไม่สามารถใช้กับระบบไฟล์ที่เมาท์ได้
jlh

หน้า zerofreeพูดถึงแพทช์ที่ให้คุณทำ "ระบบไฟล์ติดตั้งกับตัวเลือก zerofree" เพื่อให้มันเป็นศูนย์เสมอลบไฟล์ที่ถูกลบอย่างต่อเนื่อง สิ่งนี้ต้องการการคอมไพล์เคอร์เนลใหม่หรือไม่? มีวิธีที่ง่ายกว่าในการทำสิ่งเดียวกันหรือไม่?
endolith

2
ระวัง - ฉันทำระบบไฟล์ ext4 สูญหายโดยใช้zerofreeAstralinux (อิงจากเดเบียน) …
Hubbitus

33

สรุปวิธีการ (ตามที่กล่าวถึงในคำถามนี้และที่อื่น ๆ ) เพื่อล้างพื้นที่ที่ไม่ได้ใช้บน ext2 / ext3 / ext4:

Zeroing space ที่ไม่ได้ใช้

ระบบไฟล์ไม่ถูกเมาท์

  • หาก "disk" ระบบไฟล์ของคุณเปิดอยู่มีการจัดเตรียมแบบบาง (เช่น SSD ที่ทันสมัยรองรับ TRIM, ไฟล์ VM ที่มีรูปแบบรองรับการกระจัดกระจาย ฯลฯ ) และเคอร์เนลของคุณบอกว่าอุปกรณ์บล็อกเข้าใจคุณสามารถใช้e2fsck -E discard src_fsเพื่อทิ้งพื้นที่ที่ไม่ได้ใช้ 1.42.2 หรือสูงกว่า)
  • ใช้zerofree (เช่นzerofree src_fs) เพื่อเขียนเลขศูนย์บนบล็อกที่ไม่ได้ใช้อย่างชัดเจน
  • การใช้e2image -rap src_fs dest_fsเพื่อคัดลอกบล็อกที่ใช้งานอยู่เท่านั้น (ระบบไฟล์ใหม่ควรอยู่ใน "disk" zeroed อย่างอื่นต้องใช้ e2fsprogs 1.42.9 หรือสูงกว่า)

ติดตั้งระบบไฟล์แล้ว

  • หาก "disk" ระบบไฟล์ของคุณเปิดอยู่จะมีการจัดเตรียมแบบบาง (เช่น SSD ที่ทันสมัยรองรับ TRIM, ไฟล์ VM ที่มีรูปแบบรองรับ sparseness และอื่น ๆ ) เคอร์เนลของคุณบอกว่าอุปกรณ์บล็อกเข้าใจและสุดท้ายไดรเวอร์ ext filesystem รองรับfstrim /mnt/fs/เพื่อขอให้ระบบไฟล์ยกเลิกพื้นที่ที่ไม่ได้ใช้
  • การใช้cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfillจากการลบที่ปลอดภัยใช้เทคนิคนี้) วิธีนี้เป็นวิธีที่ไม่มีประสิทธิภาพไม่แนะนำโดยเท็ด Ts'o (ผู้เขียน ext4) อาจจะไม่ได้เป็นศูนย์สิ่งบางอย่างและสามารถชะลออนาคตfscks

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

ทำให้ไฟล์รูปภาพเล็กลง

รูปภาพอยู่ในรูปแบบ VM เฉพาะ

คุณจะต้องใช้เครื่องมืออิมเมจดิสก์ที่เหมาะสม (เช่นqemu-img convert src_image dst_image) เพื่อเปิดใช้งานพื้นที่ที่เป็นศูนย์เพื่อเรียกคืนและเพื่อให้ไฟล์ที่แสดงอิมเมจมีขนาดเล็กลง

ภาพเป็นไฟล์ดิบ

หนึ่งในเทคนิคต่อไปนี้สามารถใช้เพื่อทำให้ไฟล์กระจัดกระจาย

  • cp --sparse=always src_image dst_image.
  • fallocate -d src_image (ต้องใช้ util-linux v2.25 หรือสูงกว่า)

ทุกวันนี้มันอาจง่ายกว่าที่จะใช้เครื่องมือเช่นvirt-sparsifyเพื่อทำตามขั้นตอนเหล่านี้และอื่น ๆ ในคราวเดียว

 แหล่งที่มา


15

sfillจากการลบที่ปลอดภัยสามารถทำสิ่งนี้และงานอื่น ๆ ที่เกี่ยวข้อง

เช่น

sfill -l -l -z /mnt/X

อัปเดต # 1

มีแผนผังต้นกำเนิดที่ดูเหมือนจะใช้โดยโครงการ ArchLinux บน github ที่มีแหล่งที่มาsfillซึ่งเป็นเครื่องมือที่รวมอยู่ในแพ็คเกจ Secure-Delete

นอกจากนี้ยังมีสำเนาของsfillหน้าคนอยู่ที่นี่:


URL นั้นล้าสมัยแล้ว ไม่มีความคิดว่าหน้าแรกของมันอยู่ที่ใดในตอนนี้ (หรือแม้ว่ามันจะยังมีอยู่) แต่มันก็บรรจุสำหรับเดเบียนและอูบุนตู อาจ distros อื่น ๆ ด้วย หากคุณต้องการซอร์สโค้ดสามารถพบได้ในคลังข้อมูลเดเบียนหากคุณไม่พบที่อื่น
30297 cas

URL manpage ที่ล้าสมัยได้รับการแก้ไขแล้ว ดูเหมือนว่า "Digipedia" ไม่มีอะไรอีกแล้ว
mwfearnley

8

หากคุณมี e2fsprogs 1.42.9 คุณสามารถใช้e2imageเพื่อสร้างอิมเมจพาร์ติชันโดยไม่มีพื้นที่ว่างในตอนแรกดังนั้นคุณสามารถข้ามขั้นตอนการ zeroing ได้


ฉันไม่สามารถ (หาข้อมูลออนไลน์ได้อย่างง่ายดายเกี่ยวกับพารามิเตอร์เหล่านี้ แต่พวกเขาได้รับจริงในบันทึกย่อรุ่น1.42.9
mwfearnley

1
นั่นเป็นเครื่องมือที่มีค่า! อย่างไรก็ตามคำตอบของคุณจะดีกว่าถ้ามันยังอธิบายถึงวิธีการใช้ มันe2image -ar /dev/foo1 | gzip > fs.img.gzหรือการเปลี่ยนแปลงบางอย่าง รวม-fเพื่อใช้กับ fs ที่เมาท์
marcelm

0

sfillคุณสามารถใช้ มันเป็นทางออกที่ดีกว่าสำหรับวอลลุ่มบาง ๆ


หากคุณต้องการที่จะแสดงความคิดเห็นในคำตอบ cas รอจนกว่าคุณจะมีชื่อเสียงพอที่จะทำ
Anthon

1
ฉันคิดว่าคำตอบนั้นหมายถึงmanpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... ซึ่งอย่างน้อยก็พยายามตอบ ("ออนไลน์" ในกรณีนี้หมายถึง "ที่ติดตั้งระบบไฟล์" ไม่ใช่ "บนเว็บ")
derobert

0

หากคุณไม่ต้องการใช้เครื่องมือเพิ่มเติมวิธีนี้ควรเร็วกว่าcat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1

ทำไมที่จะเร็วกว่าcat? (ไม่มีอาร์กิวเมนต์บล็อกขนาดddไม่ได้ช่วย)
marcelm

ขนาดบล็อกใช้โดยแมวที่มีขนาดเล็ก
eadmaster

2
ใช่ แต่นั่นไม่ได้ทำให้ddเร็วขึ้น ในความเป็นจริงมันอาจทำให้catเร็วขึ้น ขนาดบล็อกมีความสำคัญเพียงเพื่อลดค่าใช้จ่ายในการโทรของระบบและปรับการใช้แคช CPU ให้เหมาะสม ด้วยค่าใช้จ่ายสูงของ syscall คุณจะเข้าสู่พื้นที่ของผลตอบแทนที่ลดลง แคชเริ่มเจ็บด้านบนพูด 1MiB และเมื่อใช้งานบนดิสก์จริงคุณจะถูก จำกัด ด้วย I / O และจุดนั้นส่วนใหญ่จะเป็นสิ่งที่สงสัย ลองเปรียบเทียบด้วยตัวคุณเอง
marcelm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.