深入浅出-文件系统

万法缘生,皆系缘分。缘起即灭,缘生已空。

世间万物皆是幻象,一切随缘生而生,随缘灭而灭 。 若是有缘,时间、空间都不是距离;若是无缘,终是相聚也无法会意。真正的解脱之道,不是将烦恼视为负担,而是把烦恼当做修行的功课;真正的修行,修炼的不是断除烦恼本身,而是面对烦恼的心态和智慧。

Linux哲学思想:一切皆文件

    但凡有操守的linux老师,在介绍linux时都不可避免的重复在说“linux的哲学思想重要的一条:一切皆文件”。然而,真正将文件在整个操作系统中的作用和实现讲清楚的却是寥寥。既然文件对于linux操作系统如此重要,下面会从不同的维度来认识文件和文件系统。

1. 文件系统的产生

文件,其实可以等同于数据。对于计算机而言,真正的工作就是用CPU处理数据(这里的数据在内存中)。

出现两个问题:

  • 第一,CPU处理的是内存中的数据,内存中的数据从哪里来的?
  • 第二,处理完成的数据,怎么保存?

毕竟,内存中的数据断电后就没有了,而且内存空间有限,不可能将所有数据都放在内存中。
温馨提示:此处暂不考虑数据如何输入输出到内存的问题

现在的计算机环境,一般来说数据从磁盘上来(泛指直接由硬盘或存储所提供的磁盘空间)。提及磁盘,很多名词就会从脑子里面蹦出来:盘片、磁头、磁旋臂、磁道、扇区、柱面、电机、7200转、10k、15k.....这些基于硬件的工作原理部分,在此就不做复述。这些东西都很重要,但是对于我们来说不可控,也就是不能直接操作,存在磁盘上的数据仅仅是表示0/1的磁信息,那么怎么才能将数据存入到硬盘上?

对于计算机而言,任何无法直接做到或是做起来很繁琐的事情,都可以采用抽象的方法。

文件是磁盘的抽象,进程是CPU的抽象,虚拟内存就是内存的抽象....此类的东西很多,想要学会操作系统就必须理解此类的抽象。

磁盘里有很多部件,能够正常的运转必然有一套管理系统。既然文件是磁盘的抽象,自然也需有一套“抽象的”管理磁盘的系统----文件系统。也就是说,我们想要访问和控制磁盘,就要将物理的磁盘进行逻辑化抽象,进行管理。比如物理磁盘的数据读写以扇区(sector)为单位,抽象后的文件,以块(block)为单位

这里也就解释了,为什么磁盘在出厂已经格式化,在使用磁盘时还要再进行一次文件系统格式化才能够使用的原因。

2. 文件系统分类

  • ext2:早期linux中常用的文件系统
  • ext3:ext2的升级版,带日志功能
  • ext4:ext3的升级版,大幅度改动
  • RAMFS:内存文件系统,速度很快
  • NFS:网络文件系统,由SUN发明,主要用于远程文件共享
  • MS-DOS:MS-DOS文件系统
  • VFAT:Windows95/98操作系统采用的文件系统
  • FAT:WindowsXP操作系统采用的文件系统
  • NTFS:WindowsNT/XP操作系统采用的文件系统
  • HPFS:OS/2操作系统采用的文件系统
  • PROC:虚拟的进程文件系统
  • ISO9660:大部分光盘所采用的文件系统
  • ufsSun:OS所采用的文件系统
  • NCPFS:Novell服务器所采用的文件系统
  • SMBFS:Samba的共享文件系统
  • XFS:由SGI开发的先进的日志文件系统,支持超大容量文件
  • JFS:IBM的AIX使用的日志文件系统
  • ReiserFS:基于平衡树结构的文件系统
  • udf:可擦写的数据光盘文件系统

3. 不同视角看文件系统

以用户的角度:

  • 文件名
  • 操作

解释:作为用户,文件就是存取数据的基本单元。不需要知道数据真实存在具体哪个硬盘的哪个扇区里,此时用户能够看到也只有文件的名字,所在的位置(路径),是否有权限进行读写执行而已。这时的文件系统隐藏在文件名和路径之间,看不见摸不着。

以操作系统角度,内存文件系统(VFS)—> 大同

  • 超级块(super block)对象
  • 索引节点(inode)对象
  • 目录项(dentry)对象
  • 文件(file)对象

解释:在操作系统层面,文件系统有很多类型(ext4、xfs、nfs、cifs....),操作系统要识别每一种类型,并且每种类型的文件系统操作的方式不同。用户在面对不同类型文件系统要用不一样的操作,这显然不是明智的办法。

