Làm cách nào để TRIM / DISCARD toàn bộ phân vùng SSD trên Linux?


28

Phân vùng của tôi /dev/sda3trên ổ SSD không chứa bất kỳ hệ thống tập tin nào, nhưng nó chứa rác. Làm cách nào để thực hiện thao tác TRIM / DISCARD trên toàn bộ phân vùng?


7
Tôi nghĩ vấn đề là anh ta không muốn ghi bất kỳ dữ liệu nào, anh ta muốn SSD xóa khối flash nhưng để trống để nó được ghi vào, được gọi là làm mới ổ SSD.
Chris Thompson


@joe: Liên kết xóa an toàn ATA của bạn thậm chí không đề cập đến các mệnh đề. Tôi không muốn xóa toàn bộ ổ đĩa, chỉ là một phân vùng. Và tôi không muốn mạo hiểm vô tình xóa toàn bộ ổ đĩa.
pts

11
@Doc: Việc lấp đầy phân vùng với dữ liệu rác hoàn toàn trái ngược với ý định của pts: Nó sẽ cho SSD biết rằng phân vùng đã được lấp đầy hoàn toàn khi sử dụng. Điều này sẽ làm giảm hiệu suất và tuổi thọ của SSD.
Đen

Câu trả lời:


40

Nếu phiên bản linux-linux của bạn đủ mới (tháng 9 năm 2012), thực sự có một công cụ được xây dựng có mục đích blkdiscard, đó là cách tốt nhất để làm điều này:

sudo blkdiscard /dev/sda3

Nhưng nếu bạn cần khả năng tương thích với các phiên bản phân phối Linux cũ hơn, hãy đọc tiếp ... Có những trường hợp hdparm/ wiper.shtừ chối chạm vào âm lượng vì đó không phải là phân vùng, vì vậy chúng tôi cần một cái gì đó vượt ra ngoài.

Cách được hỗ trợ nhiều nhất mà tôi đã tìm thấy là tận dụng thực tế là khối lượng trao đổi Linux hỗ trợ DISCARD khi chúng được bật. Các wipefs ở cuối là có nên âm lượng không được công nhận là trao đổi sau này.

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D

Điều này phát hành KHÁM PHÁ trên phần lớn thiết bị.


1
Cảm ơn, không biết về blkdiscard. Lệnh nguy hiểm ... :)
frostschutz

Tại sao? Tôi chỉ xem nó trong hướng dẫn:WARNING: All data in the discarded region on the device will be lost!
MrCalvin

9

Tôi biết câu hỏi này khá cũ, nhưng ...

Cách đơn giản nhất để làm điều này là chỉ cần tạo một hệ thống tệp ext4 trên phân vùng với phiên bản hợp lý gần đây mkfs.ext4. Điều đầu tiên công cụ này làm là TRIM toàn bộ phân vùng. Khi bạn đã thực hiện điều đó, bạn có thể ghi đè lên dữ liệu được tạo bằng bất kỳ hệ thống tệp nào bạn muốn.

(Tôi vừa mới thực hiện việc này để tạo phân vùng vfat mới trên thẻ SD chẳng hạn.)


Cảm ơn vì tiền boa! FYI Sau khi TRIMming, viết một số khối với siêu dữ liệu cho một hệ thống tệp ext4 trống, do đó, một vài phần trăm của phân vùng vẫn chưa được xác định.
pts

4
@pts Bạn có thể giảm thiểu kích thước của siêu dữ liệu bằng cách giảm kích thước nhật ký và số lượng nút:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog

2
@AryehLeibTaurog Sử dụng -E lazy_journal_initdường như dẫn đến việc viết ít hơn một chút so với -J size=4không. (Dựa trên các thử nghiệm sử dụng tệp thưa thớt thay vì SSD vật lý và duđể xác minh số lượng đã được viết.)
kasperd

@kasperd Một thử nghiệm thông minh với kết quả thú vị! Cảm ơn.
Aryeh Leib Taurog

8

hdparm --trim-sector-Range ở mức thấp, nó được cho là nói chuyện trực tiếp với SSD, do đó không phụ thuộc vào hệ thống tập tin. Những gì wiper.sh làm là sử dụng các chương trình cụ thể của hệ thống tệp để ánh xạ các vùng (hệ thống tệp) miễn phí sang các phần SSD (phần cứng), chúng sử dụng hdparm để cắt xén chúng.

Trả lời câu hỏi, bạn có thể sử dụng hdparm để cắt phân vùng đó, nhưng bạn nên rất cẩn thận . Cách thực hiện là lấy phạm vi khu vực được sử dụng bởi phân vùng, sau đó sử dụng hdparm trên phạm vi khu vực đó. Có lẽ bạn sẽ cần phải vượt qua nhiều phạm vi ngành, vì mỗi phạm vi cho - phạm vi ngành có thể có tối đa 65535 ngành.

