首页 > 代码库 > linux读书摘要--linux磁盘与文件系统管理

linux读书摘要--linux磁盘与文件系统管理

磁盘基础知识点整理

    整颗磁盘的组成主要有:圆形的磁盘盘(主要记录数据的部分);机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。

    扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有 512bytes 与 4K 两种格式;将扇区组成一个圆,那就是磁柱(Cylinder);早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位; 磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。MBR 分区表中,第一个扇区最重要,里面有: (1)主要开机区(Master boot record, MBR)及分区表(partition table), 其中 MBR 占有 446bytes,而 partition table 则占有 64 bytes。GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。


Linux 的正统文件系统为 Ext2 (Linux second extended file system, ext2fs)

    一个可被挂载的数据为一个文件系统而不是一个分区槽。Linux 操作系统的文件系统包括文件数据、文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

    superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
    inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
    block:实际记录文件的内容,若文件太大时,会占用多个 block 。

技术分享技术分享

    FAT系统需要经常进行碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易。

Linux的EXT2文件系统
    文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用resize2fs 等指令变更文件系统大小),否则inode与block固定后就不再变动。但是文件系统高达数百G将所有inode与block放置在一起数量庞大不易管理。因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。

技术分享

启动扇区

    在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的 MBR,这样也才能够制作出多重引导的环境。


data block (资料区块)
    data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。 不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
技术分享
    原则上, block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);每个 block 内最多只能够放置一个文件的数据;承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。

inode table (inode表格)
    inode 记录的文件数据至少包括:该文件的存取模式(read/write/excute);该文件的拥有者与群组(owner/group);该文件的容量;该文件建立或状态改变的时间(ctime);最近一次的读取时间(atime);最近修改的时间(mtime);定义文件特性的旗标(flag),如 SetUID...;该文件真正内容指箱(pointer);
    inode 的数量与大小也是在格式化时就已经固定,除此之外还有其它特色:每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);每个文件都仅会占用一个 inode 而已;承上,因此文件系统能够建立的文件数量与 inode 的数量有关;系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。
    inode 要记录的数据非常多,但偏偏又只有 128bytes 而已, 而 inode 记录一个 block 号码要花掉 4byte ,假设我一个文件有400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录呢! inode 哪有这么多可记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为 12 个直接,一个间接,一个双间接与一个三间接记录区。如下所示。根据以上信息可以计算出当block为1k时,最大文件为2G的由来。但是不可以此来计算block为2k和4k的情况。

技术分享

Superblock (超级区块)
    Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:block 与 inode 的总量;未使用与已使用的 inode / block 数量;block 与 inode 的大小 (block 为 1, 2, 4K, inode 为 128bytes 或 256bytes);filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;一个valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则valid bit为1 。
    Superblock是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果superblock死掉了,你的文件系统可能就需要花费很多时间去挽救。一般来说,superblock的大小为1024bytes。此外,。每个block group都可能含有 superblock事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份咯,这样可以进行 superblock 的救援。

Filesystem Description (文件系统描述说明)
    这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪一个block号码之间。这部份也能够用dumpe2fs来观察的。

block bitmap (区块对照表)

    从 block bitmap 当中可以知道哪些block是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件啰。同样的,如果你删除某些文件时,那么那些文件原本占用的block号码就得要释放出来,此时在block bitmap当中相对应到该block号码的标志就得要修改成为『未使用中』啰!这就是 bitmap 的功能。

inode bitmap (inode对照表)
    这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码,至于inode bitmap 则是记录使用与未使用的inode号码!

dumpe2fs: 查询Ext家族superblock信息的指令(注意不能用来查寻xfs文件系统)
技术分享技术分享


目录

    目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。当我们在 Linux 下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 码;而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:

技术分享
    如果想要实际观察 root 家目录内的文件所占用的 inode 号码时,可以使用 ls -i 这个选项来处理:
技术分享

文件
    当我们在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的block 数量给该文件。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 block 来储存该文件! 但同时请注意,由于 inode 仅有 12 个直接指向,因此还要多一个 block 来作为区块号码的记录。


目录树读取
    inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 因此在第五章文件与目录的权限说明中, 我们才会提到『新增/删除/更名文件名与目录的 w 权限有关』的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个文件时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取文件的 inode 号码,最终才会读到正确的文件的 block 内的数据。

