【Linux】文件系统

简介: 【Linux】文件系统

文件系统

我们目前的文件都是被打开的,如果没有被打开那,在哪里?

一定不是在内存当中,只能在磁盘等外设当中存在着

磁盘文件,如果没有被打开,如何理解这些文件?没有打开的文件都有什么问题?

  1. 如何被合理存储的问题
  2. 主要是为了解决:快速定位,快速读取和写入 — 磁盘文件也是这样
  1. 目前我们标识一个文件主要是通过文件名的方式
  1. 如何定位一个文件
  2. 如何对文件进行读取和写入

1. 了解磁盘的物理结构

磁盘使我们计算机上唯一的一个机械设备,同时它还是外设,它表明了它加载到内存的速度非常慢

盘片一共有两个面,有一摞盘片,一面有一个磁头,一个磁头负责一个面的读取。

磁头和盘面是没有挨着的,距离依旧很近,对数据写入和读取,更改基本元素的南北极,读取南北极

向磁盘写入:N->S

删除磁盘数据:S->N

2. 磁盘的具体物理存储结构

尝试在硬件上,理解数据的一次读和写

磁盘中的基本存储单元:扇区,一个扇区是512字节或者4kb

一般磁盘,所有的扇区都是512字节。 通半径的所有扇区:磁道

只需要确定用哪一个磁头读取:

首先要定位哪一个面:在一个面上,如何在硬件上定位一个扇区?

  1. 先定位在哪一个磁道,由半径决定
  2. 在确定在该磁道,再确定在哪一个扇区–根据扇区的编号,定位一个扇区

柱面就是磁道

磁头(head) 柱面(cylinder) 扇区(sector)

未来定义一个扇区 CHS定位法

一个普通文件(属性+数据)都是0,1数据,无非就是占用一个或者多个扇区,来进行数据存储的,我们既然能够使用CHS定位法定位任意一个扇区,我们就能够定位多个扇区,从而将文件从硬件角度,进行读取和写入

3. 逻辑抽象

如果操作系统能够得知任意一个CHS地址,就能够访问任意一个扇区,那么操作系统内部是不是直接使用CHS地址那?

不是,这是为什么?

  1. 操作系统是软件,磁盘是硬件,硬件定位一个地址CHS,但是如果操作系统直接用了这个地址,万一硬件变了?操作系统是不是也要发生改变。这不符合解耦的思想,操作系统要和磁盘做好解耦工作
  2. 即便是扇区,512字节,单位IO的基本数据量也是很小的!硬件512字节,操作系统进行IO,基本单位是4kb,这是非常浪费时间的、

磁盘:块设备,所以OS需要一套新的地址,来进行块级别的访问

这种磁带想必大家都见过,磁带本来是一个圆形的,但是如果我们将它拉直,是不是就是一个线性的

初步完成了一个从物理逻辑到线性逻辑的抽象的过程!!数组是天然有下标的

这个时候要定位一个扇区,只需要一个数组下标就可以了。

假设数组的下标是N, 而其中我们OS是以4kb为单位进行IO的,一个操作系统级别的文件要包括8个扇区!甚至在操作系统角度,并不关心扇区

计算机常规的访问方式:起始地址+偏移量的方式(语言,数据类型)我们只需要知道数据块的起始地址(第一个扇区的下标地址)+ 4kb的类型,我们把数据块看做一个类型

所以块的本质,就是一个数组的下标,以后我们表示一个块,就可以采用线性下标的方式,定位任何一个块了

OS->N->LBA->逻辑地址块,可是磁盘只认CHS所以我们要知道

LBA <-----> CHS的相互转化

这个相互转化,只需要了解就可以了

OS系统要管理磁盘,就将磁盘看成一个大数组,对磁盘的管理,变成了对数组的管理。先描述在组织

4. 文件系统

我们使用ls -l的时候除了看到文件名,还看到了文件元数据

每行包含7列:

  • 模式
  • 硬链接数
  • 文件所有者
  • 大小
  • 最后修改的时间
  • 文件名

ls -l读取存储在磁盘上的文件信息,然后显示出来。

这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息

这个执行结果,我们需要了解几样东西

