web-dev-qa-db-ja.com

LinuxでSSDパーティション全体をトリム/破棄する方法は?

私のパーティション/dev/sda3 SSDドライブのファイルシステムは含まれていませんが、ゴミが含まれています。パーティション全体でTRIM/DISCARD操作を実行するにはどうすればよいですか?

32
pts

Util-linuxのバージョンが十分に新しい場合(2012年9月)、実際には専用のツール blkdiscard があり、これがこれを行うための最良の方法です。

Sudo blkdiscard /dev/sda3

しかし、古いLinuxディストリビューションバージョンとの互換性が必要な場合は、以下をお読みください... hdparm/wiper.shボリュームではないため、ボリュームへの接触を拒否します。したがって、それ以上のものが必要です。

私が見つけた最もサポートされている方法は、Linuxスワップボリュームが有効になっている場合にDISCARDをサポートするという事実を利用することです。最後のwipefsはそこにあるので、ボリュームは後でスワップとして認識されません。

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

これにより、デバイスの大部分でDISCARDが発行されます。

45
robbat2

この質問はかなり古いですが...

これを行うsimplest方法は、mkfs.ext4のかなり最近のバージョンを使用して、パーティションにext4ファイルシステムを作成することです。このツールが最初に行うことは、パーティション全体をトリムすることです。それが完了したら、作成したデータを任意のファイルシステムで上書きできます。

(たとえば、SDカードに新しいvfatパーティションを作成するためにこれを実行しました。)

9
David Given

hdparm --trim-sector-rangesは低レベルであり、SSDと直接通信するため、ファイルシステムに依存していません。 wiper.shは、ファイルシステム固有のプログラムを使用して空き(ファイルシステム)領域を(ハードウェア)SSDセクターにマップし、hdparmを使用してそれらをトリミングします。

質問に答えると、hdparmを使用してそのパーティションをトリミングできますが、非常に注意にする必要があります。これを行う方法は、パーティションで使用されるセクター範囲を取得し、そのセクター範囲でhdparmを使用することです。おそらく--trim-sector-rangesの各範囲は最大65535セクターを持つことができるため、複数のセクター範囲を渡す必要があります。

fdisk -lは、パーティションの開始とサイズを通知します。 fdiskで使用されているユニットとSSDのセクターサイズに注意してください。

例(私のSSD):

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

このパーティションの前のスペースを破棄するために、セクター1から始まる2047(512バイトサイズ、SSD上の)セクターをトリミングできます:hdparm --trim-sector-ranges 1:2047。これはMBR(GPTの場合はどうなるか)であるため、セクター0からトリムすることはできません。

パーティションで使用されているスペースを破棄するには、hdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 ...を実行します。スクリプトで記述できますが、今は記述しません。

また、念のため、ここでは何も保証していません。セクターの計算が間違っている可能性があります。--trim-sector-rangesを効果的に使用する前に、すべてのバックアップを行ってください。

:最初に示したように、最初のパーティションの前に "空の"スペースをトリミングする場合は、再起動する前にGRUB(または使用するブートローダー))を必ず再インストールしてくださいGRUBは、その一部を最初のパーティションの前の「未使用」セクターに格納します。他のブートローダーはわかりませんが、そうかもしれないので、注意してください。

8
spuk

あなたはスクリプトを見ることができますwiper.sh hdparmパッケージに含まれています。 hdparmコマンドを使用します--trim-sector-ranges少なくともext3/4ファイルシステムが含まれている場合、パーティション上のすべての空のセクターをトリムします。それがフォーマットされていないパーティションで機能するかどうかはわかりませんが、ext4でいつでも一時的にフォーマットすることができます。

6
Jaap Eldering

blkdiscardは、ドライブ全体だけでなく、パーティションでも機能します。 Fedora 20で問題なくテストしました。blkdiscardのソースを確認しました。これは、パーティションについて何も知らない非常にシンプルなプログラムです。カーネルが変換を行うと思います。

blkdiscardは質問せず、進行状況の情報も表示しないので、十分に注意してください。

Blkdiscardが利用できない場合は、このスクリプトを使用して、その出力をhdparmにフィードします。最初の引数はトリムするセクターの数、2番目はトリムする最初のセクターです。

#! /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
4
proski