在 Limbo 型假 USB 或 SD 卡上,从驱动器上特定位置开始的所有扇区都不可用(仅零或仅一或不可读的扇区响应)。
闪存驱动器可能标称容量为 256 GB,但实际上只有 16 GB。任何超过 16GB 阈值写入的内容都会进入数字黑洞(因此地狱边缘)。当尝试访问该数据时,可能会发生以下情况之一:
- 该设备返回空白扇区00000000 (0x00)仅字节。
- 设备返回扇区11111111 (0xFF)仅字节。
- 该设备向计算机发出该扇区已损坏的信号。
- 设备无限期地冻结并且永远不会返回读取请求。
- 设备返回随机数据(非常罕见的类型)
在我拥有的流氓闪存驱动器上,第一个就是这种情况。它返回00 00 00 00
…在所有扇区内的所有 512 字节扇区中地狱边缘区域,超出了实际数据容量。
使用mkfs
或者gparted
在假 USB(用于测试目的)上创建文件系统确实会无限期冻结。
Windows 和 Android 均成功将 SD 卡格式化至其声称的全部容量需要不到半分钟。仅当不触及超出实际容量的任何文件系统页脚时,这才可能实现。只能通过修改标题。
GParted 和 mkfs 无限期冻结(直到从 PC 中移除驱动器)并留下用以下指示的文件系统未知输入 GParted。
如何在 GParted 中将恶意闪存驱动器格式化为声称的全部容量,同时仅写入文件系统标头?
这将使 GParted 不会触及导致无限期冻结的边缘区域(不要与恶意驱动器上列出的第四种扇区返回类型混淆。这是 GParted 的反应)。
我想要实现的目标:
- 测试 Linux 的反应交换到一个假闪存驱动器上。 因为这对于 StackExchange 来说太微不足道了,所以我决定自己尝试一下。
- 在Android手机上测试不同的文件系统(ext2、ext3、ext4、FAT16、FAT32、exFAT、f2fs、xfs、zfs、ntfs):我想尝试使用Android手机录制超过实际容量的视频,看看它的反应如何。
答案1
我有点怀疑这是否会起作用。但是有一种强大的方法可以满足您的要求。如果这不起作用,您就没有其他选择可以mkfs
做更好的事情。
- 在主文件系统上创建一个与设备大小相同的(稀疏)文件。例如使用
truncate --reference=/dev/sdX disk.img
- 对文件进行分区(我假设您想要这个 - 如果您不想要,则跳过它并使用
/dev/loopN
而不是/dev/loopNp1
)。您可以运行fdisk disk.img
, 或dd if=/dev/sdX of=disk.img conv=notrunc bs=1M count=1
复制设备上的任何分区。 losetup -f disk.img
- 这将创建一个循环设备并打印其名称。mkfs.FOO /dev/loopNp1
- 创建文件系统dd if=/dev/loopN of=/dev/sdX bs=1k count=16M conv=sparse
- 将磁盘映像的前 15G (16*1024*1024*1024) 复制到设备中。您可以根据需要进行调整。conv=sparse
将跳过全为零的写入块。