innode

  • 超级快(Super Block):存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。 超级块在各个分区里都会存在,而且是统一更新的
  • GDT,Group Descriptor Table:块描述符,描述块组属性信息
  • 块位图(Block Bitmap):快位图里面记录了那个数据已经被占用了,那个数据没有被占用
  • inode位图(inode Bitmap):一般而言,一个文件内部所有属性的集合,inode节点(128字节),一个文件,一个inode其中即便是一个分区,内部也存在大量的文件即会存在大量的inode节点,一个group需要有一个区域,来专门保存该group内所有文件的inode节点。inode表分组内部,可能会存在多个inode,需要将inode区分开来,每一个inode都会有自己的inode编号!inode编号,也属于对应文件的id

而文件的内容是变化的,我们使用数据块来进行文件内容的保存的,所以一个有效文件要保存,就需要【1,n】数据块。如果是多个文件需要更多的数据块

Linux要查找一个文件,是根据inode编号来进行查找的,包括读取内容。一个inode对应一个文件,而改文件inode属性和改文件对应的数据块,是有映射关系的

将属性和数据分开存放的想法看起来简单,但实际上是如何工作的?

  1. inodeVS文件名

Linux只认识inode号,文件的inode属性中,并不存在文件名!文件名是用户给的

  1. 重新认识目录

目录是文件吗?是的,Linux下一切皆是文件,目录也有inode

  1. 任何一个文件,一定在一个目录内部,所以目录的内容是什么?需要数据块,目录的数据块里面保存的是该目录下文件名和inode编号对应的映射关系,而且在目录内,文件名和inode互为key值
  2. 当我们访问一个一个文件的时候,我们是在特定目录下访问的
  3. 先要在当前目录下,找到这个文件的inode编号
  4. 一个目录也是一个文件,也一定在一个分区里面,结合inode,在该分区中找到分组,在该分组中inode table中找到文件的inode
  5. 通过inode和对应的datalock的映射关系,找到文件
  1. 的数据块,并加载到OS,并完成显示到显示器

如何理解文件的增删改查

根据文件名找到inode,再根据inode属性中的映射关系,设置block Bitmap对应的bit位,置为0就可以,最后inode number设置inode Bitmap对应的bit位设为0。删除文件,只需要修改位图就可以了

如果文件被误删了,我们该怎么办?

  1. inode确定分组,inode number是一个分区内唯一有效,不能跨分区
  2. 我们学习到的分区,分组,填写系统属性,都是OS完成的?分区完成之后,后面要让分区能够被正常使用,我们需要对分区进行格式化,格式化的过程,其实是OS向分区写入文件系统的管理属性信息
  1. 我们如果inode只是单单的用数组建立和datablock的映射关系,15 * 4kb,是不是意味着只能存放:60kb的数据

创建一个文件主要有以下4个操作:

  1. 存储属性,内核先找到一个空闲的i节点。内核把文件信息记录到其中
  2. 存储数据,这个文件需要存储在三个磁盘块,内核找到了三个空闲块:300, 500, 800。将内核缓冲区的第一块数据复制到300,下一块复制到500
  3. 记录分配情况,文件内容按照顺序300, 500, 800存放。内核在inode上的磁盘分区记录了上述块列表
  4. 添加文件名到目录,新的文件名,Linux如何在当前的目录中记录这个文件?内核将入口添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来

5. 软硬连接

5.1 制作软硬连接,对比差别

软连接,类似Windows的快捷方式,软连接内部存放的都是自己所指向的文件的路径。软连接是一个独立的连接的文件,有自己的inode number,必有自己的inode属性和内容

建立软连接的命令是 ln -s 源文件 目标文件,其中 -s 表示创建软链接。例如,将 /home/user1/file1 创建一个软连接到 /home/user2/file2,可以使用以下命令:

ln -s /home/user1/file1 /home/user2/file2

这样,/home/user2/file2 就成为了 /home/user1/file1 的软链接,对 /home/user2/file2 的操作实际上是对 /home/user1/file1 的操作。


硬连接,硬连接和目标文件公用一个inode number,意味着,硬连接一定是和目标文件使用同一个inode的。那么硬连接究竟是干了什么,?建立了新的文件名和老的inode的映射关系,有多少个文件名指向我硬连接数,本质上是一个引用计数


建立硬连接的命令是 ln 源文件 目标文件,其中不需要使用 -s 参数。例如,将 /home/user1/file1 创建一个硬链接到 /home/user2/file2,可以使用以下命令:

