Linux学习(10)--Ext2文件系统特性
2017-03-07 19:34
260 查看
dumpe2fs(查看文件系统)
[root@VM_174_157_centos ~]# dumpe2fs [-bg] 设备文件名 选项与参数: -b:列出保留为坏道的部分 -h:仅列出 superblock 的数据,不会列出其他的区段内容 范例1:找出根目录下的磁盘文件名,并查看相关信息 [root@VM_174_157_centos ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/vda1 20510332 1965288 17496528 11% / <==就是这个 devtmpfs 499348 0 499348 0% /dev tmpfs 508452 24 508428 1% /dev/shm tmpfs 508452 12564 495888 3% /run tmpfs 508452 0 508452 0% /sys/fs/cgroup tmpfs 101692 0 101692 0% /run/user/0 #这里会显示大量的数据,建议使用管道操作 [root@VM_174_157_centos ~]# dumpe2fs /dev/vda1 | less Filesystem volume name: <none> <==这是文件系统的名称 Last mounted on: / Filesystem UUID: 49f819fd-e56d-48a4-86d3-7ebe0a68ec88 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean <==这个系统是没问题的 Errors behavior: Continue Filesystem OS type: Linux Inode count: 1310720 <==inode总数 Block count: 5242624 <==block总数 Reserved block count: 262129 Free blocks: 4792058 <==可用block数 Free inodes: 1273966 <==可用inode数 First block: 0 Block size: 4096 <==每个block的大小 Fragment size: 4096 Reserved GDT blocks: 510 Blocks per group: 32768 ...(中间省略)... Check interval: 0 (<none>) Lifetime writes: 21 GB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256 <==每个inode大小 ...(中间省略)... Group 0: (Blocks 0-32767) Primary superblock at 0, Group descriptors at 1-2 <==超级块在0号block Reserved GDT blocks at 3-512 Block bitmap at 513 (+513), Inode bitmap at 514 (+514) Inode table at 515-1026 (+515) <==inode table所在的block 21082 free blocks, 8176 free inodes, 2 directories Free blocks: 1038, 1051, 1054-1071, 1120-1135, 1152-1231, 1238, 1243, 1248-1263, 1280-1295, 1344-1375, 1440-1503, 1536-1569, 1634-1639, 1648-1663, 1835-1855, 1888-1903, 1920-1935, 1952-2015, 2048-2079, 2144-2175, 2528-2751, 3008-3120, 3185-3215, 3278-3279, 3304-3343, <==空闲未使用的block ...(后面省略)... #前半部分在秀出 superblock 的内容,包括卷标名称(Label)和inode/block的信息 #后面基本上都是每个block group的个别信息了,可以看到各个区段的号码
如上面所示,用dumpe2fs可以看到很多信息,上半部分主要是superblock的内容,下半部分则是每个block group的内容,我们可以看到/dev/vda1规划的 block 为4K,第一个block号码为0等等。
与目录树的关系
从前面我们可以知道,每个文件(无论是一般文件还是目录文件)都会占用一个inode,而由权限的内容我们知道目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。那么目录在Ext2文件系统中怎么记录数据呢?目录
当我们在Linux下新建一个目录时,Ext2会分配一个inode和至少一个block给该目录。其中inode记录该目录相关权限与属性,并可记录分配到的那个block的号码。而block记录该目录下的文件名与该文件名占用的inode号码数据。如果想实际查看root目录内的文件所占用的inode,可以用 -i 这个参数:
[root@VM_174_157_centos ~]# ls -li total 8 131079 -rw-------. 1 root root 2523 Apr 21 2016 anaconda-ks.cfg 131085 drwxr-xr-x 2 root root 4096 Mar 5 16:13 scripts
而当我们使用“ll”的时候,出现的目录几乎都是1024的整数倍,因为每个block都是1K、2K、4K
[root@VM_174_157_centos ~]# ll -d /bin /boot /proc /lost+found /sbin/ lrwxrwxrwx. 1 root root 7 Apr 21 2016 /bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Feb 19 10:45 /boot <==1个4K block drwx------. 2 root root 16384 Apr 21 2016 /lost+found <==4个4K block dr-xr-xr-x 86 root root 0 Feb 19 10:45 /proc dr-xr-xr-x. 2 root root 20480 Mar 2 16:47 /sbin/ <==5个4K block #至于/proc不占硬盘空间,是因为它本身是一个虚拟文件系统,放置的数据都是在内存中 #比如系统内核、进程、外部设备状态等等
文件
当我们在Linux下的Ext2新建一个100KB的文件,假设block为4KB。那么Linux将分配一个inode与25个block来储存,但是由于inode只有12个直接指向,所以还会多分配额外的一个block来作为记录。目录树读取
由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码(通常一个文件系统的最顶层inode号码是从2开始),此时就能够得到根目录的inode内容,并依据该inode读取根目录的block文件名数据,再一层层往下直到正确的文件名。#例如我要读取/etc/passwd这个文件,系统是如何操作的 [root@VM_174_157_centos ~]# ll -di / /etc /etc/passwd 2 dr-xr-xr-x. 19 root root 4096 Mar 5 19:30 / 458753 drwxr-xr-x. 90 root root 4096 Mar 2 16:47 /etc 459281 -rw-r--r-- 1 root root 1324 Feb 25 17:51 /etc/passwd
通过挂载点的信息/dev/vda1的inode号码为2的inode,且有r、x权限让我们可以继续读取block内容
通过上个步骤的block内容,找到/etc目录的inode号码(458753)
这样依次往下,最后将该block的内容一次读取出来
Ext2/Ext3文件的访问与日志文件系统的功能
如果我们是新建一个文件或者目录时,就需要block bitmap和inode bitmap的帮助了。此时系统的行为是:先确定用户对于想添加文件的目录是否具有w、x权限
根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入
根据blokc bitmap找到没有使用的block号码,并将实际数据写入,且更新inode的block指向数据
将刚刚写入的inode与block数据同步更新inode bitmap与block bitmap中,并更新superblock
一般来说,我们将inode table与data block称为数据存放区域,至于其他例如super block、block bitmap与inode bitmap等 区段就被称为 metadata(中间数据),因为这几个区段的数据是经常变动的,每次添加、删除、编辑时都可能会影响到这三个部分的数据,因此才被称为中间数据。
数据的不一致(Inconsistent)状态
在一般情况下,上述的新增操作可以顺利完成。但是如果文件在写入文件系统时候,遇到突发情况(例如断电等)导致系统突然中断,所以写入的数据仅有inode table及data block而已,最后一个同步更新中间数据的步骤并没有做完,此时就会发生meta data与实际数据存放区产生不一致的情况。在早期的Ext2文件系统中,如果发生这个问题,那么系统在重启后,就会通过super block当中记录的vaild bit(是否有挂载)与文件系统的state(clean与否)等状态来判断是否强制进行数据一致性的检查。
不过这个检查非常费时,因为要针对meta data区域与实际数据存放区来进行比对,得要搜寻整个文件系统,如果你的文件系统有100GB以上,文件数量又多,还在对Internet提供服务的服务器主机上,那这样的检查真的会造成主机修复时间的拉长,这就是为什么会有日志文件系统的兴起。
日志文件系统(Journaling file system)
为了避免上述情况,前辈们想了一个办法,在我们的文件系统当中划出一个快,该块专门记录写入或修订文件时的步骤,那不就可以简化一致性检查的步骤了?也就是说:预备:当系统要写入一个文件时,会现在日志记录块中记录某个文件准备要写入的信息
实际写入:开始写入文件的权限与数据;开始更新meta data中的数据
结束:完成数据与meta data的更新后,在日志记录块中完成该文件的记录
这样当我们在数据的记录过程中出了问题,我们的系统就只要去检查日志就知道哪里出了问题,针对该问题进行快速修复。那么Ext2可以做到吗?当然可以,通过Ext3即可,Ext3是Ext2的升级版,当然会向下兼容。如果我们还记得dumpe2fs里面的内容,我们就可以发现在superblock里面有这样的信息:
Journal inode: 8 Journal backup: inode blocks Journal features: journal_incompat_revoke Journal size: 128M #通过inode 8号记录jou'rnal区块的block指向,而且具有128MB的容量在处理日志
Linux文件系统的操作
我们知道所有的数据都得要加载到内存后CPU才能对该数据进行处理。想一想,如果你常常编辑一个好大的文件,在编辑的过程中又频繁的要系统来写入到磁盘中,由于磁盘写入的速度要比内存慢很多,因此你会常常耗在等待硬盘的I/O上。为了解决这个问题,Linux采用的是异步处理(asynchronously)的方式,所谓的异步处理是这样的:当系统加载一个文件到内存后,如果没有被改动过,则在内存区段的文档数据会被设定为干净(clean)。但是如果被改动过了,此时会被设定为脏的(Dirty)。此时所有的数据都还在内存中执行,没有写入到磁盘中!但是系统会不定时的将内存中设定为Dirty的数据写回到磁盘,以保持数据的一致性。当然也可以用sync命令手动强行写入到磁盘。
我们知道内存的读取速度是很快的,那把常用的文件放置到内存中,这不就会增加系统的性能了吗?没错,所以Linux文件系统上面与内存有很大的关系:
系统会将常用的文件数据放置到主内存的缓冲区,以加速我呢见的读/写
承上,因此Linux的物理内存最后都会被用光,这是正常的,可以加速系统性能
你可以手动执行sync命令,强行写入Dirty文件到磁盘
若正常关机,关机指令会主动呼叫sync来讲内存的数据回写入到磁盘内
但若不是正常关机,重启后会花很多时间在磁盘检查上,甚至导致文件系统的损毁(非磁盘)
挂载点(mount point)的意义
每个文件系统都有独立的 inode/block/superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。将文件系统与目录树结合的动作我们称为挂载。挂载点一定目录,该目录为进入该文件系统提供入口。因此并不是你有任何文件系统都能使用,必须要挂载到目录树的某个目录后,才能够使用该文件系统的。有的时候我们会发现有下面这种情况出现:
[root@www ~]# ls -lid / /boot / home 2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 / 2 drwxr-xr-x 4 root root 1024 Sep 4 18:06 /boot 2 drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home
由于一个文件系统最顶层的inode一般是2,而且除开硬链接以为,是不会出现inode相同的情况。所以可以发现/,/boot,/home是不一样的三个文件系统。其余大多数情况下我们看到的都是这样的:
[root@VM_174_157_centos ~]# ls -lid / /boot /home 2 dr-xr-xr-x. 19 root root 4096 Mar 7 14:02 / 122881 dr-xr-xr-x. 4 root root 4096 Feb 19 10:45 /boot 278529 drwxr-xr-x. 3 root root 4096 Feb 25 17:51 /home
如果从文件系统的观点来看,同一个文件系统的某个 inode 只会对应到一个文件内容而已(因为一个文件占用一个 inode 的原因),因此我们可以通过判断inode号码来判断不同文件名是否为相同的文件:
[root@VM_174_157_centos ~]# ls -lid / /. /.. 2 dr-xr-xr-x. 19 root root 4096 Mar 7 14:11 / 2 dr-xr-xr-x. 19 root root 4096 Mar 7 14:11 /. 2 dr-xr-xr-x. 19 root root 4096 Mar 7 14:11 /..
上面的信息由于挂载点均为 / ,因此三个文件(/ /. /..)其实都在一个文件系统内,inode都为2,说明都指向同一个文件,也就是说根目录的上层目录(/..)就是它自己。
其他Linux支持的文件系统与VFS
虽然Linux的标准文件系统是Ext2,还有增加了日志功能的Ext3。但是实际上,Linux还有支持很多文件系统格式的,常见的支持文件系统有:传统文件系统:Ext2/minix/MS-DOS/FAT(用vfat模块)/iso9660(光盘)等
日志文件系统:Ext3/ReiserFS/Windows’NTFS/IBM’sJFS /SGI’sXFS
网络文件系统:NFS/SMBFS
想知道你的Linux支持的文件系统有哪些,可以查看下面这个目录:
[root@VM_174_157_centos ~]# ls -l /lib/modules/$(uname -r)/kernel/fs
系统目前已加载到内存中支持的文件系统则有:
[root@VM_174_157_centos ~]# cat /proc/filesystems
Linux VFS
了解了我们使用的文件系统之后,那么Linux内核又是如何管理这些认识的文件系统呢?其实整个Linux系统都是通过一个名为Virtual Filesystem Switch(虚拟文件系统,VFS)的内核功能去读取文件系统的。我们不需要知道分区上使用的都是什么文件系统,VFS会帮我们做好这些事情。假设你的根目录(/)使用的是 /dev/hda1,用 Ext3,而 /home 使用 /dev/hda2,用 reiserts,但是我们去取用/home/dmtsai/.bashrc 时,却不需要指定使用哪个特定的文件系统,这就是VFS的功能。使用 VFS 来管理所有的文件系统,可以省去我们自行设置读取文件系统的定义。整个 VFS 可以用下图来说明:
![Linux VFS](./md_pic/Linux VFS.jpg)
相关文章推荐
- 鸟哥的Linux私房菜 基础学习篇读书笔记(10):Linux磁盘与文件系统管理(3)
- 文件系统的特性,linux的EXT2文件系统
- 鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)
- 文件系统的特性,linux的EXT2文件系统【转】
- linux ext2 文件系统学习
- linux 基础学习之二:ext2文件系统研究
- linux学习ext2文件扩展系统
- ndk学习10: linux文件系统
- Linux学习笔记10-文件系统
- 查看linux的文件系统是什么格式的(如ext2,ext3,xfs等)?
- 一天一点学习Linux之认识文件系统
- 一天一点学习Linux之认识文件系统
- Linux学习笔记3_文件系统常用命令
- linux系统管理学习笔记之六---linux文件系统
- Linux学习笔记[3] - Linux系统结构(磁盘分区、文件系统、文件类型)
- linux文件系统1:Ext2
- linux文件系统----ext2
- linux系统管理学习笔记之八---linux文件与目录的管理及权限
- Linux上三个主要文件系统(EXT2、EXT3和ReiserFS)介绍
- (cc)2.6版本Linux上替换系统调用函数实现隐藏文件学习