[Linux] Linux文件系统
🥁作者: 华丞臧.
📕专栏:【LINUX】
各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞+收藏+关注
)。如果有错误的地方,欢迎在评论区指出。
文章目录
- 一、Linux文件系统
- 1.1 磁盘
- 1.2 inode
- 1.3 软硬链接
- 1.4 动静态库
一、Linux文件系统
1.1 磁盘
信息化时代就是信息产生价值的时代,信息化是当今时代发展的大趋势,代表着先进生产力。通常我们都会将信息存放在某些硬件上,如:硬盘、内存等;当信息存放硬盘上时,信息就变成了硬盘上的文件,人们通过一些设备如电脑手机可以查看使用这些数据,我们的工作和生活,已经完全离不开视频、音乐、图片、文本、表格这样的数据文件。
- 磁盘上存放着大量的文件,这些文件需要被管理组织起来,操作系统中管理和存储文件信息的软件机构称为文件系统。
- 最开始存放数据的硬件是磁盘,随着时代发展,像我们的笔记本电脑大多使用SSD硬盘,但是磁盘还是主要的存储设备,可以用存放大量的数据,关键是便宜。
- 下图是一张磁盘的结构图,磁盘的核心就是这些盘面,盘面能够记录二进制序列,其原理就是通过电流产生感应磁场来改变某些特定位置的磁极从而将电信号持久化到磁盘上。
-
磁盘工作时是处于一种高速旋转的状态,磁头依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,磁头在副轴马达的带动下可以在极短的时间内精确的切换到数据所在的磁道。
-
磁盘是一种高精度的设备,在高速旋转的情况下,磁面上的一粒灰尘都可能会导致磁盘损坏,因此磁盘通常是在无尘的环境下密封。
-
每一个盘面都对应一个磁臂,通过这些磁臂上的磁头来定位数据的位置,依次确定磁道(柱面)、盘面、以及扇区,这三个值称为CHS地址。
-
扇区是硬盘的最小操作单位,但扇区对于操作系统来说还是太小了,一般操作系统有自己的硬盘操作最小单位,在linux下一般为4k。
-
为了方便管理数据,我们可以将硬盘这样的物理块设备,分割成多个逻辑块设备。或者,我们也可以将多个物理块设备,组合成一个容量更大的逻辑块设备。
-
操作系统需要管理磁盘,将磁盘抽象为一个线性的结构,类似于卷尺拉出来是线性的收进去是圆形的,因此我们可以将磁盘想象成线性的结构数组,对磁盘的管理就可以转换成对数组空间的管理了。
-
假设磁盘抽象的出的数组为sector disk[100000000],那么我们定位一个扇区只需要数组的下标即可(这种下标称为LBA–逻辑块地址),将LBA转换成CHS地址,再将数据写入对应的磁盘上去。
-
磁盘上存储的基本单位是扇区(512字节常规),文件系统访问磁盘的基本单位是4KB,即一次IO访问8个扇区。
-
这样做有两个好处:一、提高IO的效率 ;二、让软件(OS)和硬件(磁盘)具有强相关性即解耦合。
1.2 inode
使用ll
查看文件,除了文件名还可以看到文件的其他属性,如下图:
每行包含7列:
- 模式:代表文件的类型以及权限
- 硬链接数
- 文件所有者
- 所属组
- 文件大小
- 最后修改时间
- 文件名
如果需要查看文件更详细的信息可以使用stat命令,如下图:
在上图中我们可以看到文件属性中有一个Inode字段,在Linux系统中inode
用于表示唯一的一个文件。
- 不管是在Windows平台还是在Linux系统中,我们都可以通过绝对路径或相对路径找到一个唯一的文件,前提是在同一目录下都不允许重名的文件出现。
- 文件是存放在磁盘上的,不管是普通文本文件还是文件夹(Linux上通常称为目录)都属于文件的一种,目录也是文件;在这种情况下,操作系统如何在磁盘上查找到目标文件的呢 —— 给定一个一对一的映射关系。
Linux ext2
文件系统,下图为磁盘一个分区的文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而下图中启动块(Boot Block)的大小是确定的。
启动块(Boot Block)
:里面包含操作系统的位置以及分区表,开机信息。Block Group
:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。超级块(Super Block)
:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,因此超级快通常会备份一定数量。GDT(Group Descriptor Table)
:块组描述符,描述块组属性信息,记录inode数、起始inode编号、block使用量以及剩余量等等信息。块位图(Block Bitmap)
:Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。inode位图(inode Bitmap)
:每个bit表示一个inode是否空闲可用。i节点表(inode table)
:以128字节为单位,存放文件属性 如 文件大小,所有者,最近修改时间等。数据区(Data Blocks)
:以4KB为单位,存放文件内容。
在inode table中保存了文件对应的所有属性,那么一个inode如何与属于自己的文件内容关联起来呢?
struct inode
{// 文件所有属性...blocks[15];...
}
//在inode的结构体中包含一个blocks的数组,这个数组保存了文件对应的block编号
//其中[0, 11]:直接保存该文件的blocks编号
//[12, 15]:指向一个datablock但是这个datablock不保存有效数据,而保存该文件所对应的其它块编号
还要注意的是,文件名也是文件属性,但是inode里面并不保存文件名;Linux下,底层实际都是通过inode编号来标识文件。那么操作系统是如何准确帮用户通过文件名找到对应的文件内容呢?首先,用户对文件进行操作时都是在一个目录下,不管是创建还是删除。其次目录也是一个文件,既然是文件就有属性和内容,其属性与普通文件类似,那么目录文件的内容是什么呢?
文件名并沒有被保存在文件内容中,操作系统又必须通过文件名帮用户查找文件内容,所以文件inode和文件名必须具有映射关系并且记录下来,在Linux系统中文件名和文件inode的映射关系被保存在目录的内容中。同时我们也注意到,Linux同一个目录下,不可以创建多个同名文件,这说明文件名本身是一个具有Key值的东西。
- 创建一个新文件:当我们创建好一个新文件时,操作系统会找到自己所处的目录下,根据目录的inode编号查找到目录的datablock,然后将文件名和inode映射关系写入目录的数据块中。
- 删除文件:操作系统删除一个文件并不会直接清除数据,而是将标记该文件对应的属性和数据块的相关位图清除(由1置0),所以删除的文件是可以恢复的。
1.3 软硬链接
- 硬链接:通过索引节点(inode)来链接。
- 软链接:通过名字引用另外一个文件。
- 通过
ls -l
可以查看文件的硬链接数:
//创建一个软链接
ln -s 目标文件名 软链接名//查看文件inode编号
ls -i
上图可以看到软链接和目标文件使用的inode编号是不同的,软链接具有独立的inode编号;并且通过软链接mytest文件可以直接运行目标文件test,软链接相当于一个快捷方式,类似Windows系统,其中所保存的内容是指向文件所在路径。
//创建一个硬链接
ln 目标文件 硬链接名
硬链接不是独立的文件,相当于一个指针,指向某一个inode,而硬链接数就是引用计数,有几个硬链接指向该inode编号硬链接数就是几。
Linux中我们常见目录如下
. :当前目录
.. :上一级目录这两个目录就是硬链接
软硬链接的区别:软链接是一个独立的文件,有自己独立的inode编号;硬链接不是一个独立的文件,它和目标文件使用的是同一个inode。
1.4 动静态库
- 静态库:程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库;静态库Linux下后缀为
.a
文件,windows下后缀为.lib
文件。 - 动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。动态库Linux下后缀为
.so
文件,windows下后缀为.dll
文件。在Linux下,程序生成默认是动态连接。 - 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
测试程序/add.h/#ifndef __ADD_H__#define __ADD_H__ int add(int a, int b); #endif // __ADD_H__/add.c/#include "add.h"int add(int a, int b){return a + b;}/sub.h/#ifndef __SUB_H__#define __SUB_H__ int sub(int a, int b); #endif // __SUB_H__/add.c/#include "add.h"int sub(int a, int b){return a - b;}///main.c#include <stdio.h>#include "add.h"#include "sub.h"int main( void ){int a = 10;int b = 20;printf("add(10, 20)=%d\n", a, b, add(a, b));a = 100;b = 20;printf("sub(%d,%d)=%d\n", a, b, sub(a, b));}//生成静态库
ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)//查看静态库中的目录列表
ar -tv libmymath.a
t:列出静态库中的文件//gcc编译链接第三方库
gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
将生成的静态库删除后,程序依旧可以正常运行,如下图:
//生成动态库
//shared: 表示生成共享库格式
//fPIC:产生位置无关码(position independent code)
//库名规则:libxxx.so
gcc -fPIC -c sub.c add.c
gcc -shared -o libmymath.so add.o sub.o
同样是上面的add.c和sub.c文件形成.o文件再生成一个动态库,将动态库使用gcc编译main.c文件形成可执行文件,在删除动态库之后,此时与静态库不同,该文件运行出错表示该动态库不存在。
那么链接静态库的时候为什么没有这个问题呢?或者说链接动态库和静态库两者的区别是什么呢?
- 静态链接,是将所需要的库文件中的代码拷贝进我们自己的代码中,然后再形成一个可执行程序,运行时程序中已经包含了库中的代码不需要依赖库。
- 与静态链接不同,一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码;在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。
我们使用的库都是存放在磁盘上的文件,动态链接的可执行程序运行时会将动态链接库加载到内存中,加载到内存中的库代码只有一份,进程通过页表将进程地址空间和库链接起来,当使用动态链接库中的函数时会跳转到库中运行。
相关文章:

