一、文件系统基本知识

① 存储在永久性存储介质,由程序按照某种格式制作的数据集合叫做文件

② 磁盘上管理文件的文件、数据结构和操作构成磁盘文件系统,简称文件系统

③ 文件属性

(1)名称

(2)位置

(3)大小

(4)类型

(5)保护

(6)时间、日期

(7)用户标识

④ 进程要通过操作系统来访问磁盘上的文件,也就是说,操作系统是进程与磁盘文件系统之间的中介

⑤ 用户对文件的操作

(1)创建文件

(2)写文件

(3)读文件

(4)删除文件

⑥ 操作系统的文件管理系统必须提供两项基本功能:

(1)一是要建立专门用于文件管理的目录体系

(2)二是要为用户提供对文件进行操作的系统调用

⑦ 文件的简单存储方式

(1)经过适当的软件处理,磁盘可以看成由若干大小相等的存储块(512Byte)所组成的一个线性空间

(2)通常一个文件需要占用多个存储块

(3)磁盘文件系统需要一个目录表来记录文件名称、储存位置等信息,并把这种记录兼做目录项,这个目录表叫做目录文件

⑧ 存储块的组织方式

(1)链接组织方式:

(2)索引组织方式:为每个文件创建一个长度与文件所占用存储块的数目相等的数,以文件块的逻辑顺序号为数组元素的下标,而以文件存储块的指针为元素的内容,于是就形成了一个文件索引表。

注:简单来说,索引表就是文件块的逻辑块号与存储块号的对照表

⑨ 空闲块的记录

(1)未被文件占用,或者被已删除文件释放出来的块叫做外存的空闲块

(2)操作系统用来记录跟踪空闲块的数据结构主要有位图、链表、分组链表等

⑩ 文件目录

(1)一体化文件目录:

(2)分立式文件目录:分立式目录中,目录被分成两部分:一部分只记录文件的文件名等用户关心的逻辑信息;一部分只记录文件所占用的存储块数目、位置等物理信息。前者叫  做逻辑目录,简称目录;后者叫做索引节点,简称i节点(inode)

注:由于i节点与文件唯一对应,所以i节点也叫作文件控制块(FCB)

(3)用于集中记录i节点的文件叫做设备文件,而集中记录逻辑目录的文件叫做逻辑目录文件

注:硬链接是两个文件指向同一个i节点

⑪ 磁盘上的文件系统

(1)引导控制块:存储引导操作系统所需要的信息

(2)主分区:存储操作系统内核映像文件

(3)分区控制块(Super Block):数据分区的第一块为分区控制块,该块中含有本分区所包含的块数、块的大小、空闲块的数量及位置、文件控制块的数量及位置等详细信息,也  叫作超级块或主控文件集

(4)目录文件:位于分区控制块之后,存放分区内文件的目录文件

(5)文件控制块(FCB):通常处于文件数据块之前,内含文件的逻辑及物理信息

注:文件控制块也叫作索引节点(inode)

二、Ext2文件系统

① Ext2采用了分立式目录结构,即一个文件的目录分为目录项和索引节点

② Ext2的索引节点:在一个实际分立式目录的文件系统中,索引节点(inode)主要需要两部分内容来支持,一是inode结构;二是对于节点的操作函数

(1)Ext2的索引节点:Ext2的每个文件(或目录)都有一个唯一的i节点ext2_inode,它保存了一个文件所有与存储相关的属性

struct ext2_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Creation time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks; /* Blocks count */
__le32 i_flags; /* File flags */
  ...
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
__le32 i_generation; /* File version (for NFS) */
__le32 i_file_acl; /* File ACL */
__le32 i_dir_acl; /* Directory ACL */
__le32 i_faddr; /* Fragment address */
...
};

  * i_mode:指定文件的类型(普通文件、目录文件、设备文件和网络文件)

  * i_block[]:文件索引表。i_block[]共有15项,其中前12项为直接指向文件数据块的指针,后3项分别为采用多级索引结构的“一次间接指针”、“二次间接指针”和“三次间接指针”

(2)Ext2的i节点操作函数

const struct inode_operations ext2_file_inode_operations = {
.truncate = ext2_truncate,
#ifdef CONFIG_EXT2_FS_XATTR
.setxattr = generic_setxattr,
.getxattr = generic_getxattr,
.listxattr = ext2_listxattr,
.removexattr = generic_removexattr,
#endif
.setattr = ext2_setattr,
.permission = ext2_permission,
.fiemap = ext2_fiemap,
};

③ Ext2的目录文件及目录项

(1)Ext2的目录文件实质上是一个目录项列表,其中每一项都是一个ext2_dir_entry_2结构的数据

struct ext2_dir_entry_2 {
__le32 inode; /* Inode number */
__le16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
__u8 file_type;
char name[EXT2_NAME_LEN]; /* File name */
};

(2)Ext2的目录文件采用了一个特殊的链表结构进行存储:(程序通过rec_len作为偏移量来查找下一个目录项)

(3)每当用户需要打开一个文件时,首先要指定待打开文件的路径和名称,文件系统根据路径名称搜索对应的目录项,然后用该目录项中的i节点号找到该文件的i节点,最后通过访问i节点结构中的i_block[]数据块成员来访问文件

④ Ext2在磁盘上的存储结构:Ext2文件系统把所占用的磁盘空间分成若干个块组,每个块组的内部结构如下图

(1)超级块:保存着整个文件系统的信息

