蚊章汇 - 设备文件
type: channel
link: https://linuxcn.bwsl.wang/tag/%E8%AE%BE%E5%A4%87%E6%96%87%E4%BB%B6/
items: 在 Linux 中管理设备

在 Linux 中管理设备
type: item
date: 2017-01-08T17:35:00+08:00
description: 探索 /dev 目录可以让您知道如何直接访问到 Linux 中的设备。Linux 目录结构中有很多有趣的功能，这次我会讲到 /dev 目录一些迷人之处。在继续阅读这篇文章之前，建议你看看我前面的文章。Linux 文件系统，一切皆为文件，这两篇文章介绍了一些有趣的 Linux 文件系统概念。请先看看 - 我会等你看完再回来。……太好了 ！欢迎回来。现在我们可以继续更详尽地探讨 /dev 目录。设备文件设备文件也称为设备特定文件。设备文件用来为操作系统和用户提供它们代表的设备接口。所有的 Linux 设备文件均位于 /dev 目录下，是根 （/） 文件系统的一个组成部分，因为这些设备文件在操作系统启动过程中必须可以使用。关于这些设备文件，要记住的一件重要的事情，就是它们大多不是设备驱动程序。更准确地描述来说，它们是设备驱动程序的门户。数据从应用程序或操作系统传递到设备文件，然后设备文件将它传递给设备驱动程序，驱动程序再将它发给物理设备。反向的数据通道也可以用，从物理设备通过设备驱动程序，再到设备文件，最后到达应用程序或其他设备。让我们以一个典型命令的数据流程来直观地看看。图 1：一个典型命令的简单数据流程。在上面的图 1 中，显示一个简单命令的简化数据流程。从一个 GUI 终端仿真器，例如 Konsole 或 xterm 中发出 cat /etc/resolv.conf 命令，它会从磁盘中读取 resolv.conf 文件，磁盘设备驱动程序处理设备的具体功能，例如在硬盘驱动器上定位文件并读取它。数据通过设备文件传递，然后从命令到设备文件，然后到 6 号伪终端的设备驱动，然后在终端会话中显示。当然， cat 命令的输出可以以下面的方式被重定向到一个文件， cat /etc/resolv.conf > /etc/resolv.bak ，这样会创建该文件的备份。在这种情况下，图 1 左侧的数据流量将保持不变，而右边的数据流量将通过 /dev/sda2 设备文件、硬盘设备驱动程序，然后到硬盘驱动器本身。这些设备文件使得使用标准流 (STD/IO) 和重定向访问 Linux 或 Unix 计算机上的任何一个设备非常容易。只需将数据流定向到设备文件，即可将数据发送到该设备。设备文件类别设备文件至少可以按两种方式划分。第一种也是最常用的分类是根据与设备相关联的数据流进行划分。比如，tty (teletype) 和串行设备被认为是基于字符的，因为数据流的传送和处理是以一次一个字符或字节进行的；而块类型设备（如硬盘驱动器）是以块为单位传输数据，通常为 256 个字节的倍数。您可以在终端上以一个非 root 用户，改变当前工作目录（PWD）到 /dev ，并显示长目录列表。 这将显示设备文件列表、文件权限及其主、次设备号。 例如，下面的设备文件只是我的 Fedora 24 工作站上 /dev 目录中的几个文件。 它们表示磁盘和 tty 设备类型。 注意输出中每行的最左边的字符。 b 代表是块类型设备，c 代表字符设备。brw-rw---- 1 root disk 8, 0 Nov 7 07:06 sda brw-rw---- 1 root disk 8, 1 Nov 7 07:06 sda1 brw-rw---- 1 root disk 8, 16 Nov 7 07:06 sdb brw-rw---- 1 root disk 8, 17 Nov 7 07:06 sdb1 brw-rw---- 1 root disk 8, 18 Nov 7 07:06 sdb2 crw--w---- 1 root tty 4, 0 Nov 7 07:06 tty0 crw--w---- 1 root tty 4, 1 Nov 7 07:07 tty1 crw--w---- 1 root tty 4, 10 Nov 7 07:06 tty10 crw--w---- 1 root tty 4, 11 Nov 7 07:06 tty11识别设备文件更详细和更明确的方法是使用设备主要以及次要号。 磁盘设备主设备号为 8，将它们指定为 SCSI 块设备。请注意，所有 PATA 和 SATA 硬盘驱动器都由 SCSI 子系统管理，因为旧的 ATA 子系统多年前就由于代码质量糟糕而被认为不可维护。造成的结果就是，以前被称为 “hd[a-z]” 的硬盘驱动器现在被称为 “sd[a-z]”。你大概可以从上面的示例中推出磁盘驱动器次设备号的模式。次设备号 0、 16、 32 等等，直到 240，是整个磁盘的号。所以主/次 8/16 表示整个磁盘 /dev/sdb ， 8/17 是第一个分区的设备文件，/dev/sdb1。数字 8/34 代表 /dev/sdc2。在上面列表中的 tty 设…