Linux中的/dev目录
1. 简介
Linux 和类 Unix 操作系统遵循文件系统层次标准 (FHS)。FHS 定义了文件系统的结构。换句话说,它定义了主目录及其内容。系统上最重要的目录之一是*/dev/目录。在本教程中,我们将更深入地了解/dev/*目录及其功能。
2. /dev目录的作用是什么?
*/dev/*目录由代表连接到本地系统的设备的文件组成。但是,这些不是用户可以读写的常规文件;这些文件称为设备文件或特殊文件:
[itcodingman@blogdemo dev]# ls -l
total 0
crw-r--r--. 1 root root 10, 235 Sep 29 12:08 autofs
drwxr-xr-x. 3 root root 60 Sep 29 12:07 bus
lrwxrwxrwx. 1 root root 3 Sep 29 12:10 cdrom -> sr0
drwxr-xr-x. 2 root root 3100 Sep 29 12:10 char
crw-------. 1 root root 5, 1 Sep 29 12:08 console
lrwxrwxrwx. 1 root root 11 Sep 29 12:07 core -> /proc/kcore
drwxr-xr-x. 3 root root 60 Sep 29 12:07 cpu
crw-------. 1 root root 10, 62 Sep 29 12:08 cpu_dma_latency
drwxr-xr-x. 7 root root 140 Sep 29 12:08 disk
brw-rw----. 1 root disk 253, 0 Sep 29 12:08 dm-0
...
**设备文件是应用程序通过 I/O 系统调用与之交互的标准设备的抽象。**对应于硬件设备的设备文件分为两大类。主要是字符特殊文件和块特殊文件。
3. 字符特殊文件和块特殊文件有什么区别?
字符特殊文件是字符设备的简单接口。同样,块特殊文件是块设备的简单接口。这些设备之间的区别取决于操作系统如何从中读取数据。**驱动程序通过发送单个字符作为数据(例如字节)与字符设备进行通信。**此外,字符设备在与驱动程序通信时不需要缓冲。
另一方面,驱动程序通过缓存从块设备访问数据。此外,驱动程序通过发送整个数据块与块设备通信. 例如,字符设备是声卡或串口,而块设备是硬盘或 USB。我们通过出现在权限前面的字母来识别块设备和字符设备。第一列中显示的字母 “b” 表示块设备。另一方面,第一列中显示的字母“c”表示字符设备:
[itcodingman@blogdemo dev]# ls -l
total 0
crw-r--r--. 1 root root 10, 235 Sep 16 11:52 autofs
drwxr-xr-x. 2 root root 280 Sep 16 11:52 block
drwxr-xr-x. 2 root root 60 Sep 16 11:52 bsg
drwxr-xr-x. 3 root root 60 Sep 16 11:52 bus
lrwxrwxrwx. 1 root root 3 Sep 16 13:05 cdrom -> sr0
drwxr-xr-x. 2 root root 3100 Sep 16 13:05 char
crw-------. 1 root root 5, 1 Sep 16 11:52 console
lrwxrwxrwx. 1 root root 11 Sep 16 11:52 core -> /proc/kcore
drwxr-xr-x. 3 root root 60 Sep 16 11:52 cpu
crw-------. 1 root root 10, 62 Sep 16 11:52 cpu_dma_latency
drwxr-xr-x. 7 root root 140 Sep 16 11:52 disk
brw-rw----. 1 root disk 253, 0 Sep 16 11:52 dm-0
brw-rw----. 1 root disk 253, 1 Sep 16 11:52 dm-1
brw-rw----. 1 root disk 253, 2 Sep 16 11:52 dm-2
我们看到的大多数设备都是字符设备或块设备。但是,存在其他类型的设备,例如套接字和管道设备。
4. 什么是伪设备?
伪设备不对应硬件设备。也就是说,它们提供了几个有用的功能。例如*/dev/random*是一个生成随机数据的函数。伪设备也是字符设备。我们可以使用设备的主设备号来区分伪设备和其他字符设备。
此外,设备驱动程序通过称为主编号的唯一值与设备相关联。运行ls -l 命令时会出现主要和次要编号。逗号分隔两个数字。首先,有主号码,然后是次要号码。在我们的例子中,与伪设备相关联的驱动程序是驱动程序 1,因为我们的主设备号是 1:
[itcodingman@blogdemo dev]# ls -l |grep random
crw-rw-rw-. 1 root root 1, 8 Sep 29 12:08 random
我们还可以通过运行stat 查看主要和次要编号。这些数字显示在设备类型下:
[itcodingman@blogdemo dev]# stat /dev/random
File: /dev/random
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: 6h/6d Inode: 10216 Links: 1 Device type: 1,8
Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:random_device_t:s0
Access: 2021-09-16 11:52:35.644848848 -0400
Modify: 2021-09-16 11:52:35.644848848 -0400
Change: 2021-09-16 11:52:35.644848848 -0400
Birth: -
5. 为什么有这么多符号链接?
*/dev/*目录中的某些设备文件不会显示为块设备或字符设备。相反,列出了符号链接:
[itcodingman@blogdemo dev]# ls -lhaF| grep ^l
lrwxrwxrwx. 1 root root 3 Sep 17 09:07 cdrom -> sr0
lrwxrwxrwx. 1 root root 11 Sep 17 09:06 core -> /proc/kcore
lrwxrwxrwx. 1 root root 13 Sep 17 09:06 fd -> /proc/self/fd/
lrwxrwxrwx. 1 root root 12 Sep 17 09:06 initctl -> /run/initctl|
lrwxrwxrwx. 1 root root 28 Sep 17 09:06 log -> /run/systemd/journal/dev-log=
lrwxrwxrwx. 1 root root 4 Sep 17 09:06 rtc -> rtc0
lrwxrwxrwx. 1 root root 15 Sep 17 09:06 stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Sep 17 09:06 stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Sep 17 09:06 stdout -> /proc/self/fd/1|
/dev目录下的符号链接有很多原因。例如,当查看*/dev/stdin时,我们看到它指向/proc/self/fd/0*。这是因为 /proc/self 目录位于 /proc 文件系统上。当进程读取*/proc/self时,它会使用其进程 ID 获取有关自身的信息。所以/proc/self*目录也是一个符号链接:
[itcodingman@blogdemo dev]# ls -l /proc/self/fd/0
lrwx------. 1 root root 64 Sep 17 12:02 /proc/self/fd/0 -> /dev/pts/0
子目录 ../fd 表示文件描述符。文件描述符是对文件或输入/输出 (IO) 资源的唯一引用。它有助于识别进程必须处理的文件或输入/输出资源。例如,/dev/pts/0 目录存在于内存中。目录下的内容是允许应用程序接收输入和显示输出的伪终端:
[itcodingman@blogdemo pts]# ls -l /dev/pts
total 0
crw--w----. 1 root tty 136, 0 Sep 17 12:33 0
c---------. 1 root root 5, 2 Sep 17 09:06 ptmx
此外, /dev目录下符号链接的另一个原因是名称更改。一些应用程序可能仍然引用旧文件名,因此使用符号链接:
[itcodingman@blogdemo dev]# ls -l
total 0
lrwxrwxrwx. 1 root root 3 Sep 17 09:07 cdrom -> sr0