2.文件系统
命令篇
ln passwd passwd-hd 建立硬链接文件 passwd-hd
ln -s passwd passwd-sd 建立符号链接文件 passwd-sd
dumpe2fs 装置文件名 查看装置的EXTsuperblock
xfs_info 装置名/挂载点 查看装置的XFS的superblock
==df -h ==目录或文件名 查看(文件系统所在的)磁盘的使用情况和挂载点
du -sh 目录 查看目录的容量
mkfs.xfs 装置名称(分区) 格式化分区为xfs文件系统
原理篇
文件系统概述
好吧,讲完了磁盘,现在是时候来看看文件系统了。磁盘分区是将磁盘分成不同的区域,而每个区域里面就可以存数据,可以放文件。
而每个磁盘划分出来的区域,系统对在里面放文件时的管理就叫做文件系统。
举个例子:,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。 文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
规划文件怎么放,属性放在哪?是全部堆在一起还是分开放,哪里记录什么,哪里记录什么,这些就都是文件系统要干的事。
由于每个 inode 与 block 都有编号,而每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。 因此,我们可以知道的是,如果能够找到文件的 inode 的话,那么自然就会知道这个文件所放置数据的 block 号码, 当然也就能够读出该文件的实际数据了。
也就是说每个文件都会用一个inode,这个inode记录了文件的属性,还有文件的数据所放置的block号码(可能有多个block)
文件系统格式化时,它的最小单位就是block。然后它会规划一部分为inode,一部分为实际存放数据的block。
如图所示:
这种方式叫做索引式文件系统,当然还有类似于指针一样的指针式文件系统,例如闪存就是利用这样的存储方式,如图:
接下来,我们讲一下实际的文件系统例子。
Linux的EXT2文件系统(inode)
在EXT2文件系统中,inode 的内容在记录文件的权限与相关属性,至于 block 区块则是在记录文件的实际内容。 而且文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用resize2fs 等指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。
而且我们发现,如果文件系统容量很大时,我们会发现把所有的inode堆在一起,把所有的block堆在一起,其实不是很容易管理。
所以Ext2文件系统格式化时区分为多个区块群组,每个区块群组都有独立的inode/block/superblock系统。
虽然有这么多区块群组,但是它们实际上都还是属于同一个文件系统。因为superblock是管理整个文件系统的信息,所以其实后面群组的superblock只是第一个群组superblock的备份。
在整体的规划中,文件系统最前面有一个启动扇区,这个启动扇区可以安装开机管理程序。
这样一来,系统上有多少个分区或者严格说有多少个文件系统实际上就能安装多少个开机管理程序。
data block
文件系统中最基本的单位就是block。包括后面讲到的superblock,inode Table,也都是在block中记录数据,只是将不同的block规划成不同的功能而已。
data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。
不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。
Ext2 文件系统的 block 还有什么限制呢?有的!基本限制如下:
- 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
- 每个 block 内最多只能够放置一个文件的数据;
- 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
- 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
后面几点很重要,如果一个文件很大,那么它可能需要占据多个block。如果一个文件很小,那么它占据一个block后剩余的容量也不能让其它文件用,所以会产生一定的浪费。
这个block在磁盘系统中也有个专业名词叫做簇。
inode table
也就是说,我们前面ll 查看一个文件时,该文件所有的属性基本都记录在这里。
inode的数量和大小在格式化时就已经固定了,除此之外inode还有什么特色呢?
- 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
- 每个文件都仅会占用一个 inode 而已;
- 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
- 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
第一点,所以一个block里面可能会很多个inode。
第二三点,所以限制文件数量时,可以限制inode的数量。
最后一点也很重要,系统读取文件时,会先比对所拥有的特性于inode中记录的特性。
当然,inode记录的数据中只有少部分用于记录block区块的号码,但是如果一个文件很大,它的block区会很多,它又是如何记载的呢?这个就与它的十二个直接,一个间接,一个双间接,一个三间接记录区有关,感兴趣的可以自行查阅书籍看看。
superblock 超级区块
Superblock 是记录整个 filesystem 相关信息的地方,没有 Superblock ,就没有这个 filesystem了。
他记录的信息主要有:
利用dumpe2fs可以查看EXT家族的suprblock。
dumpe2fs 装置文件名。
与目录的关系
不过比较重要的是,与目录的关系。我们都知道在Linux中,目录记录的只是文件名,一般文件才是记录文件数据的地方。
而目录的inode和block代表什么呢?
- 系统会给每个目录分配一个inode
- 目录的inode同样记录了它的属性,和记录了它的block
- 最关键的是block里,记录了文件名与文件的inode号码
比如我有一个文件夹dir1,dir1的inode号码是10001,它的block号码是13322(假设只有一个block),然后dir里面有两个文件,file1,file2.
那么dir1的block里面记录的就是 file1 -15533(假设file1的inode号码是15533),file2 -16672.
那么系统是如何读取目录的,举下面的例子:
举例来说,如果我想要读取 /etc/passwd 这个文件时,系统是如何读取的呢?
所以只要能通过挂载点找到inode号码为128的根目录,下面的逻辑就都是一样的了。
新建文件时,文件系统的行为:
Linux与XFS文件系统
虽然EXT4很好用,但是现在Linux都统一预设为XFS文件系统了。主要原因是因为EXT文件系统格式化太慢了,尤其是预先分配inode和block要消耗好多时间……
xfs 文件系统在资料的分布上,主要规划为三个部份,一个资料区 (data section)、一个文件系统活动登录区 (log section)以及一个实时运作区 (realtime section)。 这三个区域的数据内容如下:
EXT家族有dumpe2fs观察superblock的内容
而XFS则是使用xfs_info 去观察
xfs_info 装置名/挂载点
链接(实体链接与符号链接)
在Linux系统里有两种链接,一种是实体链接,一种是符号链接。
Hard Link 实体链接
实体链接其实就是多个档名对用同一个inode号码,其实就是在某个目录下新增一笔档名链接到某inode号码的关联记录。
举个例子,假如系统里有个/root/crontab 他是 /etc/crontab 的实体链接,就是说两个档名连结到同一个inode,所以实际上这两个文件名的所有相关信息都会一模一样。
你可以透过 1 或 2 的目录之 inode 指定的 block 找到两个不同的档名,而不管使用哪个档名均可以指到 real 那个 inode 去读取到最终数据!那这样有什么好处呢?最大的好处就是『安全』!如同上图中, 如果你将任何一个『档名』删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个『档名』来读取到正确的文件数据喔!此外,不论你使用哪个『档名』来编辑,最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩
如上图:实际的含义就是在/etc目录的inode所指向的block内容里有crontab 对应一个inode号码,而/root目录的inode所指向的block内容里有crontab所对应的一个inode号码,而这两个inode号码实际上是一样的,所以该inode号码指向的block的内容也相同。
但是hard link也是有限制的:
Symbolic Link(符号链接,也就是快捷方式)
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文件!』。实际上就是找不到原始『档名』而已啦!
由 1 号 inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的 inode ,最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!
简单说明一下,就是符号链接inod1的所指向的block里存储的数据就是/etc/crontab,那么它自然就知道我们实际要找的数据在/etc/crontab里,所以它自然会去找/根目录,然后从根目录找到/etc,再从/etc 找到/etc/crontab 对应的inode,然后去其inode里读出其实际的block内容。
这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!
好的,那么如何做链接呢?
== ln [-sf] 来源文件 目标文件==
如果加上 -s就是符号链接,否则默认就是硬链接
实操篇
文件系统的简单操作
现在我们知道磁盘的整体数据是在 superblock 区块中,但是每个各别文件的容量则在 inode 当中记载的。 那在文字接口底下该如何叫出这几个数据呢?底下就让我们来谈一谈这两个指令:
- df:列出文件系统的整体磁盘使用量;
- du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
df
直接df -h ,会以易读的方式 列出系统内文件系统的容量
du
du 能列出当前目录下所有文件的容量
但是一般比较常用是
du -sh /dir 可以查看目录的大小
实际建置文件系统mkfs
mkfs.xfs
很简单,就一个命令。
mkfs 装置名称
一般都使用默认值来格式化,但当该分区是特殊分区时,可以格式化就得加参数。
举例来说,因为 xfs 可以使用多个数据流来读写系统,以增加速度,因此那个 agcount 可以跟 CPU 的核心数来做搭配!举例来说,如果我的服务器仅有一颗 4 核心,但是有启动 Intel 超线程功能,则系统会仿真出 8 颗 CPU 时,那个 agcount 就可以设定为 8 喔!
再比如如果我们使用磁盘阵列,那么在文件格式化也需要设置参数。
mkfs.ext4
出错时的处理:
- xfs_repair 处理 XFS 文件系统
- fsck.ext4 处理 EXT4 文件系统
但是处理文件系统时,这些文件系统必须是在卸载的状态,不能在使用中!
结尾
现在,我们已经成功地进行分区,也对分区进行了格式化,也就是在分区建置了文件系统。100步已经走了八十多步,离成功已经不远了,最后就是将文件系统挂载起来就好啦!接下里就让我们来挂载文件系统吧!
参考资料:《鸟哥的Linux私房菜》