linux 日志式文件系统,linux 学习笔记--日志式文件系统及软硬链

本日志是自己记录一些自学期间有意思的点,不容易消化的点。 不是纯粹的抄书,方便日后查看及分享,讲的不在理的请使劲喷。

简单阐述下文件系统分类:

传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;

日志式文件系统 (Journaling filesystem): ext3 /ext4 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS / ZFS;

网络文件系统: NFS / SMBFS;

传统文件系统和日志式文件系统区别:

先了解下传统文件系统的工作逻辑

1. 先确定使用者对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;

2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;

3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据;

4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容

然后是日志式文件系统的工作逻辑

1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;

2. 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;

3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录

很明显看出日志式文件系统容灾性高 断电系统故障等 好还原数据。日志式fs就是在传统fs上解决了数据不一致状态。

顺带提一下脏数据的由来:当系统载入一个文件到内存后,如果该文件没有被更动过,则在内存区段的文件数据会被设置为干净(clean)的。 但如果内存中的文件数据被更改过了(例如你用 nano 去编辑过这个文件),此时该内存中的数据会被设置为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设置为“Dirty”的数据写回磁盘,以保持磁盘与内存数据的一致性。 你也可以利用第四章谈到的 sync指令来手动强迫写入磁盘。在Dirty状态如果断点或者故障 就会产生脏数据,导致数据不一致。

这里重点讲下XFS。

随着硬盘(磁盘阵列)容量越来越庞大,像ext 这种需要提前规划好的文件格式,无法动态配置,难以掌控TB级以上的容量。特别是需要格式化的时候相当费时间。 所以centos7.x之后都默认采用XFS文件系统了。(其实硬盘性能并没有太多差别,毕竟是硬件决定的,主要是文件系统的复原速度、创建速度、支持超大文件等等选择的XFS)

说到容量顺带提一点:硬盘容量计算,厂家出厂都按1000算,操作系统按1024算。所以买1TB的硬盘 到系统中就只有976G或更低了。

----------------------------------------------------------以下定义是抄书--------------------------------------------------------------------------------

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

数据区 (data section)

基本上,数据区就跟我们之前谈到的 ext 家族一样,包括 inode/data block/superblock 等数据,都放置在这个区块。这个数据区与 ext 家族的 block group 类似,也是分为多个储存区群组 (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)

在登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区啦!文件的变化会在这里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前, 文件系统正在运行些啥动作,借以快速的修复文件系统。因为系统所有动作的时候都会在这个区块做个纪录,因此这个区块的磁盘活动是相当频繁的!xfs 设计有点有趣,在这个区域中, 你可以指定外部的磁盘来作为 xfs 文件系统的日志区块喔!例如,你可以将 SSD 磁盘作为 xfs 的登录区,这样当系统需要进行任何活动时, 就可以更快速的进行工作!相当有趣!

实时运行区 (realtime section)

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

介绍2个重要的命令

df:列出文件系统的整体磁盘使用量;

df [-ahikHTm] [目目录录或或文文件件名名]

选项与参数:

-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;

-k :以 KBytes 的容量显示各文件系统;

-m :以 MBytes 的容量显示各文件系统;

-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H :以 M=1000K 取代 M=1024K 的进位方式;

-T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;

-i :不用磁盘容量,而以 inode 的数量来显示

# 在 Linux 下面如果 df 没有加任何选项,那么默认会将系统内所有的(不含特殊内存内的文件系统与 swap) 都以 1 KBytes 的容量来列出来!至于那个 /dev/shm 是与内存有关的挂载,先不要理他!

由于 df 主要读取的数据几乎都是针对一整个文件系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中你需要特别留意的是那个根目录的剩余容量! 因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 0 时,那你的 Linux 可能就问题很大了

那个 /dev/shm/ 目录,其实是利用内存虚拟出来的磁盘空间,通常是总实体内存的一半! 由于是通过内存仿真出来的磁盘,因此你在这个目录下面创建任何数据文件时,存取速度是非常快速的!(在内存内工作) 不过,也由于他是内存仿真出来的,因此这个文件系统的大小在每部主机上都不一样,而且创建的东西在下次开机时就消失了! 因为是在内存中嘛!

du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

du [-ahskm] 文件或目录名称

选项与参数:

-a :列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已。

-h :以人们较易读的容量格式 (G/M) 显示;

-s :列出总量而已,而不列出每个各别的目录占用容量;

-S :不包括子目录下的总计,与 -s 有点差别。

-k :以 KBytes 列出容量显示;

-m :以 MBytes 列出容量显示;

du 这个指令其实会直接到文件系统内去搜寻所有的文件数据,所以速度会慢些

软链硬链:hard link ,symbolic link

ln [-sf] 来源文件 目标文件

选项与参数:

-s :如果不加任何参数就进行链接,那就是hard link,至于 -s 就是symbolic link

-f :如果 目标文件 存在时,就主动的将目标文件直接移除后再创建!

个人理解 软链就是windows的快捷方式,创建新文件并指向原文件的inode。硬链就是利用同一个inode指向两个文件名 但文件内容还是一个(这点在网盘逻辑里也有应用)

一般 hard link 所用掉的关连数据量很小,所以通常不会改变 inode 与磁盘空间的大小。硬链限制:1。不能跨 Filesystem;2。不能 link 目录;硬链相对安全,删除硬链只是修改了原文件的inode种关联性数据,原文件的inode,block都存在(除非删完了)。而且hard link 可以同时修改起效,因为改的同一个block。硬链才会使ls -l 里面的link数加一。

symbolic link 软链是会消耗inode 和block。软链修改变动,原文件也跟着变动!虽然hard link 更安全,但是限制不能link目录,所以大部分都是用的软链。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值