ドライブの未割り当て領域をトリムするユーティリティ


11

いくつかのext4パーティションを含むドライブ(SDカード)がありますが、未割り当ての領域もあります。fstrimユーティリティは、ファイルシステム内で作業することができます。ホイールを再発明してホイールを作成する前に、未割り当てスペースをトリムできる(または明示的に指定された範囲をトリムできる)別のユーティリティはありますか?

私は、デバイス上の未割り当て領域の大部分がされていることを確認することができない私は0を、この特定のカードに、その観察トリミングされた空間リターンに読み込んでてきたように、現在コントローラでないことが知られているが、デバイスショーのスキャン大量のゴミデータが残っています。

編集:を使用して問題が発生していhdparmます。以下の例では最初のセクターを破棄していますが、指定した範囲に関係なく同じ結果が表示されます。fstrimデバイスに問題はありません:

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

さらに調査していますが、誰か洞察力はありますか?


1
パーティション化されていないスペースを1つ以上のパーティションに(一時的に)マップするとblkdiscard、デバイス全体をトリミングするパーティションで使用できます。
frostschutz 2013年

ありがとう!これは適切なツールのblkdiscardように見えますが、私の標準パッケージリポジトリでは利用できないようです(Ubuntu 12.04、には存在しないようですutil-linux)。
Jason C

hdparmどういうわけか私のために働くことができませんでしたが、私はgithub.com/karelzak/util-linux/tree/stable/v2.23からutil-linuxソースを取得し、ビルドしました(./autogen.sh ; ./configure ; make blkdiscard)、それはうまく機能しています。まだ神秘的ですhdparmblkdiscard、私が望んでいることを正確に実行します。おまけ:最初に一時ファイルシステムを作成する必要はありません。sfdisk -lパーティション間のスペースを把握し、blkdiscardそれをトリムするために使用できます。
Jason C

ああ、私はblkdiscardオフセット/長さのオプションで作業できることさえ知らなかった。そのため、私が提案した一時パーティションは必要ありません。いいね!
frostschutz 2013年

回答:


16

あなたが最近の十分なバージョンを持っている場合util-linux、それはツールが含まblkdiscard使用して、装置内全体のデバイス、または範囲をトリミングすることが可能である--offset--lengthのオプションを。

注意: blkdiscard危険です。間違った領域をトリムすると、データが失われます。

したがって、パーティションテーブルのパーティション化されていない(無料の)領域を特定し、このツールを使用してそれらをトリムできます。以下の場合msdosgpt、パーティション、partedそのような自由な領域を提供します。

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

それにループを追加...

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

印刷する

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

この出力が正しいことを確認し、必要に応じてオプションを追加し(冗長ですか?)、最後に削除しechoて実際に実行されるようにして、設定する必要があります。

その例の2番目のコマンドは、長さが小さすぎるため実際には失敗します。ループ内で確認する価値があるかもしれません。1MB未満の領域は、正常にトリミングされる可能性が低いので無視してください。


パーティションの代わりにLVMを使用している場合は、空いているスペースのLVを作成し、それをトリムできます。

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

で設定issue_discards = 1した場合は、LVMがTRIMを単独で発行lvm.confするため、blkdiscard呼び出しをスキップできますlvremove


1
ありがとう!マイケルの回答も有効であるにもかかわらず、私にとっては有効であるため、これを回答として述べました。また、私は質問のコメントで私が言ったことを追加します。あなたがいる場合はありません持ってblkdiscard利用できます。あなたからのutil-linuxのソースをつかむことができgithub.com/karelzak/util-linux/tree/stable/v2.23 [ビルドblkdiscard(実行./autogen.sh ; ./configure ; make blkdiscard) -それは(あなたには、いくつかの依存関係と微調整をインストールする必要がありますが、きれいに構築されたconfigureオプションを)としてインストールしない限り、既存のutil-linuxと競合しません。
Jason C

1
渡された特定の値で障害を観察しblkdiscardていましたが、値が長さではなくオフセットに基づいていることに気付きました。に問題がある可能性がありblkdiscardます。現在調査中です。unix.stackexchange.com/questions/98473/…を
Jason C

マウントされたすべてのファイルシステムの空き容量と無料のLVM VGを破棄するスクリプトを作成しました:github.com/stefanct/discard-everything
stefanct

7

hdparm --trim-sector-ranges範囲をトリミングできます。マニュアルページはそれを使用するように警告しているので、正しい範囲と構文を得ていることをよりよく確認するべきです。

ブートローダーコードや2番目のパーティションテーブルなどの非表示のデータが時々あるので、パーティションの外側のすべてのデータのトリムを送信することは危険だと思います。パーティションの外側のどの領域が実際に使用されていないかを知る必要があります。


パーフェクト、ありがとう!でデバイスサイズを取得し、hdparmから未使用の範囲を取得して、sfdiskそれに応じてトリミングできます。ドライブに何が入っているか知っています。アクセス可能であるが割り当てられていない領域のデータを非表示にするパーティショニングスキームがある場合、パーティションエディターの基本的な機能が損なわれます。私は、このような計画はずっと放棄されていると思います(期待します)(ただし、頭のてっぺんには何もありません)。私が知っているすべてのスキームは、デバイスの開始時に既知の未割り当て領域にMBRを格納し、割り当てられたパーティション内にVBR / EBRを格納します。異なる古いあいまいなスキームが存在する場合があります。:)
Jason C

hdparm問題があります。質問を詳細に編集しました。あなたは何か洞察力を持っているかどうか疑問に思います。
Jason C

1
hdparmの少なくとも一部が/ dev / mmcblk0で機能しないようです。申し訳ありませんが、これ以上の考えはありません。
Michael Suelmann 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.