如何在Linux上修剪/删除整个SSD分区?


28

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


7
我想说的是,他不想写任何数据,他想让SSD擦除闪存块,但将其保留为空,以便可以将其写入,即刷新SSD驱动器。
克里斯·汤普森


@joe:您的ATA安全擦除链接甚至都没有提及。我不想删除整个驱动器,只是一个分区。而且我不想冒险意外擦除整个驱动器。
pts 2012年

11
@Doc:用垃圾数据填充分区与pts的意图恰好相反:它将告诉SSD分区已完全被使用。这会降低SSD的性能和使用寿命。
黑色

Answers:


40

如果您的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。


1
谢谢,不知道blkdiscard。危险命令... :)
弗罗斯特斯

为什么?我只是在手册中查找它:WARNING: All data in the discarded region on the device will be lost!
MrCalvin

9

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

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

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


谢谢你的小费!仅供参考,在TRIMming之后,为一个空的ext4文件系统写一些带有元数据的块,因此该分区的百分之几仍未修剪。
pts 2013年

4
@pts您可以通过减少日志大小和索引节点数来最小化元数据的大小:mkfs.ext4 -J size=4 -N1 /dev/my/device
Aryeh Leib Taurog

2
@AryehLeibTaurog使用-E lazy_journal_init似乎可以使写入的次数略少-J size=4。(基于使用稀疏文件而不是物理SSD的实验并du验证已写入了多少。)
kasperd15年

@kasperd一个有趣的实验,有趣的结果!谢谢。
Aryeh Leib Taurog

8

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会将部分存储在第一个分区之前的“未使用”扇区中。不知道其他引导程序,但我想可能是这种情况,所以请当心。


7
wiper.shfstrim更安全的方法淘汰了,但是对于这种特定用法,blkdiscard两者都胜过。在2013年,无需手动冒险计算范围。
加百利

6

您可以看一下wiper.shhdparm软件包随附的脚本。它使用hdparm命令--trim-sector-ranges对分区上的所有空扇区进行TRIM,至少在它包含ext3 / 4文件系统的情况下。不知道它是否适用于未格式化的分区,但是您始终可以使用ext4对其进行临时格式化。


用ext4格式化它,然后运行wiper.sh将修剪除ext4元数据以外的几乎所有分区。但我想修剪整个分区。
pts

2
@pts:建议您查看一下wiper.sh的代码,并尝试弄清楚它如何推导修整范围。然后,您可以手动将修剪范围发送到hdparm以对整个分区进行TRIM。
Jaap Eldering 2011年

4

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

-1

这是一篇有趣的文章,讨论使用HDDErase调用SSD的内置安全擦除功能,该功能应该可以让您获得想要的:

http://www.windowsitpro.com/article/file-systems/q-how-can-i-reset-a-solid-state-disk-ssd-to-a-fully-erased-clean-state-


谢谢您的回答,但是它不起作用,因为1)它会擦除整个驱动器2)它需要Microsoft Windows,并且我一直在寻找Linux解决方案。
pt

2
还要注意,这基本上是一样的blkdiscard --secure
ntninja
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.