我想知道如何通过终端删除USB闪存驱动器,以使数据无法恢复。
我想知道如何通过终端删除USB闪存驱动器,以使数据无法恢复。
Answers:
TL / DR:确保获得正确的设备名称,确保未安装该设备,并进行尽可能多的随机覆盖。如果您的发行版足够新,则可以通过为闪存硬件设计的擦除命令来执行此操作。在这些检查中,请始终使用驱动器(如/ dev / sd h),而不要使用分区名称(应为/ dev / sd h1)。
# dmesg|grep sdXX
[3600.000001] sd 6:0:0:0: [sdXX] 125106176 512-byte logical blocks: (64.0 GB/59.6 GiB)
# blkid|grep sdXX
/dev/sdXX1: PARTUUID="88a03bb2-ced8-4bb2-9883-0a51b4d460a8"
# df|grep /dev/sdXX
# shred -vzn8 /dev/sdXX
shred: /dev/sdXX: pass 1/9 (random)...
shred: /dev/sdXX: pass 1/9 (random)...46MiB/3.8GiB 1%
...
shred: /dev/sdXX: pass 9/9 (000000)...3.8GiB/3.8GiB 100%
# blkdiscard -s /dev/sdXX
blkdiscard: /dev/sdXX: BLKSECDISCARD ioctl failed: Operation not supported
# blkdiscard /dev/sdXX
blkdiscard: /dev/sdXX: BLKDISCARD ioctl failed: Operation not supported
#
从理论上讲,用0进行覆盖dd
就可以了。但是,由于闪存驱动器内部的构造方式,如果使用一次覆盖操作,则可能在实际的块后面隐藏了几层数据,这些数据块仍在存储剩余信息。
通常,闪存的一部分是有故障的,并且在制造过程中被标记为有故障。还有其他一些地方可能出错(变得不可更改,无法设置或无法清除),这些部件在使用寿命期间也必须标记为有故障。此信息存储在保留空间中,与数据位于相同的芯片上。这是4GB拇指驱动器未显示2 ^ 32字节容量的多个原因之一。
闪存还以更大的块在内部进行组织,有时比驱动器上运行的文件系统大得多。典型的文件系统块大小为4KB,可以一口气擦除的闪存段的范围可能从64KB到几兆字节。这些大块只能全部擦除,这会将所有块重置为已知状态(全1或全0)。之后,数据写入可以更改任何位(在需要时将默认1更改为0,或将默认0更改为1),但只能更改一次。要将任何位改回默认值,需要再次擦除所有段!
因此,当您想更改一个4KB的块(文件系统被要求更改文件中间的单个字符)时,闪存控制器将需要读取和缓冲所有64KB的旧数据,擦除所有这些数据,并写回新内容。这将是非常缓慢的,擦除段是最慢的操作。同样,一个段只能擦除有限的时间(典型情况是数万次),因此,如果对单个文件进行太多更改,则可能会很快损坏驱动器。
但这不是完成的方式。智能闪存控制器只需将4KB的新数据写入其他位置,并记下注释即可将读取重定向到旧块中间的4KB数据。他们需要更多空间,我们看不到存储有关重定向的信息。他们还尝试确保他们遍历所有可访问的段来存储数据,这称为损耗平衡。
这意味着通常旧数据仍在驱动器上!如果仅清除了所有可访问的块,则所有隐藏的块仍将保留数据的最新版本。您是否希望保护数据免受攻击者访问,这是一个不同的问题。
如果您最近发布的数据足够多,并且对USB驱动器进行了编程以显示它是闪存驱动器,则blkdiscard
可以使用基础TRIM
操作,这就是我们上面所讨论的分段擦除。它还具有一个附加标志,以确保即使是不可见的隐藏数据也被硬件完全擦除:
# blkdiscard -s /dev/myusbdevice
-s,--secure执行安全丢弃。安全丢弃与常规丢弃相同,除了必须清除所有可能由垃圾回收创建的丢弃块的所有副本。这需要设备的支持。
正如我上面演示的那样,它不一定有效。如果得到Operation not supported
,则内核,实用程序或USB网关芯片(允许闪存控制器看起来像通过USB的驱动器)都不支持传递TRIM
命令。(闪存控制器必须仍然能够自行擦除片段)。如果驱动器供应商支持,则这是最安全的方法。
另一种较不安全的方法是,如果可能的话,用随机值覆盖几次,以确保允许较少的旧数据在某个地方徘徊。
你问为什么随机?试想一下,如果USB驱动器变得过于智能,并且检测到您想清除一个扇区,并且刚刚更改了该扇区现在是可用的位图,则需要稍后清除。因为这意味着它可以加快零写入速度,所以它使笔式驱动器看起来更有效,对吗?您的驱动器是否正在执行此操作,很难确定。
在最极端的情况下,驱动器仅会记住从清除开始就清除了多少数据,并且驱动器只需要存储大约4字节的信息即可完成此操作,而不会从要删除的数据中清除任何内容。所有这些使它看起来非常快。
如果要使用随机的,不可预测的值覆盖数据,则这些优化是不可能的。因此,驱动器必须确保数据最终存储在闪存芯片中。但是您仍然不能排除一些以前使用过的扇区仍然存在一些旧数据的情况,但是由于通常无法访问该驱动器,因此暂时不认为擦除该驱动器很重要。只有实际的TRIM
命令才能保证这一点。
要使用随机值自动覆盖,您可能需要使用shred
,例如:
# shred -vzn88 /dev/myusbdrive
使用的选项:
如果可能,请同时使用blkdiscard
和shred
,如果blkdiscard -s
驱动器支持,则这是最佳的解决方案,但是shred
事先进行排除固件错误的操作不会受到损害。
哦,总是要三重检查您要清除的设备!dmesg可以帮助您查看最近插入的设备是什么,还值得检查您打算使用的设备名称ls -al
,甚至是设备节点号,以及blkid
输出以查看哪些分区可能是您不希望使用的要清除。
切勿在您要继续使用的内部驱动器上使用这些命令- blkdiscard
仅在固态驱动器上可用,但是丢失数据并不值得!
随着技术的进步,可能还有其他方法可以安全地清除数据。
提到的另一种方式是SECURITY ERASE
可以通过hdparm
命令发出的ATA 命令。以我的经验,闪存驱动器并不真正支持它。它是专为企业硬盘设计的,并非总是在成本最低的存储设备中实现该功能。
该TRIM
/ DISCARD
操作比很多新的SECURITY ERASE
命令,响应Flash功能创建的,所以它具有正在执行,即使是在廉价的USB驱动器的可能性要高得多,但它仍然不是无处不在。如果要擦除USB软件狗中的SD / micro SD卡,并blkdiscard
报告不支持它,则可能要尝试使用其他软件狗/读卡器,和/或在具有直接SD / MMC插槽的机器中进行操作。
blkdiscard
在Debian Jessie中,并且仅在Ubuntu的最新两个发行版中,而在Ubuntu LTS 14.04中则没有。 blkdiscard
已添加到软件包util-linux
版本2.23。
blkdiscard
与@zhenech的另一条评论中的hdparm
解决方案进行比较(特别是链接:ata.wiki.kernel.org/index.php/ATA_Secure_Erase)。
我意识到这并不是您问题的真正答案,但是最简单的方法是物理破坏驱动器(通常用大锤将其砸碎可以解决问题,但是也可以选择工业粉碎或焚化)。如果您对安全性有足够的担忧,希望确保数据不可恢复,则该数据的价值可能是驱动器本身成本的许多倍,并且物理方法便宜且可靠。
我知道的最简单最快的方法是将零(0)写入整个驱动器:
dd if=/dev/zero of=/dev/sdX
指驱动/dev/sdX
器的设备节点在哪里。
有些人建议使用更多的迭代和其他模式进行更彻底的处理。可使用特定的实用程序来执行此操作。GNU coreutils软件包包含shred
专门用于此目的的命令。许多人还使用badblocks -w
,这是e2fsprogs软件包的一部分。在FreeBSD上,该shred
实用程序已被调用,gshred
并且应该在/usr/ports/sysutils/coreutils
或/usr/ports/sysutils/fileutils
端口中可用。
如果您打算重复使用它,这应该能够安全地擦除您的闪存驱动器:http : //linux.die.net/man/1/scrub 如果没有,则将其融化...