文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识。本文将介绍linux的文件系统,主要包括了文件系统概念、文件系统分类、文件系统运行原理、VFS、文件系统检测和修复、挂载点、创建文件系统、文件系统的挂载、文件系统的卸载、常见工具等。文中例子主要是基于centOS7操作系统,下图是本文要介绍Linux文件系统的内容:
图1 Linux文件系统主要内容
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,安全控制,日志,压缩,加密等。
没有文件系统就没有文件的概念,没有目录的概念,没有目录结构的概念,我们访问数据就只能以二进制的形式,非常不方便。一般来讲,磁盘分区完毕后还需要格式化为需要的文件系统,之后操作系统才能够使用这个分区。
文件系统存在很多种,以下是一些文件系统所对应的操作系统或功能:
Linux文件系统:ext2(Extended file system), ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
光盘:iso9660
Windows:FAT32, exFAT,NTFS
Unix: FFS(fast), UFS(unix), JFS2
网络文件系统:NFS, CIFS
集群文件系统:GFS2, OCFS2(oracle)
分布式文件系统:fastdfs,ceph, moosefs, mogilefs, glusterfs, Lustre
RAW:未经处理或者未经格式化产生的文件系统
根据其是否支持"journal"功能:
日志型文件系统: ext3, ext4, xfs, ...
非日志型文件系统: ext2, vfat
文件系统的组成部分:
内核中的模块:ext4, xfs, vfat
用户空间的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
Linux的虚拟文件系统:VFS
查询前支持的文件系统:cat /proc/filesystem
那么文件系统是如何运行的呢?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等)。文件系统通常会将这两部分的额数据分别存在不同的块,权限与属性放置到inode中,至于实际数据则放置到data block块中。另外,还有一个超级块(super)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。
每个inode与block都有编号,至于这三个数据的意义可以简略说明如下:
superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量、以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
block:实际记录文件的内容,若文件太大时,会占用多个block。
我们将inode与block块用图解来说明一下,如图2所示,文件系统先格式化出inode与block的块,假设一个文件的属性与权限数据是放置到inode3号(下图较小方格内),而这个inode记录了文件数据的实际放置点为1,6,8这三个block号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一下子将3个block内容读出来。那么数据的读取就如同图2所示中的箭头所指定的模样了。这种数据访问的方法我们称为索引式文件系统。
图2 inode/block数据访问示意图
VFS
这么多文件系统,Linux的内核是如何管理的呢?其实,整个Linux系统都是通过一个名为Virtual Filesyatem Switch(虚拟文件系统,VFS)的内核功能去读取整个文件系统的。也就是说,整个Linux认识的文件系统其实都是VFS在进行管理。我们用户并不需要知道每个分区上头的文件系统是什么,VFS会主动帮助我们做好读取的操作。整个VFS可以简略用图3来说明。
图3 VFS文件系统示意图
文件系统检测和修复
常发生于死机或者非正常关机之后
挂载为文件系统标记为"no clean"
注意:一定不要在挂载状态下修复
fsck: File System Check
fsck.FS_TYPE
fsck-t FS_TYPE
-p: 自动修复错误
-r: 交互式修复错误
FS_TYPE一定要与分区上已经文件类型相同
e2fsck:ext系列文件专用的检测修复工具
-y:自动回答为yes
-f:强制修复
挂载点
每个文件系统都有独立的inode、block、super block等信息,这个文件系统要能够链接到目录树上才能被我们使用。将文件系统与目录树结合的操作我们称为挂载。要注意:挂载点一定是目录,任何一个分区都必须挂载到某个目录上,磁盘Linux分区都必须挂载到目录树中的某个具体的目录上才能进行读写操作,该目录成为进入该文件系统的入口。
mkfs命令:
(1)mkfs.FS_TYPE/dev/DEVICE
mkfs.ext4 /dev/sdb1
mkfs -t extX /xfs/btrfs/vfat
mke2fs -t ext2 /ext3/ext4 /dev/sdXX
(2)mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL': 设定卷标
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为。
不过在挂载前,要注意几件事;
单一文件系统不应该被重复挂载在不同的挂载点中;
一个目录不应该重复挂载多个文件系统
挂载点目录一般为空
尤其要注意后两点,因为如果用来挂载的目录不是空的,挂载点下原有文件在挂载完成后会被临时隐藏,等到分区卸载,才会显示原本的内容,所以,挂载点最好是空目录。
而要将文件系统挂载到Linux系统上,就要使用mount这个命令
mount 设备名 挂载点
-t 指定文件系统类型
-r 只读挂载
--remount,ro|rw 也会新/etc/fstab中的选项,如果与指定的冲突,则remount后指定的优先。
-n 隐藏挂载信息不显示,但在/proc/mounts可以查到
-a 读取/etc/fstab,挂载其中没有挂载的设备
-L 'LABEL': 以卷标指定挂载设备
-U 'UUID': 以UUID指定要挂载的设备
-B --bind 目录挂目录
-o 选项
sync,async 同步,异步(defaults)
atime(defaults),noatime 是否在读访问时更新atime
diratime(defaults),nodiratime
auto(defaults)/noauto 写在/etc/fstab当中的分区,是否在mount -a时被挂载
exec(defatuls)/noexec 在该分区所挂载的目录中的脚本是否可以执行。
dev(defaults)/nodev:是否支持在此文件系统上使用设备文件
suid(defaults)/nosuid:不否支持suid和sgid权限
remount:重新挂载
ro:只读
rw:读写(defaults)
user/nouser(defaults):是否允许普通用户挂载此设备,默认管理员才能挂载
acl:启用此文件系统上的acl功能
defaults 默认,见以上中的(defaults)
卸载:为解除此关联关系的过程
卸载时:可使用设备,也可以使用挂载点
卸载:
# umount DEVICE
# umount MOUNT_POINT
内存空间使用状态:
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间占用等信息的查看工具:
df[OPTION]... [FILE]...
-H 以1000为单位
-T 文件系统类型
-h: human-readable
-i:inodesinstead of blocks
-P: 以Posix兼容的格式输出
查看某目录总体空间占用状态:
du [OPTION]... DIR
-h: human-readable
-s: summary
配置文件修改
如果想要实现在开机的时候就将需要的文件系统都挂载好,这样就不需要每次进入Linux系统都还要再挂载一次。当然可以,那就直接到/etc/fstab里面去修改就行。现在让我们直接查看一下/etc/fstab这个文件的内容。
其实/etc/fstab就是将我们利用mount命令进行挂载时,将所有的参数写入到这个文件就可以了。
/etc/fstab每行定义一个要挂载的文件系统
第一列:要挂载的设备或伪文件系统:
设备文件
LABEL:LABEL=""
UUID:UUID=""
伪文件系统名称:proc,sysfs
第二列:挂载点
第三列:文件系统类型
第四列:挂载选项:defaults
第五列:转储频率:0:不做备份1:每天转储2:每隔一天转储
第六列:自检次序:0:不自检 1:首先自检;一般只有rootfs才用1
举例:
怎样将/dev/sdb1每次开机都自动挂载到/mnt/sdb1?
[root@centos7~]# vim /etc/fstab
#将下面这一行写入/etc/fstab
/dev/sdb1 /mnt/sdb1 xfs defaults 0 0