第 7章 . 用户定义的设备名称

/dev/ 目录包含代表设备的虚拟文件。每个虚拟文件代表一个系统设备,如贮存设备、USB 设备、或打印机。这些虚拟文件被称为设备名称(device names)

IDE 设备的设备名称以 hd 开头,SCSI 设备的设备名称以 sd 开头。前缀后面跟随着一个代表驱动器顺序的字母,从 a 开始,如:/dev/hda 是第一个 IDE 硬盘驱动器;/dev/hdb 是第二个 IDE 硬盘驱动器,/dev/hdc 是第三个 IDE 硬盘驱动器,依此类推。

如果设备名称后面跟随了一个数字,这个数字代表分区号码。例如:/dev/hda1 代表第一个 IDE 驱动器的第一个分区。

如果硬盘驱动器被物理性地转移到机器中的另一位置、从机器中被拆卸、或初始化失败,某些设备名称就会改变,从而造成设备名称的潜在无效引用。如图 7-1所示,如果某系统有三个 SCSI 硬盘驱动器,第二个 SCSI 硬盘驱动器被拆除了,/dev/sdc 成为 /dev/sdb,从而导致到/dev/sdc 的引用变得无效,到/dev/sdb 的引用也变得无效,因为它现在指向不同的驱动器。

图 7-1. 删除硬盘驱动器

每个硬盘驱动器都有一个独特的标志,叫做 UUID。要解决设备名称的变动问题,devlabel 允许你使用用户定义的设备名称来关联这些 UUID。一个符号链接会被创建来连接用户定义的设备名称和实际的设备名称。如果实际的设备名称改变了,这个符号链接会被更新,并根据驱动器的 UUID 来指向同一驱动器。因此,IDE 和 SCSI 贮存设备都可以使用它们的用户定义的名称被引用。

Devlabel 还允许你自动挂载热插入的设备,如可移硬盘和数码照相机的内存卡之类的 USB 设备。如果被配置成自动挂载,设备被插入后,它就会使用用户定义的设备名称被挂载。

7.1. 配置 Devlabel

用户定义的设备名称可以根据设备名称、分区名称、或驱动器的 UUID 来被添加。

使用以下语法来为贮存设备添加用户定义的设备名称。所指定的设备可以是整个设备,也可以是设备上的单个分区。

devlabel add -d <device> -s <symlink>

例如:要添加 /dev/work 这个符号链接来代表 /dev/hdb1 分区,使用以下命令:

devlabel add -d /dev/hdb1 -s /dev/work

如果该命令成功,以下输出会被显示:

Created symlink /dev/work -> /dev/hdb1
Added /dev/work to /etc/sysconfig/devlabel

要根据设备的 UUID 来添加设备名称,使用以下语法:

devlabel add -u <uuid> -s <symlink>

要使用 devlabel 来检索设备的 UUID(或确保它的存在),使用以下命令:

devlabel printid -d <device>

符号链接名称必须独特。如果试图添加一个已经存在的链接,配置文件不会被修改,以下输出会被显示:

The file /dev/work already exists.
Failure. Could not create a symlink.

要从 devlabel 列表中删除符号链接,使用以下命令:

devlabel remove -s <symlink>

项目从配置文件中被删除,符号链接被删除。

要判定 devlabel 符号链接的状态,使用以下命令:

devlabel status

它返回的输出和以下相仿:

lrwxrwxrwx    1 root            9 Apr 29 13:20 /dev/work -> /dev/hdb1
lrwxrwxrwx    1 root            9 Apr 29 13:41 /dev/tcf -> /dev/hda1

7.1.1. 热插入设备

当硬件在系统运行期间被加入或移除之类的系统事件发生时,一个叫做热插入(hotplug)的程序会运行。譬如,如果一个 USB 硬盘驱动器或 USB 介质卡读取器被连接到系统上,hotplug 通过在系统日志文件(/var/log/messages)中记录消息来通知用户,并载入正确的内核模块来使这个设备能够正常运行。

当一个 PCI、USB、或 IEEE 1394(又称 FireWire)设备被插入,hotplug 脚本还会重新启动 devlabel,因此可移贮存介质能够收到一个用户定义的设备名称(如 /dev/usbcard),它还可以自动挂载那个贮存设备。

把 USB 卡读取器插入计算机的 USB 端口后,以根用户身份发出以下命令(/dev/sda1 是介质卡的设备名称,/dev/usbcard 是要使用的用户定义的设备名称):

devlabel add -d /dev/sda1 -s /dev/usbcard --automount

该命令在 /etc/sysconfig/devlabel 中添加一个挂载点的项目,然后创建一个 /dev/usbcard/dev/sda1 的链接。devlabel--automount 选项指定,在 devlabel 重新启动时,如果 /etc/fstab 中有这个设备项目而且这个设备项目存在(找到了带有同一 UUID 的设备),那么就自动挂载这个项目。

updfstab 是一个扫描 IDE 和 SCSI 总线来寻找新设备的程序。如果这些项目在 /etc/fstab 中不存在,它会在其中添加这些项目。它还为 USB 设备添加项目,因为它们似乎是 SCSI 设备。详情请参阅 updfstab 的说明书页。

当某个 USB 设备被插入,hotplug 就会运行 updfstab 程序。如果这个贮存设备(如介质卡)存在,该程序会为它在 /etc/fstab 中添加一项记录。(如果插入的卡读取器中没有卡,这项记录就不会被添加。)所添加的这一行包含实际设备名称(如 /dev/sda1)和 kudzu 选项。kudzu 选项通知 Kudzu[1]如果设备不存在就删除这一行。因为这一行是 devlabel 所需的,你必须删除 kudzu 选项才能使这一行被保留在文件内。你还需把设备名称改成 devlabel 设备名称(如 /dev/usbcard),并创建挂载点(如 /mnt/usbcard)。

修改了这一行后,它应该和以下相似:

/dev/usbcard   /mnt/usbcard   auto    noauto,owner 0 0

由于 --automount 这个选项,当 devlabel 重新启动后,USB 设备被插入到计算机时,USB 卡读取设备中的贮存介质就会被挂载到 /mnt/usbcard。值得注意的是,当 USB 卡读取器被插入到计算机时,这个卡必须已经在读取器中,否则,devlabel 就找不到贮存设备,因此无法自动挂载它。

如果 USB 卡读取器被插入了,其中还没有插入卡,当卡被插入时,以根用户身份重新运行 devlabel restart 来挂载这个介质卡。

[1]

Kudzu 是在系统引导时运行的硬件探测工具。它用来判定系统上添加了或移除了哪些硬件。