2. 设备

Linux 使用一种特殊的命名法来指代硬盘分区,为了理解后续页面的讨论,必须理解这种命名法。

在 Linux 中,分区由设备文件表示。这些是位于以下目录的虚拟文件/dev。以下是一些条目

brw-rw----    1 root     disk       3,   0 May  5  1998 hda
brw-rw----    1 root     disk       8,   0 May  5  1998 sda
crw-------    1 root     tty        4,  64 May  5  1998 ttyS0
设备文件是一种类型为 c(用于“字符”设备,即不使用缓冲区缓存的设备)或 b(用于“块”设备,即通过缓冲区缓存的设备)的文件。在 Linux 中,所有磁盘都仅表示为块设备。

2.1. 设备名称

2.1.1. 命名约定

按照约定,IDE 驱动器将被赋予设备名称/dev/hda/dev/hddHard Drive A (/dev/hda) 是第一个驱动器,而 Hard Drive C (/dev/hdc) 是第三个。

表 2. IDE 控制器命名约定

驱动器名称驱动器控制器驱动器编号
/dev/hda11
/dev/hdb12
/dev/hdc21
/dev/hdd22

典型的 PC 有两个 IDE 控制器,每个控制器可以连接两个驱动器。例如,/dev/hda是第一个 IDE 控制器上的第一个驱动器(主盘),而/dev/hdd是第二个控制器上的第二个驱动器(从盘)(计算机中的第四个 IDE 驱动器)。

您可以直接写入这些设备(使用 catdd)。但是,由于这些设备代表整个磁盘,从第一个块开始,您可能会错误地覆盖主引导记录和分区表,这将导致驱动器无法使用。

表 3. 分区名称

驱动器名称驱动器控制器驱动器编号分区类型分区编号
/dev/hda111主分区1
/dev/hda211主分区2
/dev/hda311主分区3
/dev/hda411交换分区NA
/dev/hdb112主分区1
/dev/hdb212主分区2
/dev/hdb312主分区3
/dev/hdb412主分区4

一旦驱动器被分区,分区将以名称末尾的数字表示。例如,第二个驱动器上的第二个分区将是/dev/hdb2第 3.3 节为了清晰起见,上面的表格中列出了分区类型(主分区),尽管该概念直到第 3.3 节才进行解释。

表 4. SCSI 驱动器

驱动器名称驱动器控制器驱动器编号分区类型分区编号
/dev/sda116主分区1
/dev/sda216主分区2
/dev/sda316主分区3

SCSI 驱动器遵循类似的模式;它们用 'sd' 而不是 'hd' 表示。因此,第二个 SCSI 驱动器的第一个分区将是/dev/sdb1。在上面的表格中,驱动器编号被任意选择为 6,以引入 SCSI ID 编号在 linux 下不映射到设备名称的概念。

2.1.2. 名称分配

在 (Sun) Solaris 和 (SGI) IRIX 下,赋予 SCSI 驱动器的设备名称与您插入的位置有关。在 linux 下,只有哀嚎和咬牙切齿。

之前

SCSI ID #2        SCSI ID #5       SCSI ID #7        SCSI ID #8
 /dev/sda          /dev/sdb         /dev/sdc          /dev/sdd

之后

SCSI ID #2                         SCSI ID #7        SCSI ID #8
 /dev/sda                           /dev/sdb          /dev/sdc

SCSI 驱动器的 ID 编号从 1 到 15。较低的 SCSI ID 编号被分配较低顺序的字母。例如,如果您有两个编号为 2 和 5 的驱动器,则 #2 将是/dev/sda,而 #5 将是/dev/sdb。如果您移除其中任何一个,所有编号较高的驱动器将在下次启动时被重命名。

如果您的 linux 机器中有两个 SCSI 控制器,您需要检查 /bin/dmesg 的输出,以查看每个驱动器被分配了什么名称。如果您移除两个控制器中的一个,剩余的控制器可能会将其所有驱动器重命名。Grrr...

有两种解决方法;两者都涉及使用程序为每个分区贴上标签(请参阅第 6 节)。即使设备被物理移动,标签也是持久的。然后,您可以通过标签直接或间接地引用分区。

2.1.3. 逻辑分区

表 5. 逻辑分区

驱动器名称驱动器控制器驱动器编号分区类型分区编号
/dev/hdb112主分区1
/dev/hdb212扩展分区NA
/dev/hda512逻辑分区2
/dev/hdb612逻辑分区3

上表说明了名称分配中一个神秘的跳跃。这是由于使用了逻辑分区(请参阅第 3.4 节),逻辑分区总是从 5 开始,原因稍后解释。

这就是您处理 linux 磁盘设备所需知道的全部内容。为了完整起见,请参阅下面 Kristian 关于设备编号的讨论。

2.2. 设备编号

设备文件唯一重要的是其主设备号和次设备号,它们代替文件大小显示

$ ls -l /dev/hda

表 6. 设备文件属性

brw-rw----1rootdisk3,0Jul 18 1994/dev/hda
权限 所有者主设备号次设备号日期设备名称

当访问设备文件时,主设备号选择要调用哪个设备驱动程序来执行输入/输出操作。此调用使用次设备号作为参数完成,并且完全取决于驱动程序如何解释次设备号。驱动程序文档通常描述驱动程序如何使用次设备号。对于 IDE 磁盘,此文档位于 /usr/src/linux/Documentation/ide.txt。对于 SCSI 磁盘,人们会期望在 /usr/src/linux/Documentation/scsi.txt中找到此类文档,但实际上并不在那里。必须查看驱动程序源代码才能确定( /usr/src/linux/driver/scsi/sd.c:184-196)。幸运的是,在 /usr/src/linux/Documentation/devices.txt中,有 Peter Anvin 的设备编号和名称列表;请参阅块设备的条目,IDE 的主设备号为 3、22、33、34,SCSI 磁盘的主设备号为 8。主设备号和次设备号各占一个字节,这就是为什么每个磁盘的分区数量受到限制的原因。