Linux文件系统 底层原理

linux文件、目录、Inode

inode负责文件的元数据和数据存储,文件存储块负责实际数据的存储,而目录文件维护文件名和inode之间的联系。

1. 用户空间到内核空间

首先,当用户程序请求打开一个文件时(例如使用open系统调用),程序将文件路径名传递给操作系统。这是从用户空间向内核空间进行系统调用的过程。

2. 解析路径名

操作系统需要解析提供的路径名。如果路径是绝对路径,解析从根目录开始;如果是相对路径,则从当前工作目录开始。路径名可能包含多个组件,由斜杠(/)分隔。

3. 查找目录项

文件系统会逐级查找路径中的每个目录项。每个目录项都有一个关联的inode和文件名。从当前目录(或根目录)的inode开始,文件系统读取目录内容,寻找与第一个路径组件匹配的目录项。

4. 获得inode号

一旦找到了匹配的目录项,就会获得与之关联的inode号。如果路径中还有更多的组件,文件系统会使用这个inode号获取下一级目录的信息,并重复步骤3和4,直到找到最终文件名对应的inode号。

5. 读取inode结构

文件系统使用inode号来索引inode表,读取该文件的inode结构。inode结构包含了文件的元数据,如文件大小、权限、所有者以及指向文件实际数据块的指针。

6. 权限检查

在打开文件之前,系统会检查当前进程是否有足够的权限(基于inode中的权限信息)来执行请求的操作(读、写或执行)。

7. 创建文件描述符

权限检查通过后,内核会为该文件创建一个文件描述符(file descriptor)。文件描述符是一个非负整数,它在内核中唯一标识已打开的文件,并可被进程用来读写文件。

8. 返回文件描述符

最后,文件描述符会返回给用户空间的程序,程序接下来就可以使用这个文件描述符来进行文件读写等操作。

markdown 复制代码
当我们尝试打开/usr/local/a.txt这个文件时,操作系统会经历以下步骤:

1. 路径解析:
操作系统首先解析文件的路径。根据路径/usr/local/a.txt,它会从根目录开始查找。
首先,它会读取根目录/的内容,查找usr这个目录条目对应的inode号码。
一旦找到usr目录的inode,系统就会加载这个inode,并访问存储在usr目录下的`文件条目和子目录`的列表。
接着在usr目录下查找名为local的目录,并重复上述过程,即加载其inode,查找local目录下的内容。
最后在local目录的内容中找到名为a.txt的`文件条目`,并获取其对应的`inode号码`。

2. inode加载:
系统根据得到的inode号码,从磁盘上的`inode表`中加载a.txt文件的`inode结构`。
inode结构包含了文件的各种属性信息,如文件类型、权限、所有者、组、文件大小、时间戳(创建、修改、访问时间)以及指向文件实际数据的指针。

3. 权限检查:
不通过将返回一个错误,通常是"Permission denied"。

4. 文件打开:
一旦确认用户有相应的权限,系统会在内核中为该文件创建一个文件描述符(`整数`)。

有了文件描述符之后,就可以通过Linux提供的系统调用(如read(), write()等)来操作文件内容了。
文件的实际数据可能存储在硬盘的不同位置,inode中的`指针`会指向这些数据所在的数据块。
系统会根据需要从磁盘读取数据到内存中,或者将内存中的数据写入到磁盘。

5. 关闭文件:
完成对文件的操作后,程序会调用close()系统调用来关闭文件描述符。
关闭文件描述符后,相关资源会被释放,该文件描述符也可以被其他文件使用。
Linux文件目录
  • 绝对路径是从根目录(/)开始的完整路径,它可以唯一地标识一个文件或目录

  • 相对路径是相对于当前工作目录的路径

    cd: 改变当前工作目录
    pwd: 显示当前工作目录的路径
    ls: 列出指定目录下的文件和子目录 其实就是输出了目录文件的内容
    chdir: 改变当前工作目录
    getcwd: 获取当前工作目录的路径
    access: 判断文件是否存在或是否有指定的权限
    
Linux系统目录文件是什么?

