先来扯淡吧,上一篇文章说到要补习的第二篇文章介绍文件系统的,现在就来写吧。其实这些技术都已经是很久以前的了,但是不管怎么样,是基础,慢慢来学习吧。有种直接上Spark源码的冲动。。

1. 这篇博客具体什么内容?

这篇博客是一篇文件系统入门文章,介绍一种概念上的文件系统,VSFS(Very Simple File System)

2. 文件系统是什么?

文件系统,首先是单纯的软件,因此不会涉及到使用机器硬件特征来优化文件系统;其次,它主要包含两方面内容,什么样的结构来组织文件,怎么利用这种文件结构来完成读写删除操作。

3. 建立VSFS文件系统

  磁盘的最小存储单位是扇区(Sector),首先将磁盘划分为一个个磁盘块(Block),每个块大小4KB,于是我们获得了这样的磁盘空间: 
 
  其次将这64个磁盘块的后56个磁盘块作为存储真实文件数据的区域,称为数据块(Data Region),此外,为了方便查看文件的属性等元数据,我们为每个文件建立一个inode(256Byte),然后将所有文件的inode统一组织起来放在磁盘的固定区域,在这里我们将其放在3-7这5个磁盘块(Inodes): 
 
  在这里,每个inode占用256Byte的空间,而一共是5*4Kb,故而我们一共最多可以存储80个inode,也就是说我们这个小型简单文件系统最多存储80个文件。 
  此外,为了便于磁盘管理,我们使用位标记为来标注Data Region 和 Inodes区域的使用情况(假设如果使用则设置,位为1,否则为0),为此分别占用1和2这两个磁盘,分别称为inode bitmapdata bitmap。 
  最后,我们需要一个磁盘块来存储整个文件系统的原信息(称之为SuperBlock),包括系统管理的数据规模、文件数目、inode区域起始物理地址等等吧。于是最终我们的文件系统磁盘占用是这样的: 
 
  我们这个文件系统接入到操作系统之后,操作系统会首先根据SuperBlock来初始化一些参数,然后将这个文件系统接入到操作系统的文件系统树上面去。

4.VSFS文件系统各部分具体实现

  • Inode 
    这个最“悬乎”,里面到底存储什么了?下面这个图解释了ext2 inode里面存储的内容,可以参考一下: 
     
    其实除了一些文件属性信息之外,inode最大的作用就是管理文件各个磁盘块的物理地址了,在看这个之前先来看看inode本身在Inodes区域的存储: 
     
    我们看到,其实就是给每个inode编号,然后存储在磁盘中,形成一个inode数组。 
    下面来说说inode是怎么存储文件的磁盘块的地址的。 
    最先想到的应该是直接存储就好了嘛,事实上,ext2中存储时分配了60Byte,想到每个指针的大小是4Byte(32位),也就是15个指针/物理地址。如果每个地址都是磁盘块本身的地址的话,文件本身最多包含15个磁盘块,也就是15*4K=60K的大小,显然是不符合要求的。于是乎,就有了间接索引的概念,指针指向一个磁盘块,而这个磁盘块本身存储的是真实文件磁盘块的地址。如此,一级间接索引可以表示4KB/4B=1024个物理磁盘快的数据,也就是4M。此外,还可以组织二级间接索引,可以计算出来就是4G的大小,还可以有三级索引,如此便解决了大文件的表示问题。事实上,ext2上面的15个指针中有12个事直接磁盘块的物理地址(比较大多数文件都很小,12*4K=48K足够了),剩下的三个分别表示1个一级间接索引,1个二级间接索引,1个三级间接索引。   
  • 文件夹 事实上,文件夹也可以作为一种“文件类型”,只不过存储的数据是文件名和inode number之间的映射而已。所以存储文件夹的时候只需要在对应的inode中标志位文件夹即可。

  • 空间分配 因为有了inode bitmap以及data bitmap,我们就可以获知那些磁盘块是空的,于是就按照这个来就可以了。当然了,这里面可以有优化的空间,比如是不是可以尽量分配连续的空闲磁盘块啊,等等吧。

5. 读写操作是怎么执行的

  • 读文件 为了不失去一般性,我们需要读取文件这个路径下的文件:/foo/bar 
    首先我们需要找到"/"根目录的位置,但是怎么做啊!!!事实上,根目录的inode编号是实现设定好的,假设为2。对照下面这个表来看吧: 

    • 根据根目录的inode number计算出inode所在地址,读取出来;
    • 根据inode里面的地址,读取根目录的文件夹的数据,获得文件夹foo的inode number;
    • 找到文件夹foo的inode,进而获得foo的内容,获得bar文件的inode number;
    • 根据文件bar的inode number获得文件的inode,进而获得文件数据,一块一块来读取吧;

    可见,每多一级目录,需要增加两个I/O操作。

  • 写文件 写文件的定位文件过程跟上面类似,但是写数据可能需要包括很多其他操作,比如向data bitmap申请空闲空间、之后将被分配的心block标志位使用后将更新的data bitmap写回磁盘、写文件数据本身。此外,可能还有更新inode的可能,如果是新建文件的话,还需要更改对应文件夹的内容。下面以新建文件为例子说明整个过程,见下图: 
     
    应该可以看懂吧,很恐怖吧。每次创建文件需要10次I/O,而单纯的写操作需要5次I/O!!

