前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux文件系统——全方位掌握

Linux文件系统——全方位掌握

作者头像
大闲人柴毛毛
发布2018-03-09 11:02:08
8640
发布2018-03-09 11:02:08
举报
文章被收录于专栏:大闲人柴毛毛大闲人柴毛毛

文件系统的特性

磁盘分区完毕后需要进行格式化,操作系统才能使用这个分区。 不同操作系统能够使用的文件系统是不同的,例如:Windows98以前使用FAT/FAT16文件系统,Windows2000以后使用NTFS文件系统,Linux使用Ext2文件系统。在分区完成之后,要使得操作系统能够识别文件系统,就需要进行格式化,把分区格式化成某一个操作系统能够识别的文件系统。 一般来说,一个分区中装一个文件系统,但是现在技术发展了,一个分区可以装多个文件系统,也能将多个分区合并成一个文件系统。一个文件系统可以挂载到操作系统上。

文件系统的构成

一个文件由许多的属性和文件本身的数据组成,文件系统会把同一个文件的两种数据分别存放在inode和block中。此外,整个文件系统还有个super block,用于记录整个文件系统的整体信息。

  • inode:记录一个文件的所有属性,以及这个文件所对应的block的号码(一个文件对应一个inode)
  • block:存放文件的实际数据(若文件数据太大,则使用多个block存放)
  • super block:记录文件系统的整体信息,包括:inode、block的数量、文件系统的使用量、剩余量等。

Ext2文件系统读取数据的过程

要访问一个文件时,首先找到这个文件的inode,根据inode中的权限查看当前用户是否有权力读取这个文件;然后查看inode中block的位置,最后找到block,读出数据。这种文件系统就叫做索引式文件系统,所以Linux的ext2文件系统就是索引式文件系统。 PS:U盘(闪存)一般使用FAT文件系统,而FAT文件系统并没有inode,每个block中记录着本文件下一个block的位置。所以FAT文件系统无法通过inode一次性将这个文件所有的block号码读取出来,而只能一个个地读取block后才能知道下一个block的位置。所以如果同一个文件的block分散地太开,那么读取一个文件的时间就会很长,所以就有所谓的“碎片整理“,就是将同一个文件的block们尽量放到一起去。但Linux的ext2文件系统由于是索引式的,因此不太需要碎片整理。

关于Ext2文件系统的一些补充说明

  • 有些文件系统非常大,高达数百GB,那么格式化后会有大量的inode和block,为了方便管理,文件系统对所有的inode和block进行分组,每一组叫做block group,每一组都有独立的inode/block/super block。
  • data block数据块是用来存储文件实际数据的地方,只有1KB、2KB、3KB这三种。
  • 所有的inode和block在格式化的时候大小和数量就固定了,而且每一个block都有固定的编号,便于inode查找。
  • 文件系统支持的最大磁盘容量和单一文件容量是不一样的;

block大小

1KB

2KB

4KB

最大单一文件容量

16GB

256GB

2T

一个block只能存放一个文件的数据,如果文件太大,则使用多个block存放,如果一个block放不满,则剩下的就空着。

  • 每个block的大小要合理地选择, 如果太大,会造成最后一个block中会有大量剩余的空间;如果太小,那么inode中就要记录更多的block号码,每次找block要耗时,所以这样效率也不高。
  • 由于每个inode在格式化的时候大小就已经固定了,并且只有128bytes,并且每个文件仅能占用一个inode,因此,文件系统能够创建的文件数与inode的数量有关。除此之外:
  • 当一个文件很大时,它的block太多,每个block号码需要4byte,那么inode记录不下了怎么办?这时候将block号码存在一个block中,inode仅仅需要记录这个block的号码即可,这就是一次间接索引。Linux的ext2文件系统最多支持3级间接索引。
  • super block记录了整个文件系统的相关信息,是非常重要的,如果super block死掉了,那么系统会花费大量时间去挽救他。
  • 一般super block的大小为1024bytes
  • 每个block group中都含有一个super block,由于一个文件系统中只能有一个super block,所以这些group中的super block都是一样的,在第一个super block挂了的时候进行挽救用的。
  • File System Description文件系统描述说明:描述所有区段的起始和结束的block号码,所有区段包括:superblock、data block、inodebitmap、bitmap。
  • block bitmap块对照表:这个表记录了哪些block是空的,从而创建一个文件的时候能够快速分配空的block。
  • inode bitmap:这个与block bitmap类似,它记录哪些inode是空的。