ln /home/user1/file1 /home/user2/file2

这样,/home/user2/file2 就成为了 /home/user1/file1 的硬链接,对 /home/user2/file2 的操作实际上是对 /home/user1/file1 的操作。因为硬链接是对同一文件的多个名称,所以在文件系统中只有一个文件,所以无法在不同的文件系统中创建硬链接。


解释一下文件的三个时间:

  • Access:最后访问的时间
  • Modify:文件内容最后修改的时间
  • Change:属性最后修改的时间

6. 动静态库

静态库与动态库

  • 静态库(.a):程序在编译链接的时候,把库的代码链接到可执行文件当中。程序在运行的时候不在需要静态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码

一个与动态库连接的可执行文件仅仅包含函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件运行之前,外部函数的机器码由操作系统从磁盘上的动态库中复制到内存中,这个过程称为“动态链接”

动态库可以在多个程序间共享,所以动态链接使可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共同使用,节省了内存和磁盘空间

生成静态库

[root@localhost linux]# gcc -c add.c -o add.o
[root@localhost linux]# gcc -c sub.c -o sub.o
生成静态库
[root@localhost linux]# ar -rc libmymath.a add.o sub.o
ar是gnu归档工具,rc表示(replace and create)
查看静态库中的目录列表
[root@localhost linux]# ar -tv libmymath.a
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 add.o
rw-r--r-- 0/0 1240 Sep 15 16:53 2017 sub.o
t:列出静态库中的文件
v:verbose 详细信息
[root@localhost linux]# gcc main.c -L. -lmymath
-L 指定库路径
-l 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行。

库搜索路径

  • 从左到右搜索
  • 由环境变量指定的目录
  • 由系统指定的目录

/usr/lib

/usr/local/lib

生动动态库

  • shared:表示生成共享库格式
  • fPIC:产生位置无关码
  • 库名规则:libxxx.so

示例:

[root@localhost linux]# gcc -fPIC -c sub.c add.c 
[root@localhost linux]# gcc -shared -o libmymath.so*.o
[root@localhost linux]# ls add.c add.h add.o libmymath.so main.c sub.c sub.h sub.o

使用动态库

编译选项:

  • I:链接动态库,只要库名即可(去掉lib以及版本号)
  • L:链接库所在的路径

示例:gcc main.o main -L. -lhello

运行动态库

  1. 拷贝.so文件到系统共享路径下,一般指usr/lib
  1. 更改LD_LIBRARY_PATH
[root@localhost linux]# export LD_LIBRARY_PATH=.
[root@localhost linux]# gcc main.c -lmymath
  1. ldconfig配置/etc/ld.so.conf.d/, ldconfig更新
[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf/root/tools/linux
[root@localhost linux]# ldconfig

使用外部库

系统中有很多库,它们通常由一组互相关联的用来完成某项常见工作的函数组成。比如用来处理屏幕显示情况的函数(ncurses函数)

#include <math.h>
#include <stdio.h>
int main(void)
{
 double x = pow(2.0, 3.0);
 printf("The cubed is %f\n", x);
 return 0;
}
gcc -Wall calc.c -o calc -lm 

库文件名和引入库的名称

如:libc.s -> C库, 去掉lib,去掉后缀.so .a

相关文章
|
8月前
|
自然语言处理 监控 Linux
Linux 内核源码分析---proc 文件系统
`proc`文件系统是Linux内核中一个灵活而强大的工具,提供了一个与内核数据结构交互的接口。通过本文的分析,我们深入探讨了 `proc`文件系统的实现原理,包括其初始化、文件的创建与操作、动态内容生成等方面。通过对这些内容的理解,开发者可以更好地利用 `proc`文件系统来监控和调试内核,同时也为系统管理提供了便利的工具。
425 16
|
10月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
571 15
|
11月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
2469 7
|
11月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
281 7
|
11月前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
301 8
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
210 7
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
197 12
|
存储 Linux 索引
Linux 下最主流的文件系统格式——ext
【9月更文挑战第8天】硬盘被划分为若干相同大小的块(Block),默认大小为4K,便于灵活管理文件数据。文件数据分散存放于这些块中,提高了数据添加、删除和插入的便利性。
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
210 6