[Linux] Linux文件系统
🥁作者: 华丞臧. 📕专栏:【LINUX】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 文章目录 一、Linux文件系统1.1 磁盘1.2 inode1.3 软硬…...

有仰拍相机和俯拍相机时,俯拍相机中心和吸嘴中心的标定
俯拍相机中心和吸嘴中心的标定 文章目录 俯拍相机中心和吸嘴中心的标定 前言适用模型如下:一、使用一个标定片进行标定1.关键注意:2.标定步骤: 二、使用一个L型的工件1.关键注意:2.标定步骤: 总结 前言 在自动化设备领…...

【Vue学习笔记5】Vue3中的响应式:ref和reactive、watchEffect和watch
所谓响应式就是界面和数据同步,能实现实时更新。 Vue 中用过三种响应式解决方案,分别是 defineProperty、Proxy 和 value setter。Vue 2 使用的方案是 defineProperty API。Vue3中使用的方案是Proxy和value setter。 1. ref和reactive vue3中实现响应…...

自动化测试工具的基本原理以及应用场景
自动化测试工具是现代软件开发流程中必不可少的组成部分,它可以通过编写脚本或使用图形用户界面工具自动化测试过程,提高测试的效率和准确性。本文将介绍自动化测试工具的基本原理以及应用场景。 自动化测试工具的基本原理 自动化测试工具通常采用的原理…...

