開いているファイル内の範囲を破棄/TRIMするにはどうすればよいでしょうか?

開いているファイル内の範囲を破棄/TRIMするにはどうすればよいでしょうか?

SSD の場合、行デバイスを開き、ioctl()withBLKDISCARDコマンドを使用してページの範囲を破棄できます。

私の質問は

開いているファイルの場合、データの範囲を破棄するにはどうすればよいですか? また、それは基盤となるファイルシステムの実装に依存しますか?

答え1

あなたが探していますfallocateFALLOC_FL_PUNCH_HOLEそれらのブロックを破棄/トリム/アンマップするのはファイルシステム次第です。ext4 はそうすると思います。

たとえば、1MiB から 2MiB を破棄するには、次のようにします。

err = fallocate(fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, 1048576, 2097152);
if (0 != err) {
    /* handle error */
}

成功した場合、それらのバイトの今後の読み取りでは 0 が返されるはずです。

[注: POSIX にはこれを行う方法がありません。上記の fallocate は Linux 固有です。ただし、質問に Linux のタグを付けているので、問題ないと思います。]

関連情報