Linux学习笔记之Linux文件系统详解
0x00 机械硬盘
机械磁盘由磁头(head)、磁道(track)、柱面(cylinder)、扇区(sector)和盘片(platter)组成。其中,磁头悬浮在盘片上,并且每张盘片上下各有一个磁头;每张盘片的磁道数是相同的,每张盘片相同位置的磁道组成柱面;而每一个磁道由数量相同的扇区组成,我们知道离主轴越远的扇区面积越大,而扇区大小一般为512B,必然导致存储密度越低,这样做明显浪费空间,为了解决问题,我们将磁盘密度改为等密度结构,这就意味着外围磁道的扇区数量要大于内圈的数量。
- 物理图

- 逻辑图

- 数据读取流程
假设目标扇区和当前磁头位置不在同一个磁道上,首先,磁头从一个磁道移动到另一个磁道,同时,盘片也在旋转,此时,虽然磁头到达了该磁道,但是还没有到达目标扇区,因此还需要等待,最后读取红色区域。

0x01 文件
基于上述介绍的机械磁盘,我们如何访问磁盘扇区?通过访问(柱面,磁头,扇区)确定一个扇区,但是用户是无法直接访问扇区的,操作系统将扇区抽象成文件! 因此,文件是我们操作操作系统最小的单位。
2.1 文件系统设计
文件系统采用分层设计,最底层的是设备,接着是IO控制(设备驱动),基本文件系统(向设备驱动程序发出命令),文件组织模块(负责文件的逻辑块和物理块,以及管理空闲空间),逻辑文件系统(管理元数据)

2.2 文件系统的实现
文件系统的实现包括磁盘结构和内存结构,即我们将文件以什么结构存储于磁盘,以什么结构存储于内存。
- 磁盘结构
这里以Linux中的Ext2的磁盘结构为例,需要注意的是我们需要对硬盘进行格式化生成如下图所示的磁盘结构。其中,主引导扇区(0柱面、0磁头、1扇区,大小为512B)由MBR(Main Boot Record,主引导记录,大小为446B)和各个分区组成。MBR又包含位于磁盘最前边的一段引导代码即Boot Loader、磁盘分区表和魔数。磁盘分区表记录的是分区信息,魔数指定哪个分区为活动分区,也就是说把控制权交给这个活动分区的操作系统。需要注意的是图中我只化了2个分区,而在实际情况下我们最多可以化4个分区,这里说明一下为什么最多只能化4个分区,我们知道一个扇区的大小是512B,其中主MBR就占用了446B,结束标志占用2B,所以分区表的大小就只有64B,而每个分区信息用16B表示,因此硬盘只能划分为4个主分区。
由于每个分区都可以安装操作系统,因此每个分区中都有引导块,引导块是包含引导操作系统所需要的信息。由于分区容量很大,因此,我们会将分区进一步划分为各个块组,块组包含超级块、块组描述、磁盘块位图、inode位图、inode表以及数据块,其中,超级块(superblock)描述的是整个分区的详细信息,如分区的块数、块的大小、空闲块的数量和指针、空闲FCB的数量和指针,需要注意的是同一个分区中的块组中的超级块信息是一样的,只有块组0 的超级块会被加载到内存,而且由于每个块组都保留超级块信息,保证了磁盘高可用;块组描述记录inode表的起始位置、数据块的起始位置、空闲inode表和空闲数据块;磁盘块位图管理的是空闲磁盘块;inode位图管理空闲的inode;inode表存放inode信息。

- 内存结构
我们每次打开一个文件,即open 文件,需要发起操作系统调用,系统调用会查看一个表:系统范围打开的文件表,每个进程会维护打开的文件表,索引号指向的是系统范围打开的文件表,这个索引号在Linux上称为文件描述符,在windows上称为文件句柄。

0x02 文件存储
3.1 连续存储
- 顺序访问速度快,随机访问速度也快,例如:访问Hello.java,磁头定位到编号为1的磁盘块,接着顺序读取编号为2、3磁盘块。但是,容易出现碎片。
- 注意:图中的每一块表示逻辑块

3.2 链式存储
- 增、删内容很快;
- 顺序访问速度还好,但是随机访问速度很慢。

3.3 折中方案 - 索引存储
由于连续存储和链式存储都存在一些缺点,因此我们的先辈们想出了一个折中方案即索引存储。首先有一个磁盘块(索引节点)不存实际数据,它存放的是元数据和这些数据应该存放在哪些磁盘块的信息。例如下图中的索引节点20,它存放的元数据包含权限、所有者和时间戳,数据信息包含磁盘1、3、12、13、19。
- 优点:顺序访问和随机访问速度很快
- 缺点:需要一个额外的空间,即索引节点存储了大量的信息。