如果我想要读取 /etc/passwd 这个文件时,系统是如何读取的呢?
技术分享
1./的inode:
    透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block的内容(有r与x) ;
2./的block:
    经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521);
3.etc/的inode:
    读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
4.etc/的block:
    经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
5.passwd的inode:
    读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容;
6.passwd的block:
    最后将该 block 内容的数据读出来。

如果我想要新建一个文件或目录时,系统是如何读取的呢?

1.先确定用户对于欲新增文件的目录是否具有w与x的权限,若有的话才能新增;
2.根据 inode bitmap 找到没有使用的 inode号码,并将新文件的权限/属性写入;
3.根据 block bitmap 找到没有使用中的 block号码,并将实际的数据写入block中,且更新inode的 block指向数据;
4.将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新c superblock的内容。

为防止因数据不一致状态的产生,导致文件检查过慢,日志式文件系统兴起

    filesystem当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:
1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
2. 实际写入:开始写入文件的权限与数据;开始更新metadata的数据;
3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。
    ext2可达到这样的功能:透过ext3/ext4即可。 ext3/ext4ext2的升级版本,并且可向下兼容ext2版本呢

linux系统上的文件系统与内存之间的关系

    系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
    承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
    你可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中;
    若正常关机时,关机指令会主动呼叫 sync来将内存的数据回写入磁盘内;
    但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁) 


挂载点的意义

    将文件系统与目录树结合的动作我们称为『挂载 。挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要『挂载』到目录树的某个目录后,才能够使用该文件系统的

linux支持的文件系统与VFS

    传统文件系统:ext2 / minix / MS-DOS / FAT (vfat模块) / iso9660 (光盘)等等;
    日志式文件系统: ext3 /ext4 / ReiserFS / Windows‘ NTFS / IBM‘s JFS / SGI‘s XFS / ZFS
    网络文件系统: NFS / SMBFS

技术分享

    整个Linux的系统都是透过一个名为Virtual Filesystem Switch的核心功能去读取filesystem的。 也就是说,整个Linux认识的filesystem其实都是VFS在进行管理,我们使用者并不需要知道每个partition上头的filesystem是什么~VFS会主动的帮我们做好读取的动作。

技术分享


XFS文件系统介绍

    EXT家族当前较伤脑筋的地方: 支持度最广,但格式化超慢 

XFS文件系统的配置 
    xfs文件系统在资料的分布上,主要规划为三个部份,一个资料区(data section)、一个文件系统活动登录区(log section)以及一个实时运作区(realtime section)。 这三个区域的数据内容如下:

资料区(data section)
    包括inode/data block/superblock等数据 .分为多个储存区群组(allocation groups)来分别放置文件系统所需要的数据。 每个储存区群组都包含了(1)整个文件系统的superblock(2)剩余空间的管理机制、(3)inode的分配与追踪。此外,inodeblock都是系统需要用到时, 这才动态配置产生,所以格式化动作超级快。ext家族不同的是,xfsblockinode有多种不同的容量可供设定,block容量可由512bytes ~ 64K调配,不过,Linux的环境下, 由于内存控制的关系(页面文件pagesize的容量之故),因此最高可以使用的block大小为4K而已 。至于inode容量可由256bytes2M这么大!不过,大概还是保留256bytes的默认值就很够用。

文件系统活动登录区 (log section)
    登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区。

实时运作区(realtime section)
     当有文件要被建立时, xfs 会在这个区段里面找一个到数个的extent区块,将文件放置在这个区块内,等到分配完毕后,再写入到data sectioninodeblock去! 这个extent区块的大小得要在格式化的时候就先指定,最小值是4K最大可到1G

xfs_info去观察superblock内容的指令
技术分享

    第1行里面的isize指的是inode的容量,每个有256bytes 这么大。至于 agcount则是前面谈到的储存区群组(allocation group)的个数,共有4个,agsize则是指每个储存区群组具有65536block。配合第4行的block设定为4K,因此整个文件系统的容量应该就是4*65536*4K这么大!
    第2行里面sectsz指的是逻辑扇区(sector)的容量设定为512bytes 这么大的意思。
    第4行里面的bsize指的是block 的容量,每个block4K的意思,共有262144block在这个文件系统内。
    第5行里面的sunitswidth与磁盘阵列的stripe相关性较高。这部份我们底下格式化的时候会举一个例子来说明。
    第7行里面的internal指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了4K *2560block,总共约10M的容量。
    第9行里面的realtime区域,里面的extent容量为 4K。不过目前没有使用。

