Linux  ext2文件系统理解

  1. 硬盘组成:

硬盘由多个圆形硬盘片组成。按照硬盘片能够容纳的数据量分为单盘和多盘。硬盘的数据读取主要靠机械手臂上的磁头,在机械手臂上有多个磁头。机械手臂不动硬盘旋转一周划过的路径就是磁道。由于在一块硬盘上有多个硬盘片重叠放置,所以在硬盘旋转的时候在不同硬盘片上画出了多个相同的磁道,这些相同的磁道组成了柱面。柱面是分区的最小单位。由圆形向外画直线又可以将磁道划分为扇区,扇区是数据存储的最小单位,一个扇区的大小约为512字节。

磁盘容量 = 柱面 * 磁头 * 扇区 * 512字节

2.分区:

在使用一块硬盘之前首先要做的就是分区。分区的主要目的是告诉操作系统这块硬盘从哪个柱面到哪个柱面是可用区域。一块硬盘可以分成多个区,例如windows下的C、D、E、F。那么这些分区信息存储在什么地方? 在硬盘的第0轨上存储的是MBR(Master Boot Recorder)主引导区,分区信息就存储在MBR中。正因为如此,MBR是计算机启动时第一个读取的区域。

因为MBR的大小是存在限制的,最多只能够存储四个分区信息,这也是主分区和扩展分区最多只能有四个的原因。可以使用3P+E或者其他的方式对硬盘进行分区。

  1. 文件系统

在对硬盘进行分区了以后,要对分区进行格式化,ext2是Linux标准的文件系统格式。上面说过扇区是数据存储的基本单位,但是扇区容量太小,如果以扇区作为文件的基本存储单位,那么会导致硬盘的多次访问,从而导致系统性能的下降。格式化分区的一个主要任务是确定最小的数据存储单位----块的大小。一个块是由多个扇区组成,即 块容量 = 扇区容量 * 2 ^n,也就是说当格式化分区以后,文件的存储将以块为最小单位,例如一个块的大小为1k,那么如果我要存储0.1k的文件,就需要分配一个块给这个文件,虽然有0.9k的容量浪费;再比如要存储一个9.5k的文件,就需要分配10个块给这个文件。在Linux  ext2文件系统中块只用来存储文件内容数据,那么文件还有很多的属性信息存储在什么地方? ext2 文件系统提出了inode这个数据结构,使用这个数据结构存储文件的相关属性,例如访问权限,所有者,所属组还用对应文件内容数据的存储块指针信息等。(inode也是用一个或者多个块存储的)在块和inode数据结构提出以后,格式化分区仍然存在以下问题:

1)   分区信息如何存储?例如分区大小,起始和结束柱面、创建时间等。

2)  inode信息如何组织?

在使用ext2格式格式化分区以后,分区中的块和inode会被进行编号。而且会将0~x(x会因不同分区而异)的块规划成一个大的块,称为superBlock,在superBlock中存储了该分区的一些信息,例如块数目,inode数目,分区创建时间等,而且还有多个类似 Group  x:(Block  x ~ y)(这里的x,y表示的是数值编号)单元,这些信息存储的是什么?在ext2文件系统中将所有的块和inode又组成成多个块组,每个块组包含多个块和inode,也就是说块和inode是以块组进行管理的。在块组中包含的信息有:

Group 0: (Blocks 0-32767) [ITABLE_ZEROED]

1.Checksum 0xb986, unused inodes 49

2.Primary superblock at 0,

3.Group descriptors at 1-2

4.Reserved GDT blocks at 3-1024

5.Block bitmap at 1025 (+1025), Inode bitmap at 1041 (+1041)

6. Inode table at 1057-1568 (+1057)

7.22987 free blocks, 49 free inodes, 480 directories, 49 unused inodes

8.Free blocks: 9392, 9436, 9444, 9496, 9567-9571, 9790-32767

9.Free inodes: 8144-8192

  1. primary superblock : 存储分区信息的块
  2. Group descriptors : 存储块组信息的块
  3. Reserved GDT blocks : 预留块
  4. Block bitmap Inode bitmap: 分别表示块与inode是否可用,每一位表示一个块或者inode,为1表示存在有数据,为0表示没有存储数据为空
  5. inode table : 表示该块组包含的所有inode所在的块
  6. free Block, free inode : 空闲块和inode的数量
  7. free Block :空闲块所在块
  8. free inode : 空闲inode所在块

当你创建一个文件时 :

  1. 根据inode位图/块位图的信息,找到尚未使用的inode与块,进而将文件的属性与数据分别记入inode与块。
  2. 将刚刚使用的inode与块的号码告知superBlock、inode位图、块位图等,让这些数据更新信息。

Linux系统到底是如何读取一个文件内的内容呢?

目录:在Linux的ext2 文件系统建立一个目录时,ext2会给该目录分配一个inode与至少一个块。其中,inode记录该目录的相关属性,并指向分配到的那个块;块记录在这个目录下的相关文件的关联性 。