通过一个索引节点是不是可以解决所有问题呢?由于一个节点的大小是有限的,当出现一个特别大的文件,一个索引节点不放不了这么多磁盘块信息,那应该怎么办?我们将索引节点划分为若干个区域,元数据区域保持不变,磁盘索引区域划分为直接块和间接块,直接块表示通过索引直接找到数据块,间接块表示索引指向的是另一个索引节点。

0x03 文件读取过程
以查找/tmp/Test.log为例,首先获取根目录/的inode号,一般情况下根目录的inode号是固定的,假设为1,通过inode号找到根目录属性和它的磁盘块,然后从硬盘中读取第405磁盘块,该磁盘块内容中包含tmp的inode号,以此类推,最终找到Test.log的磁盘块。

Linux学习笔记之Linux文件系统详解的更多相关文章
- Linux学习之文件特殊权限详解(SetUID、SetGID、Sticky BIT)(十一)
Linux学习之文件特殊权限详解(SetUID.SetGID.Sticky BIT) 目录 SetUID SetGID Sticky BIT SetUID SetUID简介 只有可以执行的二进制程序和 ...
- Linux学习笔记之 Btrfs文件系统简介及使用
Btrfs 也有一个重要的缺点,当 BTree 中某个节点出现错误时,文件系统将失去该节点之下的所有的文件信息.而 ext2/3 却避免了这种被称为”错误扩散”的问题. Btrfs相关介绍: Btrf ...
- IP2——IP地址和子网划分学习笔记之《子网掩码详解》
2018-05-04 16:21:21 在学习掌握了前面的<进制计数><IP地址详解>这两部分知识后,要学习子网划分,首先就要必须知道子网掩码,只有掌握了子网掩码这部分内容 ...
- linux学习笔记2 - linux常用命令
转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...
- Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...
- ubuntu学习笔记-tar 解压缩命令详解(转)
tar 解压缩命令详解 -c: 建立压缩档案 -x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能 ...
- CDN学习笔记二(技术详解)
一本好的入门书是带你进入陌生领域的明灯,<CDN技术详解>绝对是带你进入CDN行业的那盏最亮的明灯.因此,虽然只是纯粹的重点抄录,我也要把<CDN技术详解>的精华放上网.公诸同 ...
- Linux学习笔记之Linux相关知识
[想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...
- [读书笔记]C#学习笔记三: C#类型详解..
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
- C#学习笔记二: C#类型详解
前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. ...
随机推荐
- MySQL数据库(一)-- 数据库介绍、MySQL安装、基础SQL语句
一.数据库介绍 1.什么是数据库 数据库即存储数据的仓库 2.为什么要用数据库 (1)用文件存储是和硬盘打交道,是IO操作,所以有效率问题 (2)管理不方便 (3)一个程序不太可能仅运行在同一台电脑上 ...
- curl模拟多线程
1.curl发送请求的请求的基本思路 打开会话 设置会话参数 发送请求 关闭句柄 2.curl单进程发送示例 <?php //请求链接 $arr = [ 'https://www.yahoo.c ...
- c++ c的拓展
C++对c的拓展之, 引用和const关键字 bool类型关键字 C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和false 理论上bool ...
- 大数据技术原理与应用:【第二讲】大数据处理架构Hadoop
2.1 Hadoop概论 创始人:Doug Cutting 1.简介: 开源免费; 操作简单,极大降低使用的复杂性; Hadoop是Java开发的; 在Hadoop上开发应用支持多种编程语言.不限于J ...
- python安装第三方库--换镜像源
python安装第三方库--换镜像源 1. 更换anaconda源 清华大学镜像:清华大学镜像 anaconda下载地址:https://mirrors.tuna.tsinghua.edu.cn/an ...
- CodeForces 407E: k-d-sequence
题目传送门:CF407E. 题意简述: 给定非负整数 \(k,d\) 和一个长度为 \(n\)(\(1\le n\le 2\times 10^5\))的整数序列 \(a\). 求这个序列中最长的一个连 ...
- java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES) at com.mysql.c ...
- cookies , sessionStorage 及 localStorage 的初步的区别
cookies 保存在浏览器中,关闭浏览器后再次打开,任然存在,当然可能存在一定的有效期.(仅限存在同一台电脑,同一个浏览器中) Session依赖Cookie!! sessionStorage ...
- ESA2GJK1DH1K基础篇: Android连接MQTT简单的Demo
题外话 我老爸也问我物联网发展的趋势是什么!!!!!! 我自己感觉的:(正在朝着 "我,机器人" 这部电影的服务器方向发展) 以后的设备都会和服务器交互,就是说本地不再做处理,全部 ...
- Burnside引理
参考了神仙gzy的博客 置换:把一个排列变成另外一个排列,简单来说就是一一映射. 置换群:置换的集合. 置换即给定一个排列\({f_1,f_2,...,f_n}\),若其作用在一个排列上,则这个排列置 ...