inode与目录的关系

当我们在Linux的ext2下创建一个目录时,文件系统会给我们分配一个inode和一个block。 其中,inode记录该目录的相关权限与属性,并记录该block的号码。 而block中记录的是这个目录的名字、这个目录下所有的文件名、以及这些文件所占用的inode号码。

代码语言:javascript
复制
//通过增加-i参数,可以查看文件所占用的inode号码
//PS:最前面的数字就是inode号码
ls -li
total 24
 606624 drwx------+  8 chaibozhou  staff   272  4 28 08:31 Desktop
 606608 drwx------+ 15 chaibozhou  staff   510  4 26 20:14 Documents
 606610 drwx------+ 60 chaibozhou  staff  2040  4 29 20:37 Downloads
 606612 drwx------@ 52 chaibozhou  staff  1768  4 30 12:38 Library

inode与文件的关系

当我们创建一个文件时,文件系统会分配一个inode和相对于文件大小的一些block。例如一个block为4KB,我们创建了一个100KB的文件,那么需要分配一个inode和25个block;但Linux的ext2文件系统只有12个直接索引,所以还需要一个间接索引的block来存放该文件block的号码。

文件的读取过程

假设读取/etc/passwd这个文件:

  1. 根据挂载点信息找到/dev/hdc2根目录inode,也就是号码为2的inode。(根目录的inode号码是2)。然后根据inode中的权限信息判断当前用户是否有权限访问当前目录;然后找到跟目录对应的block号码。
  2. 根目录的block中存放着根目录下所有文件和文件夹的名字和inode号码;找到etc文件夹的inode号码。
  3. 读取该inode中的权限,判断当前用户是否有权限进入该目录;读取inode中的block号;到block 中查找passwd对应的inode号。
  4. 读取该inode中权限并判断,再读取inode中block号码,最后读取block中的数据即可。

文件系统大小与磁盘读写性能的关系

当一个文件很大,需要很多的block,而这些block又存放的比较离散,这时磁盘读写性能就很低了。 如果由于文件系统的空闲block较为离散,即使是存一些小文件,仍然需要磁头大量的移动,这时候就考虑将所有数据拷出来,然后格式化整个文件系统,再将数据拷回去。 如果文件系统太大,一个文件的block存放的位置很远,那么磁头要移动大量的位置来读取一个文件,此时效率就低了;也就是说,文件系统的大小不是越大越好的。

Ext2/3文件系统创建文件的过程

  • 文件的创建过程 a)首先判断该用户对于新文件所在的目录是否具有w和x权限,若有的话才能创建。 PS:因为目录的w权限代表能够创建、删除、重命名、移动文件;x权限代表能够cd到目录中去。 b)根据inode bitmap找到没有使用的inode号码,把文件的属性写进去; c)根据block bitmap找到没有使用的block,将文件的数据写进去,并更新inode,将block的号码写进去; d)更新inode bitmap和block bitmap,更新super block。(更新中间数据)
  • 数据的不一致性 inode和block被称为数据的存放区域,super block、block bitmap、inode bitmap称为中间数据(metadata)。如果在文件创建的过程中,因不明原因导致中断,数据已经写入inode和data block,但是更新中间数据的工作还没有做完,此时就会出现meta data和实际数据存放区产生了不一致。
  • 解决数据的不一致的方法——日志文件系统 a)预备:当要写入一个文件时,先在日志文件中记录某个文件准备要写入的信息; b)实际写入:开始写入文件的权限、属性和数据;然后更新中间meta data。 c)结束:完成数据记录与meta data更新之后,在日志记录块中完成对该文件的记录。 有了日志文件的记录,万一哪个文件在创建过程中发生异常,那么系统直接查看日志文件,看看哪一个文件有预备记录,但没有结束记录,然后仅对有问题的文件进行一致性检查即可,无需对整个文件系统进行检查,这样就能够实现快速恢复文件系统了。

