hello,小伙伴们大家好!我是木荣,今天有个小伙伴问到了/dev目录相关的问题,所以来做个简单的记录分享给大家。如有不足之处请指正。
1. /dev目录
如果将一个设备连接到Linux系统时,通常需要一个设备驱动程序才能正常工作。你可以通过设备文件或设备节点与设备驱动程序交互,这些是看起来像普通文件的特殊文件。由于这些设备文件就像普通文件一样,你可以使用ls、cat等程序与它们交互。这些设备文件一般存放在/dev目录下。继续并在你的系统上通过命令ls /dev
查看/dev目录,你将看到系统上有大量的设备文件。
其中一些设备经常使用并与之交互,例如/dev/null,当我们将输出发送到/dev/null时,内核知道这个设备接收了我们所有的输入并丢弃了它,所以什么也没有返回。
以前,如果你想在系统中添加一个设备,你只需要在/dev中添加设备文件,然后可能就会忘记它。重复几次,你就会发现哪里有问题了。/dev目录会被你很久以前升级或停止使用的设备的静态设备文件弄得乱七八糟。设备也会按照内核找到它们的顺序被分配设备文件。因此,如果每次重新启动系统时,设备可能有不同的设备文件,这取决于它们被系统识别的时间。
现在不再使用这种方法,现在用来动态添加和删除当前正在系统上使用的设备。慢慢往下看。
2. 设备类型
在我们讨论如何管理设备之前,让我们先来看看一些设备
列从左到右依次代表:
- 权限
- 连接数
- 拥有者
- 所属组
- 主设备号
- 次设备号
- 时间戳
- 设备名称
在ls命令中,您可以通过每行的第一个字符确定文件的类型。设备文件表示如下:
- C 字符设备
- B 块设备
- P 管道文件
- S socket套接字
- d 目录文件
- l 链接
字符设备
这些设备传输数据,但每次传输一个字符。您将看到许多伪设备(/dev/null)作为字符设备,这些设备并没有真正地在物理上连接到计算机,但它们允许操作系统具有更大的功能。
块设备
这些设备传输数据,但是是固定大小的大块。您最常见的是使用数据块作为块设备的设备,例如硬盘、文件系统等。
管道设备
命名管道允许两个或多个进程相互通信,这些类似于字符设备,但不是将输出发送到设备,而是发送到另一个进程。
套接字设备
套接字设备促进了进程之间的通信,类似于管道设备,但它们可以同时与多个进程通信。
设备描述
设备用两个数字来描述,主设备号和次设备号。你可以在上面的ls例子中看到这些数字,它们用逗号分隔。例如,假设一个设备的设备号为:8,0。主设备号表示所使用的设备驱动程序,这通常是sd块设备的主设备号。次设备号告诉内核它是这个驱动类中的哪个唯一设备,在这种情况下,0用于表示第一个设备
3. 设备名称
最常见的设备名称:
SCSI
如果系统上有任何类型的大容量存储,那么它很可能正在使用SCSI协议。SCSI代表小型计算机系统接口,它是一种允许磁盘、打印机、扫描仪和其他外设与系统之间通信的协议。您可能听说过在现代系统中实际上并没有使用SCSI设备,但是我们的Linux系统将SCSI磁盘与/dev中的硬盘驱动器相对应。它们由一个前缀sd (SCSI磁盘)表示:
常见的SCSI设备文件: /dev/sda -第一块硬盘 /dev/sdb -第二块硬盘 /dev/sda3—第一块硬盘的第三个分区
伪设备
伪设备并不是真正地连接到您的系统,最常见的伪设备是字符设备:
/dev/zero -接受并丢弃所有输入,产生一个连续的NULL(零值)字节流 /dev/null -接受并丢弃所有输入,不产生输出 /dev/random -生成随机数
PATA设备
有时在旧系统中,你可能会看到硬盘驱动器以hd前缀引用:
/dev/hda -第一块硬盘 /dev/hdd2 -第4块硬盘的第二个分区
sysfs
Sysfs是很久以前创建的,目的是更好地管理系统上的设备,而/dev目录无法做到这一点。Sysfs是一个虚拟文件系统,通常挂载在/sys目录下。它为我们提供了比在/dev目录中能够看到的更详细的信息。目录/sys和/dev在某些方面看起来非常相似,但它们确实有很大的不同。基本上,/dev目录很简单,它允许其他程序访问设备本身,而/sys文件系统用于查看信息和管理设备。
/sys文件系统基本上包含了系统中所有设备的所有信息,比如制造商和型号、设备插入的位置、设备的状态、设备的层次结构等等。在这里看到的文件不是设备节点,因此实际上并不是在/sys目录下与设备交互,而是在管理设备。
看一下/sys目录下的内容:
5. udev
你可以使用如下命令创建设备节点:
该命令将创建一个设备节点/dev/sdb1,并将其设置为主设备号为8、次设备号为3的块设备(b)。
要删除一个设备,只需rm /dev
目录下的设备文件。
但是由于udev的存在,我们真的不再需要这样做了。udev系统动态地为我们创建和删除设备文件,这取决于它们是否连接。系统上运行着一个udevd守护进程,它侦听来自内核的关于连接到系统的设备的消息。Udevd将解析该信息,并将数据与/etc/udev/rules中指定的规则进行匹配D,根据这些规则,它很可能为设备创建设备节点和符号链接。
还可以使用udevadm命令查看udev数据库和sysfs。这个工具非常有用,但有时会非常复杂,查看设备信息的简单命令是:
6. lsusb, lspci, lssci命令
就像我们使用ls命令列出文件和目录一样,我们可以使用类似的工具列出有关设备的信息。
列出usb设备
lsusb
列出PCI设备
lspci
列出SCSI设备
lsscsi
7. dd命令
dd工具对于转换和复制数据非常有用。它从文件或数据流中读取输入,并将其写入文件或数据流。
该命令用于拷贝backup.img到/dev/sdb。它将以1024字节为单位复制数据,直到没有更多的数据要复制为止。
- if=file -输入文件,从文件中读取,而不是标准输入
- of=file -输出文件,写入文件而不是标准输出
- bs=bytes -块大小,它一次读取和写入这么多字节的数据。您可以使用不同的大小度量,用k表示千字节,m表示兆字节,等等,因此1024字节就是1k
- count=number -要复制的块数。
你会看到一些dd命令使用count选项,通常使用dd如果你想复制一个1兆字节的文件,你通常会希望在复制完成时看到这个文件是1兆字节。假设你运行以下命令:
backup.img文件是10M,但是,我们在这个命令中说要复制超过1M内容2次,所以只有2M被复制,使我们复制的数据不完整。Count在许多情况下都可以派上用场,但如果只是复制数据,则可以忽略Count甚至bs。如果你真的想优化你的数据传输,那么你会想要开始使用这些选项。
dd是非常强大的,你可以用它来备份任何东西,包括整个磁盘驱动器,恢复磁盘映像等等。要小心,如果你不确定你在做什么,这个强大的工具可能会付出代价。
小结
好了,就先到这里吧。