[Linux]Devices

Devices

1 /dev目录

当将一个设备连接到计算机时,通常需要一个设备驱动程序以确保其正常工作。设备驱动程序可通过设备文件或设备节点进行交互,这些特殊文件看起来就像普通文件一样。由于这些设备文件与普通文件相似,可以使用如lscat等命令来与它们互动。这些设备文件一般存储在/dev目录下。

查看系统中的设备文件

要查看您的系统中有哪些设备文件,请执行以下命令:

1
$ ls /dev

执行后,会看到大量存在于系统中的设备文件。其中一些设备文件,比如/dev/null,当向/dev/null发送输出时,内核知道该设备会接收所有输入并直接丢弃,因此不会有任何返回内容。

传统方法的问题

在过去,如果想要向系统添加一个设备,需要手动在/dev目录下添加相应的设备文件,然后很可能就不再理会它了。重复几次之后,问题便显现出来了:/dev目录会被长期未使用或已升级设备的静态设备文件所堆积。此外,设备还会根据内核发现它们的顺序被分配设备文件。这意味着每次系统重启后,设备可能会因为被发现的时间不同而拥有不同的设备文件。

动态管理设备的新方法

现在采用了一种新的机制来动态地添加和移除系统中当前正在使用的设备,从而避免了上述问题。这种方法将在后面详细讨论。

2 设备种类

运行以下命令,可以列出/dev目录下的设备文件及其详细信息:

1
$ ls -l /dev

示例输出可能如下所示:

1
2
3
4
brw-rw----   1 root disk      8,   0 Dec 20 20:13 sda
crw-rw-rw- 1 root root 1, 3 Dec 20 20:13 null
srw-rw-rw- 1 root root 0 Dec 20 20:13 log
prw-r--r-- 1 root root 0 Dec 20 20:13 fdata

每一行从左至右分别表示权限、所有者、所属组、主设备号、次设备号、时间戳和\名称。

文件类型的标识

使用ls命令时,可以通过每行的第一个字符识别文件类型。设备文件的标识符如下:

  • c:字符设备
  • b:块设备
  • p:管道设备
  • s:套接字设备

字符设备

此类设备逐字符传输数据。常见于伪设备(如/dev/null),这些伪设备并非物理连接到机器上,但它们扩展了操作系统的功能。

块设备

此类设备以大而固定大小的数据块进行数据传输。最常见的是硬盘和文件系统等利用数据块的设备。

管道设备

命名管道允许两个或多个进程之间进行通信,与字符设备类似,但其输出是发送给另一个进程而非设备。

套接字设备

套接字设备促进进程间的通信,类似于管道设备,但能够同时与多个进程进行通信。

设备编号

设备通过两个数字进行分类:主设备号和次设备号。例如,对于设备编号8, 0:

  • 主设备号(8)代表所使用的设备驱动程序,这通常对应sd块设备。
  • 次设备号(0)告诉内核该设备在此驱动类别中的唯一标识,例如这里的0表示第一个设备(a)。

3 设备名称

SCSI设备

如果使用的机器上有任何形式的大容量存储,很有可能它使用的是SCSI(发音为”scuzzy”)协议。SCSI代表小型计算机系统接口,是一种允许磁盘、打印机、扫描仪及其他外围设备与系统通信的协议。尽管实际的SCSI设备可能不再广泛应用于现代系统中,但在Linux系统中,SCSI磁盘通常对应于/dev目录下的硬盘驱动器,并以sd(SCSI disk)作为前缀标识。

  • /dev/sda:第一块硬盘
  • /dev/sdb:第二块硬盘
  • /dev/sda3:第一块硬盘上的第三个分区

伪设备

伪设备并非物理连接到系统上,它们多数作为字符设备存在:

  • /dev/zero:接受所有输入并丢弃之,生成连续的NULL(零值)字节流。
  • /dev/null:接受所有输入并丢弃之,不产生任何输出。
  • /dev/random:生成随机数。

PATA设备

在一些较老的系统中,可能会看到使用hd前缀表示的硬盘驱动器:

  • /dev/hda:第一块硬盘
  • /dev/hdd2:第四块硬盘上的第二个分区

4 sysfs

Sysfs与设备管理

Sysfs文件系统创建的目的在于更有效地管理系统中的设备,补充了/dev目录未能提供的功能。作为一个虚拟文件系统,Sysfs通常挂载于/sys目录下,提供了比/dev目录更为详尽的设备信息。尽管/sys和/dev目录在某些方面看起来相似,但它们有着明显的区别和不同的用途。简而言之,/dev目录提供了一个简单的接口,允许其他程序直接访问设备;而/sys文件系统则用于查看设备信息和进行设备管理。

