Linux文件系统 底层原理

news2024/9/21 4:39:29

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.coloradmin.cn/o/1543873.html

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

相关文章

Linux账号管理与ACL权限设置

文章目录 Linux的账户和用户组用户标识符:UID与GID用户账号用户组:有效与初始用户组groups,newgrp 账号管理新增与删除用户:useradd、相关配置文件、passwd、usermod、userdel用户功能:id、finger、chfn、chsh新增与删…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置(模板页面还需要修改) 总结 1 vmware exporter安装配置 …

文件操作3

随机读写数据文件 一、随机读写原理 在我们写数据时,有一个光标不断的在随着新写入的数据往后移动; 而读数据时,也有一个看不见光标,随着已经读完的数据,往后移动 这里的文件读写位置标记——可以想象成图形界面里的…

人、机中的幻觉和直觉

对于人类而言,幻觉和直觉是两种不同的心理现象。幻觉是一种错误的感知或体验,而直觉是一种在没有明显依据的情况下产生的直观认知。这两种概念在心理学和认知科学中具有不同的意义和研究对象。 人类幻觉是指个体在感知或体验上出现的错误,即看…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位? 如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素(如click,clear,send_keys) 二、隐藏元素 如下图有个输入框…

C语言例4-9:格式字符s的使用例子

代码如下&#xff1a; //格式字符s的使用例子 #include<stdio.h> int main(void) {printf("%s,%5s,%-5s\n","Internet","Internet","Internet");//以三种不同格式&#xff0c;输出字符串printf("%10.5s,%-10.5s,%4.5s\n&q…

电脑卸载软件怎么清理干净?电脑清理的5种方法

随着我们在电脑上安装和卸载各种软件&#xff0c;很多时候我们会发现&#xff0c;即使软件被卸载&#xff0c;其残留的文件和注册表项仍然存在于电脑中&#xff0c;这不仅占用了宝贵的磁盘空间&#xff0c;还可能影响电脑的性能。那么&#xff0c;如何确保在卸载软件时能够彻底…

【iOS ARKit】播放3D音频

3D音频 在前面系列中&#xff0c;我们了解如何定位追踪用户&#xff08;实际是定位用户的移动设备&#xff09;的位置与方向&#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了&#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息&…

【排序算法】插入排序与选择排序详解

文章目录 &#x1f4dd;选择排序是什么&#xff1f;&#x1f320;选择排序思路&#x1f309; 直接选择排序&#x1f320;选择排序优化&#x1f320;优化方法&#x1f309;排序优化后问题 &#x1f320;选择排序效率特性 &#x1f309;插入排序&#x1f320;插入排序实现 &#…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…

代码随想录算法训练营第三十四天|1005. K次取反后最大化的数组和,135,分发糖果

1005. K 次取反后最大化的数组和 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数…

【中间件】docker数据卷

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 1.数据卷&#xff08;容器数据管理&#xff09; 修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为内部没有编辑器&#xff0c;修改…

快速区分清楚图形渲染中的AABB,KD树和BVH这些概念

快速区分清楚图形渲染中的AABB&#xff0c;KD树和BVH这些概念 主要想形象去区分好这些术语&#xff0c;目的是扫盲&#xff0c;先开好坑&#xff0c;内容持续填充。 0.先摆出这些词的全称 AABB&#xff1a; 原名&#xff1a;axis aligned bounding box&#xff1b;中文直译名…

图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

目录 417. 太平洋大西洋水流问题 827.最大人工岛 127. 单词接龙 417. 太平洋大西洋水流问题 题目链接(opens new window) 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界…

QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架 QGraphicsScene&#xff08;场景&#xff09;&#xff1a;可以管理多个图形项QGraphicsItem&#xff08;图形项&#xff09;&#xff1a;也就是图元&#xff0c;支持鼠标事件响应。QGraphicsView&#xff08;视图&#xff09;&#xff1a;关联场景可以让…

Schemdraw小白从入门到放弃---原理工具书

文章目录 序版本最简单的例子一、总体思路二、元件2.1 color习题 2.2 label2.3 length 三、元件的连接3.1 延续性习题 3.2 方向习题 3.3 接线点习题3.3.1 默认激活anchor与沉默anchor3.3.2 切换鼠标焦点机制3.3.2.1 at函数规定元件的start接在哪个anchor上3.3.2.2 to函数规定元…

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…

C语言---------strlen的使用和模拟实现

字符串是以‘\0’作为结束标志&#xff0c;strlen函数的返回值是‘\0’前面的字符串的个数&#xff08;不包括‘\0’&#xff09; 注意 1&#xff0c;参数指向的字符串必须以‘\0’结束 2&#xff0c;函数的返回值必须以size_t,是无符号的 使用代码 ​ #include<stdio.…

力扣438. 找到字符串中所有字母异位词

Problem: 438. 找到字符串中所有字母异位词 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.编写辅助函数bool same(vector& need, vector& matched)&#xff1a; 1.1 以need为标准&#xff0c;循环对比need和matched的每一个位置的元素值是否相等 2.获…

RabbitMQ 安装保姆级教程

目录 1.MQ引言 1.1 什么是MQ 1.2 MQ有哪些 1.3 不同MQ特点 2.RabbitMQ 的引言 2.1 RabbitMQ 2.2 RabbitMQ 的安装 2.2.1 下载 2.2.2 下载的安装包 2.2.3 安装步骤 3. RabiitMQ 配置 3.1RabbitMQ 管理命令行 3.2 web管理界面介绍 3.2.1 overview概览 3.2.2 Admin用…