在Linux中,目录是一种特殊类型的文件。它的主要作用是存储其他文件和子目录的索引。一个目录文件包含了一系列的条目,每个条目都连接着一个文件名到相应文件(或子目录)的inode号码。

  • 文件名:在该目录下的文件或子目录的名称。
  • inode号码:与每个文件名对应的inode的唯一标识符。这个inode号码指向文件系统中的inode表里的一个特定的inode
Linux系统文件种类有哪些?

在Linux操作系统中,几乎所有的外接设备都是以文件的形式表示和访问的。这一设计理念体现在Linux的常说原则"一切皆文件"(Everything is a file)上。无论是硬盘、USB驱动器、打印机还是其他外围设备,它们在Linux中通常都有对应的文件表示。这些设备文件通常位于/dev目录下

DT_REG:普通文件

DT_DIR:目录文件

DT_FIFO:命名管道

DT_SOCK:套接字文件

DT_CHR:字符设备文件

DT_BLK:块设备文件

DT_LNK:符号链接文件(软链接)

套接字文件:

本地套接字通常位于/tmp目录、/var/run目录,如:

  • /var/run/mysqld/mysqld.sock:MySQL
  • /proc/net/tcp:所有的TCP套接字文件
字符设备文件:

特点:

  • 数据按字符(字节)流处理。
  • 支持串行访问。
  • 通常用于像键盘、鼠标、串口和打印机这样的设备。

示例:

  • /dev/tty - 表示当前终端的控制终端。
  • /dev/null - 一个特殊的字符设备,任何写入它的数据都会被丢弃,读取它总是返回文件结束。
  • /dev/random/dev/urandom - 随机数生成器设备,提供随机数据。
  • /dev/ttyUSB0 - 第一个 USB 串行端口设备文件。
块设备文件:
特点:
  • 数据按块(通常是512字节或更大)处理。
  • 支持随机访问。
示例:
  • /dev/sda - 第一个SCSI或SATA硬盘。
  • /dev/sdb, /dev/sdc 等 - 其他SCSI或SATA硬盘。
bash 复制代码
ls -l命令查看/dev目录下的内容来区分字符设备和块设备
brw-rw---- 1 root disk 8, 0 Mar 10 08:53 /dev/sda
crw-rw-rw- 1 root tty 5, 0 Mar 10 09:08 /dev/tty
Linux文件按块存储

在Linux文件系统中,一个数据块通常只用于存储单个文件的数据。每个数据块被分配给文件时,它将专门用于该文件的内容,并且不会与其他文件共享。

块的大小有1 KB、2 KB、4 KB或更大,当一个文件小于一个块的大小时,产生的未使用空间称为内部碎片。

Linux系统 Inode表是什么?

inode表是一个数据结构,它位于Unix和类Unix文件系统中,用来存储文件的元数据信息(除了文件名和目录信息之外的所有信息)。每个文件或目录在文件系统中都有一个唯一的inode,并且有一个对应的条目在inode表中。

每个inode条目通常包含以下信息:

  • 文件的类型:比如普通文件、目录、符号链接、字符设备、块设备等。

  • 权限位:指明哪些用户对该文件有读、写、执行权限。

  • 所有者:文件的所有者的用户ID(UID)。

  • 所属组:文件的所属组的组ID(GID)。

  • 文件大小:文件的字节大小。

  • 时间戳:文件的最后访问时间、最后修改时间、inode状态的最后改变时间等。

  • 链接计数:指向该文件的硬链接数量。

  • 数据块指针:指向文件实际内容的数据块的指针。这可能包括直接指针、间接指针、双重间接指针和三重间接指针。

    markdown 复制代码
    `直接指针`: 这些指针直接指向包含文件数据的硬盘块。在inode中,通常有多个直接指针,每个指向一个不同的数据块。小文件的数据可能完全由直接指针引用。
    
    `间接指针`: 一旦直接指针不足以引用文件数据时,就会使用间接指针。一个间接指针指向一个硬盘块,而这个硬盘块完整地被用作存储其他指针的数组,这些新指针各自指向实际包含文件数据的硬盘块。
    
    `双重间接指针`: 当一个间接指针还不够时,双重间接指针会被利用
    
    `三重间接指针`: 在极少数情况下,如果文件非常大,即使双重间接指针也不够用时,就会使用到三重间接指针
    
    实际数据:
    所以Linux文件系统是通过这种`索引分配`方法来管理文件的数据块
    有些文件系统(FAT32,EXFAT)是通过`链接分配`来管理的
    `顺序分配`比较少用,因为容易产生碎片

