实用程序,用于驱动器上的TRIM未分配空间


11

我有一个带有几个ext4分区的驱动器(SD卡),但是还有一些未分配的空间。该fstrim实用程序只能在文件系统内工作。在我重新发明轮子并写一个轮子之前,是否有另一个实用程序可以对未分配的空间进行修剪(或者可以对明确指定的范围进行修剪)?

我可以确认的是,大部分的设备上未分配的空间是不是目前已知的控制器是免费的,因为我观察到,这种特殊的卡上,读取到修剪空间返回0的,但该设备显示的扫描剩下大量垃圾数据。

编辑:我在使用时遇到问题hdparm。下面的示例舍弃了第一个扇区,但是无论我指定的范围如何,我都会看到相同的结果。fstrim设备上没有任何问题:

root@ubuntu:~# hdparm --please-destroy-my-drive --trim-sector-ranges 0:1 --verbose /dev/mmcblk0 

/dev/mmcblk0:
trimming 1 sectors from 1 ranges
outgoing cdb:  85 0d 06 00 01 00 01 00 00 00 00 00 00 40 06 00
outgoing_data:  
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

ioctl(fd,SG_IO): Invalid argument
FAILED: Invalid argument

我正在进一步调查,但是有人有见识吗?


1
如果您用一个或多个分区(临时)映射未分区的空间,则可以blkdiscard在其上使用以修剪整个设备。
弗罗斯特斯

谢谢!看起来像是正确的工具,但blkdiscard在我的标准软件包存储库中似乎不可用(Ubuntu 12.04,似乎没有在中提供util-linux)。
詹森·C

hdparm由于某种原因,我一直无法为我工作,但是我从github.com/karelzak/util-linux/tree/stable/v2.23抓取了util-linux源,构建了它(./autogen.sh ; ./configure ; make blkdiscard),并且运行良好。仍然是个谜,hdparmblkdiscard确实是我想要的。附:无需先创建一个临时文件系统,您可以sfdisk -l用来找出分区之间的空间并进行blkdiscard修剪。
詹森·C

哦,我什blkdiscard至不知道能够使用offset / length选项。因此,我建议的临时分区甚至不是必需的。真好!
弗罗斯特斯

Answers:


16

如果您的版本足够新util-linux,则它包含的工具blkdiscard可以使用--offset--length选项对整个设备或设备范围内的TRIM进行修整。

请注意:这 blkdiscard很危险,如果将其TRIM设置到错误的区域,则数据将丢失!

因此,您可以找出分区表的未分区(空闲)区域,然后使用此工具对它们进行修剪。对于msdosgpt分区,parted提供如下所示的空闲区域:

# parted -m /dev/sda unit b print free | grep ':free;'
1:17408B:1048575B:1031168B:free;
1:64022904832B:64023240191B:335360B:free;

向其添加循环...

while IFS=: read -ra FREE
do
    echo blkdiscard --offset ${FREE[1]%%B} --length ${FREE[3]%%B} /dev/sda
done < <(parted -m /dev/sda unit b print free | grep ':free;')

哪个打印

blkdiscard --offset 17408 --length 1031168 /dev/sda
blkdiscard --offset 64022904832 --length 335360 /dev/sda

验证此输出对您来说是正确的,如果您喜欢(详细吗?),请添加其他选项,最后删除,echo这样它将被实际执行,并且应该进行设置。

该示例的第二个命令实际上由于长度太小而失败-可能值得在循环内检查,忽略小于1MB的区域,因为它们不太可能成功修剪。


如果使用LVM而不是分区,则可以为空闲空间创建一个LV并进行以下修剪:

lvcreate -l100%FREE -n blkdiscard SSD-VG
blkdiscard -v /dev/SSD-VG/blkdiscard
lvremove SSD-VG/blkdiscard

如果你设置issue_discards = 1你的lvm.conf,你可以跳过blkdiscard为LVM发布有关TRIM呼叫lvremove本身。


1
谢谢!我将其标记为答案,因为它对我有用,即使Michael的答案也有效。此外,我会增加我所说的问题的意见:如果你不做blkdiscard可用的; 您可以从github.com/karelzak/util-linux/tree/stable/v2.23抓取util-linux源代码,然后进行构建blkdiscard(运行./autogen.sh ; ./configure ; make blkdiscard)-它构建得很干净(尽管您可能必须安装一些依赖项和调整configure选项),并且只要您不安装它,它就不会与现有的util-linux冲突。
詹森·C

1
我也观察到传递了某些值的失败blkdiscard,但是注意到这些值是基于偏移量而不是长度的。我可能正在blkdiscard调查中的问题。参见unix.stackexchange.com/questions/98473/…–
Jason C

我创建了一个脚本,该脚本会丢弃所有已挂载文件系统上的可用空间以及免费的LVM VG:github.com/stefanct/discard-everything
stefanct 2014年

7

hdparm --trim-sector-ranges可以修剪范围。手册页警告使用它,因此您最好确保获得正确的范围和语法。

我认为为分区外部的所有数据发送修剪会很危险,因为那里有时会存在一些隐藏数据,例如引导加载程序代码或第二个分区表。您需要知道一点,分区之外的哪些区域确实未被使用。


很好,谢谢!我可以使用抓取设备的大小hdparm,其中的未使用范围为sfdisk,并相应地进行修整。我知道硬盘上有什么。如果有一种分区方案将数据隐藏在可访问但未分配的区域中,则将破坏任何分区编辑器的基本功能。我认为(希望)像这样的任何方案早就被放弃了(尽管我什至不知道)。我所知道的所有方案都将MBR存储在设备开头的已知未分配空间中,并将VBR / EBR存储在已分配分区中。可能有一些旧的晦涩的方案有所不同。:)
Jason C

我在上遇到了一些困难hdparm,我详细地编辑了我的问题;想知道您是否有任何见识。
詹森·C

1
似乎至少某些hdparm在/ dev / mmcblk0上不起作用。抱歉,我没有其他想法。
Michael Suelmann
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.