更新3:解释

更新3:解释

我最近读到了很多关于假冒 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:我尝试收集一些英文资料。由于时间不足,我未能详细阅读所有资料。

更新3:解释

由于下面有奇怪的批评,因此做出一些解释。

问题是什么?为什么仅使用 dd 无法解决?

这是对

“弄清楚你要解决的问题是什么,以及‘假驱动’的定义是什么。”

似乎有些人不明白这个问题。因此,我尝试尽可能简短详细地解释一下,尽管我认为这已经超出了我的问题的范围。

操作系统或 unix 工具提供的 USB 设备容量可能不正确。这是致命的,因为操作系统会控制您可以向其发送多少数据。发送的数据量超过其实际容量,您将丢失数据。这是一个问题。那么,为什么会发生这种情况?

您无需了解 USB 协议即可理解该问题。串行接口具有共同的属性,即客户端设备(USB 驱动器)需要通过此串行接口告知其自身的容量。这意味着客户端设备需要自己的控制器,并了解设备的用途以及其容量。当它收到存储命令时,它还会决定要做什么。如果控制器以这种方式编程,它可以忽略命令或用数据覆盖某些内容。

这是什么意思?无论您的 unix 工具告诉您有关驱动器容量的信息:这都是工具向驱动器询问的内容,仅此而已。这就是 h2testw 的发明目的:它使用稍后介绍的方法测试实际大小,并将其与驱动器所说的大小进行比较。如果两者不同,您可能会丢失数据,因为所有存储数据的常见操作都依赖于操作系统的信息,而操作系统只会询问控制器。为什么只询问?测试需要时间,并且会覆盖驱动器上的所有数据。因此,操作系统需要依赖此信息是很自然的。

要像 h2testw 一样检查实际容量,您确实可以使用dd在驱动器上写入数据,然后再次读取,看看它是否与您写入的相同。完全合法。硬件和驱动器的性质使其变得更加复杂。例如,考虑写入缓存。您需要确保不从缓存中读取。这只是一个例子,说明为什么它并不像看起来那么简单。还认为仅写入零意味着信息熵很低,可以在读取时重建。只是细节上不那么容易。当然,您仍然可以手动完成。

但是,既然你可以自动化,为什么还要这样做呢?为什么还要这样做呢?正如我在下面的回答中提出的,f3 实现了许多贡献者的想法(认为它扩展了 h2testw),并且还实现了几种具有不同权衡的方法。开发人员弄清楚了他们拥有的不同假驱动器(又称伪造驱动器)的技巧在眼前。因此,虽然我理解理论和问题(似乎是因为这些问题在德国科技媒体上得到了很好的解释,但在英语媒体上却没有),但我并不假装理解一切,这就是我上面提到它的原因。我只是理解理论,我更像是一个软件人。但作为一名信息学的学生,我理解得足够好,可以看到问题所在。

“尝试理解基本的 Unix 实用程序”

其实我已经回答过这个问题了,但要说清楚:Unix 工具只是使用 USB 协议(当然仅适用于 USB 设备)来收集信息。除此之外,做更多的事情是没有意义的。

只从可信赖的供应商处购买有帮助吗?

tl;dr:事实并非如此。

“当购买商品时,就像任何形式的安全一样,请考虑寻找可信赖的卖家并只从他们那里购买驱动器。”

安全(和安全)与信任无关!它与验证和确认有关!抱歉,但这在很多方面都是错误的。

假设你通过可信赖的卖家购买。几个问题:

  1. 供应商是否测试过硬件以确保没有数据丢失?他购买假硬盘并出售时是否能识别?不一定。

  2. 有没有可能他买了一些他不知道是假货的东西?完全可以,看看最近的 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

  3. 如果我在驱动器中丢失了演示文稿并搞砸了它,我信任的供应商会回到过去拯救我吗?它可能会更换驱动器,因为上一次穿越时间的 DeLorean 于 1885 年被毁。

其他的东西

“这个问题实际上看起来更像是 OP 喜欢的东西的“促销”,而且 OP 似乎对实际测试驱动器不太感兴趣。”

