Linux 磁盘命名约定中的 sdX 和 hdX 背后有什么含义?

Linux 磁盘命名约定中的 sdX 和 hdX 背后有什么含义?

有人能告诉我 Linux 下硬盘的 hdX 和 sdX 命名约定背后的含义吗?我知道这是一个“约定”,但它是什么意思?这是否意味着,例如,SCSI 驱动器必须被称为 sdX 否则它将不起作用?

背景是我正在摆弄一个基于 Linux 的自定义操作系统和 vmware,所以我可以随意命名驱动器。我知道这种约定对用户来说很好,我只是想知道内核是否需要它。

答案1

内核处理两种类型的驱动器:

  • IDE 驱动器,例如旧硬盘驱动器和许多 CD/DVD 驱动器 - 这些驱动器使用名称 hd$x
  • SCSI 驱动器 - 这些驱动器使用名称 sd$x

SATA、SAS 和 USB 驱动器都使用 SCSI 子系统,因为它具有旧 IDE 驱动程序所不具备的某些优势。因此,对于主机计算机来说,这些控制器设备被抽象为看起来像包含 SCSI 设备的 SCSI 控制器。

对于 IDE 驱动器,命名约定非常严格:

  • hda 是第一条总线上的主驱动器
  • hdb 是第一条总线上的从属驱动器
  • hde 是第三条总线上的主驱动器

...等等。(是的,可以有两条以上的 IDE 总线。)因此,当您在一条 IDE 总线上安装 CD 或 DVD 驱动器时,看到这些驱动器挂在第二条 IDE 总线上的情况并不罕见(因为一直都是这样做的——但这是另一个讨论)。因此,完全有可能在没有 hda 和 hdb 的情况下拥有 hdc。

了解这一点很重要,因为 SCSI 子系统有所不同。驱动器按检测到的顺序进行标记。

假设您有一条老式的 SCSI 总线,并将磁盘挂在 SCSI ID 0、3 和 5 处。这些驱动器将分别被检测为 sda、sdb 和 sdc。

现在假设您购买了第四个驱动器,出于只有您自己知道的原因,您将其分配给 SCSI ID 4。这个新驱动器现在被检测为 sdc,而 SCSI ID 5 上预先存在的驱动器现在是 sdd。如果您通过绝对名称引用分区,这可能会导致各种滑稽的事情——使用插入的新驱动器启动后,/dev/sdc1 不再是以前的样子,您现在指的是 /dev/sdd1。

这就是 RedHat(及其他公司)喜欢 e2label 功能的原因之一,通过该功能,您可以为分区分配一个唯一的标签,并根据该标签进行挂载。

我不知道为什么 Linux 会这样构建。像 Solaris 这样的老式操作系统会强制您通过 SCSI 地址引用磁盘 - 因此 /dev/dsk/c0t0d0s0(控制器 0、目标(或 ID)0、磁盘 0(旧版,不要询问)、切片(或分区)0)将是绝对的,无论总线上还有其他什么磁盘。如果您插入新的 scsi 控制器并引入新的总线 ID,它确实会遇到同样的问题,但这种情况相对罕见,大多数计算机都知道更喜欢使用内部控制器而不是后来添加的控制器。Linux 的方式可以更简单 - 您不需要知道或关心您的控制器/id 信息。您只知道它是第一个或第二个磁盘。对于大多数用户来说,这是真的,您最多只需要处理几个驱动器,所以只要您能找到它,您就不在乎它的名字。

分区号又是另外一回事了。PC 上使用的标准 MS (DOS) 分区表包含四个主分区。不多也不少。它们的长度可以是 0,而且无需从定义分区 1 开始。如果需要,您可以从分区 3 开始。我认为它们甚至不必在磁盘上连续 - 您可以定义分区 3 从块 0 开始,分区 1 从块 0 之后的某个位置开始。大多数 Linux 分区工具将从分区 1 开始写入分区表,依此类推。大多数 Linux 内核会将长度为 0 的分区视为空分区或不存在的分区,并且不会宣布其存在。

如果您需要更多分区,则必须将其中一个主分区标记为“扩展”分区的容器。然后,您可以将其细分为任意数量的扩展分区(受一些我不知道的限制)。不同之处在于,内核总是从分区号 5 开始枚举扩展分区。因此,如果您的磁盘 hda 有两个主分区和两个扩展分区(无论出于何种原因),它们将被枚举为 hda1、hda2、hda5 和 hda6。分区 3 将被标记为包含扩展分区,并且不会被枚举。

解释设备名称需要用很多文字。它实际上只是向您表明设备是 IDE 还是 SCSI 控制的设备,并让您了解设备是如何分区的。

除非有令人信服的理由,否则我不会乱改它们。更改它们只会让那些认为自己知道自己在做什么的用户感到困惑。

答案2

据我所知,内核所要求的就是设备具有正确的主设备号和次设备号。

只要主设备号和次设备号正确,名为 /dev/sda3 的东西就可能不是链上第一个 SCSI 设备的第三个分区(或其他);它实际上可能是第二个 IDE 驱动器的第 N 个分区。

请注意,某些支持实用程序可能乐意或不愿意处理非“标准”开发名称。每个程序员对于什么是合理的“健全性检查”都有自己的看法。

答案3

IDE 驱动器以 hd 为前缀,而 SCSI、SATA 和 SAS 驱动器以 sd 为前缀。

例如:

第一个 SCSI 驱动器上的第一个分区:

/dev/sda1

第三分区第三IDE 驱动器:

/dev/hdc3

这些前缀由 Linux 按照其连接的顺序确定。设备命名约定无法更改,但您可以使用以下命令更改它们显示的名称(标签)e2label

e2label /dev/sdb1 /Docs

相关内容