什么是文件系统
关于对文件系统的定义有很多,这里我们不打算用很专业的语言定义文件系统,因为可能会给初学者造成困扰,同时也不是几句话能说清楚的,这里我们从文件系统实现的功能上给出一个人性化的定义。
文件系统是基于操作系统的,因此,可以说,文件系统是用来管理和组织保存在磁盘驱动器上的数据的系统软件,它通过对数据存储布局、空间管理、文件命名、安全控制等方面的管理,解决了如何在设备上有效的存储数据。通过文件系统,实现了数据的完整性,也就是保证了写入磁盘的数据和随后读出数据的一致性,同时也实现了数据读写的简单化和安全性。
文件系统除了保存和管理以文件方式存储的数据外,同样也将文件以及文件系统自身的一些重要信息(例如文件的权限、大小、修改日期、属主、存储位置等)存放到磁盘上,这些信息称为文件系统的元数据(metadata)。
文件系统是操作系统与磁盘设备之间交互的一个桥梁,通过文件系统实现了数据合理组织和有效存取,表现在操作系统上就是对文件和目录的管理。
为什么要使用文件系统
在linux下能看到类似/usr、/home的目录,在windows下能看到C盘、D盘等,同时可以很轻松的在这些系统下添加删除文件,这就是文件系统提供的功能。如果没有文件系统支持,看似很简单的操作,将变得异常复杂。
使用文件系统是和使用裸设备相对而言的,裸设备是一种没有格式化的磁盘或磁盘分区,也就是让操作系统或者程序直接操作磁盘设备(没有经过文件系统这一层就直接去读取磁盘,但是裸盘的好处是在大并发写的情况下,不经过文件系统,它的效率就会非常的高),通过文件系统的方式来组织磁盘存储和数据管理,有以下几个方面的好处:
- 数据的读取、管理操作变得简单。
文件系统给用户提供了一个简单的操作界面,用户可以通过对文件系统的简单操作,实现对磁盘的管理,虽然linux系统下也可以直接使用裸设备,但是在读取性能上,裸设备并不比文件系统能高出多少,同时还造成了管理与维护上的麻烦,普通用户是无法接受的。
- 磁盘分区管理灵活
在文件系统下提供了很多的磁盘分区管理工具,例如LVM等,通过这些工具可以灵活的对磁盘分区进行大小的修改,而在裸设备下,必须预先规划好磁盘空间,可能造成空间的不足或者浪费。
- 支持数据容错机制,数据安全能得到保障
一个好的文件系统提供了对于数据读取和写入的各种容错和保护机制,很好的保障了数据的安全,而裸设备没有这种灵活的管理机制,对于数据安全只能通过手工的备份方式来实现。
由于文件系统是操作系统和磁盘之间的一个桥梁,对磁盘的任何写操作,都要经过文件系统,然后才到磁盘,这是个优点,也是个缺点,说优点是因为通过文件系统可以合理简单的组织磁盘数据,说缺点是因为在大量写操作下,由于文件系统本身也会产生开销,例如对元数据的维护,文件系统缓存等。这个桥梁就成了一个障碍。不过,现在很多类型的文件系统都在做写入性能的改进,因而,相对于文件系统提供的这些优点,缺点基本可以忽略。
linux下常用文件系统介绍
常见的有DOS文件系统类型msdos
windows下的FAT系列(fat16和FAT32)和NTFS文件系统
光盘文件系统ISO-9660
单一文件系统ext2和日志文件系统ext3/ext4/ xfs
集群文件系统gfs(Red Hat Global File System)、ocfs2(oracle cluster File System)
加密文件系统(比如CFS)和虚拟文件系统(比如 /proc),网络文件系统(NFS)等
ext3和ext4文件系统
linux标准文件系统是从VFS开始的,然后是ext,接着就是ext2,应该说ext2是linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,从VFS到ext3,其设计思想没有太大变化,都是早期UNIX家族基于超级块和inode的设计理念。
ext3是一种日志式文件系统,其实就是在ext2文件系统基础上增加一个特殊的inode(日志文件)即日志记录功能,用于记录文件系统元数据或者各种写操作的变化,这样以来,在磁盘操作事务被真正写入到磁盘最终位置以前,首先通过日志文件的记录功能,顺序的记录了文件系统的各种写操作和元数据的变化。(对所有文件的读写都是有日志记录的,当文件系统遭受破坏,需要恢复可以基于日志进行回滚)
inode其实是标识文件的一个ID,对每个文件都会有这么一个标识,相当于每个文件都有一个身份证号,
ext4是Linux下第四代扩展日志文件系统,是ext3文件系统的后继版本。它引入了大量新功能,这些改进主要是为了提高未来的Linux系统的性能。与ext3文件系统相比,ext4文件系统有如下特点:
1、支持更多的子目录数量
ext3目前只支持32000个子目录,而ext4取消了这一限制,理论上支持无限数量的子目录。(在做Hadoop维护的时候,Hadoop会产生很多的临时的文件,如果不做清理,那么会在主目录下的子目录会越来越多,会生成以job_id命名的目录,直到超过32000这个目录就再也写不了东西了)
2、支持更大的文件系统和更大的文件
ext3文件系统最多只能支持32TB的文件系统和2TB的文件,而ext4的文件系统容量达到1EB,而文件容量则达到16TB。
XFS文件系统
XFS文件系统是SGI开发的一个高级日志文件系统,后来移植到了linux系统下,XFS 通过分布处理磁盘请求、定位数据、保持cache 的一致性来提供对文件系统数据的低延迟、高带宽的访问,因而,XFS极具伸缩性,非常健壮。
1.XFS文件系统的使用
在Centos7.0版本以后,文件系统类型默认为xfs,这样我们就可以直接使用xfs文件系统了。
xfs文件系统提供了很多实用的工具,最经常使用的有mkfs.xfs、xfs_growfs、xfs_repair、xfsdump、xfsrestore、xfs_bmap、xfs_db、xfs_fsr等,下面详细介绍下这些命令的用法。
(1)文件系统格式化命令mkfs.xfs(ext4 ext3在格式化文件系统的时候,如果磁盘分区比较大,它格式化的速度就会非常的慢,xfs就不一样,盘很大,格式化的速度也是非常快的)
mkfs.xfs主要用于文件系统的格式化,与mkfs.ext3、mkfs.ext4用法类似,下面是将系统的/dev/sdb2分区格式化为xfs文件系统,操作过程如下:
[root@localhost /]# mkfs.xfs /dev/sdb2
mkfs.xfs: /dev/sdb2 appears to contain an existing filesystem (ext4).
mkfs.xfs: Use the -f option to force overwrite.
[root@localhost /]# mkfs.xfs -f /dev/sdb2
meta-data=/dev/sdb2 isize=256 agcount=4, agsize=700288 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=2801152, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost /]# mount /dev/sdb2 /mnt
[root@localhost /]# df -h|grep /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sdb2 11G 33M 11G 1% /mnt
在格式化磁盘时,如果mkfs.xfs提示你分区原本已被格式化为其它文件系统,可以使用参数“-f”强行格式化。
最后,为了让系统启动后就自动加载,需要修改/etc/fstab文件,将如下行加入到/etc/fstab文件,这样系统启动后就会自动加载xfs分区而不必每次都手工加载:
/dev/sdb2 /mnt xfs defaults 0 0
(2)文件系统一致性检测命令
xfs_repair命令可以用来尝试修复受损的xfs文件系统,指定“-n”选项后,可以只进行文件系统一致性检查,而不修复,需要修复时去掉“-n”选项即可。
下面的操作是检查/dev/sdb2分区文件系统一致性的操作过程:
[root@localhost /]# xfs_repair -n /dev/sdb2
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan (but don't clear) agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
从输出可知,xfs_repair检查大体分为7个阶段。修复错误信息大体为5种信息。需要注意的是,被检查和修复的文件系统在进行修复前必须被卸载。
选择文件系统的标准
面对这么多的文件系统,用户应该如何选择呢,一个合理的选择标准是:将应用的特点和环境与文件系统特性结合起来综合考虑,任何脱离应用环境而单独谈文件系统优劣的方法都是不合理和不科学的。
- 读操作频繁,同时小文件众多的应用
对于此类应用,选择ext4文件系统都是不错的选择。
由于ext3的目录结构是线型的,因此当一个目录下文件较多时,ext3的性能就下降比较多。而ext4的延迟分配、多块分配和盘区功能,使ext4非常适合大量小文件的操作,因此,从性能方面考虑,对于小规模文件密集型应用,ext4文件系统是首选。而如果从性能和安全性方面综合考虑的话,xfs文件系统是比较好的选择。大量实践证明,如果业务环境是对文件要进行大量的创建和删除操作的话,ext4是更高效的文件系统,接下来依次是xfs、ext3。例如网站应用,邮件系统等,都可使用ext4文件系统来达到最优性能。
- 写操作频繁的应用
如果是一些大数据文件操作,同时,应用本身需要大量日志写操作,那么,xfs文件系统是最佳选择,根据实际应用经验,对xfs、ext4、ext3块写入性能对比,整体上性能差不多,但在效率上(CPU利用率)最好的是xfs,接下来依次是ext4和ext3。
- 对性能要求不高、数据安全要求不高的业务
对于这类应用,ext3/ext2文件系统是比较好的选择,因为ext2没有日志记录功能,这样就节省了很多磁盘性能。例如linux系统下的/tmp分区就可以采用ext2文件系统。