ext4パーティションがあるが割り当てられていないスペースもあるドライブ(SDカード)があります。このfstrim
ユーティリティはファイルシステム内でのみ機能します。ホイールを再発明して作成する前に割り当てられていないスペースをクリーンアップできる(または明示的に指定された範囲をクリーンアップできる)別のユーティリティはありますか?
割り当てられていないスペースの大部分がデバイスにあることを確認できます。いいえコントローラは現在アイドル状態であることが知られています。この特定のカードで見たように、切り捨てられたスペースを読み取るとゼロが返されますが、デバイスをスキャンすると多くのジャンクデータが残っていることがわかりました。
編集:これを使うのに問題があります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
新しいバージョンがある場合は、util-linux
デバイス全体またはデバイス内の範囲を整理するためのオプションと使用機能を備えたツールが含まれています。blkdiscard
--offset
--length
注: blkdiscard
危険です。間違った領域を切り取るとデータが消えます!
したがって、このツールを使用すると、パーティション化されたテーブル内のパーティション化されていない(使用可能な)領域を見つけてクリーンアップできます。msdos
およびgpt
パーティションの場合は、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.conf
LVMはTRIM自体を解放するため、呼び出しをスキップできますblkdiscard
。lvremove