异步处理

要处理一个文件,必须要把它全部放到内存中;那么当处理一个很大的文件的时候,如果频繁地要求操作系统将文件保存到外存,那么我们系统会出现卡顿,等待文件写入外存。为了避免写入外存时候的等待,我们就引入了异步处理方式。 一个文件在内存中,如果没有对他进行修改,那么它的状态是clean,系统不会把它写入外存;若我们对文件进行了修改,那么它的状态就变成了dirty,此时我们继续对文件进行操作,只不过系统会在后台不定时地将dirty状态的文件写入外存;也就是说,我们的操作和文件写入外存是并行的,去除了我们的等待时间。

  • 我们可以手动调用sync,强迫内存中状态为dirty的文件写回外存中去(就相当于我们使用ctrl+s,如果不自己按的话,系统会不定时地自动把数据写回外存)
  • 如果正常关机,系统会调用sync将内存中的数据写回外存
  • 如果非正常关机,系统来不及将数据写回外存,因此重启的时候系统会花很多时间进行磁盘检验,甚至可能导致文件系统的损坏(不会引起磁盘的损坏)

挂载点

每个文件系统都有独立的inode、block、super block等信息,每个文件系统都必须连接到系统的目录树上才能够被使用。我们将文件系统连接到目录树上的动作叫做挂载,就好像果子挂到树上去。 PS:挂载点一定得是目录,这个目录是进入这个文件系统的入口。 举例来说:假设有三个挂载点/、/boot、/home,他们对应的设备文件分别是:/dev/hdc2,/dev/hdc1,/dev/hdc3,那么查看这三个目录的inode号码可以发现:

代码语言:javascript
复制
2 drwxr-xr-x  23 root  wheel  3122  3 22 22:18 /
2 drwxr-xr-x  4 root  wheel  1422  3 24 22:18 /boot
2 drwxr-xr-x  6 root  wheel  122  3 25 22:18 /home

他们的inode号码都是2,说明他们都是文件系统的根目录,但是它们的其他数据都是不一样的,说明他们不是同一个文件,所以他们三个人来自三个不同的文件系统。 如果inode号码一致,并且其他属性都相同,则可以判断他们是同一个文件,就像/,/.,/..

文件系统的简单操作

  • 获取磁盘容量 df/du a)df:获取整个文件系统的磁盘使用量
代码语言:javascript
复制
df [option] 目录/文件

-a:列出所有的文件系统
-k:以KB为单位显示文件系统
-m:以MB为单位显示文件系统
-h:以人们较易阅读的单位显示文件系统
-H:以1M=1000K代替1M=1024K
-T:连同该分区的文件系统的类型一并显示,如ext3……
-i:用inode个数代替硬盘容量
代码语言:javascript
复制
df//不添加参数,显示所有的文件系统,以1KB为单位