文件系统操作
磁盘的目录与容量
    df:列出文件系统的整体磁盘使用量;
    du:评估文件系统的磁盘使用量(常用在推估目录所占容量) 
技术分享
技术分享

实体链接与符号链接:ln 

    在Linux底下的连结档有两种,一种是类似Windows的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录); 另一种则是透过文件系统的inode连结来产生新档名,而不是产生新文件!这种称为实体链接(hard link)

Hard Link (实体链接,硬式连结或实际连结)
    每个文件都会占用一个 inode , 文件内容由 inode 的记录来指向;想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取。hard link 只是在某个目录下新增一笔档名链接到某inode号码的关连记录而已。
技术分享技术分享\
    如果你将任何一个『档名』删除,其实inodeblock都还是存在的!此时你可以透过另一个『档名』来读取到正确的文件数据喔!此外,不论你使用哪个『档名』来编辑,最终的结果都会写入到相同的inodeblock中,因此均能进行数据的修改.hard link是有限制的:不能跨Filesystem不能link目录


Symbolic Link (符号链接,亦即是快捷方式)
    Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他link的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link的文件会『开不了』 

技术分享

    连结档的重要内容就是他会写上目标文件的『文件名』, 你可以发现为什么上表中连结档的大小为12Bytes呢? 因为箭头(-->)右边的档名『/etc/crontab』总共有12个英文,每个英文占用1bytes,所以文件大小就是12bytes

技术分享

    由1inode读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题 .这里还是得特别留意,这个Symbolic LinkWindows的快捷方式可以给他划上等号,由Symboliclink所建立的文件为一个独立的新的文件,所以会占用掉inodeblock。

技术分享

磁盘的分区、格式化、检验与挂载
    lsblk 列出系统上的所有磁盘列表。lsblk可以看成『list block device』的缩写,就是列出所有储存装置的意思

技术分享技术分享

blkid列出装置的UUID等参数

    UUID是全局单一标识符(universally unique identifier)Linux会将系统内所有的装置都给予一个独一无二的标识符, 这个标识符就可以拿来作为挂载或者是使用这个装置/文件系统之用。

gdisk、fdisk和parted

    分区时,应使用parted检查分区表格式,再判断使用fdisk/gdisk来分区,或直接使用parted分区。MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区 。

技术分享

    只要离开gdisk时按下『q』,那么所有的动作『都不会生效!』相反的, 按下『w』就是动作生效的意思 

技术分享
    Number: 分区槽编号,1号指的是/dev/vda1这样计算。
    Start (sector):每一个分区槽的开始扇区号码位置
    End (sector):每一个分区的结束扇区号码位置,与start之间可以算出分区槽的总容量
    Size:就是分区槽的容量了
    Code:在分区槽内的可能的文件系统类型。Linux8300swap8200。不过这个项目只是一个提示而已,不见得真的代表此分区槽内的文件系统喔!
    Name:文件系统的名称等等。
    从上表我们可以发现几件事情:
    整部磁盘还可以进行额外的分区,因为最大扇区为 83886080,但只使用到65026047号而已;
    分区槽的设计中,新分区通常选用上一个分区的结束扇区号码数加1作为起始扇区号码!
    这个 gdisk只有root才能执行,此外,请注意,使用的『装置文件名』请不要加上数字,因为partition是针对『整个磁盘装置』而不是某个partition

新建一个G的xfs分区

技术分享技术分享

    发现没有变成vda4,是因为核心没有更新,通过partprobe更新Linux核心的分区表信息

技术分享技术分享

    fdisk用于MBR中,方法与gdisk类似

    parted可以同时支持MBR和GPT的分区行为,

技术分享

磁盘的格式化

XFS文件系统mkfs.xfs 

    『格式化』其实应该称为『建置文件系统(make filesystem) 

