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


10

วิธีการล้างช่องว่างที่ไม่ได้ใช้ด้วยเลขศูนย์ (ฉันขอเครื่องมือสำหรับระบบไฟล์btrfs )

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

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

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

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

Btw สำหรับ ext3, ext4: เคลียร์พื้นที่ไม่ได้ใช้ด้วยศูนย์ (ext3, ext4) ที่นี่ฉันขอ btrfs

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


2
คุณลองใช้sfillคำแนะนำหรือไม่ ดูเหมือนว่าไม่ต้องใช้ extX
เควิน

1. ฉันรู้ว่าคุณสามารถเติมไฟล์ที่มีอยู่ด้วยฉีกเป็นศูนย์ได้ แต่นี่อาจจะไม่ใช่ไหม 2. คุณสร้างภาพเหล่านั้นอย่างไร? บางทีคุณสามารถตัดทอนที่นั่นได้ไหม?
Zlatko

@kevin: นั่นเป็นเหตุผลที่ฉันโพสต์คำตอบ sfill ในคำถามเดิม ฉันไม่ค่อยใช้ระบบไฟล์ ext2,3,4 ตัวเองดังนั้นฉันจึงพบโปรแกรมอรรถประโยชน์ที่ใช้งานได้กับ ext * เท่านั้นที่จะไร้ประโยชน์อย่างน่ารำคาญ
cas

ฉันต้องการบางสิ่งที่ "ฉลาด" บางสิ่งที่เติมเต็มพื้นที่ว่างด้วยศูนย์โดยไม่ต้องสัมผัสที่อื่น - ฉันหมายถึงโดยไม่ส่งผลกระทบต่อโครงสร้างข้อมูลภายในเช่น B-Trees (ถ้าคุณอยากรู้อยากเห็นฉันเขียนคำถาม "การบีบอัด" แต่ฉันต้องการเพื่อวัตถุประสงค์อื่นด้วย) เช่น FS ภาพ de ซ้ำการวิเคราะห์และวิจัย)
Grzegorz Wierzowiecki

เพียงใช้truncateและ / หรือfallocate
mikeserv

คำตอบ:


4

นี่คือ repost ที่ได้รับการแก้ไขและขยายออกไปอย่างมากสำหรับคำตอบของคำถามก่อนหน้าของคุณ:

sfillจากsecure-deleteแพ็คเกจสามารถทำสิ่งที่คุณต้องการ

แตกต่างจาก zerofree (ซึ่งทำงานได้เฉพาะกับระบบไฟล์ ext2, ext3 และ ext4) sfill จะทำงานกับระบบไฟล์ใด ๆ

เช่น

sfill -l -l -z /mnt/X

ดูเหมือนว่าตอนนี้หน้าแรกของ sfill / secure-delete จะหายไป แต่มันถูกจัดทำขึ้นสำหรับเดเบียนและอูบุนตู อาจ distros อื่น ๆ ด้วย ถ้าคุณต้องการซอร์สโค้ดสามารถพบได้ในเดเบียนอาร์ไคฟ์ถ้าคุณไม่พบที่อื่น

หมายเหตุ: sfill ใช้งานได้กับระบบไฟล์ที่ติดตั้งเท่านั้น หากคุณเติมไฟล์อิมเมจจากระบบโฮสต์เป็นศูนย์ไม่ใช่จากภายใน VM คุณจะต้องเมานต์อิมเมจ fs บนโฮสต์ วิธีการที่แน่นอนจะแตกต่างกันไปขึ้นอยู่กับประเภทของไฟล์รูปภาพ (เช่น qcow2 หรือ raw)

การติดตั้งรูปภาพ 'ดิบ' นั้นง่ายและตรงไปตรงมา เพียงใช้kpartxไฟล์ภาพเพื่อสร้างอุปกรณ์ลูปแบ็คและ / dev / mapper / รายการสำหรับแต่ละพาร์ติชันนั้นสามารถติดตั้งทีละรายการ

นี่เป็นสคริปต์บางส่วนที่ปรับเปลี่ยนจากส่วนของสคริปต์ที่ฉันใช้เพื่อเชื่อมต่ออิมเมจฮาร์ดดิสก์ดิสทริเน็ตที่สามารถบูตได้ (ใช้สำหรับการอัพเดตไบออสบนเครื่องที่ flashrom ไม่ทำงาน):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

หมายเหตุ: มันจะถือว่าทุกพาร์ติชันในภาพสามารถ mountable ได้ จริงในกรณีการใช้งานของฉัน (ภาพ hd freedos กับหนึ่งพาร์ทิชัน) ไม่เป็นความจริงถ้าหนึ่งในพาร์ติชั่นคือ, พูด, swap space. การตรวจจับพาร์ติชั่นดังกล่าวและการใช้ dd เป็นศูนย์พาร์ติชั่น swap จะถูกใช้เป็นแบบฝึกหัดสำหรับผู้อ่าน :)