当文件系统被格式化时,inode表会被创建并预分配一定数量的inode,这些inode会占据连续的空间。每个inode都有一个数字标识符(称为inode号),文件系统通过这个inode号来引用特定的文件元数据。

文件名与inode之间的映射存储在目录项中。目录本身也是一种特殊的文件,它的内容包含了文件名和相应的inode号码。这样设计可以允许多个文件名(硬链接)指向同一个inode,因此同一个文件可以出现在多个位置,但是其元数据实际上只存储一份。

Inode相关命令
bash 复制代码
在 /home/user 目录下查找 inode 号为 123 的文件:
find /home/user -inum 123

查看 filename的 inode 号
ls -i filename
硬链接和软链接

硬链接:

  1. 定义:硬链接是指向文件inode的直接指针。创建硬链接时,实际上是在不同的位置创建了相同的文件名,这些文件名指向同一个inode号。
  2. 硬链接像是给文件创建了一个额外的"别名",与原始文件完全等同。

软链接:

  1. 定义:软链接(符号链接)是一个特殊类型的文件,它包含了另一个文件的路径名信息。软链接文件自己有独立的inode和数据块,数据块中存储的是其所指向的目标文件的路径名。
  2. 属性独立:软链接与它所指向的文件有着不同的权限、所有者和大小信息。软链接的大小通常是它所包含的路径字符串的字符数。
  3. 限制:软链接可以跨文件系统创建,因为它们通过路径名而非inode号来引用文件。软链接可以指向目录,也可以指向不存在的文件或目录。
  4. 删除行为:删除软链接不会影响目标文件。如果删除了目标文件,软链接将成为一个悬空链接,也就是说它不再指向一个有效的文件,尝试访问该软链接将产生错误。
Linux文件权限

每个文件和目录都有三组权限:

  1. 所有者(Owner)权限:文件的创建者通常是其所有者,并且可以设置文件的权限。
  2. 组(Group)权限:文件属于一个用户组,该组内的所有用户共享相同的权限。
  3. 其他用户(Others)权限:系统上的其他用户的权限。

每组权限三种类型:

  • 读(Read, r):允许读取文件内容或列出目录中的内容。
  • 写(Write, w):允许修改文件内容或向目录中添加/删除文件。
  • 执行(Execute, x):允许执行文件,或允许进入目录并访问其包含的文件和子目录。
  • 所以 验证权限时 需要递归向上级目录验证权限

示例:

bash 复制代码
-rwxr-xr-- 1 user group 1024 Mar 10 08:53 example.txt
第一个字符表示文件类型(例如-代表普通文件,d代表目录,l代表符号链接等)。

chmod u=rwx,g=rx,o=r example.txt  # 使用字母设置权限
chmod 754 example.txt             # 使用数字设置权限
相关推荐
只对您心动1 小时前
【C高级】有关shell脚本的一些练习
linux·c语言·shell·脚本
lldhsds1 小时前
linux下的分布式Minio部署实践
linux·minio·分布式对象存储
OH五星上将2 小时前
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上
linux·嵌入式硬件·harmonyos·openharmony·鸿蒙开发·liteos-a·鸿蒙内核
DC_BLOG3 小时前
IPv6(四)
运维·服务器·网络·ip
shelby_loo3 小时前
通过 Docker 部署 MySQL 服务器
服务器·mysql·docker
ZBzibing3 小时前
[游戏技术]L4D服务器报错解决
服务器·游戏
沈艺强3 小时前
伊犁linux 创建yum 源过程
linux·运维·服务器
明朝百晓生3 小时前
无线感知会议系列【3】【基于WiFi和4G/5G的非接触无线感知:挑战、理论和应用-1】
网络·5g
拾光师3 小时前
linux命令行快捷键
linux·运维·服务器
Dola_Pan5 小时前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器