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,一经查实,立即删除!

相关文章

C/C++ 一些使用网站收集...

C/C 标准 各种语言协议标准文档 open-std.org 网站 C语言标准文档 open-std.org C基金会网站 C/C 标准库网站 c/c 标准库 cplusplus.com 网站 c/c标准库 cppreference.com 网站 C Core Guidelines【isocpp.org】 C/C 发展 C现有状态及未来规划【isocpp.org】

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

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

Matplotlib如何显示多张图片(管理多个子图)

Matplotlib 可以使用 subplot 或 subplots 方法来创建子图,从而在同一窗口中显示多张图片。以下是一些示例代码,展示如何使用 Matplotlib 显示多张图片: 1.使用 subplot import matplotlib.pyplot as plt import matplotlib.image as mpi…

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

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

pta L1-004 计算摄氏温度

L1-004 计算摄氏温度 分数 5 全屏浏览 切换布局 作者 陈建海 单位 浙江大学 给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏…

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

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

odoo中,使用paramiko库ssh连接Linux

在 Python 中,可以使用 Paramiko 库来实现 SSHClient 连接。Paramiko 是一个用于远程登录、文件传输和自动化的 SSH 客户端库。 import paramiko# 创建 SSHClient 对象 ssh paramiko.SSHClient()# 设置自动添加主机密钥 ssh.set_missing_host_key_policy(paramiko.…

K8s-网络原理-下篇

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

气候模型与大模型结合的高精度天气预报技术研究

1. 背景介绍 随着全球气候变化的加剧,天气预报的准确性变得越来越重要。传统的气候模型在预测长期气候变化方面取得了显著进展,但在短期天气预报方面仍存在一定的局限性。近年来,随着人工智能技术的发展,尤其是大模型在自然语言处…

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…

如何更换Ubuntu系统的软件源

Ubuntu系统的软件源是决定你的系统从哪里下载软件包和更新的关键设置。有时&#xff0c;由于网络连接问题或软件源的更新&#xff0c;你可能需要更换软件源。以下是详细的步骤&#xff0c;教你如何在Ubuntu系统上更换软件源&#xff0c;并确保在更改之前进行备份。 步骤1&…

时间戳的转换-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.开头的一系列依赖包&#…