《Java虚拟机学习》 java代码的运行过程
1. Java文件转换 当我们保存java文件后,首先由编译器编译成class文件,然后通过Java虚拟机将class文件转换成字节码文件 2.Java虚拟机是怎么运行Java文件 首先将java文件加载到java虚拟机中,然后由虚拟机将类元信息存储在 虚拟机的方法区中。…...

关于Intel处理器架构中AVX2里Gather特性的说明
在 Intel Haswell 架构里引入了 Gather 特性。它使得CPU可以使用向量索引存储器编址从存储器取非连续的数据元素。这些gather指令引入了一种新的存储器寻址形式,该形式由一个 基地址寄存器(仍然是通用目的寄存器)和通过一个 向量寄存器&#…...

UNIX常用命令(C站最全,一文通关)
unix常见命令列举如下,除了看还要会用: ls - 列出目录下的文件 cd - 切换目录 pwd - 显示当前目录 mkdir - 创建目录 rm - 删除文件或目录 rmdir - 删除空目录 cp - 复制文件或目录 mv - 移动文件或目录,或重命名 cat - 显示文件内容 less - 分…...

Vue监听属性详细讲解
文章目录 定义要监听的属性定义 watch修改监听的属性值监听数组变化监听对象变化监听计算属性变化监听事件变化监听路由变化 在 Vue 中,可以使用 watch/$watch 方法监听数据、计算属性、事件和路由的变化,从而实现数据绑定、事件监听和路由控制等功能。需…...

网申形式一览:这三种投递方式,你了解吗?
银行校招是个滚动的过程,每家银行的网申期并不一致。想要在看重的银行网申期投出一份漂亮的简历,简历自身要“过硬”。是不是还有同学不清楚网申简历形式? 从如信银行考试中心了解到,银行网申,尤其是大行网申ÿ…...

vue项目将多张图片生成一个gif动图
当前做项目有一个需求是将多张图片生成一个gif动图的形式 类似下面图片几张图片叠加生成一个gif动图 图片涉及工作隐私,就不公开啦 我们要引入一个gif.js的引入包,但是他没有直接引入的方式,只能从官方下载文件包,下载地址&#…...

开心档之Go 语言常量
Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量。 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 常量的定义格式: const identifier [type] value你可以省略类…...

动态库和静态库的使用
一、什么是库? 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库…...

前端:20 个常见的前端算法题
现在面试中,算法出现的频率越来越高了,大厂基本必考 今天给大家带来 20 个常见的前端算法题,重要的地方已添加注释,如有不正确的地方,欢迎多多指正 💕 1、两数之和 题目: 给定一个数组 nums …...

