Tiện ích để TRIM không gian chưa phân bổ trên ổ đĩa


11

Tôi có một ổ đĩa (thẻ SD) với một vài phân vùng ext4 nhưng cũng có một số không gian chưa được phân bổ. Các fstrimtiện ích chỉ có thể làm việc trong một hệ thống tập tin. Trước khi tôi phát minh lại bánh xe và viết một cái, có tiện ích nào khác có thể TRIM không gian chưa phân bổ (hoặc có thể TRIM một phạm vi được chỉ định rõ ràng) không?

Tôi có thể xác minh rằng phần lớn không gian chưa phân bổ trên thiết bị hiện không được bộ điều khiển biết là miễn phí, như tôi đã quan sát thấy, trên thẻ cụ thể này, đọc để cắt không gian trở về 0, nhưng quét thiết bị cho thấy nhiều dữ liệu rác còn sót lại.

Chỉnh sửa: Tôi đang gặp vấn đề khi sử dụng hdparm. Ví dụ dưới đây loại bỏ khu vực đầu tiên, nhưng tôi đang thấy kết quả tương tự bất kể phạm vi tôi chỉ định. fstrimkhông có vấn đề gì trên thiết bị:

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

Tôi đang điều tra thêm nhưng có ai có cái nhìn sâu sắc không?


1
Nếu bạn ánh xạ không gian không liên kết với một hoặc nhiều phân vùng (tạm thời), bạn có thể sử dụng blkdiscardchúng để cắt toàn bộ thiết bị.
frostschutz

Cảm ơn! Trông giống như công cụ phù hợp, nhưng blkdiscarddường như không có sẵn trong kho gói tiêu chuẩn của tôi (Ubuntu 12.04, dường như không có trong util-linux).
Jason C

Tôi không bao giờ có thể hdparmlàm việc cho tôi vì một số lý do, nhưng tôi đã lấy nguồn linux-linux từ github.com/karelzak/util-linux/tree/ sóng / v2.23 , xây dựng nó ( ./autogen.sh ; ./configure ; make blkdiscard) và nó hoạt động rất tốt. Vẫn còn bí ẩn về hdparmnhưng blkdiscardlàm chính xác những gì tôi muốn. Phần thưởng: Không cần thiết phải tạo một hệ thống tệp tạm thời trước tiên, bạn có thể sử dụng sfdisk -lđể tìm ra khoảng trống giữa các phân vùng và blkdiscardcắt bớt nó.
Jason C

Ồ, tôi thậm chí còn không biết blkdiscardcó thể làm việc với các tùy chọn bù / độ dài. Vì vậy, các phân vùng tạm thời tôi đề nghị thậm chí không cần thiết. Đẹp!
frostschutz

Câu trả lời:


16

Nếu bạn có phiên bản đủ gần đây util-linux, nó chứa công cụ blkdiscardcó thể TRIM toàn bộ thiết bị hoặc phạm vi trong một thiết bị sử dụng --offset--lengthcác tùy chọn.

Xin lưu ý: blkdiscard rất nguy hiểm, nếu bạn để nó TRIM sai vùng, dữ liệu của bạn sẽ biến mất!

Vì vậy, bạn có thể tìm ra các vùng không phân vùng (miễn phí) trong bảng phân vùng của mình và sau đó TRIM chúng bằng công cụ này. Đối với msdosgptphân vùng, partedcung cấp các khu vực miễn phí như vậy:

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

Thêm một vòng lặp cho nó ...

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;')

mà in

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

Xác minh rằng đầu ra này là chính xác cho bạn, thêm tùy chọn bổ sung nếu bạn thích (dài dòng?), Và cuối cùng loại bỏ echođể nó sẽ thực sự được thực thi và bạn nên được đặt.

Lệnh thứ hai của ví dụ đó thực sự thất bại vì độ dài quá nhỏ - có thể đáng để kiểm tra bên trong vòng lặp, bỏ qua các vùng nhỏ hơn 1MB vì ​​chúng không thể được cắt thành công.


Nếu bạn đang sử dụng LVM thay vì phân vùng, bạn có thể tạo LV cho không gian trống và cắt bớt:

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

Nếu bạn đặt issue_discards = 1ở của bạn lvm.conf, bạn có thể bỏ qua các blkdiscardcuộc gọi như LVM sẽ cấp TRIM trên lvremovecủa chính nó.


1
Cảm ơn! Tôi đã nhận xét đây là câu trả lời vì nó hiệu quả với tôi, mặc dù câu trả lời của Michael cũng có giá trị. Ngoài ra tôi sẽ thêm những gì tôi đã nói trong phần bình luận câu hỏi: Nếu bạn khôngblkdiscardsẵn; bạn có thể lấy nguồn linux-linux từ github.com/karelzak/util-linux/tree/urdy/v2.23 sau đó xây dựng blkdiscard(chạy ./autogen.sh ; ./configure ; make blkdiscard) - nó được xây dựng sạch sẽ (mặc dù bạn có thể phải cài đặt một số configuretùy chọn và điều chỉnh tùy chọn) và như miễn là bạn không cài đặt nó, nó không xung đột với linux-linux hiện có.
Jason C

1
Tôi đã quan sát các thất bại với các giá trị nhất định được chuyển đến blkdiscard, nhưng nhận thấy các giá trị được dựa trên phần bù, không phải độ dài. Có thể có một vấn đề trong đó blkdiscard, tôi đang trong quá trình điều tra. Xem unix.stackexchange.com/questions/98473/ Kẻ
Jason C

Tôi đã tạo một tập lệnh loại bỏ không gian trống trên tất cả các hệ thống tệp được gắn kết cũng như các LVM VG miễn phí: github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-rangescó thể cắt một phạm vi. Trang người đàn ông cảnh báo sẽ sử dụng nó, vì vậy bạn nên chắc chắn rằng mình đã hiểu đúng phạm vi và cú pháp.

Tôi nghĩ rằng việc gửi một trang trí cho tất cả dữ liệu bên ngoài một phân vùng sẽ nguy hiểm, vì đôi khi có một số dữ liệu bị ẩn như mã bootloader hoặc các bảng phân vùng thứ hai. Bạn cần biết exaclty, những khu vực bên ngoài phân vùng thực sự không được sử dụng.


Hoàn hảo, cảm ơn! Tôi có thể lấy kích thước thiết bị với hdparm, phạm vi không sử dụng sfdiskvà cắt theo. Tôi biết những gì trên ổ đĩa. Nếu có một lược đồ chia tay che giấu dữ liệu trong các khu vực có thể truy cập nhưng chưa được phân bổ, điều đó sẽ phá vỡ mọi chức năng cơ bản của trình soạn thảo phân vùng. Tôi đoán (hy vọng) rằng bất kỳ kế hoạch nào như thế này đã bị bỏ rơi từ lâu (mặc dù tôi biết không có kế hoạch nào ngoài đầu tôi). Tất cả các sơ đồ tôi biết về việc lưu trữ MBR trong không gian chưa được phân bổ nổi tiếng khi bắt đầu thiết bị và VBR / EBR trong các phân vùng được phân bổ. Có thể có những kế hoạch tối nghĩa cũ là khác nhau. :)
Jason C

Tôi đang gặp một số khó khăn với hdparm, tôi đã chỉnh sửa câu hỏi của mình với các chi tiết; tự hỏi nếu bạn có bất kỳ cái nhìn sâu sắc.
Jason C

1
Có vẻ như ít nhất một số hdparm không hoạt động trên / dev / mmcblk0. Xin lỗi, tôi không có ý kiến ​​gì thêm.
Michael Suelmann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.