linux文件系统

linux文件系统,以及相关的磁盘

7.1.1 磁盘组成与分区的复习

  1. 圆形的磁盘盘(主要记录数据的部分);
  2. 机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);
  3. 主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。
  4. 扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有 512bytes 与 4K 两种格式;
  5. 将扇区组成一个圆,那就是磁柱(Cylinder);
  6. 早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码喔, 就好像座位一样);
  7. 磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。
  8. MBR 分区表中,第一个扇区最重要,里面有:(1)主要开机区(Master boot record, MBR)及分区表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
  9. GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB

7.1.2 文件系统特性

  • 为 什么需要进行『格式化』呢?
  • 因为每种操作系统所设定的文件属性/权限并不相同, 为了存放这 些文件所需的数据,因此就需要将分区槽进行格式化,以成为操作系统能够利用的『文件系统格式 (filesystem)』 .

[windows 98 以前的 微软操作系统主要利用的文件系统是 FAT (或 FAT16) , windows 98 以前的 微软操作系统主要利用的文件系统是 FAT (或 FAT16) ,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个。 此外,在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。]()

文件属性和权限设置放置到inode中,而iNode中指出文件数据的放置block。这种方式称之为索引式文件系统。

FAT格式的文件系统:FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开 始就读取出来。每个 block 号码都记录在前一个 block 当中 。我们假设文件的数据依序写入 1->7->4->15 号这四个 block 号码中, 但这个文件系统没有办 法一口气就知道四个 block 的号码,他得要一个一个的将 block 读出后,才会知道下一个 block 在 何处。

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

但是如果文件过大(数百GB时),将所有的iNode和block放在一起就显得和冗余,不好管理。

所以系统分为多个区块群组block group :每 个区块群组都有独立的 inode/block/superblock 系统 。

data block :在EXT2文件系统支持的大小有1k,2k,4k。(在格式化时固定),而data block 大小的差异会导致系统能支持的最大磁盘容量与最大单一文件容量也不同。

data block 大小1KB2KB4KB
最大单一文件限制16GB256GB2TB
最大文件系统总容量2TB8TB16TB

但是虽然EXT2支持2GB以上的文件,但需要软件也同样支持的情况下才能正常工作。

  • 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
  • 每个 block 内最多只能够放置一个文件的数据
  • 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
  • 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)

例题: 假设你的 Ext2 文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes, 请问 此时你的磁盘浪费多少容量? 答: 由于 Ext2 文件系统中一个 block 仅能容纳一个文件,因此每个 block 会浪费『 4096 - 50 = 4046 (byte)』, 系统中 总共有一万个小文件,所有文件容量为:50 (bytes) x 10000 = 488.3Kbytes,但此时浪费的容量为:『 4046 (bytes) x 10000 = 38.6MBytes 』。想一想,不到 1MB 的总文件容量却浪费将近 40MB 的容量,且文件越多将造成越多的磁 盘容量浪费 .

inode table

  • 该文件的存取模式(read/write/excute);
  • 该文件的拥有者与群组(owner/group);
  • 该文件的容量;  该文件建立或状态改变的时间(ctime);
  • 最近一次的读取时间(atime);
  • 最近修改的时间(mtime);
  • 定义文件特性的旗标(flag),如 SetUID…;
  • 该文件真正内容的指向 (pointer)
  • 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
  • 每个文件都仅会占用一个 inode 而已;
  • 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
  • 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际 读取 block 的内容

但是;当inode要记录的数据非常多,且每个inode的大小又只有128byte,而记录一个block需要4byte,假设我一个文件有 400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录呢 。inode 哪有这么多可 记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为 12 个直接,一个间接, 一个双间接与一个三间接记录区。这是啥?我们将 inode 的结构画一下好了 。

这样子 inode 能够指定多少个 block 呢?我们以较小的 1K block 来说明好了,可以指定的情况如 下:

  •  12 个直接指向: 121K=12K 由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;

  •  间接: 2561K=256K 每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的 文件大小如上;

  •  双间接: 2562561K=2562K 第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;

  •  三间接: 256256256*1K=2563K 第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定 256 个号 码,因此总额大小如上; *

  •  总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB 这个16GB对应了上表的16GB。

Superblock :记录整个 文件系统的地方。非常重要。

这个玩意记录了:

  •  block 与 inode 的总量;
  •  未使用与已使用的 inode / block 数量;
  •  block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 或 256bytes);
  •  filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信 息;
  •  一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。

block bitmap :记录block的使用情况:已使用和未使用。

inode bitmap :记录inode的使用情况:已使用和未使用。

目录树读取

目标文件目录:/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 内容的数据读出来

日志式文件系统 (Journaling filesystem) :filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤,

  1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
  2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
  3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。

