Linux文件系统管理
磁盘的组成与分区
计算机用于存取文件的硬件是磁盘,磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成, 而数据的写入其实是在磁盘盘上面。磁盘盘上面又可细分出扇区(Sector)与磁道(Track)两种单位, 其中扇区的物理量设计有两种大小,分别是 512bytes 与 4Kbytes。
分区表所在区块仅有 64 bytes 容量,因此最多仅能有四组记录区,每组记录区记录了该区段的启始与结束的磁柱号码。分区主要有两国目的:一个是数据安全性考虑,比如windows重装系统的时候可以先把重要数据移动到其他分区,然后在c盘再重装系统就不会丢失重要数据。另一个原因是系统运行效率考量,分区时候磁盘寻址范围变小了,每次只需要在分区内寻址,增加寻址效率。
文件系统特性
文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、 群组、时间参数等)。文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
- superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;、
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
Linux 的 EXT2 文件系统(inode)
标准的 Linux 文件系统 Ext2 就是使用这种 inode 为基础的文件系统。
Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
block
Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种,因为 block 大小而产生的 Ext2 文件系统限制如下:
inode
inode 要记录的数据非常多, 但容量只有 128bytes , 而 inode 记录一个 block 号码要花掉 4byte ,假设我一个文件有 400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录,因此inode与block之间的对应关系使用了类似二级页表这样的机制来实现,inode 记录 block 号码的区域定义为 了12 个直接,一个间接, 一个双间接与一个三间接记录区。
inode 本身 (128 bytes),里面有 12 个直接指向 block 号码的对照,因此如果一个block的容量大小是1k的话,将直接、间接、双间接、三间接加总,得到 12 + 256 + 256 * 256 + 256 * 256 * 256 (K) = 16GB,也就是说能够容纳的最大文件为16GB。
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 。
此外每个block group还有一些其他的内容:
-
Filesystem Description (文件系统描述说明)。描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。
-
block bitmap (区块对照表)。从 block bitmap 当中可以知道哪些 block 是空的,删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来
-
dumpe2fs: 查询 Ext 家族 superblock 信息的指令。
首先使用blkid命令列出所有被初始化的装置
选择一个装置查看具体信息
与目录树的关系
当我们在 Linux 下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。
查看目录下文件所占用的 inode 号码时,可以使用 ls -li 这个选项来处理:
文件系统的简单操作
磁盘与目录的容量
两个重要的指令:df, du
- df:列出文件系统的整体磁盘使用量;
- du:评估文件系统的磁盘使用量(常用在推估目录所占容量
df
选项与参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;
-i :不用磁盘容量,而以 inode 的数量来显示
直接使用df列出所有的filesystem
Filesystem:代表该文件系统是在哪个 partition ,所以列出装置名称;
1k-blocks:说明底下的数字单位是 1KB!可利用 -h 或 -m 来改变容量;
Used:使用掉的磁盘空间
Available:也就是剩下的磁盘空间大小;
Use%:磁盘的使用率
Mounted on:就是磁盘挂载的目录所在
加上-h以直观的方式查看容量
如果df后面接的是文件或者目录,也可以自动转换为其所在的分区,并列出分区详细信息
du
选项与参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
直接使用du命令,会列出当前目录所有文件的大小,单位是kb,加上-a参数就是列举所有文件:
使用通配符的方式,检查根目录下每个目录所占的容量:
如果想要检查某个目录下,哪个次目录占用最大的容量,可以用这个方法找出来。
实体链接与符号链接
首先明确两点:
- 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
- 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。
实体链接
因此文件名只与目录有关,但是文件内容则与 inode 有关。所以所谓的实体链接(hard link)也就是在目录下新增一个文件并与一个inode关联,因此一个inode可以对应多个文件名,那么这两个拥有相同inode的文件实际上对应了完全一样的内容。
使用ln命令可以进行实体链接,上面的例子可以看到,两个文件夹指向了相同的位置。
hard link有两个限制:
- 不能跨 Filesystem;
- 不能 link 目录。
符号链接
符号链接Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件名,所以,当来源档被删除之后,symbolic link 的文件就无法使用。
符号链接实际上就类似于windows里面的创建快捷方式。上面这个快捷方式只有12byte,这12byte实际上就是存的目标位置的路径名。