fdisk -l có thể cho bạn biết bắt đầu và kích thước của các phân vùng. Hãy chú ý đến các đơn vị được sử dụng bởi fdisk và kích thước cung của ổ SSD của bạn.

Ví dụ (SSD của tôi):

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    39070079    19534016   83  Linux

Để loại bỏ không gian trước phân vùng này, tôi có thể cắt các ngành 2047 (kích thước 512 byte, trên ổ SSD của tôi) bắt đầu từ khu vực 1 : hdparm --trim-sector-ranges 1:2047. Tôi không thể cắt bắt đầu từ khu vực 0 vì đó là MBR (không biết nó hoạt động như thế nào đối với GPT).

Để loại bỏ không gian được sử dụng bởi phân vùng, tôi sẽ làm hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 .... Nó có thể được viết kịch bản nhưng tôi sẽ không viết ngay bây giờ.

Ngoài ra, để chắc chắn: Tôi không đảm bảo bất cứ điều gì ở đây, tôi có thể đã tính toán sai các lĩnh vực, thực hiện sao lưu mọi thứ trước khi sử dụng hiệu quả phạm vi --trim-sector.

Lưu ý : nếu bạn cắt không gian "trống" trước phân vùng đầu tiên, như tôi đã trình bày, hãy chắc chắn cài đặt lại GRUB (hoặc bất kỳ trình tải khởi động nào bạn sử dụng) trước khi khởi động lại, vì GRUB lưu trữ một phần của nó trên các cung "không sử dụng" trước phân vùng đầu tiên . Không biết các bộ tải khởi động khác nhưng tôi đoán đó có thể là trường hợp, vì vậy hãy cẩn thận.


7
wiper.shbị lỗi thời bởi fstrimnó an toàn hơn nhiều, nhưng đối với việc sử dụng cụ thể này sẽ blkdiscardđánh bại cả hai. Trong năm 2013, không cần phải mạo hiểm phạm vi tính toán bằng tay.
Gabriel

6

Bạn có thể xem kịch bản đi wiper.shkèm với gói hdparm. Nó sử dụng lệnh hdparm --trim-sector-rangesđể TRIM tất cả các cung trống trên một phân vùng, ít nhất là nếu nó chứa một hệ thống tập tin ext3 / 4. Không chắc chắn nếu nó hoạt động với các phân vùng chưa được định dạng, nhưng bạn luôn có thể định dạng tạm thời nó với ext4.


Định dạng nó với ext4 và sau đó chạy wiper.shsẽ cắt gần như tất cả các phân vùng ngoại trừ siêu dữ liệu ext4. Nhưng tôi muốn cắt toàn bộ phân vùng.
pts

2
@pts: Tôi khuyên bạn nên xem mã của wiper.sh và cố gắng tìm hiểu làm thế nào nó suy ra phạm vi cắt. Sau đó, bạn có thể tự gửi một phạm vi cắt tới hdparm để TRIM toàn bộ phân vùng.
Jaap Eldering

4

blkdiscardcó thể làm việc trên các phân vùng, không chỉ trên toàn bộ ổ đĩa. Tôi đã thử nghiệm thành công trên Fedora 20. Tôi đã kiểm tra các nguồn của blkdiscard- đó là một chương trình rất đơn giản không biết gì về phân vùng. Tôi giả sử hạt nhân dịch.

Hãy rất cẩn thận, blkdiscardkhông có câu hỏi và cho thấy không có thông tin tiến bộ.

Nếu blkdiscard không có sẵn, hãy sử dụng tập lệnh này và đưa đầu ra của nó lên hdparm. Đối số đầu tiên là số lượng các ngành cần cắt, thứ hai là khu vực đầu tiên để cắt.

#! /bin/sh
# List ranges for hdparm --trim-sector-ranges-stdin
: ${MAXSECT=65535}
test $# = 2 || { echo "Usage: trimlist sectors offset" >&2; exit 1; }
sectors=$1
pos=$2
while test $sectors -gt 0; do
    if test $sectors -gt $MAXSECT; then
            size=$MAXSECT
    else
            size=$sectors
    fi
    echo $pos:$size
    sectors=$(($sectors-$size))
    pos=$(($pos+$size))
done

-1

Đây là một bài viết thú vị nói về việc sử dụng HDDErase để gọi ra tính năng xóa an toàn tích hợp của SSD, thứ sẽ giúp bạn muốn:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-


Cảm ơn câu trả lời của bạn, nhưng nó không hoạt động, vì 1) nó xóa toàn bộ ổ đĩa 2) nó yêu cầu Microsoft Windows và tôi đang tìm kiếm một giải pháp Linux.
pts

2
Cũng lưu ý rằng điều này về cơ bản là giống như blkdiscard --securevậy.
ntninja
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.