我最近读到了很多关于假冒 MicroSD 卡和 USB 拇指驱动器的文章,它们声称拥有大量空间(即使你问你的电脑),但实际提供的空间却少得多。我最近买了一个 SanDisk USB 驱动器(声称 128 GB),想测试它的大小。它不是通过 ebay 或其他地方购买的,但我真的想在有效使用它之前测试一下它的真实大小。
我可以复制一些东西到上面,再复制回去,看看文件是否没问题。我也可以用哈希和其他东西来自动化它。但我希望有一个更准确的解决方案。我读到对于 Windows,H2testw 可以解决问题。有没有一种简单的方法可以在 Ubuntu/Linux 上测试这个?也许是一种专门的、工作良好的工具?
更新:为了清楚起见,我们的想法是验证控制器告知 Linux 系统的大小是否正确(所以不会丢失任何数据)。我并不是想看看我得到的是不是 128 GB 而不是 127.3 GB。我想测试我写入的所有数据是否可以再次读取。不幸的是,我只能在英语技术网站上找到一些关于此的信息。不过,德语来源也不错。我实际上正在寻找类似的应用程序,但适用于 Ubuntu/Linux:https://www.raymond.cc/blog/test-and-detect-fake-or-counterfeit-usb-flash-drives-bought-from-ebay-with-h2testw/
更新2:我尝试收集一些英文资料。由于时间不足,我未能详细阅读所有资料。
- https://www.ebay.com/gds/All-About-Fake-Flash-Drives-2013-/10000000177553258/g.html
- https://en.wikipedia.org/wiki/USB_flash_drive#Counterfeit_products
- https://www.heise.de/newsticker/meldung/Verdaechtige-USB-Sticks-mit-2-Terabyte-bei-Amazon-Faelschungen-entlarven-Datenverluste-vermeiden-3915202.html
- http://www.pcgameshardware.de/USB-Stick-Hardware-255579/News/falsche-Speicherkapazitaet-bei-Amazon-1245682/
更新3:解释
由于下面有奇怪的批评,因此做出一些解释。
问题是什么?为什么仅使用 dd 无法解决?
这是对
“弄清楚你要解决的问题是什么,以及‘假驱动’的定义是什么。”
似乎有些人不明白这个问题。因此,我尝试尽可能简短详细地解释一下,尽管我认为这已经超出了我的问题的范围。
操作系统或 unix 工具提供的 USB 设备容量可能不正确。这是致命的,因为操作系统会控制您可以向其发送多少数据。发送的数据量超过其实际容量,您将丢失数据。这是一个问题。那么,为什么会发生这种情况?
您无需了解 USB 协议即可理解该问题。串行接口具有共同的属性,即客户端设备(USB 驱动器)需要通过此串行接口告知其自身的容量。这意味着客户端设备需要自己的控制器,并了解设备的用途以及其容量。当它收到存储命令时,它还会决定要做什么。如果控制器以这种方式编程,它可以忽略命令或用数据覆盖某些内容。
这是什么意思?无论您的 unix 工具告诉您有关驱动器容量的信息:这都是工具向驱动器询问的内容,仅此而已。这就是 h2testw 的发明目的:它使用稍后介绍的方法测试实际大小,并将其与驱动器所说的大小进行比较。如果两者不同,您可能会丢失数据,因为所有存储数据的常见操作都依赖于操作系统的信息,而操作系统只会询问控制器。为什么只询问?测试需要时间,并且会覆盖驱动器上的所有数据。因此,操作系统需要依赖此信息是很自然的。
要像 h2testw 一样检查实际容量,您确实可以使用dd
在驱动器上写入数据,然后再次读取,看看它是否与您写入的相同。完全合法。硬件和驱动器的性质使其变得更加复杂。例如,考虑写入缓存。您需要确保不从缓存中读取。这只是一个例子,说明为什么它并不像看起来那么简单。还认为仅写入零意味着信息熵很低,可以在读取时重建。只是细节上不那么容易。当然,您仍然可以手动完成。
但是,既然你可以自动化,为什么还要这样做呢?为什么还要这样做呢?正如我在下面的回答中提出的,f3 实现了许多贡献者的想法(认为它扩展了 h2testw),并且还实现了几种具有不同权衡的方法。开发人员弄清楚了他们拥有的不同假驱动器(又称伪造驱动器)的技巧在眼前。因此,虽然我理解理论和问题(似乎是因为这些问题在德国科技媒体上得到了很好的解释,但在英语媒体上却没有),但我并不假装理解一切,这就是我上面提到它的原因。我只是理解理论,我更像是一个软件人。但作为一名信息学的学生,我理解得足够好,可以看到问题所在。
“尝试理解基本的 Unix 实用程序”
其实我已经回答过这个问题了,但要说清楚:Unix 工具只是使用 USB 协议(当然仅适用于 USB 设备)来收集信息。除此之外,做更多的事情是没有意义的。
只从可信赖的供应商处购买有帮助吗?
tl;dr:事实并非如此。
“当购买商品时,就像任何形式的安全一样,请考虑寻找可信赖的卖家并只从他们那里购买驱动器。”
安全(和安全)与信任无关!它与验证和确认有关!抱歉,但这在很多方面都是错误的。
假设你通过可信赖的卖家购买。几个问题:
供应商是否测试过硬件以确保没有数据丢失?他购买假硬盘并出售时是否能识别?不一定。
有没有可能他买了一些他不知道是假货的东西?完全可以,看看最近的 ryzen 假货:https://www.pcgamer.com/beware-of-fake-ryzen-processors-selling-on-amazon/,https://www.heise.de/newsticker/meldung/Direkt-von-Amazon-Faelschungen-von-AMDs-Ryzen-Prozessoren-im-Umlauf-3772757.html
如果我在驱动器中丢失了演示文稿并搞砸了它,我信任的供应商会回到过去拯救我吗?它可能会更换驱动器,因为上一次穿越时间的 DeLorean 于 1885 年被毁。
其他的东西
“这个问题实际上看起来更像是 OP 喜欢的东西的“促销”,而且 OP 似乎对实际测试驱动器不太感兴趣。”
这太荒谬了。我专门搜索了一款与 h2testw 类似的工具,该工具也可以在 Linux 上运行。是的,这就是我“想要的”,答案很有帮助,很抱歉。我不知道英语媒体对此类问题并不了解,很幸运后来找到了类似的东西。这不是促销,但实际上似乎您可以使用它。
答案1
f3 - 打击 Flash 欺诈
我只找到了一个替代方案,但我认为这比h2testw
MS Windows 的原始工具更好。幸运的是,它非常容易使用,甚至可以从命令行使用。不过,也有 GUI 可用。工具网站上还有很多关于实现和假驱动器问题的信息。
f3 提供两种方法:
- f3probe 方法:速度更快
- h2testw 方法:较慢。还测试 R/W 性能。可能更可靠。
f3probe 方法(推荐)
f3probe
是测试驱动器的一种方法,虽然不太准确,但速度更快,因为它不会写入整个驱动器。您可以在工具网站上阅读更多相关信息。如果您想 100% 确定,最好使用 h2testw 方法。正如开发人员在网站上描述的:
f3probe 是识别假驱动器及其真实大小的最快方法。
和:
最后,由于 f3probe 是免费软件,一旦 f3probe 经过实战验证,它就可以嵌入到智能手机、相机、MP3 播放器和其他设备中,一劳永逸地阻止假闪存的泛滥。
网站上还有一个使用示例:
警告:这将破坏您磁盘上所有先前存储的数据!
$ sudo f3probe --destructive --time-ops /dev/sdb
[sudo] password for michel:
F3 probe 6.0
Copyright (C) 2010 Digirati Internet LTDA.
This is free software; see the source for copying conditions.
WARNING: Probing may **demolish data,** so it is more suitable for flash drives out of the box, without files being stored yet. The process normally takes from a few seconds to 15 minutes, but
it can take longer. Please be patient.
Bad news: The device `/dev/sdb' is a counterfeit of type limbo
You can "fix" this device using the following command:
f3fix --last-sec=16477878 /dev/sdb
Device geometry:
*Usable* size: 7.86 GB (16477879 blocks)
Announced size: 15.33 GB (32155648 blocks)
Module: 16.00 GB (2^34 Bytes)
Approximate cache size: 0.00 Byte (0 blocks), need-reset=yes
Physical block size: 512.00 Byte (2^9 Bytes)
Probe time: 1'13"
Operation: total time / count = avg time
Read: 472.1ms / 4198 = 112us
Write: 55.48s / 2158 = 25.7ms
Reset: 17.88s / 14 = 1.27s
请注意,它还返回一个命令,使您能够使用其实际大小的驱动器f3fix
。
f3fix 工具
f3fix 会创建一个适合假驱动器实际大小的分区。使用 的
f3probe
输出来确定 i3fix 的参数sudo f3fix --last-sec=16477878 /dev/sdb
h2testw 方法 / 使用 f3read/f3write 测试性能
F3 是处理假闪存驱动器的工具集合。其中两个一起实现了 -Method h2testw
:
f3write [--start-at=NUM] [--end-at=NUM] <PATH>
f3read [--start-at=NUM] [--end-at=NUM] <PATH>
f3write
将要求设备声明的大小,并用每个大小为 1gb 的生成文件填充它。f3read
将读取所有这些文件并查看它们是否完整且未损坏。例如,我用来测试我的 ~128gb 拇指驱动器的命令:
$ f3write /media/username/1EB8021AB801F0D7/
Free space: 117.94 GB
Creating file 1.h2w ... OK!
...
Creating file 118.h2w ... OK!
Free space: 0.00 Byte
Average writing speed: 11.67 MB/s
现在测试文件是否正确存储:
$ f3read /media/username/1EB8021AB801F0D7/
SECTORS ok/corrupted/changed/overwritten
Validating file 1.h2w ... 2097152/ 0/ 0/ 0
...
Validating file 118.h2w ... 1979488/ 0/ 0/ 0
Data OK: 117.94 GB (247346272 sectors)
Data LOST: 0.00 Byte (0 sectors)
Corrupted: 0.00 Byte (0 sectors)
Slightly changed: 0.00 Byte (0 sectors)
Overwritten: 0.00 Byte (0 sectors)
Average reading speed: 32.38 MB/s
使用这种方法对这种大小的驱动器进行测试大约需要三个小时,有时会导致我的计算机磁盘负载过重,但在我看来这是最准确的。
在 Ubuntu 中安装
在终端上:
sudo apt install f3
这将为您带来:、、、、f3brew
及其手册页。f3fix
f3probe
f3read
f3write
这些工具是f3
软件包的一部分,至少在 Ubuntu 15.10 上可用。根据网站介绍,还有一些其他工具可用。要获取它们,请查看网站。
该软件包附带简短但有用的手册页,但我认为他们错过了网站上关于 f3read/write 和 f3probe 之间的差异的一些信息,这就是为什么这个答案有点长。
答案2
我为此写了一个简单的工具,它叫容量测试仪(截图)它有一个 GUI 和一个 CLI。
有一个Debian 7 的预编译二进制文件可供下载,这很可能在现代 Ubuntu 系统上开箱即用。
我编写它是为了个人使用,因为我找不到用于此目的的图形工具。您只需先安装空的 USB 闪存驱动器,选择它并开始测试。这是一个非常愚蠢的工具,因为它所做的就是用文件填充驱动器,然后验证驱动器上的数据是否正确。它会在第一次错误(写入或读取/验证)时中止测试。它将报告无法成功写入或验证的块的偏移量,但这是一个逻辑偏移量,因此这些信息可能毫无用处,因为它取决于文件在驱动器上所在的文件系统。但是,当驱动器已填满数据并且可以读取和验证所有内容时,可以安全地假设驱动器报告的容量是正确的。附带一提,测试文件会被自动删除(如果驱动器坏了,这可能不起作用)。
同样,它非常简单,因为它只适用于现有文件系统上的文件。因此有一些 KB(+ 1M 缓冲区)无法测试。而且它非常慢,因为它实际上填满了整个文件系统。F3 当然更加复杂,也更快,但它没有 GUI。CapacityTester 存在的唯一原因是它有一个 GUI,这样不熟悉命令行或只是喜欢 GUI 的用户就可以使用它。
欢迎提供反馈。
答案3
[问题] 你买了一张SD卡,但你不知道它是否是假货,也不知道它的真实容量是多少。
[解决方案] 以下是我在 Ubuntu 上操作的具体步骤:
- [终端] 安装f3:
sudo apt update && sudo apt install f3
- [磁盘工具] 添加驱动器分区。以慢速模式将驱动器格式化为
fat
。参见图片。 - [磁盘工具] 安装驱动器:参见图片。
- 【终端】写入磁盘:
sudo f3write /media/toddmo/FakeOrNot
- 【终端】从磁盘读取:
sudo f3read /media/toddmo/FakeOrNot
- [Amazon/AliExpress][!important] 留下列出写入速度、读取速度和真实容量的评论。
(步骤 3)
答案4
解决 OP 的行为和“假驾驶”问题
我正在编辑答案以正确解决几个问题,因为 OP 一直非常激烈(在我看来,除了他们自己的评论和答案之外,反对大多数评论和答案,我觉得这很可疑)。特别是,有很多人声称存在“假驱动”,但对于它到底是什么意思,却没有明确的定义。OP 说:
我可以把东西复制到上面,再复制回去,看看文件是否正常。我也可以用哈希和其他东西来自动化。但我希望有一个更准确的解决方案。
OP 自己也承认他们“可以复制内容”,并验证数据完整性,但非常反对所有其他提出其他建议的评论和答案,OP 只是一直将 F3 推为“真正的交易”。问题本身最初是关于驱动器的大小,但后来 OP 出于某种原因提到了哈希值以“查看文件是否正常”,就好像有神秘的驱动器声称一种大小并允许您写入该大小,但随后数据已损坏。因此,我认为这非常可疑,并将 OP 宣传 F3 视为垃圾问答。
当驱动器实际上是假驱动器时
在这个问题中,OP的明显定义是
“...声称拥有大量空间(通常空间过大,例如 128 GB),但实际仅提供 0.5 到 4 GB 的驱动器。”
换句话说,根据 OP 的说法,控制者主张X 量的数据,但 USB 只能包含比声称的少了 80-90%。
用户苏多杜斯在提议评论(强调补充):“我发现几个 USB 闪存盘比标称尺寸略小。我把它们称为矮小。我认为假驱动器是“明显偏小”(通常公称尺寸的一半或更小)”。这个定义很棒,但是如果我们采用这个定义,假驱动器的定义就是 50%。一个声称有 64 GB 但只能容纳 32 GB 的驱动器,从技术上讲,其价值的一半会损失给所有者,而所有者只能将他们想要放入驱动器中的一半内容放入驱动器中。
我提出一个更简单的定义:假冒存储设备是声称具有Claimed Size
但容差低于 15%(容差为Claimed Size ± 15 %
)的存储设备。
这 ± 15 %
是非常合理的。还要考虑到用户通常会混淆 Unix、IEEE 和 IEC 组织,它们使用二进制前缀而不是 10 的幂前缀来表示数据存储大小。在 Yotta 前缀级别,差异达到 20%,但是 USB 驱动器还没有达到这个水平,所以在未来 20 年内,15% 可能是合理的。(参见 askubuntu 问题“‘MiB’ 中 ‘i’ 的含义”和二进制前缀)
测试驱动器
实际上,除了 Ubuntu 和大多数符合 POSIX 标准的 Unix 系统自带的工具外,用户不需要任何特殊工具。让我们再次强调并重新表述该定义:
如果我们无法将大量数据写入驱动器,并且写入的数据在 15% 的容差范围内,则驱动器没有问题
简单的方法是dd
,只需用零覆盖设备(当然,请记住在执行此操作之前保存文件)。
sudo dd if=/dev/zero of=/dev/sdb1 iflag=nocache oflag=direct bs=1
注意bs=1
块大小为 1 字节。该dd
命令通常会报告写入了多少数据。
$ dd if=/dev/zero of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB, 1.0 KiB) copied, 0.00261981 s, 391 kB/s
我们要求它写入 1024 个字节,它就写入了 1024 个字节。
遵循该定义的更精确的步骤列表如下:
弄清楚驱动器声称有多少数据(假设您怀疑
df
是“错误的”)。在此示例中,让我们假设/dev/sdb1
这是我的 USB 驱动器的设备文件:$ df -P /dev/sdb1 | awk 'NR==2{print $2}' 115247656
请注意,该
-P
标志用于 POSIX 可移植性,这意味着数据块大小将为 1024 字节,并且意味着该驱动器上有 115247656*1024 字节。弄清楚驱动器声明 (115247656) 以下 15% 的容差是多少,也许使用支持浮点计算的实用程序,例如
awk
:$ awk 'BEGIN{printf "%d\n",115247656*(1-0.15)}' 97960507
在与上一步中的驱动器大小相同的硬盘上创建随机数据以用作基准:
dd if=/dev/urandom of=./mytestfile.random bs=1024 count=97960507
现在写入数据
dd if=./mytestfile.random of=/dev/sda1
。如果驱动器可以容纳这么多,它就是“真实的”。您还可以取md5sum
或sha1sum
并./mytestfile.random
与/dev/sda1
现在进行比较。更好的改进是将写入到mytestfile.random
文件的挂载点,从而保持驱动器上的文件系统不变,并且不会改变驱动器的分区,换句话说dd if=./mytestfile.random of=/mountpoint/for/usb/drive/testfile.random
为了保证完整性,您可以执行任何哈希值检查,例如
md5sum
、sha1sum
或sha256sum
其他。例如md5sum ./mytestfile.random /mountpoint/for/usb/drive/testfile.random
这里的关键点是,如果写入数据量在容差范围内,并且在写入前后产生正确的校验和 - 那么驱动器可能没有问题。
如果愿意的话,可以将所有这些都放入一个很好的脚本中以方便使用。
结论
这个问题看起来更像是 OP 喜欢的东西的“宣传”,而且 OP 似乎对实际测试驱动器不太感兴趣。此外,问题本身比“驱动器”问题更人性化。在评论中,OP 自己表示他们并不真正了解 USB 行为,但强烈指责“控制器”。我将用 3 点来总结这个问题:
- 清楚地弄清楚你要解决的问题是什么以及“假驱动”的定义是什么。
- 尝试理解基本的 Unix 实用程序
- 购买商品时,就像任何形式的安全一样,请考虑寻找可信赖的卖家并只从他们那里购买驱动器。