Linux文件系统
索引式文件系统(ext2)
ext2系统在格式化的时候会区分为多个区块群组,每个区块群组都有独立的inode、数据区块、superblock等,而不是将所有的inode和数据区块放在一起,这样会造成管理困难。
启动扇区
文件系统最前面有一个启动扇区,用来安装启动引导程序
而每个区块群组主要有六部分组成:
数据区块
数据区块是用来存储真正数据的地方。
ext2系统中支持的区块大小有1K、2K、4K,并且区块的大小在文件系统格式化的时候就会确定,不再更改。
每一个数据区块都有一个自己的编号,记录在inode,以便于寻找数据。
数据区块还有四个基本限制:
- 原则上,区块的大小和数量在格式化完成之后就不能再修改。
- 每个区块只能放置一个文件的数据。(导致存储空间的浪费)
- 较大的文件会占用多个区块用来存储。
- 文件小于区块,则该区块中的剩余空间并不能再使用。
inode table
inode用来记录文件的的属性和文件放置区块的编号(每个区块编号占据的空间为4B)
- 她所记录的数据还有有:
- 文件的读写属性(r-w-x)
- 文件的拥有者和用户组
- 文件的大小
- 文件建立或状态改变的时间
- 最近一次的读取时间
- 最近修改的时间
- 定义文件特性的标识,如SetUID
- 该文件真正内容的指向
- inode的一些特性:
- 在ext2文件系统中,每个inode的大小固定为128B;ext4和xfs中每个inode的大小为256B
- 每个文件占有一个inode,所以文件的数量和inode的数量是相关的(总的文件数不能超过inode的最大数量)
- 系统读取文件时,首先要先找到inode,并分析inode所记录的文件权限与用户是否符合,符合之后才能读取到区块的内容
在这里,inode的大小只有128B(以ext2为例),那么他是怎样来储存大量的数据的呢?
原来,inode记录区块号码的区域定义为12个直接、1个间接、1个双间接、1个三间接记录区,如图所示:
以1K大小的区块来说明:
-
12个直接指向即直接存储12个区块的号码
-
1个间接指向,即再拿一个区块来记录区块号码,这里一个区块为1K=1024B,可以存储1024/4=256个区块号码
-
依次类推,双间接可以存储256×256个区块号码;三间接可以存储256³个区块号码。
所以126B的inode可以记录总大小为16GB的区块们的号码。
超级区块(superblock)
superblock是用来记录整个文件系统相关信息的地方,一般为1024B
他记录的文件系统信息有:
- 数据区块和inode的数量
- 未使用与已使用的 数据区块和inode 的数量
- 数据区块和inode 的大小
- 文件系统的挂载时间(文件系统即一个分区,需要挂载在目录上才能使用)、最近一次写入数据的时间、最近一次检验磁盘的时间等信息
- 一个有效位数值,若此文件系统已被挂载,则有效位为0,若未被挂载,则有效位为1。
此外,每个区块群组都可能含有超级区块。首先,第一个区块群组有一个超级区块,而其他区块群组可能有超级区块(为第一个区块群组的超级区块做备份)
文件系统描述说明(filesystem description)
描述每个区块群组的开始与结束的区块,记录数据区块、indoe table、superblock、区块对照表所在的区块。
区块对照表(block bitmap)
用来记录那些区块是空的、哪些非空。
inode对照表
记录已被使用的inode和未被使用的inode
目录、文件在文件系统中的记录
目录
目录的内容为目录下的文件名,而文件才是真正存储数据的地方
当新建一个目录时,系统会分配给该目录一个inode和至少一个区块,inode中会记录所分配区块的号码;区块则记录目录下的文件名和文件名所占用的inode(这样通过访问目录,可以得到特定文件的inode,进而访问特定的文件)
文件
建立一个新文件时,系统会分配一个inode和相对于该文件大小的区块给该文件。
目录树的读取过程
目录树由根目录读起,首先由挂载的信息可以得到根目录的inode,innode规范的权限让我们读取区块中的内容即文件名数据和文件的inode,再一层层往下(根据inode)读到正确的文件。
文件的存取和日志式文件系统的功能
-
当我们新增一个文件时,文件系统的操作如下:
- 首先确定用户对于新增文件的目录是否具有w、x权限,有权限才能操作。
- 根据inode对照表找到一个空的inode,将新文件的属性写入其中。
- 根据区块对照表找到一个未使用的区块,将文件的数据写入其中,更新文件的inode,将区块号码写入其中
- 根据分配的inode和区块更新inode对照表和区块对照表,之后再更新superblock
一般,我们将数据区块称为数据存放区域,而将超级区块、indoe对照表、区块对照表称为元数据(metadata)。元数据是经常变动的,每次新增、编辑、删除都会改变元数据的内容
文件系统的操作正常来说是不会出现问题的,但当我们操作不当或由于其他原因使系统突然终止,就会导致数据更新信息不完成,出现数据不一致现象,如区块已被分配,但区块对照表的数据并未改变。这个时候我们就需要检查数据的不一致状态,然后做出修改更正,但是常规的检查十分耗时间,所以为了方便,新的文件系统出现了–––日志式文件系统。
-
日志式文件系统
即在文件系统中专门划分出一个区块,用来记录写入或修改文件的步骤。
操作步骤如下:
- 当要写入一个文件时,首先在日志记录区块中记录某个文件准备要写入的信息。
- 接着,写入文件的权限和数据,更新metadata的数据。
- 完成数据和元数据(metadata)的更新,在日志中完成该文件的记录。
这样就可以使一致性检查更加便利。
Linux文件系统的运行
我们知道,内存的速度和磁盘的速度差距是比较大的,木桶的容量取决于最短的那块木板,所以磁盘的写入速度会拖内存的后退。在这种情况下,Linux采用了异步处理的方式来提高效率:
加载一个文件至内存中后,若文件未被修改过,则打上clean的标记。若被更改过,打上dirty的标记,这些操作都在内存中进行,并没有写入磁盘,而系统会不定期的将dirty的数据写回磁盘,来保证磁盘和内存数据的一致性。
Linux为提高效率,会将常用的文件加载到内存中,所以:
- 系统会将常用的文件数据放在内存的缓冲区中,来加速文件的读写操作
- 所以linux的物理内存最后都会被用光,用来加速系统性能
- 可以手动使用sync命令让dirty的文件写回磁盘
- 正常关机时,关机命令也会调用sync命令将内存中dirty的数据写回磁盘
linux挂载点
文件系统必须挂载到目录上才能使用,目录即相当于文件系统的入口。
我们可以根据inode来判断不同文件名是否为同一个文件,如/、/.、/… 三者标识同一文件–-根目录。
挂载点一定是目录,目录是进入文件系统的入口
VFS
不同的磁盘分区可能会使用不同的文件系统,而VFS(virtual filesystem switch)会自动帮我们处理文件系统的读取工作,我们不需要知道每个磁盘分区的文件系统。
XFS文件系统(CentOS)
ext文件系统是预先规划好所有的inode、区块,除非格式化否则不能再进行改变,做不到动态配置。而面对越来越大的磁盘容量,格式化所需要的时间越来越长,ext逐见颓势。
xfs是一个日志式文件系统,数据的分布,规划为三个部分:
- 数据区 data section
- 文件系统活动登陆区 log section
- 实时运行区 realtime section
数据区
包含indoe、数据区块、超级区块等数据。
数据区 分为了多个存储区群组,每个存储区群组都包括:
- 整个文件系统的superblock
- 剩余空间的管理机制(?)
- inode的分配和追踪
此外,inode和区块都是当有需求时才会动态配置产生,并不是一开始就规划好,所以格式化速度更快。
另外,xfs区块的容量可在512B-64KB间调整,inode容量为256B-2M
文件系统活动登陆区
用来记录文件系统的变化,相当于日志区
在xfs中,可以指定外部的磁盘作为xfs文件系统的日志区块。
实时运行区
当有文件被建立时,文件首先会被放在一个或多个extent区块中,等待分配完毕后(应该是数据区块和inode的分配),才会被写入数据区。
而extent区块的大小在格式化时就被确定,一般在4K-1G之间。
文件系统的操作
读取磁盘和目录的容量
-
df 命令:列出问文件系统的磁盘使用量
df [-hi] 目录或文件名
-h : 以人们容易理解的格式输出
-i : 不显示磁盘容量,而现实inode的数量
-
du 命令:查看目录所占的容量
du [] 目录或文件名
硬链接和符号链接
硬链接
硬链接是在目录下新增一条链接到某一inode的文件名,即硬链接文件与某一文件具有相同的inode和权限,它们除了文件名外均相同,对任一文件做修改,所有的文件都会改变。
-
硬链接的限制:
- 不能跨文件系统,既不能跨越文件系统建立链接
- 不能链接目录,只能链接文件(若链接目录,则对目录下的所有文件都要建立链接,复杂度高)
-
硬链接的建立:使用 ln 命令
ln -[sf] 源文件 目标文件
-s : 不加s参数建立硬链接,加s参数则建立符号链接
-f :若目标文件已存在,则之删除后再建立链接
符号链接
符号链接指的是 新建一个文件(新的inode),这个文件会让数据的读取指向他所链接的文件的文件名,相当于windows下的快捷方式,若源文件消失,则符号链接失效;同样修改符号链接,也会使源文件被修改。
硬链接是建立一个与源文件有相同inode的文件,他们本质上是一个文件,只不过文件名不同,即硬链接相当于源文件的一个副本。而符号链接是建立一个新文件,拥有自己的inode、区块,相当于快捷方式。
目录的链接数量
一个空目录中至少存在 . 和 **…**两个目录,他们具有相同的inode,所有当我们新建一个目录时,新目录的链接数为2,而上一层目录的链接数会加1。
图中17就是该目录的链接数
磁盘的分区、格式化、检验、挂载
当我们想在我们的系统中增加一块磁盘时,我们需要做如下操作:
-
对磁盘进行分区
-
格式化磁盘分区,以建立系统可用的文件系统
格式化磁盘的原因是:不同系统设置的文件属性和权限并不相同,需要将磁盘格式化为该系统可使用的文件系统才能正常使用。
-
对建立的文件系统进行检验
-
建立挂载点,将文件系统挂载到目录上,进而可以开始使用
下面详细介绍每一步的具体操作:
磁盘分区
磁盘的分区方式有两种,MBR和GPT,MBR现在逐渐淘汰
观察磁盘分区的状态
-
lsblk 命令:列出系统中的所有磁盘
lsblk -[dfimpt] [device]
-
blkid 命令:列出设备的UUID等参数
UUID时设别的全局标识符,每一个设备的UUID都是独一无二的,所以通常使用UUID来对磁盘进行分区,避免一些错误出现。
-
parted 命令:列出磁盘的分区表类型和分区信息
parted device_name print # 列出磁盘的相关信息
磁盘分区
MBR使用fdisk命令进行分区,GPT使用gdisk命令(仅root可用)进行分区。注意:使用gdisk时设备名不能含有数字,因为我们的磁盘分区是针对于整个磁盘设备而不是某个分区。
/dev right /dev/sda1 wrong
fdisk/gdisk 设备名称
操作详情见鸟哥私房菜233页
注意的是,当我们新建一个分区,而该磁盘我们正在使用时,此时系统无法立即更新分区表,需要我们使用partprobe命令来手动更新分区表。
partprobe [-s]
磁盘格式化(创建文件系统)
使用mkfs(make filesystem)命令
mkfs [] 设备名称
- 创建xfs文件系统,使用mkfs.xfs 命令
- 创建ext4文件系统,使用mkfs.ext4命令
文件系统检验
当文件系统出现问题时,我们可以通过使用特定的命令对文件系统进行观察和处理。
- xfs_repair 命令处理xfs文件系统
- fsck.ext4 命令处理ext4文件系统
注意的是:只有身为root用户且文件系统有问题时才可以使用这些命令,在文件系统正常的时候使用这些命令有可能会对系统造成危害。
另:使用上述命令检查时,被检查的硬盘分区需要先卸载之后再检查。而**卸载时需要注意 **你在使用该磁盘分区的时候是无法卸载该磁盘的。
文件系统的卸载与挂载
挂载的一些限制:
- 一个文件系统不应该被挂载在不同的挂载点上
- 一个目录不能挂载多个文件系统
- 作为挂载点的目录最好为空目录(若目录不为空,则挂载之后原来的内容会被暂时隐藏起来,直到分区被卸载之后再重新显现)
挂载使用mount命令,卸载使用umount命令
mount [-t 文件系统] UUID=“ ” 挂载点
umount [-fn] 设备文件名或挂载点
-f:强制卸载
-n:不更新/etc/mtab情况下卸载
挂载U盘时,注意U盘的文件系统不能是NTFS
磁盘/文件系统参数自定义
- mknod命令
- xfs_admin 命令修改XFS系统的UUID和Label name(设备名)
设置启动挂载
启动挂载/etc/fstab
当我们将某个文件系统挂载到目录上之后,重启后会需要我们手动再次挂载,而如何让系统自动在启动时挂载呢?这就需要我们将挂载的信息写入到/etc/fstab文件中,写入之后,务必使用mount -a命令来测试是否有语法错误(mount -a指的是加载文件/etc/fstab中所有的文件系统)
/etc/fstab文件的信息如下:
例:
/dev/mapper/centos-root / xfs defaults 0 0
对应于:
[设备名/UUID/LABEL] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]
dump是一个用来做为备份的命令
fsck:是否以fsck检验扇区
系统挂载的一些限制:
- 根目录必须挂载,且必须要先于所有其他挂载点 被挂载进来
- 其他挂载点必须为已建立的目录,且一定要遵守FHS
- 所有挂载点,同一时间,只能挂载一次
- 所有硬盘分区,同一时间,只能挂载一次
- 若要卸载文件系统,须将工作目录一道挂载点之外
镜像文件的挂载
镜像文件是否一定要刻录为挂盘才能使用?我们可以通过loop设备来挂载镜像文件,mount -o loop 文件名 挂载点
loop设备是一种伪设备,是使用文件来模拟块设备的一种技术,文件模拟成块设备后, 就像一个磁盘或光盘一样使用。
内存交换分区(Swap)的创建
交换分区(swap)是对内存不足情况的一种应对之道,当内存空间不足时,系统就会将内存中不使用的文件转移到swap中,以腾出足够的内存空间供其他程序使用。
建立内存交换分区有两种方式:
使用物理分区创建内存交换分区
操作步骤:
- 创建磁盘分区,使用gdisk命令(注意code为8200)
- 磁盘分区格式化,格式化为内存交换分区格式,使用mkswap 设备文件名
- 启动swap设备,使用swapon 设备文件名(此外,要关闭swap设备时,使用swapoff命令)
- 使用free和swapon -s来观察内存的使用量
- 记得将新建的分区写入/etc/fstab文件中,使得系统可以自动挂载
使用文件创建内存交换文件
操作步骤:
- 使用dd命令创建大文件
- 用swapon将文件格式化为内存交换文件格式
- swapon 文件名
- 写入/etc/fstab
利用parted命令进行磁盘分区操作
我们知道,fdisk支持MBR分区,gdisk支持GPT分区,而parted命令对二者均支持。
parted命令的格式:
parted [设备] [命令 [参数]]
命令有: 新增分区:mkpart [primary|extended|logical] [ext4|xfs|vfat]
显示分区:print
删除分区:rm [partition(即分区号码)]
鸟哥私房菜256页