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. 返回文件描述符

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

当我们尝试打开/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硬盘。
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状态的最后改变时间等。

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

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

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

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

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

在这里插入图片描述

Inode相关命令
在 /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):允许执行文件,或允许进入目录并访问其包含的文件和子目录。
  • 所以 验证权限时 需要递归向上级目录验证权限

示例:

-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             # 使用数字设置权限

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel 打开后提示:MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用...

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用,但无法列出导致循环的引I用。请尝试编辑上次输入的公式,或利用“撤消”命令删除该公式,如下图&…

微服务(基础篇-003-Nacos)

目录 Nacos注册中心(1) 认识和安装Nacos(1.1) Nacos快速入门(1.2) 服务注册到Nacos(1.2.1) Nacos服务分级存储模型(1.3) 配置集群(1.3.1) 根据集群修改…

如何用Airtest脚本连接无线Android设备?

之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备,它的关键点在于,需要先 adb connect 一次,才能点击 connect 按钮无线连接上该设备: 但是有很多同学,在使用纯Airtest脚本的形式连接无线设备时&#xff0c…

K8s-网络原理-下篇

引言 本文是《深入剖析 K8s》的学习笔记,相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取,欢迎Star! K8s 的网络隔离: NetWorkPolicy K8s 如何考虑容器之间网络的“隔离” -> NetWorkPolicy 以下是一个 NetWorkPolicy 的定义…

Android开发 --- Android12外部存储权限问题

1.问题 Android12使用如下权限&#xff0c;将不会获得读写文件的权限 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /> 2.解决 if (!Environment.isExternalStorageManager()) {Intent intent new Intent(Settings.ACTION_M…

将数据转换成xml格式的文档并下载

现在有一个实体类对象的集合&#xff0c;需要将它们转换为xml文档&#xff0c;xml文档就是标签集合的嵌套&#xff0c;例如一个学生类&#xff0c;有姓名、年龄等&#xff0c;需要转换成一下效果&#xff1a; <student><age>14</age><name>张三</na…

Java学习Day3

一道简单练习题&#xff0c;对编号进行随机排名 import java.util.Random; import java.util.Scanner;public class Main {public static void rand(int[] a,int n){Random rnew Random();for (int i0;i<n;i){int rrr.nextInt(n);int tempa[i];a[i]a[rr];a[rr]temp;}}publ…

时间戳的转换-unix时间戳转换为utc时间(python实现)

import datetimetimestamp = 1711358882# 将时间戳转换为UTC时间 utc_time = datetime.datetime.utcfromtimestamp(timestamp)# 格式化并输出时间 formatted_time = utc_time.strftime(%Y-%m-%d %H:%M:%S) print(formatted_time)同样:UTC如何转换为unix时间戳 from datetime …

如何利用python 把一个表格某列数据和另外一个表格某列匹配 类似Excel VLOOKUP功能

环境: python3.8.10 Excel2016 Win10专业版 问题描述: 如何利用python 把一个表格某列数据和另外一个表格某列匹配 类似Excel VLOOKUP功能 先排除两表A列空白单元格,然后匹配x1表格和x2表格他们的A列,把x1表格中A列A1-A810范围对应的B列B1-B810数据,匹配填充到x2范围…

C语言程序与设计——预处理命令

宏 在C语言中宏有三种形式: 定义符号常量定义傻瓜表达式定义代码段 在使用宏的过程中需要注意的是&#xff0c;宏的作用仅仅是在预处理阶段对代码进行替换&#xff0c;而非进行运算&#xff0c;所以在使用时&#xff0c;如果出现了我们预期之外的结果&#xff0c;很有可能是宏…

Spring IoC DI(1)

IoC & DI入门 Spring 通过前面的学习, 我们知道了Spring是一个开源框架, 它让我们的开发更加简单. 它支持广泛的应用场景, 有着活跃且庞大的社区, 这就是Spring能够长久不衰的原因. 但是这个概念还是比较抽象. 可以用更具体的话描述Spring, 那就是: Spring是包含了众多…

Jakarta项目介绍

概述 在升级Spring Boot到3.0版本以后&#xff0c;或升级Spring到6.0版本以上&#xff0c;会发现应用编译失败或启动失败等问题。 经过排查不难得知&#xff0c;Spring 6或Spring Boot 3&#xff08;实际上依赖于Spring 6&#xff09;不再支持javax.开头的一系列依赖包&#…

人工智能的迷惑行为:AI世界的隐秘角落

人工智能迷惑行为大赏 在当今数字化时代&#xff0c;人工智能技术的飞速发展给我们的生活带来了诸多便利和可能性&#xff0c;但同时也伴随着一些令人困惑的现象和行为。本文将深入探讨人工智能的迷惑行为&#xff0c;揭示AI世界中的隐秘角落&#xff0c;让我们一同探寻这个充…

《深入浅出LLM 》(二):大模型基础知识

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

CPU缓存行及伪共享

CPU Cache概述 随着CPU的频率不断提升&#xff0c;而内存的访问速度却没有质的突破&#xff0c;为了弥补访问内存的速度慢&#xff0c;充分发挥CPU的计算资源&#xff0c;提高CPU整体吞吐量&#xff0c;在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大&#xff0c;…

代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机II ,55. 跳跃游戏 , 45.跳跃游戏II

贪心&#xff1a;只要把每一个上升区间都吃到手&#xff0c;就能一直赚 class Solution { public:int maxProfit(vector<int>& prices) {int res 0;for(int i 1;i< prices.size();i){int diff prices[i] - prices[i-1];if(prices[i] > prices[i-1]){res d…

蓝桥杯练习题总结(二)dfs题、飞机降落、全球变暖

目录 一、飞机降落 二、全球变暖 初始化和输入 确定岛屿 DFS搜索判断岛屿是否会被淹没 计算被淹没的岛屿数量 三、军训排队 一、飞机降落 问题描述&#xff1a; N架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 时刻到达机场上空&#xff0c;到达时它的剩余…

[Linux]文件缓冲区

文件fd 输出重定向除了用dup2()改变数组下标外&#xff0c;还可以用命令来完成 所有的命令执行&#xff0c;都必须有操作系统将其运行起来变成进程&#xff0c;然后根据>>, <<来判断是输入重定向&#xff0c;还是输出重定向。 缓冲区 之所以有缓冲区&#xff0…

JavaScript 基础、内置对象、BOM 和 DOM 常用英文单词总结

一提到编程、软件、代码。对于英语不是很熟悉的同学望而却步。其实没有想像中的难么难&#xff0c;反复练习加上自己的思考、总结&#xff0c;会形成肌肉记忆。整理一下&#xff0c;初学者每天30遍。 1、JavaScript 基础语法 break&#xff1a;中断循环或 switch 语句的执行。…