ยูทิลิตี้ไปยัง TRIM พื้นที่ที่ไม่ได้จัดสรรบนไดรฟ์


11

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

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

แก้ไข: hdparmฉันมีปัญหาการใช้ ตัวอย่างด้านล่างละทิ้งภาคแรก แต่ฉันเห็นผลลัพธ์เดียวกันโดยไม่คำนึงถึงช่วงที่ฉันระบุ fstrimไม่มีปัญหาในอุปกรณ์:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

ฉันกำลังตรวจสอบเพิ่มเติม แต่ไม่มีใครเข้าใจหรือไม่?


1
หากคุณจับคู่พื้นที่ที่ไม่ได้แบ่งพาร์ติชั่นด้วยพาร์ติชั่นหนึ่งตัวหรือมากกว่า (ชั่วคราว) คุณสามารถใช้blkdiscardกับพาร์ติชั่นที่ตัดแต่งอุปกรณ์ทั้งหมดได้
frostschutz

ขอบคุณ! ดูเหมือนว่าเครื่องมือที่เหมาะสม แต่blkdiscardดูเหมือนจะไม่สามารถใช้ได้ในที่เก็บแพคเกจมาตรฐานของฉัน (Ubuntu 12.04 ดูเหมือนจะไม่มีอยู่ในutil-linux)
Jason C

ฉันไม่สามารถhdparmทำงานให้ฉันได้ด้วยเหตุผลบางอย่าง แต่ฉันคว้าแหล่งข้อมูลลินุกซ์จากgithub.com/karelzak/util-linux/tree/stable/v2.23สร้างมันขึ้นมา ( ./autogen.sh ; ./configure ; make blkdiscard) และมันทำงานได้ดีมาก ยังคงสงสัยเกี่ยวกับhdparmแต่blkdiscardทำในสิ่งที่ฉันต้องการ โบนัส: ไม่จำเป็นต้องสร้างระบบไฟล์ชั่วคราวก่อนคุณสามารถใช้sfdisk -lเพื่อหาช่องว่างระหว่างพาร์ติชั่นและblkdiscardตัดมันได้
Jason C

โอ้ฉันไม่ได้ตระหนักถึงblkdiscardความสามารถในการทำงานกับตัวเลือกออฟเซ็ต / ความยาว ดังนั้นพาร์ติชันชั่วคราวที่ฉันแนะนำจึงไม่จำเป็น ดี!
frostschutz

คำตอบ:


16

หากคุณมีรุ่นล่าสุดเพียงพอutil-linuxก็มีเครื่องมือblkdiscardที่สามารถตัดทั้งอุปกรณ์หรือช่วงภายในอุปกรณ์ที่ใช้--offsetและ--lengthตัวเลือก

โปรดทราบ: blkdiscardเป็นอันตรายหากคุณปล่อยให้มันตัดส่วนที่ผิดข้อมูลของคุณจะหายไป!

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

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

เพิ่มการวนซ้ำไป ...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

ซึ่งพิมพ์

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

ตรวจสอบว่าผลลัพธ์นี้ถูกต้องสำหรับคุณเพิ่มตัวเลือกเพิ่มเติมหากคุณต้องการ (verbose?) และสุดท้ายลบechoดังนั้นมันจะถูกดำเนินการจริงและคุณควรตั้ง

คำสั่งที่สองของตัวอย่างนั้นล้มเหลวจริง ๆ เนื่องจากความยาวน้อยเกินไป - มันอาจคุ้มค่าที่จะตรวจสอบภายในลูปไม่ต้องสนใจภูมิภาคที่มีขนาดเล็กกว่า 1MB เนื่องจากพวกมันไม่น่าจะถูกเล็มได้สำเร็จ


หากคุณใช้ LVM แทนพาร์ติชันคุณสามารถสร้าง LV สำหรับพื้นที่ว่างและตัดแต่งที่:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

หากคุณตั้งissue_discards = 1ในของคุณlvm.confคุณสามารถข้ามblkdiscardโทรเป็น LVM จะออก TRIM บนlvremoveด้วยตัวเอง


