【问题标题】:Unix File System: How are file names translated to disk sectors?Unix 文件系统:文件名如何转换为磁盘扇区?
【发布时间】:2014-05-09 20:15:39
【问题描述】:

一个非常基本的问题。当我尝试通过提供文件的完全限定路径来打开文件描述符时,执行的确切步骤顺序是什么。

我在找

  • 这是如何在 Linux 上工作的
  • 给定一个文件名 - 如何将其转换为 inode 和磁盘扇区
  • Linux 文件系统(特别是 ext3 和 ext4)是否维护某种文件名到 inode 的映射?

【问题讨论】:

  • 这是一个非常理智的好奇心,但您不应该关心磁盘扇区在文件系统中是如何组织的。内核中的文件系统驱动程序正在处理这个问题。

标签: linux operating-system filesystems ext4


【解决方案1】:

除了tmp's answer:

文件确实是inodes。

通常,给定文件在某个目录中有一些条目指向它的 inode。 Directories 是将名称映射到 inode,目录是一种文件。请参阅stat(2) 了解 inode 包含的内容(并且可以通过应用程序代码查询),尤其是各种文件类型(普通文件、目录、字符或块设备、fifo、符号链接......)。因此,目录通常是将字符串映射到 inode 的字典(以各种特定于文件系统的方式实现)。因此,在目录/bin/ 中,通常有一个条目将bash 关联到bash shell 的ELF 可执行文件的inode(即/bin/bash)。使用readdir(3) - 进而调用getdents(2)- 来读取目录中的条目。

一个给定的 inode 可能无法通过某个名称访问。当一个进程open(2)-ing 一个文件,然后unlink(2)-ing 它(同时保留打开的文件描述符)时,尤其会发生这种情况。这是制作临时文件的首选方式。 (当没有更多进程使用它们时,它们将由内核释放)。

一个给定的 inode 也可能有 几个 目录条目指向它。 (即一个文件有“多个名称”)link(2) 系统调用会发生这种情况。 (符号链接文件使用symlink(2) 创建)。

另请参阅 path_resolution(7) 和 unix file system & file system & ext2 & ext3 & ext4 & btrfs & comparison of file systems 维基页面。另请阅读这个旧的file system 描述(有些细节已经烂,但大体思路在这里,尤其是VFS 的作用)

【讨论】:

  • 文件名是如何映射到 inode 的?这是否发生在目录级别?例如打开文件“/home/bobo/foo/hello.txt”,文件名到inode的查找将完成4次(在'/'对于'home',在'/home'对于'bobo',在' /home/bobo' for 'foo', at '/home/bobo/foo' for hello.txt。一旦知道文件的inode - 它指向硬盘上的块。然后读取块的调用是由操作系统发出。这个文件名阻止解析是如何工作的?
  • 关注我给你的所有链接。
  • @AmitSharma:是的,文件名的循环会发生 4 次(在您的示例中),并且在每个级别(目录)上,内核都会检查用户是否具有对该目录的适当权限。但是,如果你真的想了解所有的概念和算法,你必须参考我提到的那本书。
【解决方案2】:

当我们调用“open(filepath)”时,内核会执行以下步骤:

  1. 将文件名转换为 inode。
  2. 为 inode 分配一个新的文件表条目,初始化各种东西(每个进程)。
  3. 分配用户文件描述符条目并存储到文件表条目(全局数据结构)中。
  4. 将用户文件描述符返回给调用者。

有关内部算法的完整信息,您可能需要参考莫里斯·巴赫 (Maurice J Bach) 的伟大经典著作 “UNIX 操作系统的设计”,其中详细描述了这些概念和实现。

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 2014-07-15
    • 2012-11-27
    • 2011-01-03
    • 2013-12-20
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多