5.2 Linux文件系统进阶

时间:2022-02-05 09:03:59

常见文件系统概念

    从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。

当前支持的文件系统存放在:/lib/modules/`uname –r`/kernel/fs

[root@CentOS6 ~]#ls /lib/modules/2.6.32-696.el6.x86_64/kernel/fs
autofs4  cachefiles  configfs  dlm       exportfs  ext3  fat      fuse  jbd   jffs2  mbcache.ko  nfs_common  nls       ubifs  xfs
btrfs    cifs        cramfs    ecryptfs  ext2      ext4  fscache  gfs2  jbd2  lockd  nfs         nfsd        squashfs 

日志型与非日志型文件系统

    所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后它修改元数据。

    在很多日志文件系统(如:ext3, ReiserFS)中,可以选择三个级别的日志:回写(writeback)、顺序(ordered)和数据(data)。

VFS:Linux中的虚拟文件系统

    VFS是Linux中的一个虚拟文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch)。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。例如:不同的文件系统,如Ext2/3、XFS、FAT32等,具有不同的结构,假如用户调用open等文件IO函数去打开文件,具体的实现会非常不同。为了屏蔽这种差异,Linux引入了VFS的概念。相当于是Linux自建了一个新的贮存在内存中的文件系统。所有其他文件系统都需要先转换成VFS的结构才能为用户所调用。

5.2 Linux文件系统进阶

超级块(super block)

    Linux将元数据区划分为很多子单位,子单位负责一块数据区。位图也是在区域中自我管理的。注意,多个单位之间是可以跨越的,当第一个磁盘块区域存不下时,可以放到第二个磁盘块区域中。家有千头,主持一人,需要一个专门的块来协调子单位之间的工作,所以在元数据区域里面还有一个特殊的数据区(全局管理区),叫超级块(super block)。每个子单位有使用了多少,还剩多少,超级块都能看到。如果super block挂了,那么整个文件系统都挂了。Super block不是单独存放的,而是存在子元数据区里面。为了避免super block挂掉,还存有好几个副本,每个子元数据区都存有一个super block,我们用的时候只用其中一个。

5.2 Linux文件系统进阶

buffer与cache

    缓冲(buffers)

缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

    缓存(cached)

是把读取过的数据保存起来,重新读取时若命中(hit)就不要去读硬盘了,若没有命中就读硬盘。

[root@CentOS7 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.1G        678M        157M        8.9M        312M        252M
Swap:          2.4G         40K        2.4G

文件系统管理

    fdisk 在创建新的分区时无法指定分区的文件系统,而 parted 命令可以指定分区的文件系统。那么当一个磁盘上的分区没有文件系统时,可以使用相应的工具对文件系统进行设置。

    mkfs命令用于在特定的分区上建立 linux 文件系统。

    语法:mkfs [选项] 分区

    选项

-L:命名卷名。
-t {ext2|ext3|ext4}      mkfs.ext3 = mkfs-t ext3 = mke2fs -j = mke2fs -t ext3
-b {1024|2048|4096}
-L 'LABEL'
-i#: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小
-N #:指定分区中创建多少个inode
-I 一个inode记录占用的磁盘空间大小,128---4096
-m #: 默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...]:启用指定特性

-O ^FEATURE:关闭指定特性

    blkid命令用于块设备属性信息查看。

    语法:blkid [选项] [分区]

[root@CentOS6 ~]#blkid
/dev/sda6: UUID="2fec9c8e-3d42-4417-b29c-ef69a50b5980" TYPE="ext2" 
/dev/sda1: UUID="056668aa-7ecd-4235-8351-c8fb02372e3b" TYPE="ext4" 
/dev/sda2: UUID="481fa90c-b9f1-459b-ba67-f4f4c8d7942b" TYPE="ext4" 
/dev/sda3: UUID="b98328eb-21c7-4114-b3d5-93cd4aec6bc8" TYPE="ext4" 
/dev/sda5: UUID="5a1eda5a-2e54-4d0c-b8ea-ef99b9ac3417" TYPE="swap" 

    选项

-U UUID: 根据指定的UUID来查找对应的设备

-L LABEL:根据指定的LABEL来查找对应的设备

    e2label命令用于管理ext系列文件系统的卷标

    语法:e2label 分区 [新卷标]

    findfs:查找分区

    语法:findfs [LABEL|UUID]=关键字

[root@CentOS6 ~]#e2label /dev/sda1 bootdisk
[root@CentOS6 ~]#e2label /dev/sda1
bootdisk
[root@CentOS6 ~]#findfs LABEL=bootdisk
/dev/sda1

    tune2fs命令用于修该重设ext系列的文件系统。

    语法:tune2fs [选项] 分区

[root@CentOS6 ~]#tune2fs -L app /dev/sda3
tune2fs 1.41.12 (17-May-2010)
[root@CentOS6 ~]#blkid /dev/sda3
/dev/sda3: UUID="b98328eb-21c7-4114-b3d5-93cd4aec6bc8" TYPE="ext4" LABEL="app" 

    选项

-l:查看指定文件系统超级块信息;super block
-L 'LABEL':修改卷标
-m #:修预留给管理员的空间百分比
-O: 文件系统属性启用或禁用
-o: 调整文件系统的默认挂载选项
-U UUID: 修改UUID号

    dumpe2fs命令用于指定分区显示超级块上的元数据和分区信息。

    fsck命令用于检测与修复文件系统。fsck 命令时必须在非挂在情况下使用!!

    语法:fsck [-f] 分区

    当 fsck 检查 ext 文件系统时,使用的是 e2fsck 工具;检查 xfs 文件系统时, 使用的是 xfs_repair 工具。