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

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

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

  
   文章目录

  目录
  文章目录
  前言
  一  磁盘
  1.1  磁盘的物理结构
  1.2  磁盘的存储结构 
   1.3  磁盘的逻辑结构
  ​编辑二  文件系统
  2.1  简朴相识 
  2.2  inode 
  2.3  文件描述符,历程与文件系统的关系 
  ​编辑2.4  补充小知识
  三  软硬连接
  3.1  软连接 
  3.2  硬连接
  ​编辑四  动静态库
   4.1  静态库
   4.1.1  手动制作静态库
  4.1.2  利用静态库 
  ​编辑 4.2  动态库
  4.2.1  手动制作静态库 
  4.2.2  利用动态库 
  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:
  1. [root@localhost linux]# export LD_LIBRARY_PATH=.
  2. [root@localhost linux]# gcc main.c -lmymath
  3. [root@localhost linux]# ./a.out
  4. add(10, 20)=30
  5. sub(100, 20)=80
复制代码
 3:
  1. [root@localhost linux]# cat /etc/ld.so.conf.d/bit.conf
  2. /root/tools/linux
  3. [root@localhost linux]# ldconfig
复制代码
 

4.3  动静态库补充




总结

✨✨✨各位读友,本篇分享到内容是否更好的让你明白,如果对你有资助给个

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表