1 Linux文件系统的三层抽象
一般而言,文件是存储在硬盘上的,那么将磁盘这一物理实体,进行逻辑划分和组织,就是进行抽象的过程。目的就是为了便于管理。
最朴素的管理手段就是,给硬盘的区域编号,按照编号从低到高给文件分配存储空间。当然,访问效率就可想而知了(当文件数量一多,访问效率将会及其低下)。所以那些系统开发人员就发挥出自己的聪明才智,对文件系统进行了巧妙的设计。
第一层抽象:从磁盘到分区
一整块磁盘,能存储大量的数据,统一管理起来不太方便。若能将它分而治之,则更加灵活。比如说window系统里面的磁盘分区:C盘,D盘,E盘等等。每个分区都可以看作是一个独立的磁盘。
第二层抽象:从磁盘到块序列
一个磁盘由一些磁性盘片组成。每个盘片的表面都被划分为很多同心圆,这些同心圆称作磁道,每一个磁道又进一步被划分为扇区,每个扇区可以存储一定字节的数据(如512字节)。扇区是磁盘上的基本存储单元,每次空间分配或者访问都是以一个扇区为最小单位。
第三层抽象:从块序列到三个区域的划分
为了存储不同类型的数据(文件内容、文件属性、目录),将磁盘块分为3个部分:超级块,inode结点,数据区
- 文件系统中的第一个块被称为超级块,超级块用来存放文件系统本身的结构信息
- 文件系统的下一个部分被称为i-节点表。每个文件都有一些属性,如大小、文件所有者和最近修改时间等。这些性质被记录在一个称为i-节点的结构中。所有的i-节点都有相同的大小,并且i-节点表是这些结构的一个列表。i-node节点表存放i-node节点,存储文件属性、所有者、权限等元数据信息
- 文件系统的第三部分是数据区。文件的内容保存在这个区域。数据区分块存储文件数据,它是不连续存储的,一个文件的内容可能散落在数据区内部
2 Cat userlist的过程
输入ls -ia
可以查看当前目录包含的文件以及对应的i-节点号
如上图,代表当前目录的"."的i-节点号为800729,代表上一级目录的".."的i-节点号为800909。
输入cat userlist
,表示读取userlist这个文件并显示
step1.在目录中寻找文件名
文件名存储在目录文件中,内核在目录文件中寻找包含字符串"userlist"的记录。userlist所在的记录包含编号为47的i-节点。
step2.定位i-节点并读取内容
内核在文件系统中的i-节点区域找到i-节点47。i-节点包含数据块编号的列表。
step3.访问存储文件内容的数据块
在step2之后,即知道了数据块的位置和在磁盘中的顺序,就可以通过不停的调用read函数,使内核不断将字节从磁盘复制到内核缓冲区。
ps
内核根据文件名找到i-节点号,再根据i-节点号找到i-节点。在i-节点中,找到文件的权限位和用户ID,从而判断该用户是否具有读取权限。通过以上调用构成,内核已经可以知道文件内容存放在哪些数据块上,以及它们的顺序。由于cat不断的调用read函数,使得内核不断将字节从磁盘复制到内核缓存区,进而到达用户空间
所有从文件读取数据的命令,比如,cat、cp、more、who等,都是将文件名传给open来访问文件内容,对open的每次调用都是先在目录中寻找文件名,然后根据目录中的i-节点号获得文件的属性,最终找到文件的内容。
假如open一个没有读或者写权限的文件时:内核首先根据文件名找到i-节点号,然后根据i-节点号找到i-节点。在i-节点中,内核找到文件的权限位和拥有者的用户ID。如果权限位设置你的用户ID对文件没有访问权限,则open返回-1并将errno置为EPERM。
标签:文件,存储,Cat,userlist,内核,磁盘,节点 From: https://www.cnblogs.com/cqszxy2020/p/16818256.html