5. Linux 中的驱动器命名

Linux 使用一种特殊的命名规则来指代大容量存储设备,这需要被理解。

5.1. 命名约定

Linux 过去常常处理两种类型的驱动器,取决于电子接口(控制器):IDE 和 SCSI。老用户还记得 CD 刻录机通过 “SCSI 仿真” 访问的日子。实际上,IDE 和 SCSI 大多使用相同的底层命令,并且从 2007 年开始,随着新的 “SATA” 接口的出现,命名被统一了,在新的发行版中,所有驱动器都使用相同的命名。在本文中,CD 或 DVD 读写器被视为硬盘驱动器。

5.1.1. 旧的 IDE 命名

按照惯例,IDE 驱动器被赋予设备名称/dev/hda/dev/hdd. Hard Drive A(/dev/hda) 是第一个驱动器,Hard Drive C(/dev/hdc) 是第三个。

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

因此,通常情况下,具有 IDE 控制器的计算机可以容纳 4 个驱动器:/dev/hda (主控制器主盘), /dev/hdb (主控制器从盘), /dev/hdc (次控制器主盘), /dev/hdd (次控制器从盘)。一些(罕见的)主板具有两个以上的控制器,一些扩展卡也可能具有控制器,这些控制器按照字母顺序编号,但您需要弄清楚您的特定硬件的实际名称是什么。

您可以将驱动器放置在任何您想要的位置,不强制填补空隙。您可能有兴趣了解驱动器/光驱连接到什么位置,但这超出了本文档的范围。

5.1.2. 新的硬盘驱动器名称

现在,所有旋转硬盘驱动器都使用与旧 SCSI 控制器相同的名称,即将 “h” 替换为 “s”,因此是 /dev/sda,等等。驱动器的数量取决于主板或扩展板上的控制器数量。通常有 4 个可用。驱动器的编号取决于控制器卡及其被内核读取的方式,因此一开始很难说。

5.1.3. 闪存驱动器名称

闪存驱动器通常不通过 IDE 或 SATA 接口连接,因此不使用相同的名称。使用了几种不同的接口,每种接口都有不同的名称。内核文档提供了这些名称。

5.1.4. 底层设备和额外的命名

您会在某些应用程序中找到对底层 SCSI 设备和各种命名约定的引用,例如(wodim 是命令行 CD 刻录程序)

          wodim --scanbus
scsibus1:
        1,0,0   100) *
        1,1,0   101) 'TSSTcorp' 'CD/DVDW TS-L632D' 'ac00' Removable CD-ROM
        1,2,0   102) *
        1,3,0   103) *
        1,4,0   104) *
        1,5,0   105) *
        1,6,0   106) *
        1,7,0   107) *

您可能需要使用某种 SCSI:1,1,0 选项来访问 CD-ROM。尽量避免使用它,因为它非常容易出错,应该只留给程序员使用。我提到它只是因为您并非总是可以避免它。

如果您执行 “cat /dev/ | more”,您可以看到

          lrwxrwxrwx  1 root root             3 mars  9 07:56 scd0 -> sr0
(...)
crw-r-----  1 root disk       21,   0 mars  9 07:56 sg0
crw-rw----+ 1 root disk       21,   1 mars  9 07:56 sg1

这些 scd、sr、sg 设备是底层接口(注意 “c” 代表 “字符”)。尽量不要使用它们。dmesgmore /var/log/boot.msg 应该会为您提供可用的 sdxx 设备,例如(简短摘要)

          <5>sd 0:0:0:0: [sda] 976773168 512-byte hardware sectors: (500GB/465GiB)
<5>sd 0:0:0:0: [sda] Write Protect is off
<7>sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00

这意味着驱动器是 /dev/sda

然而,这些文件(由 dmesgmore /var/log/boot.msg 提供)过去很容易阅读,但现在不再容易了。现在内核并行启动多个驱动程序,因此消息是混合的,您可能会看到

          <6> sda:<6>USB Universal Host Contr'ller Interface driver v3.0

这并不意味着您的 sda 驱动器是 USB 驱动器,而是 USB 模块与驱动器模块同时启动并同时发送其消息。您仍然有一个 /dev/sda 驱动器。

5.1.5. 新的媒体名称

以下是插入 USB 密钥的 dmesg 内容

          scsi7 : SCSI emulation for USB Mass Storage devices
usb 5-3: New USB device found, idVendor=0951, idProduct=160e
usb 5-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 5-3: Product: DataTraveler 2.0
usb 5-3: Manufacturer: Kingston
usb 5-3: SerialNumber: 200706200000000059188185
usb-storage: device found at 9
usb-storage: waiting for device to settle before scanning
scsi 7:0:0:0: Direct-Access     Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 2
sd 7:0:0:0: [sdb] 3930112 512-byte hardware sectors: (2.01GB/1.87GiB)
sd 7:0:0:0: [sdb] Write Protect is off
sd 7:0:0:0: [sdb] Mode Sense: 23 00 00 00
sd 7:0:0:0: [sdb] Assuming drive cache: write through
sd 7:0:0:0: [sdb] 3930112 512-byte hardware sectors: (2.01GB/1.87GiB)
sd 7:0:0:0: [sdb] Write Protect is off
sd 7:0:0:0: [sdb] Mode Sense: 23 00 00 00
sd 7:0:0:0: [sdb] Assuming drive cache: write through
 sdb: sdb1
sd 7:0:0:0: [sdb] Attached SCSI removable disk
sd 7:0:0:0: Attached scsi generic sg2 type 0
usb-storage: device scan complete

您在那里看到了我们刚才所说的所有内容!SCSI 仿真、scsi、sd 和 sg 名称,以及对我们最重要的 sdb。

以下是高速 SDHC 卡的消息

          tifm_core: MMC/SD card detected in socket 0:1
mmc1: new SDHC card at address d555
mmcblk0: mmc1:d555 SD04G 3.79GiB
 mmcblk0: p1

/dev/mmcblk0p1 on /media/H2SD type vfat (rw,nosuid,nodev,noatime,flush,uid=1000,utf8,shortname=lower)

当这两张卡可能使用相同的闪存芯片时,USB 密钥使用 USB 接口和 SCSI 仿真,SDHC 卡使用笔记本电脑的 PCMCIA 插槽,并使用特殊的设备命名 (/dev/mmcblk0)。就分区而言,它们的用法是相同的。

5.1.6. 磁盘 ID

在一个磁盘数量众多且可移动的世界中,不可能跟踪哪个设备被哪个磁盘使用。因此,现在有很多方法可以使用磁盘名称。这使得使用基本工具变得极其困难。这些是 “磁盘标签” 和 “磁盘 UUID”,以及 “分区标签”。有关详细信息,请参阅 fstab 手册页。