struct ext2_super_block {
__le32 s_inodes_count; /* Inodes count */
__le32 s_blocks_count; /* Blocks count */
__le32 s_r_blocks_count; /* Reserved blocks count */
__le32 s_free_blocks_count; /* Free blocks count */
__le32 s_free_inodes_count; /* Free inodes count */
__le32 s_first_data_block; /* First Data Block */
__le32 s_log_block_size; /* Block size */
__le32 s_log_frag_size; /* Fragment size */
__le32 s_blocks_per_group; /* # Blocks per group */
__le32 s_frags_per_group; /* # Fragments per group */
__le32 s_inodes_per_group; /* # Inodes per group */
__le32 s_mtime; /* Mount time */
__le32 s_wtime; /* Write time */
__le16 s_mnt_count; /* Mount count */
__le16 s_max_mnt_count; /* Maximal mount count */
__le16 s_magic; /* Magic signature */
__le16 s_state; /* File system state */
__le16 s_errors; /* Behaviour when detecting errors */ ...
   __le16 s_block_group_nr; /* block group # of this superblock */
...
__u8 s_uuid[]; /* 128-bit uuid for volume */
char s_volume_name[]; /* volume name */
char s_last_mounted[]; /* directory where last mounted */
...
};

注:Ext2在每个块组中都配置了一个超级块,正常情况下只是用第一个块组(块组0)中的超级块,其他块组的超级块只是一个备份

(2)块组描述表:是超级块的补充,提供块组位图存放位置和i节点存放位置

struct ext2_group_desc
{
__le32 bg_block_bitmap; /* Blocks bitmap block */
__le32 bg_inode_bitmap; /* Inodes bitmap block */
__le32 bg_inode_table; /* Inodes table block */
__le16 bg_free_blocks_count; /* Free blocks count */
__le16 bg_free_inodes_count; /* Free inodes count */
__le16 bg_used_dirs_count; /* Directories count */
__le16 bg_pad;
__le32 bg_reserved[];
};

(3)存储块管理位图:记录块组中数据块的使用情况

(4)i节点管理位图:记录块组中i节点的使用情况

(5)i节点表:存放i节点数据结构的表

(6)数据块:储存数据

Linux文件系统--基于EXT2的更多相关文章

  1. Linux 文件系统及 ext2 文件系统

      linux 支持的文件系统类型 Ext2:     有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3:     Ext2 的加强版,添加了日志 ...

  2. linux文件系统(ext2)

    一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下图是一个磁盘分区格式化成e ...

  3. Linux文件系统知识记录——ext2描述

    最近完成了一个编程作业,大致功能是给定一个文件名,给出该文件所在目录和其本身所占用的簇号等信息.笔者选用了Linux的ext系列文件系统作为实验对象,通过实验对ext2文件系统的存储和索引有了一个较为 ...

  4. Linux磁盘管理——Ext2文件系统

    前言 通常而言,对于一块新磁盘我们不是直接使用,而是先分区,分区完毕后格式化,格式化后OS才能使用这个文件系统.分区可能会涉及到MBR和GPT问题.至于格式化和文件系统又有什么关系? 这里的格式化指的 ...

  5. linux 文件系统简介

    linux文件系统简介   文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...

  6. linux文件系统简介

    文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储结构.软链接 ...

  7. Linux文件系统 (Ubunt)

    Linux 文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基本原理.文件存储 ...

  8. (转)Linux文件系统的实现

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状 ...

  9. Linux文件系统及常用命令

    Linux文件系统介绍: 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上.目录提供了管理文件的一个方便而有效的途径. Linux使用树状目录结 ...

随机推荐

  1. python -使用Requests库完成Post表单操作

    """ 使用Requests库完成Post表单操作 """ #_*_codingn:utf8 _*_ import requests fro ...

  2. 关于键盘事件-查询:有多个input框,任意一个支持enter键查询

    应用场景:同一个界面有多个input框支持任意一个Enter查询. 实现:在input框中添加onkeypress="函数名()". 函数里面编写对应键盘code值,在里面直接调用 ...

  3. Django路由配置之子路由include(URL分发)

    子路由include(URL分发) 在一个项目中可能存在多个应用,为了方便区分和管理,在项目的总路由urls.py中会进行路由分发: (1)项目总路由导入from  django.conf.urls  ...

  4. BATJ解决千万级别数据之MySQL 的 SQL 优化大总结

    引用 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL 逻 ...

  5. zoj3995 fail树

    //给n个串 求两个串的(最长)公共后缀, 如果这个后缀是1个串的前缀 ,那么++ans,求ans/* 对所有串建立AC自动机,那么若前缀ii 是前缀jj 的后缀,说明ii 是Fail树上jj 的祖先 ...

  6. Lightoj1356

    题目链接:https://vjudge.net/problem/LightOJ-1356 题目大意: T个 test case,每个 test case 给出一个 N 个数的集合.请找出一个最大的子集 ...

  7. vue项目中使用bpmn-番外篇(留言问题总结)

    前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...

  8. 浅谈进程&线程

    学习过操作系统(下面简称OS)的都清楚,计算机计算的核心是CPU,操作系统是计算机资源的管理者 同事也是软硬件之间的接口.为了实现程序的并发,而引入了进程的概念.在传统OS中,进程是个很重要的概念,它 ...

  9. [PHP学习教程 - 文件]002.判断远程文件是否存在(Remote File Exists)

    引言:项目过程当中碰到了类似流程这样的需求,对服务器上的文件进行依次操作,如:检查文件格式->检查文件是否有更新->处理更新->同步其他服务器等等 如果需求的操作是依赖于远程文件是否 ...

  10. [Objective-C] 014_Objective-C 代码规范指南

    本文参考引用(http://www.csdn.net/article/2015-06-01/2824818-objective-c-style-guide/1) 拥有良好的编码规范,能使我们的代码保持 ...