fstrim cắt hơn một nửa kích thước phân vùng mặc dù phân vùng được gắn với loại bỏ


8

Khi tôi cài đặt ổ SSD của mình, tôi chỉ gắn vào discardvà không đổ mồ hôi. Tuy nhiên hôm nay tôi đã đọc về những ưu và nhược điểm của việc sử dụng fstrimthay vào đó và quyết định chạy chương trình để có ý tưởng về việc nó sẽ thực sự mất bao lâu (vẫn với các phân vùng của tôi được gắn với discard). Lệnh mất vài phút trên cả phân vùng gốc và nhà của tôi. Đối với phân vùng nhà của tôi, tôi đã sử dụng -vvà nhận được điều này:

$ sudo fstrim -v /home
/home: 137494052864 bytes were trimmed

Đây là nhiều hơn không gian trống trên phân vùng!

$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       206G   78G  118G  40% /home

Các lần chạy tiếp theo kết thúc sau chưa đầy một giây, ví dụ:

$ sudo fstrim -v /home
/home: 0 bytes were trimmed

Chắc chắn nếu tôi luôn có phân vùng được gắn kết discard, fstrimkhông nên cắt một lượng lớn dữ liệu như vậy? Các discardtùy chọn chắc chắn được kích hoạt, sau đây là có liên quan fstabdòng:

UUID=xxxxxxxx...    /          ext4   noatime,discard,errors=remount-ro  0      1
UUID=xxxxxxxx...    /home      ext4   noatime,discard,errors=remount-ro  0      2

mountdòng đầu ra:

/dev/disk/by-uuid/xxxxxxxx... on / type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)
/dev/sda2 on /home type ext4 (rw,noatime,discard,errors=remount-ro,stripe=128,data=ordered)

Ổ SSD là một chiếc THNSNS256GMCP của Toshiba. Lý do tại sao điều này xảy ra?

Câu trả lời:


12

Hai điều ở đây:

  1. fstrimcắt tất cả dữ liệu chưa được phân bổ trong hệ thống tệp (tốt, không thực sự là tất cả dữ liệu, chỉ các khối dữ liệu không được phân bổ, tôi không nghĩ các phần không được sử dụng của bảng inode hoặc các phần của các khối không được sử dụng hoàn toàn là cắt xén), bất kể có discardsử dụng hay không. fstrimkhông thể biết khối nào chưa được phân bổ đã bị "cắt xén" hoặc chưa có trong quá khứ, nhưng nó (thực sự là kernel, tất cả fstrimcông việc được thực hiện trong FITRIM ioctl) tuy nhiên theo dõi nhóm khối nào đã được cắt bớt và sẽ không cắt chúng một lần nữa nếu không có bất kỳ sự sắp xếp nào trong nhóm khối đó kể từ đó, trừ khi bạn yêu cầu FITRIM với độ dài tối thiểu nhỏ hơn (từ việc kiểm tra mã ext4, nó có thể khác với hệ thống tập tin) giải thích tại sao bạn nhận được 0 trong lần chạy tiếp theo.

    Lưu ý rằng không có hại khi cắt một khối đã được cắt. Điều đó chỉ nói với SSD một lần nữa rằng nó có thể làm bất cứ điều gì nó muốn với nó (như xóa nó để nó có thể sẵn sàng sử dụng lại cho thứ khác).

  2. Trong dfđầu ra, giá trị "khả dụng" không tính đến không gian được "dành riêng" root, bạn sẽ nhận thấy 206 - 76 là 130G, không phải 118G. 12G (khoảng 5%) được bảo lưu. Xem tunefs -mđể thay đổi bao nhiêu được dành riêng.

1
Vì vậy, nếu fstrimkhông biết những gì đã được cắt bớt, tại sao nó lại báo cáo 0 byte lần thứ hai? Chắc chắn điều này phải đến từ đĩa, nhưng tại sao lần đầu tiên nó lại báo cáo một số tiền lớn như vậy? Chắc chắn đĩa sẽ không biết liệu đã được sử dụng discardhay trimchưa.
Graeme

1
@Graeme, argh, điểm tốt. fstrim, sử dụng iITtl FITRIM và đó là kernel thực hiện tất cả công việc và báo cáo kết quả cho fstrim. Tôi cho rằng kernel theo dõi những gì đã được cắt, nhưng nó chỉ có thể làm điều đó vì nó đã khởi động. Sẽ điều tra và cập nhật câu trả lời.
Stéphane Chazelas

1
Ok, vâng, kernel phải theo dõi những gì đã được cắt từ khi khởi động. Nếu tôi khởi động lại và làm khác fstrim, tôi nhận được cùng một đầu ra.
Graeme

@Graeme, xem chỉnh sửa của tôi.
Stéphane Chazelas

1
fstrimChỉ cần đưa ra vấn đề phù hợp ioctl, mọi thứ khác là quyết định của hệ thống tập tin và hệ thống tập tin hoạt động rất khác nhau. ext4cố gắng tránh cắt xén những thứ tương tự lặp đi lặp lại, xfskhông quan tâm và cắt xén mọi thứ miễn phí, những người khác có thể làm những việc khác - nếu họ thậm chí còn hỗ trợ nó ... nếu không thể, hãy phàn nàn với hệ thống tập tin.
frostschutz
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.