这太荒谬了。我专门搜索了一款与 h2testw 类似的工具,该工具也可以在 Linux 上运行。是的,这就是我“想要的”,答案很有帮助,很抱歉。我不知道英语媒体对此类问题并不了解,很幸运后来找到了类似的东西。这不是促销,但实际上似乎您可以使用它。

答案1

f3 - 打击 Flash 欺诈

我只找到了一个替代方案,但我认为这比h2testwMS 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及其手册页。f3fixf3probef3readf3write

这些工具是f3软件包的一部分,至少在 Ubuntu 15.10 上可用。根据网站介绍,还有一些其他工具可用。要获取它们,请查看网站。
该软件包附带简短但有用的手册页,但我认为他们错过了网站上关于 f3read/write 和 f3probe 之间的差异的一些信息,这就是为什么这个答案有点长。

答案2

我为此写了一个简单的工具,它叫容量测试仪(截图)它有一个 GUI 和一个 CLI。

有一个Debian 7 的预编译二进制文件可供下载,这很可能在现代 Ubuntu 系统上开箱即用。

我编写它是为了个人使用,因为我找不到用于此目的的图形工具。您只需先安装空的 USB 闪存驱动器,选择它并开始测试。这是一个非常愚蠢的工具,因为它所做的就是用文件填充驱动器,然后验证驱动器上的数据是否正确。它会在第一次错误(写入或读取/验证)时中止测试。它将报告无法成功写入或验证的块的偏移量,但这是一个逻辑偏移量,因此这些信息可能毫无用处,因为它取决于文件在驱动器上所在的文件系统。但是,当驱动器已填满数据并且可以读取和验证所有内容时,可以安全地假设驱动器报告的容量是正确的。附带一提,测试文件会被自动删除(如果驱动器坏了,这可能不起作用)。

同样,它非常简单,因为它只适用于现有文件系统上的文件。因此有一些 KB(+ 1M 缓冲区)无法测试。而且它非常慢,因为它实际上填满了整个文件系统。F3 当然更加复杂,也更快,但它没有 GUI。CapacityTester 存在的唯一原因是它有一个 GUI,这样不熟悉命令行或只是喜欢 GUI 的用户就可以使用它。

欢迎提供反馈。

答案3

[问题] 你买了一张SD卡,但你不知道它是否是假货,也不知道它的真实容量是多少。

[解决方案] 以下是我在 Ubuntu 上操作的具体步骤:

  1. [终端] 安装f3:sudo apt update && sudo apt install f3
  2. [磁盘工具] 添加驱动器分区。以慢速模式将驱动器格式化为fat。参见图片。
  3. [磁盘工具] 安装驱动器:参见图片。
  4. 【终端】写入磁盘:sudo f3write /media/toddmo/FakeOrNot
  5. 【终端】从磁盘读取:sudo f3read /media/toddmo/FakeOrNot
  6. [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。如果驱动器可以容纳这么多,它就是“真实的”。您还可以取md5sumsha1sum./mytestfile.random/dev/sda1现在进行比较。更好的改进是将写入到mytestfile.random文件的挂载点,从而保持驱动器上的文件系统不变,并且不会改变驱动器的分区,换句话说

    dd if=./mytestfile.random of=/mountpoint/for/usb/drive/testfile.random
    
  • 为了保证完整性,您可以执行任何哈希值检查,例如md5sumsha1sumsha256sum其他。例如

    md5sum ./mytestfile.random  /mountpoint/for/usb/drive/testfile.random
    

    这里的关键点是,如果写入数据量在容差范围内,并且在写入前后产生正确的校验和 - 那么驱动器可能没有问题。

如果愿意的话,可以将所有这些都放入一个很好的脚本中以方便使用。

结论

这个问题看起来更像是 OP 喜欢的东西的“宣传”,而且 OP 似乎对实际测试驱动器不太感兴趣。此外,问题本身比“驱动器”问题更人性化。在评论中,OP 自己表示他们并不真正了解 USB 行为,但强烈指责“控制器”。我将用 3 点来总结这个问题:

  • 清楚地弄清楚你要解决的问题是什么以及“假驱动”的定义是什么。
  • 尝试理解基本的 Unix 实用程序
  • 购买商品时,就像任何形式的安全一样,请考虑寻找可信赖的卖家并只从他们那里购买驱动器。

相关内容