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

Rob*_*t G 7 linux block-device

我正在使用来自外部驱动器的 Linux。我根本不希望它在 Windows 中看到主磁盘。过去我一直通过将 1 写入/sys/block/devices/sd*/device/delete(从内存中写入)来做到这一点。

但对于其他有 NVMe 磁盘的笔记本电脑,结构不同,我必须使用/sys/block/devices/nvmep01/device/device/remove(再次,从内存中)。(USB连接外置磁盘还是按照之前的方式)为什么有两种方式呢?我不能只用一个吗?其中之一已被弃用吗?(我还没有检查 sd* 是否也可以删除)

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

use*_*686 19

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

\n

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

\n

在现代 Linux 上,SCSI 驱动程序也恰好用于 ATA 磁盘,因为事实证明这样做更加稳健(SATA 与 SCSI 共享概念,并且大多数 SCSI-ATA 命令都有 1:1 的转换)。但是 \xc2\xa0 直到几年前,ATA 磁盘都有自己的驱动程序,并且内部 HDD 会被命名hd*(/dev/hda 等) \xe2\x80\x93 并且它们在下面有自己的结构/sys 也是如此。

\n

另一方面,NVMe 与 SCSI 和 ATA 有很大不同,因此虽然 Linux 也曾sd*一度拥有类似的转换层,但最终发现让 NVMe 磁盘拥有自己的设备类型并让工具直接说话会更好NVMe 命令。因此NVMe磁盘被命名为nvme*.

\n

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

\n

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

\n

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

\n

  • @NikitaKipriyanov:他们没有删除分区;他们没有删除分区。他们正在通过“device”符号链接到达其父设备。 (5认同)
  • “就在几年前”听起来像是一个轻描淡写的说法。默认情况下,从“hd*”到“sd*”的切换发生在 10-15 年前,具体取决于您使用的发行版。几年前,旧的(非 libata,`hd*`)基础设施已从内核源代码中删除,但它已经很长一段时间没有使用了,除非您碰巧在不支持的 20 多年旧硬件上运行现代”体系。 (4认同)