我有两个PNY Turbo Attaché 3 USB 3.0 闪存盘。当我尝试弹出其中任何一个时,它们都不会被弹出。相反,设备会自行调整大小,变为零字节大小。如果我再次尝试弹出设备,它只会保持连接状态,成为一个零字节大小的存储设备。物理断开并重新连接驱动器会将其恢复到原来的 32GB 状态。
我可以使用以下方法在 Linux 上观察到此行为eject
和lsblk
在 Windows 上使用 Windows 资源管理器和diskpart
。特别奇怪的是,我拥有的不仅 PNY 驱动器有此问题。我拥有另外两家制造商的 USB 驱动器也有同样的问题。
这是怎么回事?设备弹出后不是应该完全消失吗?
答案1
经过大量实验后,我认为我可以部分回答这个问题。
每个硬盘都不同。我的结论基于我对这些硬盘进行的测试:
- 十铨彩转 (E902) USB 3.0 [8GB]
- Nitrokey 存储 2 [16GB]
- SanDisk Ultra USB 3.0 闪存盘 [16GB]
- PNY Turbo Attaché 3 USB 3.0 闪存盘 [32GB]
- 金士顿 DataTraveler Max Type A 闪存盘 [256GB]
当我使用以下方法弹出这些驱动器时,它们都会做一些我意想不到的事情eject
在 Linux 上或 Windows 上的 Windows Explorer 上。不过,并非所有文件都会自行调整为 0 字节。
第 1 部分:这里发生了什么?
@Mokubai 建议“它们可能类似于装有 MicroSD 卡的 USB 读卡器。读卡器通常允许您弹出安装的卡,而不是整个设备。”Nitrokey Storage 2 确实是一个内置 MicroSD 卡的 MicroSD 读卡器。但我不清楚其他驱动器的情况。
第 2 部分:设备弹出时不应该完全消失吗?
也许不是。这取决于“弹出”的含义以及是否弹出 USB 设备本身。当我写这个问题时,我所说的“弹出”是指:
- 如果设备上有任何已挂载的文件系统,请卸载它们或停止并显示错误。
- 确保所有剩余数据都已写入设备。
- 彻底关闭设备。
事实证明,我告诉 Linux 和 Windows 要做的并不是这三个步骤。
在 Linux 上,我使用该eject
命令。它的手册页上写着“根据设备是 CD-ROM、SCSI 设备、可移动软盘还是磁带,有四种不同的弹出方法。默认情况下喷射按顺序尝试所有四种方法,直到成功。”这些方法都不是针对 USB 的。据我所知,eject
它们只与关闭存储本身有关,而不是整个 USB 设备。现在,关闭存储本身可能应该会关闭整个 USB 设备,但是,正如@DrMoishe Pippik 提到,这些设备的闪存控制器可能已经损坏。
在 Windows 上,我使用 Windows 资源管理器尝试弹出驱动器E:
(例如)。需要注意的是,“驱动器”字母不是指驱动器。它们是指卷。(您可以使用diskpart
。在 中diskpart
,先运行list disk
然后运行list volume
。)因此,当您要求弹出“驱动器” 时E:
,您并不是在要求关闭整个 USB 设备。您只是要求关闭特定卷。话虽如此,Windows 默认在 USB 驱动器上创建具有单个分区的 MBR 分区表。在这种情况下,卷不会跨越整个驱动器,因为驱动器的一部分正由 MBR 使用。通过 Windows 资源管理器弹出它仍会将整个驱动器的大小调整为零字节,因此,即使您只是要求对部分存储空间执行某些操作,但最终也会对所有存储空间执行某些操作。无论哪种方式,Windows 资源管理器都在处理 USB 设备上的存储空间,而不是整个 USB 设备。
第 3 部分:如何在 Linux 和 Windows 上彻底关闭 USB 驱动器
正如我之前提到的,我似乎实际上并不想“弹出”这些驱动器。那么我该怎么做呢?
在 Linux 上
udisksctl power-off --block-device=/dev/<whatever>
根据udisksctl
的手册页,udiskctl power-off
确实做了我想要做的事:
断电
安排安全移除并关闭驱动器。在操作系统方面,这包括确保没有进程正在使用该驱动器,然后请求将正在运行的缓冲区和缓存提交到稳定存储中。关闭驱动器的具体步骤取决于驱动器本身和所使用的互连。对于通过 USB 连接的驱动器,效果是 USB 设备将被取消配置,然后禁用它所连接的上游集线器端口。
请注意,由于某些物理设备包含多个驱动器(例如 4 合 1 闪存读卡器 USB 设备),关闭一个驱动器可能会影响其他驱动器。因此,执行此操作没有太多保证。通常的结果是驱动器消失,就像拔掉电源一样。