假设我将一个 USB 驱动器或 NVMe SSD 插入计算机,计算机如何知道驱动器上有多少个扇区?我的意思是磁盘本身知道吗?如果它知道,那么它会告诉计算机吗?我正在编写的脚本需要这个,我无法将任何包导入到脚本中,所以我需要以原始方式执行此操作,我想到一种方法是尝试写入磁盘并记录由于超出限制而无法写入的扇区数。
假设我将一个 USB 驱动器或 NVMe SSD 插入计算机,计算机如何知道驱动器上有多少个扇区?我的意思是磁盘本身知道吗?如果它知道,那么它会告诉计算机吗?我正在编写的脚本需要这个,我无法将任何包导入到脚本中,所以我需要以原始方式执行此操作,我想到一种方法是尝试写入磁盘并记录由于超出限制而无法写入的扇区数。
磁盘控制器已编程为了解其容量,并在操作系统询问时将其报告给操作系统。它是定义基本“读/写”命令的同一协议的一部分。
例如,NVMe 设备使用 NVMe 协议(因此得名),它具有“识别控制器”和“识别命名空间”命令(可能还有一些相关命令)。
同样,USB 驱动器使用 SCSI 协议,该协议也包含“INQUIRY”命令;SATA 和 IDE 磁盘在 ATA 协议中具有类似的命令。
然而,虽然通常可以发送原始 SCSI 或 NVMe 命令,但执行此操作的机制取决于操作系统 - 例如 Linux 上 SCSI 的 /dev/sg0 上的 ioctl 等 - 并且普遍需要 root 或管理员权限。
这可以通过 Python 实现,但您必须手动实现所有三种协议(而且您可能会出错,例如支持 USB 设备中的多个 LUN),而且这会比直接询问操作系统花费更长的时间——因为毕竟操作系统已经收集了这些信息。(例如,在 Linux 上您可以查询 udev。)