6. Cache

使用Cache来缓存一些数据,这样可以加速操作,比较文件读写太恶心了,读就不多说了,除了缓存数据本身还可以缓存目录的地址。写缓存(Write Buffering) ,这个主要是通过暂缓执行写操作,而尽可能将I/O合并,调度等等吧,是个很好玩的地方。 
当然了,你也可以强制不使用write buffering,fsync()就是干这个的。


7. 参考文献

  1. http://pages.cs.wisc.edu/~remzi/OSTEP/file-implementation.pdf

File System Implementation 文件系统设计实现的更多相关文章

  1. Fast File System

    不扯淡了,直接来写吧,一天一共要写三篇博客,还有两篇呢. 1. 这篇博客讲什么? Fast File System(FFS)快速文件系统,基本思想已经在在上一篇博客File System Implem ...

  2. ORA-00245: control file backup failed; target is likely on a local file system (转载)

    环境:DB VERSION: 11.2.0.4.0RAC 2 nodes 问题:邮件显示rman备份失败,查看rman备份日志 Starting Control File and SPFILE Aut ...

  3. java hadoop file system API

    org.apache.hadoop.fs Class FileSystem java.lang.Object org.apache.hadoop.fs.FileSystem All Implement ...

  4. Design and Implementation of the Sun Network File System

    Introduction The network file system(NFS) is a client/service application that provides shared file ...

  5. Linux文件虚拟机系统只读Read-only file system的快速解决方法

    问题描述:上周公司的私有云(底层架构是Openstack+KVM,目前稳定性还不够好,开发团队在改进中)一个计算节点挂掉,之后恢复后发现这个计算节点的所有Linux系统都变成只读了,复制文件提示:Re ...

  6. SD卡添加文件,添加不进去,报 Read-only file system错误

    android 模拟器手机如何添加文件到sd卡? 在DDMS中直接添加文件到模拟器sd卡如果出现错误类似:Failed to push XXXXX.txt on emulator- : Read-on ...

  7. [转]ADT中通过DDMS导入文件出错ddms transfer error: Read-only file system,Failed to push selection: Read-only file system

    [已解决] 原文  http://www.crifan.com/ddms_import_file_error_transfer_error_read_only_file_system/ 想要通过adt ...

  8. asm和file system之间数据文件的转换

    How to move a datafile from a file system to ASMMoving a datafile from the file system can be achive ...

  9. 《The Google File System》论文阅读笔记——GFS设计原理

    一.设计预期 设计预期往往针对系统的应用场景,是系统在不同选择间做balance的重要依据,对于理解GFS在系统设计时为何做出现有的决策至关重要.所以我们应重点关注: 失效是常态 主要针对大文件 读操 ...

随机推荐

  1. 软工实践-Alpha 冲刺 (4/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...

  2. 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和

    poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...

  3. CodeForces 154A Hometask dp

    题目链接: http://codeforces.com/problemset/problem/154/A 题意: 给你一个字符串,和若干模板串(长度为2),至少删除多少个字母,使得字符串的字串里面没有 ...

  4. 用vs调试项目的时候报HTTP 错误 403.14 - Forbidden

    曾经遇到过这种诡异的问题,你一定想不到,这个可能是因为你用svn合并的时候,导致了你的dll文件出了问题. 竟然可以用主干的dll替换的方式,解决掉这个问题.

  5. 关于String和StringBuffer的原理

    public class Foo {2.   public static void main (String [] args)  {3.      StringBuffer a = new Strin ...

  6. 解析DXF图形文件格式

    一.DXF文件格式分析 DXF文件由标题段.表段.块段.实体段和文件结束段5部分组成,其内容如下. ☆标题段(HEADER)标题段记录AutoCAD系统的所有标题变量的当前值或当前状态.标题变量记录了 ...

  7. YARN中用的作业调度算法:DRF(Dominant Resource Fairness)

    在Mesos和YARN中,都用到了dominant resource fairness算法(DRF),它不同于hadoop基于slot-based实现的fair scheduler和capacity ...

  8. 配置java环境 启动服务

    1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件 [root@7 ~]# java -version openjdk version "1.8.0_65 ...

  9. 自己编写 Oracle 分页函数

    CREATE OR REPLACE PACKAGE PACK_PAGINATION AS PAGESIZE CONSTANT ; TYPE TYRECORD_EMP IS RECORD( EMPNO ...

  10. GO语言教程(一)Linux( Centos)下Go的安装, 以及HelloWorld

    写在前面: 目前,Go语言已经发布了1.5的版本,已经有不少Go语言相关的书籍和教程了,但是看了一些后,觉得还是应该自己写一套Go语言的教程.给广大学习Go语言的朋友多一种选择.因为,咱写的教程,向来 ...