Linux File System (File operations)

Linux File System (File operations)

inode结构主要有以下成员:
// 必须有的

  • mode:类型+权限
  • 文件大小
  • 引用计数
  • 块地址

// 肯定没有的

  • 文件名:一个文件可以有多个文件名,文件的文件名不存在inode里

// 可以有的

  • 时间戳,一般不更新访问时间,维护设备寿命

inode number 在一个文件系统中是唯一的

  • 硬链接不能跨文件系统
  • 软链接可以跨文件系统

硬链接(Hard Link)

  • 定义:硬链接是指多个文件名指向同一个 inode(索引节点)。
  • 特点:
    • 共用 inode:所有硬链接共享相同的 inode 号。
    • 文件访问:无论通过哪个链接访问文件,都是访问同一个数据块。
    • 限制:
      • 不能链接目录,以防止形成循环结构。
      • 不能跨文件系统,因为 inode 在不同文件系统中是独立的。

软链接(Symbolic Link 或 Symlink)

  • 定义:软链接是一个独立的文件,内容是另一个文件的路径。
  • 特点:
    • 不同 inode:软链接有自己的 inode,指向目标文件的路径。
    • 灵活性:可以链接目录和跨文件系统的文件。
    • 依赖性:如果目标文件被删除或移动,软链接将失效(成为“断链”)。

Two files opened by a process

举一个例子:
假设web server正在写一个access.log
此时开发人员想看一下access.log,使用less access.log命令
因此打开俩次这个文件,生成俩个file table entries(打开一个文件就是一个file table entry)
但是只有一个inode entry,file size存在inode中,所以开发人员是可以看到access.log的变化的。

后面也会细说,其实文件操作主要涉及三个表结构,文件描述符表、文件表和inode表。

文件描述符

有三个层次:

  1. file descriptor table (每个进程一个的)
  2. file entry table, w.file offset (全局)
  3. indoe table, w/file size (全局)

文件状态通常在file table中,只有FD_CLOEXEC放在file descriptor table中.
图示一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
┌─────────────────────────────────────────────────────┐
│ Process Table │
├─────────┬─────────┬─────────┬─────────┬────────────┤
│Process 1│Process 2│Process 3│ ... │Process N │
│ PID 1 │ PID 2 │ PID 3 │ │ PID N │
│ │ │ │ │ │
│ fd[0]─┐ │ fd[0]─┐ │ fd[0]─┐ │ │ fd[0]─┐ │
│ fd[1]─┼─│►fd[1]─┼─│►fd[1]─┼─│► ... │ fd[1]─┼─┐ │
│ fd[2]─┘ │ fd[2]─┘ │ fd[2]─┘ │ │ fd[2]─┘ │ │
└─────────┴─────────┴─────────┴─────────┴────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────┐
│ File Table │
├─────────┬─────────┬─────────┬─────────┬────────────┤
│File Ptr1│File Ptr2│File Ptr3│ ... │File PtrN │
│f_count=2│f_count=1│f_count=3│ │f_count=1 │
│f_pos │f_pos │f_pos │ │f_pos │
│f_flags │f_flags │f_flags │ │f_flags │
│f_mode │f_mode │f_mode │ │f_mode │
└────┬────┴────┬────┴────┬────┴─────────┴─────┬──────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ Inode Table │
├─────────┬─────────┬─────────┬─────────┬────────────┤
│Inode 1 │Inode 2 │Inode 3 │ ... │Inode N │
└─────────┴─────────┴─────────┴─────────┴────────────┘

open(2)twice vs. open(2) then dup(2)/fork(2)


Linux File System (File operations)
https://arcanus.red/2024/12/07/Linux-File-System-File-operations/
作者
Helix
发布于
2024年12月7日
许可协议