/dev/sda3
SSDドライブのパーティションにはファイルシステムが含まれていませんが、ゴミが含まれています。パーティション全体でTRIM / DISCARD操作を実行するにはどうすればよいですか?
/dev/sda3
SSDドライブのパーティションにはファイルシステムが含まれていませんが、ゴミが含まれています。パーティション全体でTRIM / DISCARD操作を実行するにはどうすればよいですか?
回答:
util-linuxのバージョンが十分に新しい場合(2012年9月)、専用のツールが実際にありblkdiscard
ます。これは、これを行う最適な方法です。
sudo blkdiscard /dev/sda3
古いLinuxディストリビューションのバージョンとの互換性が必要な場合でも、ケースがあります...読みhdparm
/ wiper.sh
それはパーティションではありませんので、我々はそれを超えた何かを必要とするので、ゴミは、ボリュームに触れることが。
私が見つけた最もサポートされている方法は、Linuxスワップボリュームが有効になっているときにDISCARDをサポートするという事実を利用することです。最後のワイプはそこにあるので、ボリュームは後でスワップとして認識されません。
D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D
これにより、デバイスの大部分でDISCARDが発行されます。
blkdiscard
。危険なコマンド... :)
WARNING: All data in the discarded region on the device will be lost!
この質問はかなり古いものですが、...
これを行う最も簡単な方法は、合理的に最新のバージョンのext4ファイルシステムをパーティションに作成することですmkfs.ext4
。このツールが最初に行うことは、パーティション全体のTRIMです。それが完了したら、作成したデータを任意のファイルシステムで上書きできます。
(たとえば、SDカードに新しいvfatパーティションを作成するためにこれを実行しました。)
mkfs.ext4 -J size=4 -N1 /dev/my/device
-E lazy_journal_init
すると、書き込みよりも書き込みがやや少なくなる-J size=4
ようです。(物理SSDではなくスパースファイルを使用した実験に基づいdu
ており、書き込まれた量を確認します。)
hdparm --trim-sector-rangesは低レベルであり、SSDと直接通信するため、ファイルシステムに依存しません。ワイパー.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(SSDでは512バイトサイズ)セクターをトリミングできますhdparm --trim-sector-ranges 1:2047
。セクター0から開始することはできません。これはMBRであるためです(GPTの場合はどうでしょう)。
パーティションで使用されているスペースを破棄するには、を実行しますhdparm --trim-sector-ranges 2048:65535 67583:65535 133118:65535 ...
。スクリプトを作成することもできますが、今は作成しません。
また、念のため:ここでは何も保証していません。誤って計算されたセクターがある可能性があります。すべてをバックアップしてから、-trim-sector-rangesを効果的に使用します。
注:最初に示したように、最初のパーティションの前に「空の」スペースをトリミングする場合、GRUBは最初のパーティションの前の「未使用」セクターにその一部を保存するため、再起動する前に必ずGRUB(または使用するブートローダー)を再インストールしてください。他のブートローダーを知らないが、そうかもしれないので、注意してください。
wiper.sh
廃止されましfstrim
たが、これははるかに安全ですが、この特定の使用法でblkdiscard
は両方に勝ります。2013年には、計算範囲を手動で危険にさらす必要はありません。
wiper.sh
hdparmパッケージに含まれているスクリプトを見ることができます。--trim-sector-ranges
少なくともext3 / 4ファイルシステムが含まれている場合は、hdparmコマンドを使用して、パーティション上のすべての空のセクターをトリムします。フォーマットされていないパーティションで動作するかどうかはわかりませんが、ext4で常に一時的にフォーマットできます。
wiper.sh
すると、ext4メタデータを除くほぼすべてのパーティションがトリミングされます。しかし、パーティション全体をトリミングしたいと思います。
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