文件系统的运作

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

其他linux支持的文件系统和VFS

​ 虽然 Linux 的标准文件系统是 ext2 ,且还有增加了日志功能的 ext3/ext4 ,事实上,Linux 还有支 持很多文件系统格式的, 尤其是最近这几年推出了好几种速度很快的日志式文件系统,包括 SGI 的 XFS 文件系统,可以适用更小型文件的 Reiserfs 文件系统,以及 Windows 的 FAT 文件系统等等, 都能够被 Linux 所支持喔!常见的支持文件系统有:

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

在系统中查看支持的文件格式: ls -l /lib/modules/$(uname -r)/kernel/fs

Linux VFS (Virtual Filesystem Switch)

​ VFS的功能是帮助整个linux系统去管理filesystems的。

​ 假设你的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那么你取用 /home/dmtsai/.bashrc 时,有特别指定要用的什么文件系统的模块来读取吗? 应该是没有吧!这个就 是 VFS 的功能啦!透过这个 VFS 的功能来管理所有的 filesystem, 省去我们需要自行设定读取文 件系统的定义啊~方便很多!

XFS文件系统简介

从CentOS7开始,预设的文件系统就已经从EXT4转变成XFS格式了,那么是什么原因让CentOs放弃支持度最完整的EXT4而改XFS呢?

EXT :支持度最广,但格式化超慢!

XFS:不逊于EXT,格式化超快,支持大型文件

xfs系统文件的配置

分为三个部分:资料区(data section)、文件系统活动登录区(log section)、实时运作区(realtime section)。

资料区:跟EXT类似,XFS的资料区放置的也为inode/data block/super block 等数据。分为多个储存区群组(allocation groups)来存放文件系统需要的数据。每储存区群组都包含了:

  1. 存放了整个文件系 统的 superblock
  2. 剩余空间的管理机制
  3. inode 的分配与追踪。此外,inode 与 block 都是 系统需要用到时, 这才动态配置产生,所以格式化动作超级快

另外,与 ext 家族不同的是, xfs 的 block 与 inode 有多种不同的容量可供设定,block 容量可 由 512bytes ~ 64K 调配,不过,Linux 的环境下, 由于内存控制的关系 (页面文件 pagesize 的 容量之故),因此最高可以使用的 block 大小为 4K 而已!(鸟哥尝试格式化 block 成为 16K 是 没问题的,不过,Linux 核心不给挂载! 所以格式化完成后也无法使用啦!) 至于 inode 容量可 由 256bytes 到 2M 这么大!不过,大概还是保留 256bytes 的默认值就很够用了

文件系统活动登录区(log section)

​ 在登录区这个区域主要被用来纪录文件系统的变化,文件的变化会在这 里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些 缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前, 文 件系统正在运作些啥动作,藉以快速的修复文件系统。

因为文件系统在所有活动时都会在log section留下痕迹,所以这个区域的磁盘活动是相当频繁的,而且有意思的时,XFS文件系统支持指定外部硬盘来当做log section!这就可以让整个文件系统的数据读取变得更快!

实时运作区(realtime section)

​ 当有文件要被建立时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区 块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去! 这个 extent 区块的大小 得要在格式化的时候就先指定,最小值是 4K 最大可到 1G。一般非磁盘阵列的磁盘默认为 64K 容量,而具有类似磁盘阵列的 stripe 情况下,则建议 extent 设定为与 stripe 一样大较佳。这个 extent 最好不要乱动,因为可能会影响到实体磁盘的效能。 个人感觉类似于缓冲区

实体链接与符号链接

Hard Link(实体链接/硬链接/实际连结)

每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;  想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。

也就是说增加一个inode来指向实际文件的block,这个增加的inode就为实体链接。无论哪个实体链接都可以修改clock中的文件。

并且Hard Link

  • 不能跨 Filesystem;
  • 不能 link 目录 (因为如果link目录,就需要将目录下所有的文件都Link一下,大大提高了环境的复杂度。)

Symbolic Link (符号链接,亦即是快捷方式)

​ Symbolic link 就是在建立一个独立的 文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的 动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文 件!』。

磁盘的分区、格式化、检验与挂载

​ 对于一个系统管理者( root )而言,磁盘的的管理是相当重要的一环,尤其近来磁盘已经渐渐的被当成 是消耗品了 … 如果我们想要在系统里面新增一颗磁盘时,应该有哪些动作需要做的呢:

  1. 对磁盘进行分区,以建立可用的 partition ;
  2. 对该 partition 进行格式化 (format),以建立系统可用的 filesystem;
  3. 若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验;
  4. 在 Linux 系统上,需要建立挂载点 (亦即是目录),并将他挂载上来;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值