上面说过,计算机遇到复杂的问题就采用抽象的方式来解决。这时“虚拟文件系统交换(VFS,Virtual Filesystem Switch)”出现了。向上,为用户提供统一的接口,让用户忽略文件系统类型的差异和选择。向下,使用结构对象的方式,将各种类型的文件系统管理信息,在内存中建立一个数据结构,将各种系统管理起来。

以磁盘文件系统角度:(磁盘上只有inode,没有一种专门称为目录的数据结构)

  • 索引节点(inode)
  • 数据块(block)
  • 超级块(super block)

解释:这里的磁盘文件系统,就是文件系统在磁盘上真实存在的数据信息。一定要与VFS中的信息加以区别,起初没有搞清楚它们之间的逻辑关系,也是有点蒙圈。这里的inode、block、super block是固定保存在磁盘中,vfs的结构对象内容,是从磁盘文件系统中读取的,存在内存中,关机就不再存在了。所以在vfs加了对象的后缀,以示不同。

 

上面从用户-->操作系统-->磁盘的角度(自上而下)分别简单描述了文件系统。为了能够理清文件系统的结构,我们需要自下而上顺序,逐一来介绍。

磁盘文件系统

大家最熟悉的莫过于windows,那我们就从windows 磁盘碎片整理说起。

对于文件系统来讲,离我们最近和最早接触的就是Windows文件系统,比如FAT32、NTFS。具有一些操作经验的童鞋,都会知道windows定期进行磁盘碎片整理,读写会变快些,这是为什么呢?

硬盘是低速设备,其读写单位是扇区,为了避免频繁访问硬盘,windows文件系统以簇为单位进行读写,linux文件系统使用块为单位。(1 sector=512bytes,簇和块的大小,在进行文件系统格式化时可以进行设定,比如1 block=4K,就是8个扇区)

以下为了解释方便,簇和块,都统称为块。此处设定簇(快)的大小为4k,有一个10k的文件。

当前文件10k,大于一个块的大小,就需要用多个块来存储一个文件。如何知道文件有那些块,就要取决于文件数据块的组织形式。在windows FAT中,采用链式结构来组织,简单来说,每个数据块尾部留一些固定的空间,记录下一个块的信息。这个结构的好处,提高磁盘的利用率,节省空间,处理简单。同时缺点也就暴露出来了,因为我们无法确保每个文件的数据块都是连续的,会出现磁头反复移动才能读完数据块。比如存储的数据块在3、6、5号上,其实磁头直接读3->5->6 这样就可以读完了,但是链式方式,在读到3时,根本不知道有5这个数据块,只会读6,然后翻过头了再读5(可能盘片再旋转一次才能读到5)。

所以windows就有了碎片整理,将下一个块,尽量移动到顺序的位置,使得能够高效的读取。这样的文件系统可以称为链式文件系统或非索引文件系统

linux文件系统不存在这个问题,因为使用索引结构来组织数据。简单来说,索引文件系统将数据分为两个部分:真实数据和元数据。元数据中包括了文件对应的块信息,以inode table形式存在,即使数据块是不连续的,访问文件,会先访问inode,得到相应块的信息,然后进行排序,一次性读取。

文件 = inode(元数据) + block(真实数据)

好处,不言而喻读取和查找都会比较快。缺点,inode会占用一定空间。

  • 索引节点(inode):文件的元数据(一切文件管理的相关信息,不包括文件名)
  • 数据块(block):文件真实的数据
  • 超级块(super block):整个文件系统的元数据

Q:每个文件都要有一个inode,inode中记录了文件的大部分信息,地位与文件数据一样重要,但如此重要的数据结构,对于用户来说,缺少文件名,为什么?

A:因为,inode是操作系统(文件系统)管理文件的重要信息,只要给出inode,就可以找到文件实际的数据。在文件系统的角度是不需要所谓文件名、路径等等抽象的东西。

Q:毕竟创建文件系统,最终都是为人服务的,但文件系统自身不需要使用文件名,作为用户,却要使用文件名进行对数据的操作,那么inode和文件名是如何关联在一起的?

