メインコンテンツへスキップ
  1. ノート/
  2. Linux/

Linux ファイル FILE

·3579 文字·8 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml
この記事は中国語版をもとにした日本語版メモです。コマンド、コード、数式、画像リンクは原文の意味を壊さないように保持し、説明文と見出しを日本語向けに整理しています。

ファイル描述符
#

ファイル在 Linux システム中通过ファイル描述符与内核进行交互。打开ファイル时,Linux 内核会执行以下手順:

  1. システム调用:当用户程序调用 open() 打开ファイル时,它会触发一个システム调用,通过内核与硬件进行交互。
  2. ファイルシステム操作:内核会查找ファイルパス对应的 inode 结构,inode 存储ファイル的元数据(如ファイル大小、权限、数据块位置等)。
  3. 缓存与メモリ映射:内核会将ファイル数据从磁盘加载到メモリ中的缓存(page cache)中,以加速后续的ファイル读取操作。もしファイル很大,内核可能会使用メモリ映射(mmap())将ファイル映射到プロセス的虚拟地址空间。

在 Linux 中,ファイル共享主要指多个プロセス或多个スレッド对同一ファイル的並行访问。ファイル共享不仅仅包括並行访问ファイル内容,还涉及对ファイル描述符和ファイル锁定的管理。

3.1 ファイル描述符和共享
#

每个プロセス在打开ファイル时,都会获取一个ファイル描述符(file descriptor)。ファイル描述符是内核中的一个索引,它指向一个 file 结构,この结构包含了ファイル的状态和偏移量等信息。多个プロセスもし打开相同的ファイル,它们会共享ファイル描述符,指向同一个ファイル结构。

内核在处理ファイル描述符时会采用 引用计数,即多个プロセス或スレッド共享ファイル描述符时,只要有一个プロセス关闭ファイル描述符,内核才会真正释放相关资源。

3.2 ファイル锁定与並行访问
#

为了避免ファイル的並行写入产生冲突,Linux 提供了ファイル锁(flock)机制,プロセスできます对ファイル加锁,确保在某一时刻只有一个プロセス对ファイル进行写操作。

  • ファイル锁的类型
  • 共享锁(Shared Lock):多个プロセスできます同时获得共享锁,适用于只读操作。
  • 独占锁(Exclusive Lock):只有一个プロセスできます获得独占锁,适用于写操作。

通过 flock()fcntl() システム调用,程序できます请求对ファイル的共享或独占锁。

3 .3 内核中的ファイル共享实现
#

内核通过 struct file 结构来实现ファイル共享。每当一个プロセス打开一个ファイル时,内核会为该ファイル分配一个 file 结构体,并将该ファイル的描述符映射到プロセス的ファイル表中。もし多个プロセス打开相同的ファイル,它们共享この file 结构体。プロセス间共享ファイル时,内核会确保数据的同步性和一致性,避免数据竞争和冲突。

  1. メモリ映射ファイル(mmap):もし多个プロセス必要访问同一个ファイル的同一部分,Linux 提供了メモリ映射ファイル机制(mmap()),这使得プロセスできます将ファイル内容映射到プロセス的地址空间,プロセス之间できます直接通过共享メモリ区域访问ファイル数据。メモリ映射ファイル适合高效的ファイル共享和プロセス间通信(IPC)。

  2. 读写锁(Read-Write Locks):内核也提供了一些同步机制,如读写锁,确保对ファイル的並行访问不会引起数据不一致。


indoe
#

是的,正如你所说,在 Linux 中,几乎所有的资源都被视为ファイル,这包括普通ファイル、ディレクトリ、设备ファイル、管道、套接字等。这种“万物皆ファイル”的设计理念使得 Linux 操作システム对ファイル的管理变得统一且高效。与ファイル紧密相关的一个重要概念是 inode

什么是 inode?
#

inode 是 Linux ファイルシステム中的一个重要数据结构,它存储了ファイル的元数据(metadata),即与ファイル内容无关的信息。每个ファイル(或ディレクトリ)在ファイルシステム中都有一个唯一的 inode 来描述该ファイル的属性。inode 并不包含ファイル的名称或ファイル的实际数据内容,而是包含了指向数据块的指针、ファイル的大小、权限、作成时间、変更时间等重要信息。

inode 的主要内容
#

一个 inode 通常包含以下内容:

  1. ファイル类型:たとえば普通ファイル、ディレクトリ、符号链接、设备ファイル等。
  2. ファイル权限:ファイル的读、写、执行权限(たとえば 755、644 等)。
  3. ファイル拥有者:ファイル的所有者 UID 和 GID(用户 ID 和组 ID)。
  4. ファイル大小:ファイル的字节数。
  5. 时间戳
    • 作成时间(ctime):inode 被作成或変更的时间。
    • 変更时间(mtime):ファイル内容最後に一次変更的时间。
    • 访问时间(atime):ファイル最後に一次被访问的时间。
  6. 数据块指针:指向ファイル数据的指针,表示该ファイル存储的数据位于磁盘的哪个位置。这些指针分为直接指针、间接指针等。
  7. 硬链接计数:指示指向此 inode 的硬链接数量。

