文件的文件名和 inode 之间的关系

Tim*_*Tim 1 filesystems

对于一个文件,据说它的“文件名”指向它的 inode。这是否意味着它的“文件名”是一个具有或指向其 inode 的指针的数据结构?

也有人说它的“文件名”是一个字符串。这个字符串是否存储在某个地方(也许也在一个文件中)?

这两个说法互相矛盾吗?

硬链接不能链接到不同文件系统上的文件,而软链接可以。是否因为文件名指针不能指向不同文件系统上的 inode,而存储在 inode 中的指针可以指向不同文件系统上的文件内容?

cou*_*ode 9

文件名是目录中的一个条目。本质上,目录是两列表,其中第 1 列是文件名,第 2 列是 inode 编号。(好吧,对于现代文件系统来说,这个故事更复杂,但为了解释就可以了。) inode 编号指向 inode 表;此表对用户态进程不可见,但您可以通过调用stat()lstat()系统调用来查询 inode 。inode 包含文件的元数据,例如所有权、访问权限、访问、修改和更改时间等。最重要的是,inode 包含或指向在磁盘上查找文件的位置的信息。

另一个重要的条目是链接数,因为可以从许多地方指向 inode - 这些被称为hardlinks。如果您使用rm(即使用unlink()系统调用)删除文件,则仅删除目录中的条目,并减少 inode 的链接计数。只有当它达到 0 时,与 inode 相关联的磁盘空间和 inode 本身才会被释放以供进一步重用。

所以:文件名是一个字符串,指向发生在目录的数据结构中。

硬链接不能链接到不同文件系统上的文件,而软链接可以。是否因为文件名指针不能指向不同文件系统上的 inode,而存储在 inode 中的指针可以指向不同文件系统上的文件内容?

每个文件系统都有自己的 inode 表。inode 表中的条目只能严格引用“他们自己的”文件系统。因此,硬链接不能跨越文件系统边界。

软链接是一个非常不同的东西。本质上,它是一个包含文件名的小文件。如果一个进程打开一个符号链接,系统会跟随它并打开由该文件名引用的文件。由于软链接仅基于路径名,因此它们不受文件系统边界的限制。