文件: 在ext2文件系统下创建一个文件时系统至少分配一个inode和对应于文件大小的块,inode本身并不记录文件名,它只记录文件相关属性,文件名则记录在该文件所属文件夹的块区域。在该文件夹的块区域记录了文件名和inode的相关连接。所以在ext2 文件系统下读取一个文件内容时,Linux会首先由根目录/获取该文件的上层目录所在的inode,在由该inode获取该目录所属的块,在块中找到该文件的inode,再通过该文件的inode得到该文件对应的块。例如读取 /etc/crontab文件:

linux ext2 文件系统学习的更多相关文章

  1. Linux ext2文件系统

    Linux最传统的磁盘文件系统(filesystem)使用的是ext2 1.ext2文件系统结构ext2文件系统划分为多个块组,每个块组拥有独立的inode/block,一个文件系统只有一个Super ...

  2. Linux ext2文件系统之初步思考

    数据存放在磁盘中,磁盘最小存取单位sector(512Byte);文件系统中存储的最小单位是 块(Block),大小通常(1KB,2KB,4KB...), 一个block对应多个sector,因而可用 ...

  3. Linux EXT2 文件系统

    磁盘是用来储文件的,但是必须先把磁盘格式化为某种格式的文件系统,才能存储文件.文件系统的目的就是组织和管理磁盘中的文件.在 Linux 系统中,最长见的是 ext2 系列的文件系统.其早期版本为 ex ...

  4. ext2文件系统学习(二)—— 目录磁盘结构

    创建镜像.mount等操作和上一篇一样,测试目录结构如下: 一些文件系统信息如下: Block size:             1024 Inodes per group:  128 Inode ...

  5. ext2文件系统学习(一)

    源码分析网上太多了,不写了,记录简单的实践步骤: 1. 创建ext2文件镜像并映射 cd /tmp count= mkfs.ext2 ext2-1M.img mkdir ext2 sudo mount ...

  6. linux文件系统学习

    linux系统支持很多种文件系统. 1. 如何确认当前系统挂载了哪些文件系统? 使用mount命令可以查看当前系统上已经挂载了哪些文件系统, sh-# mount rootfs on / type r ...

  7. [Linux] linux文件系统学习

    linux系统支持很多种文件系统. 1. 如何确认当前系统挂载了哪些文件系统? 使用mount命令可以查看当前系统上已经挂载了哪些文件系统, lqt@lqt-ThinkPad-T420:~$ moun ...

  8. Linux 下EXT2文件系统 —— 如何将蚂蚁和大象优雅的装进冰箱里

    这一阵子真是偷懒,无时无刻不和自己身体中的懒癌做斗争.最终我还是被打败了,星期天两天几乎都是荒废过去的,在空闲的时候实际上我内心也是有点焦虑的,不知道去怎么度过这时间.学习吧又不想学习,看电视娱乐吧也 ...

  9. 文件系统的特性,linux的EXT2文件系统【转】

    本文转载自:https://blog.csdn.net/tongyijia/article/details/52809281 先来提出三个概念: - superblock - inode - bloc ...

随机推荐

  1. Android 和iOS中 Gesture 和 Touch

    先谈谈在开发中遇到的手势问题: 今天在开发android程序时,在 View.OnTouchListener 的 onTouch(View view, MotionEvent motionEvent) ...

  2. iOS 利用self.navigationItem.backBarButtonItem修改后退按钮文字

    @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem; // Bar button item to use for the ba ...

  3. codeforces A. Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/359/A 题目意思:给出一个n行m列的table,你需要选择一个good cell(假设为(x, y), ...

  4. July 29th, Week 31st Friday, 2016

    I am a slow walker, but I never walk backwards. 我走得很慢,但我从来不会后退. I had run very fast, and I had once ...

  5. 配置SecureCRT连接本地虚拟机中的Linux系统

    转自:http://www.pythoner.com/196.html 由于平时公司开发时都是使用SecureCRT连接的Linux服务器,所以也想使用SecureCRT在自己电脑上连接本地虚拟机中的 ...

  6. Oracle错误代码大全

    Oracle错误代码大全——最新.最全的Oracle错误代码 对快速查找oracle数据库错误原因很有帮助 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ...

  7. 基因变异(codevs 3194)

    题目描述 Description 小毛终于来到了冥王星,这是一颗已经不属于行星的矮行星,它的表面温度低于-220度.在这里,小毛惊奇的发现,他带来的厌氧菌开始了基因变异,裂变的速度与光照时间(秒)成乘 ...

  8. .Net查看项目文件弹出未找到与约束

    项目能打开,但是当要在项目中查看文件时弹出未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService ...

  9. /etc/profile和$HOME/.bash_profile

    Linux中含有两个重要的文件 /etc/profile和$HOME/.bash_profile 每当系统登陆时都要读取这两个文件,用来初始化系统所用到的变量,其中/etc/profile是超级用户所 ...

  10. List Copy

    //要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性. public static T Copy<T>(T RealObject) { u ...