Sysfs下的设备信息

/sys文件系统包含了系统中所有设备的详细信息,如制造商、型号、设备连接位置、设备状态、设备层次结构等。以下是通过浏览/sys/block/sda目录内容所展示的部分示例:

  • alignment_offsetdiscard_alignment:关于磁盘对齐的信息。
  • holdersslaves:显示此设备被哪些设备持有或依赖的设备。
  • removable:指示设备是否可移除。
  • ro:指示设备是否只读。
  • size:显示设备大小。
  • stat:提供设备的统计信息。
  • devicesubsystem:包含设备本身及其所属子系统的相关信息。
  • powerqueue:分别涉及设备的电源管理和队列设置。

这些文件并不是设备节点,因此不用于直接与设备交互。相反,它们为用户提供了一种手段来管理和监控系统上的设备。通过查阅这些文件,用户能够获取到设备的详细属性,并据此进行必要的调整和优化,确保系统运行效率和稳定性。

5 udev

在过去,若要手动创建设备节点,可以使用如下命令:

1
$ mknod /dev/sdb1 b 8 3

这条命令将创建一个名为/dev/sdb1的设备节点,指定其为块设备(b),并赋予主设备号8和次设备号3。同样地,删除设备也只需简单地移除/dev目录下的对应设备文件。

然而,得益于udev系统的出现,现在无需手动执行这些操作。udev系统能够根据设备是否连接动态地创建或移除设备文件。系统中运行着一个udevd守护进程,它监听来自内核的关于新连接设备的消息。udevd会解析这些信息,并将其与/etc/udev/rules.d目录下预定义的规则进行匹配,进而创建设备节点和符号链接。虽然用户可以编写自己的udev规则,但这通常超出了基本需求范围。统自带了丰富的udev规则,足以满足大多数情况的需求。

使用udevadm工具

通过udevadm命令,我们可以查看udev数据库和sysfs中的信息。要获取特定设备的详细信息,可以使用以下简单命令:

1
$ udevadm info --query=all --name=/dev/sda

6 lsusb, lspci, lssci

列出设备信息的工具

类似于使用ls命令列出文件和目录,Linux系统提供了多种工具用于列出不同类型的设备信息。

列出USB设备

要查看系统中的USB设备,可以使用lsusb命令:

1
$ lsusb

该命令将显示所有连接的USB设备的详细信息,包括设备ID、制造商和设备类型等。

列出PCI设备

对于PCI设备,可以使用lspci命令来获取相关信息:

1
$ lspci

执行上述命令后,系统会列出所有PCI设备,提供设备名称、类别以及连接的总线位置等详情。

列出SCSI设备

要列出SCSI设备的信息,可以使用lsscsi命令:

1
$ lsscsi

此命令将输出系统中所有SCSI设备的列表,包含设备路径、类型及厂商等信息。

7 使用dd工具进行数据转换和复制

dd是一个功能强大的命令行工具,适用于Linux和其他Unix-like操作系统,用于数据的转换和复制。它可以从文件或数据流读取输入,并将其写入到另一个文件或数据流。

考虑以下命令:

1
$ dd if=/home/pete/backup.img of=/dev/sdb bs=1024

此命令将backup.img的内容复制到/dev/sdb。它将以1024字节为单位块进行数据复制,直到所有数据传输完成为止。

  • if=file: 输入文件,从指定文件而非标准输入读取数据。
  • of=file: 输出文件,向指定文件而非标准输出写入数据。
  • bs=bytes: 块大小,表示每次读写的字节数。可以使用不同的尺寸单位,例如k代表千字节,m代表兆字节等。因此,1024字节等于1k。
  • count=number: 复制的块数。

使用count选项

假设执行以下命令:

1
$ dd if=/home/pete/backup.img of=/dev/sdb bs=1M count=2

如果backup.img的大小是10MB,但是上述命令仅指示复制1MB的数据两次,即总共只复制了2MB的数据,导致数据不完整。在特定情况下,count参数非常有用,但在简单地复制整个文件时,通常可以省略countbs参数。若要优化数据传输效率,则应合理配置这些选项。

dd可用于制作任何东西的备份,包括整个磁盘驱动器、恢复磁盘映像等。


[Linux]Devices
https://erlsrnby04.github.io/2025/03/21/Linux-Devices/
作者
ErlsrnBy04
发布于
2025年3月21日
许可协议