如何在 Linux 上修剪/丢弃整个 SSD 分区?

pts*_*pts 41 linux ssd trim partitioning

/dev/sda3在 SSD 驱动器上的分区不包含任何文件系统,但它包含垃圾。如何对整个分区进行 TRIM/DISCARD 操作?

rob*_*at2 54

如果您的 util-linux 版本足够新(2012 年 9 月),实际上有一个专门构建的工具blkdiscard,这是执行此操作的最佳方法:

sudo blkdiscard /dev/sda3
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要与较旧的 Linux 发行版兼容,请继续阅读...在某些情况下hdparm/wiper.sh拒绝触摸卷,因为它不是分区,因此我们需要除此之外的其他内容。

我发现的最受支持的方法是利用 Linux 交换卷在启用时支持 DISCARD 的事实。最后的wipefs在那里,所以稍后不会将卷识别为交换。

D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D
Run Code Online (Sandbox Code Playgroud)

这会在大多数设备上发出 DISCARD。

  • @iBug 这取决于 SSD 的固件。与丢弃范围相关的所有页面肯定可以立即再次写入,但如果您尝试在修剪后(写入之前)立即读取它们,则确切的结果可能会因 SSD 固件(零、确定性、随机数据)而异 (4认同)
  • 谢谢,不知道`blkdiscard`。危险的命令... :) (2认同)
  • 为什么?我只是在手册中查找了它:“警告:设备上丢弃区域中的所有数据都将丢失!” (2认同)

Dav*_*ven 10

我知道这个问题很老了,但是......

最简单的做到这一点的方法是简单地创建分区上的文件系统的ext4用比较新的版本mkfs.ext4。这个工具做的第一件事是修剪整个分区。完成此操作后,您可以使用所需的任何文件系统覆盖它创建的数据。

(例如,我刚刚这样做是为了在 SD 卡上创建一个新的 vfat 分区。)

  • @pts 您可以通过减少日志大小和 inode 数量来最小化元数据的大小:`mkfs.ext4 -J size=4 -N1 /dev/my/device` (6认同)
  • @AryehLeibTaurog 使用`-E lazy_journal_init` 似乎比`-J size=4` 的写入次数略少。(基于使用稀疏文件而不是物理 SSD 和 `du` 来验证已写入多少的实验。) (4认同)

spu*_*puk 8

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
Run Code Online (Sandbox Code Playgroud)

要放弃这个分区之前的空间,我可以修剪2047(512字节大小,在我的SSD)来自扇区1的起始扇区: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年无需手动风险计算范围。 (8认同)

Jaa*_*ing 7

您可以查看wiper.shhdparm 包中包含的脚本。它使用 hdparm 命令--trim-sector-ranges修剪分区上的所有空扇区,至少如果它包含 ext3/4 文件系统。不确定它是否适用于未格式化的分区,但您始终可以使用 ext4 临时格式化它。

  • @pts:我建议您查看wiper.sh 的代码并尝试弄清楚它是如何推导出修剪范围的。然后您可以手动向 hdparm 发送修剪范围以修剪整个分区。 (2认同)

pro*_*ski 5

blkdiscard可以在分区上工作,而不仅仅是在整个驱动器上。我在 Fedora 20 上成功测试了它。我检查了它的来源blkdiscard- 这是一个非常简单的程序,对分区一无所知。我假设内核会进行翻译。

要非常小心,blkdiscard不要提出任何问题,也不要显示任何进度信息。

如果 blkdiscard 不可用,请使用此脚本并将其输出提供给 hdparm。第一个参数是要修剪的扇区数,第二个参数是要修剪的第一个扇区。

#! /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
Run Code Online (Sandbox Code Playgroud)