Filesystem    512-blocks      Used Available Capacity  iused     ifree %iused  Mounted on
/dev/disk1     974389248 108237816 865639432    12% 13593725 108204929   11%   /
devfs                363       363         0   100%      628         0  100%   /dev
map -hosts             0         0         0   100%        0         0  100%   /net
map auto_home          0         0         0   100%        0         0  100%   /home
  • Filesystem:这一列是各个磁盘设备的名字,表示这个文件系统在哪个分区
  • 512-blocks:代表下面block是以512KB为单位的,代表block的个数
  • Used:使用掉的磁盘空间
  • Available:剩下的磁盘空间
  • Capacity:剩下磁盘空间的百分比
  • iused:使用了多少磁盘空间
  • ifree:
  • %iused :使用掉空间的百分比
  • Mounted on:挂载点的名字,也就是磁盘挂载的目录 PS:df主要是针对整个文件系统,因此读取的是super block中的数据,所以它显示的非常快。 PS:我们需要特别留意根目录的剩余量,因为所有的数据都是从根目录衍生而来的,因此当根目录的剩余量为0时,那你的系统问题就很大了。 b)du:获取某个目录的容量
代码语言:javascript
复制
du [option] 文件/目录

-a:列出所有的目录和文件的容量,要是不写这个参数默认只是列出文件的容量而已。
-n:以人们较为容易的格式显示容量
-s:列出目标目录的总容量,而不列出个别的目录容量
-S:列出目录总容量,但不包括子目录
-k:容量以KB显示
-m:容量以MB显示

//PS:若这个命令不带任何参数则列出当前目录的容量,单位是1KB。
  • 连接文件 ln Linux下的连接文件有两种,一种是类似于Windows下的快捷方式,称为符号连接;另一种称为硬连接。 a)硬连接(实际连接) 我们知道,目录的block中存放的是这个目录下的所有文件名和他们的inode号码,也就是说,文件名只与目录有关,而文件的内容是通过目录block中记录的inode号码来找到的。 硬连接就是新建一个文件名,连接到某inode号码。就是两个不同的文件名,但是指向同一个inode。 经过了硬连接的文件,如果删除其中一个文件,那么还有另外一个文件名指向这个文件,这个文件的block仍然是存在的。此外,不论通过哪个文件名修改文件,由于两个文件名都是指向同一个文件内容,所以两个文件的内容都会发生变化。 使用硬连接设置文件连接时,磁盘空间的inode和block的数目都不会发生变化。只是某个目录的block下多了一个连接文件名的inode号码而已。 硬连接不能跨文件系统。 硬连接只能连接两个文件,而不能连接两个目录。 b)符号连接(快捷方式) 再新建一个文件,只不过这个新文件会让数据的读取指向它连接的那个文件名。由于只是利用了文件的内容作为指向的操作,所以当原文件被删除之后,再打开连接文件酒会提示“文件无法打开“。 由于符号文件会创建一个新的独立的文件,所以它会用掉inode和block。 由于硬连接无法连接到目录,所以一般是符号连接比较常用。 符号文件的一个显著特性:
代码语言:javascript
复制
//表示chai是一个符号连接文件,它指向/home/shixv,而硬连接是不会有->这个符号的。
/chai->/home/shixv
代码语言:javascript
复制
//将目标文件指向原文件
ln [option] 原文件 目标文件

-s:不加参数就是硬连接,加了s就是符号连接
-f:force模式,如果目标文件存在,直接把它覆盖
代码语言:javascript
复制
//权限后面的数字就代表连接到这个inode上的连接文件个数
drwxr-xr-x    31 root  wheel   1122  3 21 22:18 .
drwxr-xr-x    31 root  wheel   1122  3 21 22:18 ..
  • 新建目录时连接数的变化 新建一个目录/chai实际上会产生三个目录,分别是:/chai,/chai/.,/chai/..。 /chai,/chai/.都表示该目录,/chai/..表示上层目录。 所以新建一个目录后,上层目录的连接数会+1,新建目录的连接数是2。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年04月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件系统的特性
  • 文件系统的构成
  • Ext2文件系统读取数据的过程
  • 关于Ext2文件系统的一些补充说明
  • inode与目录的关系
  • inode与文件的关系
  • 文件的读取过程
  • 文件系统大小与磁盘读写性能的关系
  • Ext2/3文件系统创建文件的过程
  • 异步处理
  • 挂载点
  • 文件系统的简单操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档