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。
Dav*_*ven 10
我知道这个问题很老了,但是......
在最简单的做到这一点的方法是简单地创建分区上的文件系统的ext4用比较新的版本mkfs.ext4。这个工具做的第一件事是修剪整个分区。完成此操作后,您可以使用所需的任何文件系统覆盖它创建的数据。
(例如,我刚刚这样做是为了在 SD 卡上创建一个新的 vfat 分区。)
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.shhdparm 包中包含的脚本。它使用 hdparm 命令--trim-sector-ranges修剪分区上的所有空扇区,至少如果它包含 ext3/4 文件系统。不确定它是否适用于未格式化的分区,但您始终可以使用 ext4 临时格式化它。
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)
| 归档时间: |
|
| 查看次数: |
37620 次 |
| 最近记录: |