所以我最近问这个问题,这导致我运行这个命令:
$ du -sk /dev/*
它输出大约 353 个不同的条目,如下所示:
0 /dev/sdt 0 /dev/标准错误 0 /dev/标准输入 0 /dev/标准输出 0 /dev/系统跟踪 0 /dev/tty 0 /dev/tty.蓝牙传入端口 0 /dev/tty.蓝牙调制解调器 0 /dev/ttyp0 0 /dev/ttyp1
有人可以详细说明这些目录是什么吗?为什么它们都是零字节?
答案1
他们是设备节点:
在类 Unix 操作系统中,设备文件或特殊文件是设备驱动程序的接口,它像普通文件一样出现在文件系统中。 [...]它们允许软件使用标准输入/输出系统调用与设备驱动程序交互,这简化了许多任务并统一了用户空间 I/O 机制。
换句话说,它们不是普通文件,尽管它们可能被组织到常规目录中。从历史上看,这些是在磁盘上创建的实际节点,其中包含一些内核信息。在当代的 Linux 系统上,这已被特殊的内存文件系统所取代,开发者文件系统,很像/proc
内存中的 procfs 和/sys
内存中的 sysfs。这就是为什么它们被列为具有 0 字节——它们是与内核的直接接口。
至于它们是什么,维基百科文章中有一个关于“命名约定”的部分,尽管这不具有约束力或通用性(它们可以从用户空间重命名,例如,RedHat/Fedora 派生的 udev 安装将这样做)。您可以从主要/次要数字中获得另外一些线索,显示在日期左侧的两列中ls -l
(其中“大小”所在)。这些数字对应于/sys/dev/block
或中的条目/sys/dev/char
。
请记住,大多数这些设备都是虚拟的并且可能与硬件的任何特定部分几乎没有关系或完全没有关系。例如,tty
设备是虚拟终端,您可以使用 ctrl-alt-F[N] 进行导航;pt
devices(有一个目录)是 GUI 模拟器中使用的伪终端。还有各种其他更深奥的东西,例如共享内存段(在shm
- 这些有实际大小)。同样,目的只是为了提供一个标准化的内核接口; “设备”的概念非常松散。