【Linux】多线程 --- 线程概念 控制 封装
从前种种,譬如昨日死。从后种种,往如今日生。 文章目录 一、线程概念1.重新理解用户级页表1.1 进程资源如何进行分配呢?(地址空间页表)1.2 虚拟地址如何转换到物理地址?(页目录页表项࿰…...

最长递增子序列的长度 _ 贪心+二分查找 _ 20230510
最长递增子序列的长度 _ 贪心二分查找 _ 20230510 前言 最长递增子序列的程序一般采用动态规划方式,使用bottom-up的数组记忆方式比较容易理解,当然也可以采用top-down的递归模式。本文主要讨论如何利用贪心策略,同时辅助以二分查找的方式实…...

VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接:https://sysin.org/blog/vmware-esxi-7-u3-sysin/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023-05-03,发布 ESXi 7.0U…...

Scrum敏捷开发和项目管理流程及工具
Scrum是全球运用最广泛的敏捷管理框架,Leangoo基于Scrum框架提供了一系列的流程和模板,可以帮助敏捷团队快速启动Scrum敏捷开发。 这里可以介绍一下在scrum中单团队敏捷开发如何管理,单团队敏捷开发主要是针对10-15人以下,只有一…...

微服务之配置中心
文章目录 1什么是配置2什么是配置中心3为什么我们要用配置中心4特点 1什么是配置 就是springboot中的application.yml/properties文件 比如:项目名、端口号、数据库连接参数、启动参数等。 2什么是配置中心 配置中心就是用来管理项目当中所有配置的系统ÿ…...

windows下安装OpenCL
由于我的电脑是windows10,显卡是集显Intel UHD Graphics 630。 下载Intel的SDK for OpenCL,下载地址https://software.intel.com/en-us/opencl-sdk/choose-download,也可以在我的资源里面直接下载https://download.csdn.net/download/qq_363…...

前端项目的通用优化策略
一、虚拟滚动 当我们开发的时候,遇到大数据加载,页面卡顿的问题应该如何处理?大多数情况下,我们都是尽量通过分页的方式处理这类问题,但是总有一些特殊的情况我们必须把数据全部加载到前端进行处理。我曾经遇到过一个…...

关于 IO、存储、硬盘和文件系统
关于IO、存储、硬盘和文件系统 0.引入1.了解IO1.1.存储器IO1.2.设备IO 2.存储介质和存储类型2.1.内存2.2.硬盘2.3.固态硬盘(SSD)2.4.U盘 3.硬盘的工作原理3.1.磁头3.2.盘片3.3.电动机3.4.硬盘的读写操作 4.文件系统概述4.1.文件系统的类型4.2.文件系统的…...

计算机网络期中复习提纲-酷酷的聪整理版
第一章 概述 1.请介绍计算机网络在逻辑上的组成及其各自的作用。 计算机网络在逻辑上可以分为终端子网和通信子网两部分。 终端子网是指连接计算机与网络的部分,主要负责将数据从计算机发送到通信子网,或将从通信子网接收到的数据传输到计算机。终端子网通常包括物理层和数据…...

clickhouse的嵌套数据结构Tuple、Array与Nested类型介绍和使用示例
文章目录 Tuple类型Array类型Nested类型使用示例单独使用Tuple数组嵌套 Array(Tuple)Nested类型 生产使用:分组查询 Tuple类型 Tuple是ClickHouse数据库中的一种数据类型,它允许在一个字段中存储由不同数据类型组成的元组(tuple)。元组可以包含任意数量…...

人脸修复增强调研
Real-ESRGAN 工程地址:https://github.com/xinntao/Real-ESRGAN 效果: 人脸增强部分,调用的GFPGAN. GFPGAN 工程地址:https://github.com/TencentARC/GFPGAN 论文效果: BasicSR-ESRGAN: 项目地址&a…...

【Java】继承和多态
文章目录 一、继承1.继承的例子(is-a)2.组合的例子(has-a) 二、多态1.重写2.重载 三、继承的语法四、继承的注意事项1.初始化的顺序:2.super关键字 五、继承访问限定符六、多态实现方式七、多态的理解注意事项…...

ThingsBoard集群部署之k8s
1、概述 今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来…...

【Gorm】如何在 GORM 中实现模型之间的关联?
文章目录 关联1、Belongs To(属于)2、Has One(拥有一个)3、Has Many(拥有多个)4、Many To Many(多对多) 关联 当涉及到 ORM(Object-Relational Mapping)的…...

Linux危险命令
rm -rf 命令 该命令可能导致不可恢复的系统崩坏。 rm -rf / #强制删除根目录下所有东西。rm -rf * #强制删除当前目录的所有文件。rm -rf . #强制删除当前文件夹及其子文件夹。fork 炸弹 :() { :|:& };:不太好理解可以转换成 bomb() {bomb|bomb& }; bomb一旦执行…...

FPGA入门系列13--异步串口通信
文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…...

k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容
文章目录 一、基本介绍二、应用程序生命周期2.1 部署应用2.2 应用升级2.2.1 修改YAML文件升级(交互式)2.2.2 命令指定镜像版本升级(免交互式)2.2.3 调用vim升级 2.3 滚动升级2.3.1 升级流程 2.4 应用回滚2.4.1 查看历史发布版本2.…...