一、文件系统类型
- Linux文件系统: ext2, ext3, ext4, xfs(SGI), btrfs(Oracle), reiserfs, jfs(AIX), swap
- 光盘:iso9660
- Windows:fat32, ntfs
- Unix: FFS(fast), UFS(unix), JFS2
- 网络文件系统:NFS, CIFS
- 集群文件系统:GFS2, OCFS2(oracle)
- 分布式文件系统:ceph, moosefs, mogilefs, fastdfs,glusterfs, Lustre
- RAW:未经处理或者未经格式化产生的文件系统
文件根据其是否支持“日志(journal)”功能可分为两类:
- 有日志:ext3, ext4, xfs
- 无日志:ext2
小贴士:日志文件系统:
一种文件系统,指在文件系统发生变化时,先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统的文件系统。在文件系统发生故障(如内核崩溃或突然停电)时,日志文件系统更容易保持一致性,并且可以较快恢复。
二、虚拟文件系统
虚拟文件系统也成为VFS。
VFS存在的意义:
- 1.向上,对应用层提供一个标准的文件操作接口;
- 2.对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
- 3.VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;
- 4.此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。
VFS架构图:
三、文件系统的组成
文件系统管理分两部分组成:
- 文件系统内核模块:如 ext4, xfs, vfat...
- 文件系统管理工具:如 mkfs.ext4, mkfs.xfs,mkfs.vfat...
查看当前系统支持的文件系统类型:
[[email protected] ~]# cat /proc/filesystems nodev sysfs nodev rootfs nodev bdev nodev proc ...
四、文件系统选择
1、大量小文件(LOSF, Lost of small files)I/O应用(如小图片)
Reiserfs(首选), Ext4文件系统适合这类负载特征,IO调度算法选择deadline,block size = 4096, ext4关闭日志功能。
2、大文件I/O应用(如视频下载、流媒体)
EXT4文件系统适合此类负载特征,IO调度算法选择anticipatory, block size = 4096, 关闭日志功能,启用extent(default)。
3、SSD文件系统选择
EXT4/Reiserfs可以作为SSD文件系统,但未对SSD做优化,不能充分发挥SSD性能,并影响SSD使用时间。 Btrfs对SSD作了优化,mount通过参数启用。但Btrfs仍处于实验阶段,生产环境谨慎使用。
五、创建与管理文件系统
1.mkfs命令
格式:
mkfs -t <ext4|xfs|btrfs|vfat> /dev/DEVICE
常用选项:
-t FS_TYPE:指定文件系统类型 -L LABEL:指定卷标名称
实例:
[[email protected] ~]# mkfs -t ext4 -L "YOUNG" /dev/sdb mke2fs 1.42.9 (28-Dec-2013) /dev/sdb is entire device, not just one partition! Proceed anyway? (y,n) y Filesystem label=YOUNG OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 1310720 inodes, 5242880 blocks 262144 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2153775104 160 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
2.mkfs.FS_TYPE命令
格式:
mkfs.FS_TYPE /dev/DEVICE
实例:
[[email protected] ~]# mkfs.ext4 /dev/sdb mke2fs 1.42.9 (28-Dec-2013) /dev/sdb is entire device, not just one partition! Proceed anyway? (y,n) y Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) ...
3.mke2fs命令
mke2fs专用于ext系列文件系统的创建于管理。
常用选项:
-t {ext2|ext3|ext4}:指定文件系统 -b {1024|2048|4096}: 指定块大小 -L LABEL:卷标,即分区名称 -j: 相当于“mke2fs -t ext3” mkfs -t ext3 = mke2fs -t ext3 = mke2fs -j = mke2fs -O has_journal -i #: 为数据空间中的每多少字节创建一个inode;此字节数不应该小于块大小;比例关系; -I: 一个inode记录大小128---4096 -N #:直接指定元数据区有多少个inode; -m #: 指定为管理预留管理空间占据总空间的百分比;默认为5% -O FEATURE[,...]:指定启用分区的某特殊特性 -O ^FEATURE:关闭指定特性 -O has_journal:启用日志 -O ^has_journal:关闭关闭
实例:
[[email protected] ~]# mke2fs -t ext4 -b 4096 -L ‘young‘-i 4096 -N 100000 -I 128 -m 6 -O has_journal /dev/sdb mke2fs 1.42.9 (28-Dec-2013) /dev/sdb is entire device, not just one partition! Proceed anyway? (y,n) y Filesystem label=young OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 102400 inodes, 5242880 blocks 314572 blocks (6.00%) reserved for the super user ...
4.e2lablel命令
e2lablel命令用于卷标查看及管理。
格式:
e2label DEVICE [LABEL]
实例:
[[email protected] ~]# e2label /dev/sdb young [[email protected] ~]# e2label /dev/sdb "GEEK" [[email protected] ~]# e2label /dev/sdb GEEK
5.blkid命令
blkid命令用于块设备属性信息显示。
格式:
blkid [OPTIONS] [DEVICE]
常用选项:
-U UUID: 列出某UUID对应的设备 -L LABEL: 列出使用此LABEL设备
实例:
[[email protected] ~]# blkid /dev/sdb: LABEL="GEEK" UUID="2e564b3f-e542-4bef-aa88-d70935c5c5fb" TYPE="ext4" /dev/sr0: UUID="2015-12-09-22-36-30-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/sda1: UUID="812a29ec-11dd-4fa6-b373-c4b42fb80162" TYPE="xfs" /dev/sda2: UUID="3b67c557-763b-41f2-aff0-4810b0324128" TYPE="xfs" /dev/sda3: UUID="86e06c71-0806-4463-bf6d-490a28cb12b6" TYPE="xfs" /dev/sda5: UUID="431c5b57-a52d-4fcc-8845-f984c463b78f" TYPE="swap" [[email protected] ~]# ^C [[email protected] ~]# blkid -U 2e564b3f-e542-4bef-aa88-d70935c5c5fb /dev/sdb [[email protected] ~]# blkid /dev/sdb /dev/sdb: LABEL="GEEK" UUID="2e564b3f-e542-4bef-aa88-d70935c5c5fb" TYPE="ext4" [[email protected] ~]# blkid -L "GEEK" /dev/sdb
6.dumpe2fs命令
dumpe2fs用于ext系列文件系统的超级块信息查看。
格式:
dumpe2fs [OPTIONS] DEVICE
常用选项:
-h: 仅显示超级块信息
实例:
[[email protected] ~]# dumpe2fs /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot Filesystem UUID: 23048871-a3fd-4d25-92da-5c39459bf7c6 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 51200 Block count: 204800 Reserved block count: 10240 Free blocks: 64456 Free inodes: 49329 First block: 1 Block size: 1024 Fragment size: 1024 Reserved GDT blocks: 256 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 2048 Inode blocks per group: 256 Flex block group size: 16 Filesystem created: Tue Jul 19 19:11:41 2016 Last mount time: Tue Jan 31 02:35:52 2017 Last write time: Tue Jan 31 02:35:52 2017 Mount count: 143 Maximum mount count: -1 Last checked: Tue Jul 19 19:11:41 2016 Check interval: 0 (<none>) Lifetime writes: 332 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: ac8bb143-702c-4f17-80fd-afda06b8763e Journal backup: inode blocks Journal features: journal_incompat_revoke Journal size: 4096k Journal length: 4096 Journal sequence: 0x000002a7 Journal start: 1 Group 0: (Blocks 1-8192) [ITABLE_ZEROED] Checksum 0x70bd, unused inodes 214 Primary superblock at 1, Group descriptors at 2-2 Reserved GDT blocks at 3-258 Block bitmap at 259 (+258), Inode bitmap at 275 (+274) Inode table at 291-546 (+290) 3545 free blocks, 216 free inodes, 229 directories, 214 unused inodes Free blocks: 4648-8192 Free inodes: 34, 1834-2048 ...
innode与超级块关系图:
超级块:超级块(superblock)的作用是存储文件系统的大小、有多少是空的和已经填满的占多少,以及他们各自的总数和其他诸如此类的信息。要使用一个分区来进行数据访问,那么第一个要访问的就是超级块。所以,超级块坏了,那磁盘也就基本没救了。
超级块占用1号物理块,就是文件系统的控制块,超级块包括:文件系统的大小、空闲块数目、空闲块索引表、空闲i节点数目、空闲i节点索引表、封锁标记等。超级块是系统为文件分配存储空间、回收存储空间的依据。
所以为了防止超级块数据损坏,就需要对超级块数据进行备份,以便于损坏时可以修复。
- indoe bitmap (indoe对照表): 用来记录当前文件系统的indoe哪些是已经使用的,哪些又是未使用的。
- block bitmap (块对照表): 用来记录当前文件系统哪些block已经使用,哪些又是未使用的。
- inode table (inode 表格):inode是用来记录文件的属性以及该文件实际数据所在的block的号码。
- GDT(Global Descriptor Table):用来描述每个block group开始和结束的block号码以及每个区段位于哪一个block号码之间。相当于文件系统描述的是每个block group的信息。
- data blocks:数据块,用于存放数据
7.tune2fs命令
tune2fs用于重新设定可ext系统文件系统中的可调整参数。
格式:
tune2fs [OPTIONS] DEVICE
常用选项:
-l: 查看指定文件系统的超级块信息 -L LABEL:设定卷标 -m #: 调整为管理员预留空间的百分比 -j: 用于为ext2文件系统 添加ext3格式的日志,提升ext2为ext3 -O: 文件系统属性的打开或关闭,–O ^has_journal -o: 调整文件系统挂载的默认属性(文件系统挂载属性的开启或关闭),–o ^acl -U UUID:设定指定文件系统的UUID;
实例:
[[email protected] ~]# tune2fs -l /dev/sdb #列出超级块信息,相当于dumpe2fs -h tune2fs 1.42.9 (28-Dec-2013) Filesystem volume name: GEEK Last mounted on: <not available> Filesystem UUID: 2e564b3f-e542-4bef-aa88-d70935c5c5fb Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 102400 ... [[email protected] ~]# tune2fs -L "H" /dev/sdb #设定卷标 tune2fs 1.42.9 (28-Dec-2013) [[email protected] ~]# e2label /dev/sdb H [[email protected] ~]# blkid /dev/sdb /dev/sdb: UUID="6ce61834-a56c-4367-bce3-953d05f5f4bc" TYPE="ext2" [[email protected] ~]# tune2fs -j /dev/sdb #增加日志,提升为ext3 tune2fs 1.42.9 (28-Dec-2013) Creating journal inode: done [[email protected] ~]# blkid /dev/sdb /dev/sdb: UUID="6ce61834-a56c-4367-bce3-953d05f5f4bc" SEC_TYPE="ext2" TYPE="ext3" [[email protected] ~]# tune2fs -o ^acl /dev/sdb [[email protected] ~]# uuidgen 5272519a-039a-4bf0-817a-6014daec5e15 [[email protected] ~]# tune2fs -U 5272519a-039a-4bf0-817a-6014daec5e15 /dev/sdb #修改uuid tune2fs 1.42.9 (28-Dec-2013) [[email protected] ~]# blkid -U 5272519a-039a-4bf0-817a-6014daec5e15 /dev/sdb
8.findfs命令
findfs命令用于根据卷标或者UUID查找设备
格式:
findfs [OPTIONS] UUID=<uuid> findfs [OPTIONS] LABEL=<label>
实例:
[[email protected] ~]# e2label /dev/sdb "YOUNG" [[email protected] ~]# e2label /dev/sdb YOUNG [[email protected] ~]# blkid /dev/sdb /dev/sdb: LABEL="YOUNG" UUID="5272519a-039a-4bf0-817a-6014daec5e15" SEC_TYPE="ext2" TYPE="ext3" [[email protected] ~]# findfs UUID="5272519a-039a-4bf0-817a-6014daec5e15" /dev/sdb [[email protected] ~]# findfs LABEL="YOUNG" /dev/sdb