我/dev/sda3
在SSD驱动器上的分区不包含任何文件系统,但其中包含垃圾。如何在整个分区上执行TRIM / DISCARD操作?
我/dev/sda3
在SSD驱动器上的分区不包含任何文件系统,但其中包含垃圾。如何在整个分区上执行TRIM / DISCARD操作?
Answers:
如果您的util-linux版本足够新(2012年9月),则实际上有一个专用工具blkdiscard
,这是执行此操作的最佳方法:
sudo blkdiscard /dev/sda3
但是,如果您需要与旧版Linux发行版兼容,请继续阅读...在某些情况下,hdparm
/ wiper.sh
拒绝触摸一个卷,因为该卷不是分区,因此我们需要除此以外的其他功能。
我发现最受支持的方法是利用Linux交换卷在启用时支持DISCARD的事实。末尾有擦拭布,因此以后无法识别该卷。
D=/dev/sda3 ; mkswap $D && swapon -d $D && swapoff $D && wipefs -o 0xff6 $D
这将在大多数设备上发出DISCARD。
blkdiscard
。危险命令... :)
WARNING: All data in the discarded region on the device will be lost!
我知道这个问题已经很老了,但是...
在最简单的做到这一点的方法是简单地创建分区上的文件系统的ext4用比较新的版本mkfs.ext4
。该工具要做的第一件事是修剪整个分区。完成此操作后,您可以使用所需的任何文件系统覆盖创建的数据。
(例如,我刚刚在SD卡上创建了一个新的vfat分区。)
mkfs.ext4 -J size=4 -N1 /dev/my/device
-E lazy_journal_init
似乎可以使写入的次数略少-J size=4
。(基于使用稀疏文件而不是物理SSD的实验并du
验证已写入了多少。)
hdparm --trim-sector-ranges是低级别的,应该直接与SSD通讯,因此不依赖于文件系统。wetper.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
要放弃此分区之前的空间,我可以从扇区1开始修剪2047(在我的SSD上为512字节大小)扇区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年,无需手动冒险计算范围。
您可以看一下wiper.sh
hdparm软件包随附的脚本。它使用hdparm命令--trim-sector-ranges
对分区上的所有空扇区进行TRIM,至少在它包含ext3 / 4文件系统的情况下。不知道它是否适用于未格式化的分区,但是您始终可以使用ext4对其进行临时格式化。
wiper.sh
将修剪除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