เมธอดนี้หรือตัวแปรของมันควรใช้กับไดรฟ์ข้อมูล LVM ด้วย

หากรูปภาพของคุณเป็น qcow คุณสามารถใช้qemu-nbdเครื่องมือจากqemu-utilsแพ็คเกจซึ่งจะแสดงไฟล์รูปภาพและพาร์ติชันเป็นอุปกรณ์บล็อกเครือข่ายเช่น / dev / nbd0 / dev / ndb0p1 - ซึ่งสามารถใช้ในลักษณะคล้ายกับ / อุปกรณ์ dev / mapper ด้านบน

อาจเป็นเรื่องง่ายและไม่ยุ่งยาก (แต่ใช้เวลานานกว่า) เพื่อใช้qemu-imgในการแปลงจาก qcow เป็น raw ใช้วิธีสำหรับ raw ด้านบนจากนั้นแปลงรูปภาพดิบที่แก้ไขแล้วกลับไปเป็น qcow2 ที่ถูกบีบอัด ซึ่งอาจส่งผลให้ภาพมีขนาดเล็กกว่าการใช้ qemu-nbd ในขณะที่คุณกำลังบีบอัดรูปภาพ qcow2 ใหม่ขณะที่กำลังสร้าง


1
สิ่งที่ฉันหมายถึงคือมันไม่ถือว่าเป็นวิธีที่"ฉลาด"ในการเติมพื้นที่ที่ไม่ได้ใช้ด้วยค่าศูนย์ เป็นวิธีที่ชัดเจนที่สุดโดยทั่วไปในการทำเช่นนี้ ฉันไม่ได้ถามเกี่ยวกับสิ่งต่าง ๆ เช่นนั้น
Grzegorz Wierzowiecki

1
โปรดอธิบายอัลกอริทึม"สมาร์ท"ที่ไม่เฉพาะกับตระกูลของระบบไฟล์เฉพาะ (เช่น zerofill สำหรับ ext2 / 3/4) คุณต้องการโปรแกรมที่สามารถทำงานได้ คุณไม่ได้บอกว่ามันต้องมีเวทย์มนตร์เช่นกัน
cas

1
และจริงๆถ้าระบบไฟล์ไม่ได้ใช้งาน (เพราะเช่นมันติดตั้งบนโฮสต์สำหรับ zerofilling) สิ่งที่สำคัญว่าอัลกอริทึมสมาร์ทคืออะไร? การสืบค้นเมตาดาต้า fs เพื่อค้นหาเซกเตอร์ว่างเปล่าจะไม่เร็วกว่าหรือดีกว่าการเขียนข้อมูลขนาดใหญ่ที่เต็มไปด้วย NULs ... ระบบไฟล์นั้นฉลาดพอที่จะหาพื้นที่ว่างได้
cas

2
ในอีกด้านหนึ่งสำหรับความต้องการของคุณก็เพียงพอแล้วดังนั้นคำถามของฉันมีข้อมูลโค้ดพร้อมโซลูชันนี้อยู่แล้วดังนั้นคำตอบของคุณไม่ได้ให้อะไรใหม่ ในทางตรงกันข้ามความต้องการของฉันต้องการสิ่งที่ฉันระบุเพราะฉันต้องการลบพื้นที่ที่ไม่ได้ใช้ด้วยค่าศูนย์โดยไม่ต้องแก้ไขโครงสร้างภายใน (ตัวอย่างเช่นการปรับสมดุล "Dancing B-Trees" หรือโครงสร้างข้อมูลชนิดอื่น (เช่นการวิเคราะห์และการทำซ้ำ วัตถุประสงค์)
Grzegorz Wierzowiecki

2
@cas - ฉันคิดว่าคุณขาดความจริงที่ว่า zero-fill เป็นขั้นตอนสำคัญก่อนที่จะทำการบีบอัดฮาร์ดไดรฟ์เสมือนใน VMs หากคุณมีดิสก์ที่ขยายขนาด 500 GB โดยมีไฟล์ 10 GB และพื้นที่ว่าง "ว่าง" (เช่นไฟล์ที่ถูกลบ) 10 GB การรันวิธี "ไร้เดียงสาไฟล์ยักษ์" ที่ไร้เดียงสาจะใช้เวลานานกว่าและต้องใช้ VHD เพื่อขยาย เต็ม 500 GB ฉันว่า OP จะถือว่ายูทิลิตี้นี้ต้องมี FS เฉพาะด้วย
ชื่อปลอม

3

วิธีที่ถูกต้องและ "ฉลาด" ในการล้างพื้นที่ว่างกำลังใช้งาน:

fstrim /mountpoint

ใช้สิ่งนี้กับระบบไฟล์ที่เมาท์

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

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

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