Linux:磁盘深潜:探索文件系统、连接之道与库的奥秘

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

文章目录

目录

文章目录

前言

[一 磁盘](#一 磁盘)

[1.1 磁盘的物理结构](#1.1 磁盘的物理结构)

[1.2 磁盘的存储结构](#1.2 磁盘的存储结构)

[1.3 磁盘的逻辑结构](#1.3 磁盘的逻辑结构)

[​编辑二 文件系统](#编辑二 文件系统)

[2.1 简单了解](#2.1 简单了解)

[2.2 inode](#2.2 inode)

[2.3 文件描述符,进程与文件系统的关系](#2.3 文件描述符,进程与文件系统的关系)

[​编辑2.4 补充小知识](#编辑2.4 补充小知识)

[三 软硬连接](#三 软硬连接)

[3.1 软连接](#3.1 软连接)

[3.2 硬连接](#3.2 硬连接)

[​编辑四 动静态库](#编辑四 动静态库)

[4.1 静态库](#4.1 静态库)

[4.1.1 手动制作静态库](#4.1.1 手动制作静态库)

[4.1.2 使用静态库](#4.1.2 使用静态库)

[​编辑 4.2 动态库](#编辑 4.2 动态库)

[4.2.1 手动制作静态库](#4.2.1 手动制作静态库)

[4.2.2 使用动态库](#4.2.2 使用动态库)

[4.3 动静态库补充](#4.3 动静态库补充)

总结


前言

本篇详细介绍了进一步介绍Linux,让使用者有更加深刻的认知,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步


一 磁盘

1.1 磁盘的物理结构

1.2 磁盘的存储结构

扇区:是磁盘存储数据的基本单位,512字节,块设备

1.3 磁盘的逻辑结构

磁带上面可以存储数据,我们可以把磁带"拉直",形成线性结构

真实过程:

二 文件系统

2.1 简单了解

因此,我们可以将磁盘看作以块为单位的一维数组

对一个磁盘我们如何进行管理? 分区管理 !

对于一个区如何进行管理呢? 分组管理!

因此我们只要管理好一个组,就相当于管理好磁盘

Linux ext*文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备 ,硬盘分区被 划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改 。例如mke2fs的-b选项可以设 定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的(包含和启动有关的信息,包括磁盘大小等等),

● Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相 同的结构组成。政府管理各区的例子

● 超级块(Super Block):存放文件系统本身的结构信息。 记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了------因此一个分区里超级块****有好几份散布在不同组,内容完全一样,防止文件系统挂掉

● GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的可以在了解一下

● 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用

● inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

● inode表:存放文件属性 如 文件大小,所有者,最近修改时间等

● 数据区:存放文件内容

PS:一般情况下,一个分区里,inode和block的个数是固定的

2.2 inode

上面提到 inode存放文件属性 如 文件大小,所有者,最近修改时间等

在我们的Linux中,也可以看到inode编号

inode与block建立一映射关系

这样我们可以得到一个结论:

操作系统想要访问文件内容时,需要通过inode去inode位图找是否存在,再通过inode中block数组找到数据块,再去block位图找是否被占用,最后访问到文件数据内容

准确理解文件系统:

子问题1:inode和block是如何进行映射的

一级间接块索引可将扩展成可存1024块 变成4m

子问题2: 文件名和目录文件

先提出一个结论,在操作系统中,都是通过inode来操作文件的

可是,我们在使用Linux的时候,都是通过文件名来访问文件的

这样我们了解目录文件是存储文件名和inode的映射关系的

可是,目录文件也是文件啊 !也有自己的inode和文件名,那它是哪来的?------上级目录

在我们目前看来,我们访问文件都要通过路径访问

Linux系统不需要保存路径,在磁盘没有路径的概念,只有inode,路径是用户层面的,系统都是通过inode查找文件

2.3 文件描述符,进程与文件系统的关系

2.4 补充小知识

三 软硬连接

ln是linux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。

3.1 软连接

ln -s 文件名 要形成的软连接名

我们发现,源文件和软连接文件拥有不同的inode

软连接有独立的inode,软连接内容上,保存的是目标文件的路径,类比于Windows的快捷方式

应用场景:快捷方式

3.2 硬连接

ln 文件名 形成的硬连接文件名

硬连接不是独立的文件,没有独立的inode,硬连接本质就是一组文件名和已经存在的文件的映射关系

应用场景:文件备份

四 动静态库

4.1 静态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

4.1.1 手动制作静态库

ar -rc lib+库名+.a .o文件

ar是gnu归档工具,rc表示(replace and create)------r是替换,c是创建,如果库中有对应的.o,则替换,没有则创建

一定前缀带上lib,后缀带上.a

4.1.2 使用静态库

4.2 动态库

● 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

● 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

● 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

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

4.2.1 手动制作静态库

生成动态库

shared: 表示生成共享库格式

fPIC:产生位置无关码(position independent code)

库名规则:libxxx.so

4.2.2 使用动态库

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

2、更改LD_LIBRARY_PATH

3、ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新

2:

cpp 复制代码
[root@localhost linux]# export LD_LIBRARY_PATH=.
 [root@localhost linux]# gcc main.c -lmymath
 [root@localhost linux]# ./a.out
 add(10, 20)=30
 sub(100, 20)=80

3:

cpp 复制代码
[root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf 
/root/tools/linux
[root@localhost linux]# ldconfig

4.3 动静态库补充


总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!

相关推荐
畅联云平台3 分钟前
美畅物联丨如何通过视频汇聚平台汇聚视频并推送至上级28181平台
服务器·网络·音视频
黑客Jack16 分钟前
什么是网络安全审计?
网络·安全·web安全
soragui24 分钟前
【Ubuntu】如何轻松设置80和443端口的防火墙
linux·运维·ubuntu
Amd79432 分钟前
在不同操作系统上安装 PostgreSQL
linux·windows·macos·postgresql·操作系统·数据库管理·安装指南
sensen_kiss40 分钟前
CAN201 Introduction to Networking(计算机网络)Pt.2 传输层
网络·学习·计算机网络
Tony11541 小时前
VMwareWorkstation虚拟机安装Rocky8.10系统详细教程
linux·虚拟机
网络安全queen1 小时前
【D03】SNMP、NETBIOS和SSH
运维·网络·web安全·ssh
march of Time1 小时前
centos系统如何安装kubectl和部署kube-apiserver
linux·运维·centos
wkd_0071 小时前
【开源库 | xlsxio】C/C++读写.xlsx文件,xlsxio 在 Linux(Ubuntu18.04)的编译、交叉编译
c语言·c++·xlsxio·c语言读写xlsx·c++读写xlsx·xlsxio交叉编译
qq_254674411 小时前
openwrt 负载均衡方法 openwrt负载均衡本地源接口
网络