先来扯淡吧,上一篇文章说到要补习的第二篇文章介绍文件系统的,现在就来写吧。其实这些技术都已经是很久以前的了,但是不管怎么样,是基础,慢慢来学习吧。有种直接上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. 软工1816 · Alpha冲刺(9/10)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 学习jQuery的AJAX部分的基础知识,对web端如何异步获取服务器信息有了 ...

  2. HDU 5862 Counting Intersections 扫描线+树状数组

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...

  3. HDU 5195 DZY Loves Topological Sorting 拓扑排序

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5195 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  4. 领悟JavaScript面向对象

    JavaScript 是面向对象的.但是不少人对这一点理解得并不全面. 在 JavaScript 中,对象分为两种.一种可以称为“普通对象”,就是我们所普遍理解的那些:数字.日期.用户自定义的对象(如 ...

  5. spring-test与junit

    1.添加依赖 spring-test junit spring-context(自动添加依赖其他所需的spring依赖包) 2.在class前添加以下注解,用于配置xml文件的位置 @RunWith( ...

  6. 201621123037 《Java程序设计》第13周学习总结

    作业13-网络 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 其他: 网络编程:由客户端和服务器组成 - 服务器端 第一 ...

  7. php opensll加解密类

    <?php $pri = "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCzJc4RrAqaH2Es02XQ91Cqp/JK0yX893 ...

  8. html5兼容

    You can download the latest version of HTML5shiv from github or reference the CDN version at https:/ ...

  9. cdq分治学习

    看了stdcall大佬的博客 传送门: http://www.cnblogs.com/mlystdcall/p/6219421.html 感觉cdq分治似乎很多时候都要用到归并的思想

  10. 秒杀多线程第八篇 经典线程同步 信号量Semaphore (续)

    java semaphore实现: Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号 ...