zoukankan      html  css  js  c++  java
  • linux:磁碟与档案系统管理

    档案系统特性:为什么磁碟分割完需要格式化(format)才能使用吗?

    答:因为每种作业系统所设定的档案属性和权限并不相同,为了存放这些档案所需的资料(所以需要格式化成作业系统能够利用的档案系统格式filesystem)  

    linux的正规档案系统:EXT2(Linux second extended file system, ext2fs),默认windows是不认识EXT2档案系统的

    一个可被挂载的资料为一个档案系统而不是一个分割槽(以前一个分割槽只能被格式化成一种档案系统,所以我们说一个filesystem就是一个partition)

    档案系统是如何运作的:

    1>.档案系统通常会将这两部分的资料分别存放到不同的区块,权限与属性放置到inode中,至于实际资料则放置到data block中

    2>.superblock超级块:记录整个档案系统的整体资讯,包括inode与block的总量、使用量、剩余量,以及档案系统的格式和相关资讯

    3>.inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的block的号码

    4>.block:实际记录档案资料的内容,如果内容太大,则占用多个block

    对比以下两种档案系统:

     磁盘重组:当档案写入的block太过于离散,此时档案读取的效能将会变的特别差,就需要考虑【重组】了;

     磁盘重组:可以将统一档案所属的block整合到一起,资料的读取就会很容易

     索引式档案系统:(因为是索引式的档案系统,所以基本不需要考虑经常性的磁盘重组,当然如果档案系统使用太久了,经常的删除/新增/修改档案时,造成档案资料太过于离散,就需要考虑重组一下)

      

      FAT档案系统:(由于FAT档案系统它的block不能一次性读取完,需要依次读取,当同一资料的block太过离散时,读取数据就会很慢,需要三不五时的重组)

      

     

    档案系统一开始就把inode与block规划好了,除非重新格式化,否则inode与block固定后就不再变化

      ext2档案系统示意图:

     

     每一个区块群组六大主要内容说明:

     data block(资料区块):EXT2档案系统中所支援的block大小有1k、2k、4k三种,由于block的大小不同,导致该档案系统能够支持的磁碟最大容量和最大单一档案容量并不相同

      

     限制:

      1.block的大小和容量在格式化之后就不能再进行修改了(除非重新格式化)

      2.每个block内最多只能放置一个档案的资料

      3.如果档案的大小大于block的大小,则一个档案可能占用多个block的数量

      4.如果档案的大小小于block的大小,则block的剩余容量不能再被使用(磁盘空间浪费)

     

     inode table(inode表):它的大小和数量也是在格式化的时候就固定了的

      inode记录一个block的号码要花费4byte的容量

      记录的信息:

        该档案的存取模式(read/write/excute)

        该档案的拥有者和所属群组(owner/group)

        该档案的容量(size)

        该档案的建立和修改的时间(ctime)

        最近一次的读取时间(atime)

        最近一次的修改时间(mtime)

        定义档案特性的旗标,比如SUID...

        该档案真正的内容指向(pointer)

      特色:

        每个inode大小固定为128bytes(新的ext4和xfs可以设定到256bytes)

        每个档案都只会占用一个inode

        档案系统能够建立的数量与inode的数量有关

        系统读取档案时需要先找到inode,先分析inode里面的权限和使用者是否符合,若符合才能开始实际读取block的内容

      inode结构示意图:

      

      a>.inode有12个直接存储block号码:12 * 1K = 12K

      b>.inode有1个间接存储(使用一个block块存储block号码):(1K * 1024)/ 4 *1K = 256K(记录一个block号码需要4byte,则一个block可以存储256个block号码)

      c>.inode有1个双间接存储(使用一个block存储256个block号码,通过这256个block来记录更多的block号码):((1K * 1024)/ 4 )* ((1K * 1024)/ 4) * 1K = 2562K

      d>.inode有1个三间接存储(使用一个block存储256个block号码,通过这256个block来记录256*256个的block号码,通过256*256个block来记录256个block:((1K * 1024)/ 4 )* ((1K * 1024)/ 4) * ((1K * 1024)/ 4 )* 1K = 2563K

      总额:将直接、间接、双间接、三间接的量相加,(12 + 256 + 2562 + 2563)/ 1024 / 1024 = 16GB(对照上面data block档案限制表)

      由于EXT2档案系统的限制(某些程序只能捕捉到小于2GB大小的档案,跟档案系统无关),1K大小的block结果一致,但是2K和4K的结果不一致

       

      superblock(超级快,一般大小为1024bytes):记录整个filesystem的相关整体资料,没有superblock就没有filesystem

      记录的主要资讯:

      block与inode的总数量

      未使用与已使用的block和inode的数量

      block与inode的大小(block大小有1K,2K,4K,而inode大小128bytes或256bytes)

      filesystem的挂载时间,最后一次写入的时间,最后一次检验磁碟(fsck)的时间等档案系统的相关资讯

      一个valid bit 的值,若档案系统已被挂载则为0,未被挂载则为1

      注意:每个block group都有可能含有superblock(之前说一个档案系统只有一个超级块superblock),如果后续的block group内含有超级块superblock,则是对第一个block group的超级块的一个备份,这样可以进行superblock的救援

      filesystem description(档案系统描述):这个区段描述每个block group的起始和结束的号码,以及每个区段(superblock、bitmap、inodemap、data block)分别介入哪些block号码之间

      block bitmap(块位图,区块对照表):作用标记哪些block是空的未使用的(当新增档案时,通过block bitmap就可以知道哪些block可以存储内容和资料;当你删除某个档案时,block bitmap就会释放对应的block,将它标记为【未使用】)

      inode bitmap(节点对照表):跟block bitmap类似,block bitmap只是记录使用与未使用的block号码,而inode bitmap则是记录使用与为使用的inode号码

      

      dumpe2fs:查询ext家族superblock资讯的指令(centos7.x档案系统多为xfs,暂时不太支持dumpe2fs)

      

      

    档案系统与目录树的关系:

      目录:在档案系统中,建立一个目录时,档案系统会分配一个inode给目录,以及至少一块block给该目录(这个block记录了该目录下档案的档名和每个档案对应的inode号码)

      

      目录树的读取:

      

      filesystem大小与磁碟的读取效能:

        问:档案系统规划的太大(例如:100GB),由于磁盘上的资料总是来来回回的,而资料写入磁碟不可能是连续性的block,是填充式的写入,哪个block空的就往哪写,如果写入档案的block真的分的很散,就会出现档案资料离散的问题,虽然ext2档案系统的inode里面记录了block的号码,可以一次性的读取全部的block出来,但是如果太过于离散,就会发生读取效能低下的问题,因为机械手臂要不停的来来回回的在磁碟上面频繁的读取;

        答:把filesystem的资料全部复制出来,然后将filesystem重新格式化一下,再将资料给它复制回去就OK了

      此外filesystem规划太大,资料写入系统最前面和最后面的block号码中,造成磁碟的机械手臂读取资料时移动幅度过大,也会造成读取效能下降,机械手臂在搜寻整个filesystem时,也会花费很多时间去搜寻,所以filesystem不是规划的越大越好,要根据你主机的用途来进行规划

     

    filesystem ext2/ext3/ext4档案的存取与日志式的档案系统的功能

      写入档案流程:

      

      资料不一致(Inconsistent)状态

        比如你的档案资料在写入档案系统时,遇到了紧急情况(断电,系统核心发生错误。。。),还没来得及将更新inode bitmap、block bitmap、superblock,此时会发生metadata数据的内容与实际资料存储内容不一致的状态(使用e2fsck程序来检测修复,当档案系统太大时,使用e2fsck程序时太费时了,所以就有了后来的日志式的档案系统

      日志式的档案系统(Journaling filesystem)

        步骤:1.预备:当系统要写入一个档案时,会现在日志记录区中记录某个档案准备要写入的资讯

           2.实际写入:开始写入档案的权限与资料,开始更新metadata的资料

           3.结束:完成资料与metadata的更新后,在日志记录区当中完成该档案的记录

    linux档案系统的运作:通过一个非同步处理(asynchronously)的方式

       当系统载入一个档案到记忆体后,如果该档案没有被更动,在记忆体区段的档案资料会被设定为干净的(clean);如果该档案被更动了,在记忆体中该档案资料就会被设定为(dirty),此时所以的动作都还是在主记忆体中执行,并没有写入磁盘(可以使用指令:sync来强制主记忆体将设定为dirty的档案资料刷新写入磁盘)

      作用:

        系统会将常用的档案资料放入主记忆体额缓冲区,以便加速档案系统的读写

        承上,因此linux系统中的实体主记忆体都会被用光,这是正常情况,可加速系统效能

        你可以手动使用sync强制记忆体中设定为dirty的档案资料刷新写入磁盘

        若正常关机,则关机指令会尝试主动呼叫sync指令强制将档案资料刷新写入磁盘

        若不正常关机(停电、当机或不明情况),档案资料尚未写入磁盘,因此重新开机后系统会花费很多时间进行磁盘检查,甚至可能导致档案系统的损坏(非磁碟损坏)

    linux:挂载点的意义:

      将档案系统与目录树结合的动作称之为挂载;

      挂载一定是目录,该目录为进入该档案系统的入口

      xfs filesystem它的目录最顶层的inode一般是128号

    其他linux支援的档案系统与vfs

      

      

      VFS(作用):进行管理系统的所以filesystem,它会主动帮我们识别做好读取那种filesystem的准备动作

       

      

      centos 7开始,为什么要舍弃ext家族的档案系统而使用xfs呢?

      答:

        a.ext家族的档案系统支援度广,但是格式化超级慢(采用预先把inode,block,superblock规划好,不需要动态去配置,系统可以直接用)

        b.xfs(高容量磁碟,高效能档案系统)【复原速度,建置速度】

      xfs(高容量磁碟,高效能档案系统):规划三部分(资料区、档案系统活动登录区log section、即时运作区)

        资料区(与ext家族的block group差不多):inode与block都是在系统需要的时候才分配(动态分配,格式化超级快),并且block与inode有多种不同的容量设置,block的容量可以是512byte-64K,在linux下面由于主记忆体控制的关系(分页档容量的关系),最高可以设置成4K而已(可以设置成16K,但是linux是不允许你挂载的,所以设置了也没用)inode则可以设置为256byte-2M,基本保留256就够了;

      

       档案系统的简单操作指令:df(列出系统已挂载档案系统整体容量的使用情况)、du(评估档案系统的磁碟使用情况,常用在推估目录所占容量)

       df:

        

        

      

       du:

             

    实体连接与符号连接:

      hard link(实体连接、实际连接、硬体连接):在某个目录下新增一笔档名连接到某个inode号码关联记录而已

        hard link设定连接档,磁盘的空间和inode的数量是不会改变的,hard link只是在某个目录下的block中多写入一个关联资料而已,并不会改变inode的数量,同时一般不会改变block的数量(因为hard link的关联资料量很小,一般不会产生太多空间来存储;如果刚好存放资料的block被档案资料内容填满了,那可能就会增加bock的数量了)

        hard link只能在单一的filesystem中进行,不能跨档案系统,同时不能link目录

        问题:为什么不能link目录呢?

        答:因为如果link目录,连接的资料需要连同被连接目录下的所以资料都建立连接,比如你要link实体连接/etc目录建立一个连接/etc_hd的目录,这时候/etc_hd目录底下的所以档案都需要与/etc目录下面的档案建立hard link,而不只是/etc_hd连接到/etc而已;如果要在/etc_hd下面建立档案,连带着/etc底下的档案资料又要重新link一遍,因此造成环境相当大的复杂度

        

      symbolic link(符号连接,相当于windows下面的快捷方式):建立一个独立的档案(会占用inode和block),而这个档案会让资料的读取指向它link的哪个档案的档名;当来源档被删除了,那符号链接档也打不开了

      

      练习:

      

    关于目录的link数量:

       

       

     内容参考自鸟哥linux私房菜,传送门:http://linux.vbird.org/;

  • 相关阅读:
    [原创]用C++类实现单向链表的增删查和反转操作
    [原创]c语言中const与指针的用法
    [原创]大连sap vt 实习生面试经历
    Android studio 相关错误处理
    Java 判断整数方法
    Android 网络编程
    Android 基础篇(二)
    Android ListView 的基本应用,包括缓存
    Java重点识记
    Android基础篇(一)
  • 原文地址:https://www.cnblogs.com/zengguowang/p/5456155.html
Copyright © 2011-2022 走看看