A:用户在使用文件名时,无论该文件名是作为可执行的程序,或是作为参数,都离不开路径。也就是说文件名一定在某个目录(在windows中就是文件夹)下。基于linux一切皆文件的哲学思想,目录也是文件,我们这里称为目录文件。目录文件也有inode和block,inode中没有文件名,目录文件和普通文件的区别就是block的内容了。目录文件的block中记录的内容有两种:文件名和子目录对应的inode信息。

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/xinghaitao/blog/1479631

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这个系列课程中,来自微软的权威技术专家将向您解释Windows操作系统的内部工作原理,从系统架构的大局观出发,逐步展示进程、线程、安全机制、内存管理和存储管理等子系统的工作方式。通过对底层原理的揭示,使您更进一步的理解Windows上各类程序的工作方式和如何进行错误诊断及性能优化。 本次课程的内容编排得到了国内知名技术作家,《Windows Internals》一书的中文译者,潘爱民先生的大力支持,同时TechNet也邀请到了众多微软一线技术专家进行讲解。这是一个为IT专业人员量身定做的Windows内部知识课程,在介绍原理的同时,也紧密地围绕实际案例和常见的故障进行分析点评。这是一个系统的学习Windows底层工作机制的好机会,课程内容深入浅出,精彩纷呈,绝对不容错过。 深入研究Windows内部原理系列之一:Windows的昨天、今天和明天 讲师信息:潘爱民 2007年01月25日 14:00-15:30 Level: 300 著名技术作家、微软亚洲研究院研究员潘爱民老师将在这次课程中跟听众分享Windows的发展历程和技术精萃,描绘操作系统的体系架构、Vista的内核变更以及今后版本Windows的发展趋势。 深入研究Windows内部原理系列之二:Windows体系结构-从操作系统的角度 讲师信息:张银奎 2007年01月26日 14:00-15:30 Level: 400 操作系统是计算机系统的灵魂和管理中心,也是软件系统中最复杂的部分。本讲座将以生动的讲解和丰富的演示带您领略Windows操作系统的核心架构和主要组件,包括HAL、内核、执行体、系统进程(IDLE、SMSS.EXE、WinLogon.EXE)和Windows子系统(CSRSS.EXE、WIN32K.SYS以及子系统DLL)等。并讨论中断管理、对象管理、和异常分发等系统机制和实现这些机制的基本数据结构。 深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度 讲师信息:曾震宇 2007年01月29日 14:00-15:30 Level: 400 从服务器软件到Office办公应用,从联网游戏到即时消息,不管这些应用的复杂程度如何,他们都是一个个在操作系统控制和管理之下的可执行程序。本次课程邀请微软全球技术中心专家级工程师,为各位讲解一个程序是如何经历从启动、分配资源、运行、结束这一连串的过程,并且介绍其中的重要概念和排错诊断技巧。 深入研究Windows内部原理系列之四:Windows操作系统中的重要基本概念 讲师信息:高宇 2007年01月30日 14:00-15:30 Level: 400 进程、线程、资源分配、内存管理、Win32 API、服务、安全,这些是工作中常常提及但是又无法深入理解的神秘概念。在这次课程中,讲师将介绍Windows中最常见与最重要的一些基本概念. 使大家能够顺利地参与到本系列之后的讨论中去。 深入研究Windows内部原理系列之五:Windows Sysinternals工具集介绍 讲师信息:彭爱华 2007年01月31日 14:00-15:30 Level: 400 Sysinternals Suite(Windows Sysinternals工具集)包含一系列免费的系统工具,其中有大名鼎鼎的Process Explorer、FileMon、RegMon等(在Windows Vista下,FileMon和RegMon则被Process Monitor所代替),如果把系统管理员比喻成战士的话,那么Sysinternals Suite就是我们手中的良兵利器。熟悉和掌握这些工具,并且对Windows的体系有一定的了解,将大幅度的提高日常的诊断和排错能力。本课程将以任务驱动的模式,介绍几个经典的应用案例,来介绍Sysinternals Suite的强大功能。 深入研究Windows内部原理系列之六:Vista新特性底层揭秘 讲师信息:彭爱华 2007年02月01日 14:00-15:30 Level: 400 Windows Vista绝非仅仅是具有诸如3D切换、毛玻璃等炫目的界面效果,花钱购买了Windows Vista,而仅仅为了使用其界面效果,难免有点“买椟还珠”的感觉。实际上Windows Vista值得称道的是它具有很多全新的安全特性,例如用户帐户控制、IE保护模式、服务隔离和Windows资源保护等等。有了这些全新的安全特性,我们就可以在相当的程度上摆脱恶意软件的滋扰。Windows之父Jim Allchin曾经说过不要满足于只知道How-to、小技巧之类的知识,而是应该深入底层了解其内部原理。只有了解了这些安全特性的内在原理,才
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值