1
ขอบคุณ! ฉันตั้งข้อสังเกตว่านี่เป็นคำตอบเพราะมันใช้ได้ผลสำหรับฉันแม้ว่าคำตอบของ Michael จะใช้ได้เช่นกัน นอกจากนี้ผมจะเพิ่มสิ่งที่ผมพูดในความคิดเห็นคำถาม: หากคุณไม่ได้มีblkdiscardอยู่; คุณสามารถคว้าแหล่ง util-linux จากgithub.com/karelzak/util-linux/tree/stable/v2.23จากนั้นสร้างblkdiscard(รัน./autogen.sh ; ./configure ; make blkdiscard) - มันสร้างขึ้นอย่างหมดจด (แม้ว่าคุณอาจต้องติดตั้งการพึ่งพาและconfigureตัวเลือกปรับแต่ง) และเป็น ตราบใดที่คุณไม่ติดตั้งมันก็ไม่ขัดแย้งกับ util-linux ที่มีอยู่
Jason C

1
ฉันสังเกตความล้มเหลวด้วยค่าบางค่าที่ส่งไปblkdiscardเช่นกัน แต่สังเกตว่าค่านั้นมาจากการชดเชยไม่ใช่ความยาว เป็นไปได้ว่ามีปัญหาเกิดขึ้นblkdiscardฉันกำลังอยู่ระหว่างการตรวจสอบ ดูunix.stackexchange.com/questions/98473/…
Jason C

ฉันได้สร้างสคริปต์ที่ยกเลิกพื้นที่ว่างบนระบบไฟล์ที่ติดตั้งทั้งหมดรวมถึง LVM
VGs

7

hdparm --trim-sector-rangesสามารถตัดช่วง man page เตือนให้ใช้ดังนั้นคุณควรแน่ใจว่าคุณมีช่วงและไวยากรณ์ที่ถูกต้อง

ฉันคิดว่าการส่งเล็มสำหรับข้อมูลทั้งหมดนอกพาร์ติชันอาจเป็นอันตรายเนื่องจากมีข้อมูลที่ซ่อนอยู่บางครั้งเช่นรหัส bootloader หรือตารางพาร์ติชันที่สอง คุณต้องรู้จัก exaclty ซึ่งพื้นที่นอกพาร์ติชั่นนั้นไม่ได้ใช้จริง


สมบูรณ์แบบขอบคุณ! ฉันสามารถคว้าขนาดอุปกรณ์ด้วยhdparmช่วงที่ไม่ได้ใช้sfdiskและตัดให้สอดคล้อง ฉันรู้ว่ามีอะไรในไดรฟ์ หากมีรูปแบบการแบ่งส่วนที่ซ่อนข้อมูลในพื้นที่ที่สามารถเข้าถึงได้ แต่ไม่ได้ปันส่วนนั่นจะเป็นการทำลายฟังก์ชันการทำงานพื้นฐานของตัวแก้ไขพาร์ติชัน ฉันคิดว่า (หวังว่า) รูปแบบใด ๆ เช่นนี้จะถูกทิ้งไว้นาน (ฉันไม่รู้ว่าจะอยู่ด้านบนของหัวของฉัน) แผนการทั้งหมดที่ฉันรู้จักเก็บ MBR ในพื้นที่ที่ไม่ได้ปันส่วนที่รู้จักกันดีที่จุดเริ่มต้นของอุปกรณ์และ VBRs / EBRs ภายในพาร์ติชันที่ปันส่วน อาจมีแผนการปิดบังเก่าที่แตกต่างกัน :)
Jason C

ฉันมีปัญหาhdparmฉันแก้ไขคำถามด้วยรายละเอียด; สงสัยว่าคุณมีความเข้าใจใด ๆ
Jason C

1
ดูเหมือนว่าอย่างน้อย hdparm บางอย่างจะไม่ทำงานใน / dev / mmcblk0 ขออภัยฉันไม่มีความคิดเพิ่มเติม
Michael Suelmann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.