技术分享技术分享

EXT4文件系统 mkfs.ext4
    如果想要格式化为ext4的传统Linux文件系统的话,可以使用mkfs.ext4这个指令即可
技术分享


文件系统检验 

    xfs_repair处理XFS文件系统的文件检验。fsck.ext4处理EXT4文件系统

文件系统的挂载与 卸除

    单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
    单一目录不应该重复挂载多个文件系统;
    要作为挂载点的目录,理论上应该都是空目录才是。

技术分享
技术分享

    /etc/filesystems:系统指定的测试挂载文件系统类型的优先级;
    /proc/filesystemsLinux系统已经加载的文件系统类型。 

Linux支持的文件系统之驱动程序都写在如下的目录中:
    /lib/modules/$(uname -r)/kernel/fs/

挂载xfs/ext4/vfat等文件系统(挂载文件一般使用UUID挂载因为,这个标志是独一无二的)

技术分享

    光驱一挂载之后就无法退出光盘片了!除非你将他卸除才能够退出 

挂载vfat中文随身碟(USB 磁盘)

技术分享技术分享
    如果带有中文文件名的数据,那么可以在挂载时指定一下挂载文件系统所使用的语系数据。 在 man mount找到vfat文件格式当中可以使用codepage来处理!中文语系的代码为950!另外,如果想要指定中文是万国码还是大五码, 就得要使用iocharsetutf8 还是big5两者择一 。

技术分享
    透过这个mount --bind 的功能, 您可以将某个目录挂载到其他目录去喔!而并不是整块filesystem的啦!所以从此进入/data/var就是进入/var的意思

umount (将装置文件卸除) 

技术分享技术分享


磁盘/文件系统参数修订
    Linux 底下所有的装置都以文件来代表!但是那个文件如何代表该装置呢?就是透过文件的majorminor数值来替代的 。

技术分享技术分享
xfs_admin修改 XFS文件系统的UUIDLabel name
    如果你当初格式化的时候忘记加上标头名称,后来想要再次加入时,不需要重复格式化!直接使用这个 xfs_admin即可 

技术分享技术分享
    tune2fs修改 ext4label nameUUID (用法与xfs_admin相同)

设定开机挂载
    开机挂载 /etc/fstab/etc/mtab
    根目录 /是必须挂载的﹐而且一定要先于其它mount point被挂载进来。
    其它 mount point必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则(FHS)
    所有 mount point在同一时间之内﹐只能挂载一次。
    所有 partition在同一时间之内﹐只能挂载一次。
    如若进行卸除﹐您必须先将工作目录移到 mount point(及其子目录)之外。 

技术分享

Device:磁盘装置文件名/UUID/LABEL name

    这个字段可以填写的数据主要有三个项目:
    文件系统或磁盘的装置文件名,如/dev/vda2
    文件系统的UUID 名称,如UUID=xxx
    文件系统的LABEL 名称,例如LABEL=xxx 

mount point:挂载点 ,即为目录

filesystem:磁盘分区槽的文件系统

    在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括xfs, ext4, vfat, reiserfs, nfs等等。 

parameters:文件系统参数

技术分享技术分享

dump :是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会,直接输入0就好了!

fsck:早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整(clean) 

技术分享技术分享

    /etc/fstab是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab /proc/mounts这两个文件当中的

挂载光盘/DVD 映象文件

技术分享技术分享

    建立一个空的文件在/srv/loopdev 

技术分享技术分享

    预设xfs不能够格式化文件的,所以要格式化文件得要加入特别的参数才行

技术分享

    利用mount的特殊参数,那个 -o loop 的参数来 挂载

技术分享


关于内存置换空间swap

    一般来说,如果硬件的配备资源足够的话,那么swap应该不会被我们的系统所使用到,swap会被利用到的时刻通常就是物理内存不足的情况了。虽然目前(2015)主机的内存都很大,至少都有4GB以上啰!因此在个人使用上,你不要设定swap在你的 Linux应该也没有什么太大的问题。 不过服务器可就不这么想了~由于你不会知道何时会有大量来自网络的要求,因此最好还是能够预留一些swap 来缓冲一下系统的内存用量 。

linux读书摘要--linux磁盘与文件系统管理