卡/USB 闪存:如何在频繁使用后修剪/丢弃/重置?

卡/USB 闪存:如何在频繁使用后修剪/丢弃/重置?

我想知道,是否可以在 Linux(Fedora 24)上“重置” USB 驱动器或存储卡的控制器以将其视为“未使用”?

背景:我已从 /dev/urandom 覆盖 USB 驱动器。即,我假设所有块都已写入,因为(据我所知)大多数 USB 驱动器和存储卡控制器不保留任何备用块。驱动器(如何检查存储控制器是否支持 ATA 修剪或 USB 控制器是否将 ATA 修剪传递到设备?)不支持修剪 - fstrim 抛出错误,hdparm 看不到修剪支持,即

hdparm -I /dev/sdX | grep -i TRIM

是否可以将 USB 闪存上的所有块标记为可擦除,并对所有单元运行垃圾收集?或者,如果可能的话,是否仅限于某些控制器(USB 和存储控制器)?

跟进

下列的 SD 卡被擦除后,从卡中读取了什么值?所有位都清除还是所有位都设置?至少 SD 卡应该支持命令38,作为一种快速格式化,它将重置块。

但是到目前为止我发现只有一个官方的 Win/Mac 软件可以将此命令发送到设备https://www.sdcard.org/downloads/formatter_4/

据推测(未尝试过)这也取决于 USB 控制器来传递命令,并且可能只适用于 SD 卡,但不一定适用于 USB 驱动器?

到目前为止,我还没有找到一个 Linux 程序可以轻松发送此命令38向设备发出命令。

答案1

你想要的命令是黑名单丢弃。它通过修剪来彻底清除整个分区或块设备。但是,它只适用于 SD 卡,不适用于 USB 拇指驱动器,因为我认为后者不支持修剪。

答案2

你需要fstrimutil-linux包装中:

#NAME fstrim- 丢弃已安装文件系统上未使用的块

#概要 fstrim [-a] [-o 偏移量] [-l 长度] [-m 最小大小] [-v] 挂载点

#DESCRIPTION fstrim用于已挂载的文件系统,以丢弃(或“修剪”)文件系统未使用的块。这对于固态硬盘 (SSD) 和精简配置的存储非常有用。

默认情况下,fstrim 将丢弃文件系统中所有未使用的块。可以使用选项根据范围或大小修改此行为,如下所述。

mountpoint参数是文件系统挂载目录的路径名。

频繁运行 fstrim,甚至使用mount -o discard,都可能对质量较差的 SSD 设备的使用寿命产生负面影响。对于大多数台式机和服务器系统,每周一次的修剪频率就足够了。请注意,并非所有设备都支持排队修剪,因此每个修剪命令都会对当时可能尝试使用磁盘的其他设备造成性能损失。

TRIM当然,这取决于驱动器或卡槽接受命令的能力。廉价的 USB 大容量存储器往往不接受命令;较新的 UAS(USB 连接的 SCSI)通常可以接受命令TRIM。您可以使用以下方法判断它是否受支持hdparm -i- 在“命令/功能”标题下查找“数据集管理 TRIM 支持”。

答案3

我通常使用 fstrim 来处理这个问题,不幸的是,在我遇到的所有 USB 连接存储设备上,默认情况下,丢弃是禁用的,即使是支持它的设备也是如此。如果磁盘默认禁用了丢弃选项,则使用丢弃选项安装 fs 是没用的:您需要先启用它。但是,有关于如何在支持时启用它的操作指南,甚至有关于如何通过 udev 在特定设备上使更改永久化的有限描述:但是,我发现后一种方法有局限性,因为我希望在任何支持它的设备上都启用它。我使用从通用规则调用的 udev 辅助脚本实现了这一点,该脚本在任何 scsi 磁盘添加或更改事件时执行辅助程序。udev 规则如下:

ACTION=="add|change", SUBSYSTEM=="scsi_disk", RUN+="discard $env{DEVPATH}"

而丢弃帮助脚本如下:

#!/bin/bash
logger -t discard "$*"
Dev="$(ls -1 /sys/${1}/device/block)"
logger -t discard "attempting to enable discard on target: ${Dev]}"
 
Lbpu="$(sg_vpd -p lbpv /dev/$Dev | awk '$0 ~ /^ *Unmap command supported/ {print $NF}')"
if [ $Lbpu -eq 1 ]
then
  Mulc=$(sg_vpd -p bl /dev/$Dev | awk '$0 ~ /^ *Maximum unmap LBA count:/ {printf("%i",512 * $NF) }')
  logger -t discard "$Dev Maximum unmap LBA count : $Mulc"
  if  grep -q unmap /sys/$1
  then
    logger -t discard "discard already enabled on $Dev"
  else
    echo unmap > /sys/${1}/provisioning_mode
    echo "$Mulc" > /sys/${1}/device/block/${Dev}/queue/discard_max_bytes
    logger -t discard "discard enabled on $Dev"
  fi
else
  logger -t discard "discard not supported on $Dev"
fi

抱歉,在命令替换中使用 ls 的输出并不是最理想的,而且容易出现问题,但我急于让它实现。

一旦丢弃处于活动状态,您可以使用丢弃选项重新安装它,并在支持丢弃的设备上的任何已安装的 fs 上运行 fstrim。

相关内容