ファイル与 inode 的关系
#

  • 每个ファイル(无论是普通ファイル还是ディレクトリファイル)都有一个 唯一的 inode,这是ファイル的核心标识。ファイル名只是ファイルシステム中某个ディレクトリ项(directory entry)中的一部分,它与 inode 关联起来。在 Linux 中,ファイル名和 inode 之间的映射关系是通过 ディレクトリ项(directory entry)来实现的。

    • ディレクトリ项(如 readdir() 返回的内容)将ファイル名与其对应的 inode 号关联起来。ファイル名是ディレクトリ中的一个条目,而 inode 号则指向存储ファイル元数据的 inode 结构。

inode 如何工作
#

当你执行以下操作时,操作システム如何利用 inode 来实现ファイル访问:

  1. 打开ファイル:当你打开一个ファイル时,操作システム会先查找该ファイル的ディレクトリ项,找到ファイル名对应的 inode 号。

  2. 读取ファイル内容:一旦找到 inode,操作システム就知道ファイル数据的存储位置(通过 inode 中的块指针)。它会使用这些指针从磁盘中加载ファイル内容到メモリ中。

  3. ファイル写入:当ファイル内容被変更时,内核会更新 inode 中的时间戳,并可能変更数据块指针。もしファイル增长或减少,内核会根据必要更新 inode 的大小字段。

ファイル和 inode 的生命周期
#

  1. ファイル作成:当你作成一个新ファイル时,内核会为该ファイル分配一个新的 inode,并在磁盘上为ファイル分配数据块。ファイル名会被存储在某个ディレクトリ中,并与 inode 号关联。

  2. ファイル削除:当削除ファイル时,ファイル名会从ディレクトリ中移除,内核会减少 inode 的硬链接计数。当硬链接计数为零时,inode 和数据块会被释放。

  3. 硬链接:硬链接是一个ファイル名和一个 inode 号的额外映射。硬链接作成后,多个ファイル名できます指向同一个 inode。这时,削除某个ファイル名不会立即释放 inode 或数据块,只有当所有硬链接都削除后,inode 才会被释放。

  4. 软链接(符号链接):符号链接(symlink)是一种特殊类型的ファイル,它包含指向另一个ファイルパス的字符串,而不是直接指向 inode。通过符号链接,できます间接访问ファイル。

inode 与ディレクトリ的关系
#

ディレクトリ也是ファイル。在 Linux 中,ディレクトリ实际上是一个特殊的ファイル,它的内容是ディレクトリ项,每个ディレクトリ项包含一个ファイル名和其对应的 inode 号。そのため,ディレクトリ与ファイル的关系也是通过 inode 来建立的。

  1. ディレクトリ的 inode:ディレクトリ本身也有一个 inode,它包含了ディレクトリ的元数据(如权限、拥有者等)。然而,ディレクトリ的内容并不是ファイル数据,而是ディレクトリ项,这些ディレクトリ项将ファイル名映射到其对应的 inode。

  2. ディレクトリ项与 inode:当你確認一个ディレクトリ时,内核会通过ディレクトリ项中的 inode 号来访问每个ファイル的 inode,进而获得ファイル的元数据和实际数据。

inode 的限制与优化
#

  1. ファイルシステム的 inode 数量:每个ファイルシステム在格式化时会指定一个 inode 的数量。この数量决定了ファイルシステム最多能作成多少个ファイル。通常情况下,inode 的数量与磁盘的容量相关,但它也受到ファイルシステム设计的影响。

  2. ファイルシステム优化:为了解決 inode 数量不足的問題,许多现代ファイルシステム(如 ext4、XFS 等)采用了动态 inode 分配机制,也つまり说,在ファイルシステム作成后できます根据必要扩展 inode 的数量。

まとめ
#

  • inode 是 Linux ファイルシステム中每个ファイル(或ディレクトリ)都有的一个数据结构,存储了ファイル的元数据(如权限、大小、时间戳等)以及指向ファイル数据块的指针。
  • ファイル名inode 是通过 ディレクトリ项 关联起来的。ファイル名只是一个标识符,而 inode 存储了实际的ファイル信息。
  • ディレクトリファイル 本身也是特殊的ファイル,包含了ファイル名和 inode 号的映射关系,ディレクトリ中的每个条目指向一个ファイル的 inode。
  • 硬链接 允许多个ファイル名指向同一个 inode,而 符号链接 则是指向另一个ファイルパス的引用,不直接指向 inode。

通过 inode,Linux ファイルシステム能够高效地管理ファイル的存储和访问,提供了ファイル的元数据和数据的分离,极大地提升了ファイル管理的灵活性和性能。

関連記事