为什么在 Linux 中有两种删除/隐藏磁盘的机制?

为什么在 Linux 中有两种删除/隐藏磁盘的机制?

我正在使用外部驱动器上的 Linux。我根本不想让它看到装有 Windows 的主磁盘。过去我一直通过写入 1 /sys/block/devices/sd*/device/delete(从内存写入)来实现这一点。

但是对于其他具有 NVMe 磁盘的笔记本电脑,结构不同,我必须使用/sys/block/devices/nvmep01/device/device/remove(同样,从内存中)。(通过 USB 连接的外部磁盘仍遵循以前的模式)为什么有两种方式?我不能只使用一种吗?其中一种是否已弃用?(我还没有检查 sd* 是否也可以删除)

(如果重要的话,发行版是 Ubuntu 22)

答案1

有两种方法,因为它们是特定于驱动程序的命令(Linux 上没有通用的“删除此设备”命令),当然这两个示例处理由不同设备驱动程序处理的不同设备类型。(这有点像 Windows 为 SATA 提供 StorAhci.sys 驱动程序,为 NVMe 提供 StorNvme.sys。)

重点是,这sd*不仅仅意味着“磁盘”,它具体指“SCSI 磁盘”,即使用 SCSI 命令集并由 SCSI 驱动程序处理的设备。它用于 USB 磁盘,因为它们的底层始终是 SCSI。

在现代 Linux 上,SCSI 驱动程序也用于 ATA 磁盘,因为事实证明这样做更可靠(SATA 与 SCSI 共享概念,并且大多数 SCSI-ATA 命令都有 1:1 转换)。但直到几年前,ATA 磁盘才有自己的驱动程序,而内部 HDD 则被命名为hd*(/dev/hda 等)——并且它们在 /sys 下也有自己的结构。

另一方面,NVMe极大地与 SCSI 和 ATA 不同,因此尽管 Linux 也曾sd*短暂地拥有类似的转换层,但最终发现让 NVMe 磁盘拥有自己的设备类型并让工具直接使用 NVMe 命令会更好。因此 NVMe 磁盘被命名为nvme*

(在内部,SCSI 和 NVMe 都具有比“电缆连接到磁盘,磁盘保存扇区”更复杂的结构;例如,SCSI 有“LUN”,而 NVMe 有“命名空间”,两者都允许单个磁盘以不同的方式呈现为多个磁盘;并且相应的 Linux 驱动程序最终可能由于多种原因以非常不同的方式表示它们 - 因此看到它们的 /sys 路径布局方式存在差异也就不足为奇了。)

对于 NVMe 来说,你似乎从分割设备而不是整个磁盘设备,因此当您通过.../device/sys 中的符号链接“向上”时,自然会有两个级别,从“分区”到“整个磁盘”再到“控制器”,而不仅仅是一个。

至于deletevs remove,它可能只是一个随机的不一致性,由于不同的人在不同时间在不同的内核子系统中实现它而导致的。

相关内容