dir*_*obs 12 filesystems stat devices inode
设备文件本身不是文件。它们是在类 Unix 操作系统中使用设备的 I/O 接口。它们不使用磁盘空间,但是,它们仍然使用stat
命令报告的 inode :
$ stat /dev/sda
File: /dev/sda
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 6h/6d Inode: 14628 Links: 1 Device type: 8,0
Run Code Online (Sandbox Code Playgroud)
设备文件是否使用文件系统中的物理inode 以及它们为什么需要它们?
Aus*_*arn 16
简短的回答是,只有当您有物理文件系统支持时才/dev
会这样做(如果您使用的是现代 Linux 发行版,则可能没有)。
长答案如下:
这一切都可以追溯到最初的 UNIX 哲学,即一切都是文件。这种理念是使 UNIX 如此通用的部分原因,因为您可以从用户空间直接与设备交互,而无需在应用程序中使用特殊代码来直接与物理硬件对话。
最初,/dev
它只是另一个具有众所周知名称的目录,您可以在其中放置设备文件。一些 UNIX 系统仍然采用这种方法(我相信 OpenBSD 仍然采用这种方法),并且您通常可以判断一个系统是否是这样的,因为对于系统实际上没有的设备,它会有很多设备文件(例如,每个系统都没有的文件)每个可能的磁盘上的可能分区)。这以使用更多磁盘空间为代价节省了内存空间和启动时间,这对于早期系统来说是一个很好的权衡,因为它们通常非常受内存限制并且速度不是很快。这通常称为具有静态/dev
.
在现代 Linux 系统(我相信还有 FreeBSD 和可能是最新版本的 Solaris)上,/dev
是一个由内核填充的临时内存文件系统(或者 udev,如果你使用 Systemd,因为它们不相信内核几乎可以做任何事情) . 这以一些内存(通常小于几 MB)和非常小的处理开销为代价节省了一些磁盘空间。它还具有许多其他优点,其中最大的优点之一是更容易检测热插拔硬件。这通常称为具有动态/dev
.
但在这两种情况下,设备节点都是通过常规 VFS 层访问的,根据定义,这意味着它们必须有一个 inode(即使它是一个虚拟节点,它只是存在以便stat()
像它应该的那样工作。从实际角度来看,这对使用动态的系统的影响为零,/dev
因为它们只是将 inode 存储在内存中或根据需要生成它们,而在/dev
静态的情况下几乎为零影响,因为 inode 在磁盘上占用的空间接近零,并且大多数文件系统要么没有上限它们或提供的方式比任何人都可能需要的要多。
Hau*_*ing 15
设备文件也有权限,它们存储在 inode 中。
Bar*_*mar 12
目录只是从文件名到 inode 的映射,因此名称所指的所有内容(文件、符号链接、设备、FIFO、套接字)都必须在 inode 中,没有其他地方可以放置它。
有关设备的信息存储在 inode 中。主要和次要设备号都在那里,权限、时间戳等也是如此。表明它是块或字符设备而不是常规文件的类型字段存储在那里。
设备的 inode 根本不使用包含文件块映射的字段。