Linux学习(10)--Ext2文件系统特性

来源:互联网 发布:java final static 编辑:程序博客网 时间:2024/05/21 19:46

dumpe2fs(查看文件系统)

[root@VM_174_157_centos ~]# dumpe2fs [-bg] 设备文件名选项与参数:-b:列出保留为坏道的部分-h:仅列出 superblock 的数据,不会列出其他的区段内容范例1:找出根目录下的磁盘文件名,并查看相关信息[root@VM_174_157_centos ~]# dfFilesystem     1K-blocks    Used Available Use% Mounted on/dev/vda1       20510332 1965288  17496528  11% /               <==就是这个devtmpfs          499348       0    499348   0% /devtmpfs             508452      24    508428   1% /dev/shmtmpfs             508452   12564    495888   3% /runtmpfs             508452       0    508452   0% /sys/fs/cgrouptmpfs             101692       0    101692   0% /run/user/0#这里会显示大量的数据,建议使用管道操作[root@VM_174_157_centos ~]# dumpe2fs /dev/vda1 | lessFilesystem volume name:   <none>           <==这是文件系统的名称Last mounted on:          /Filesystem UUID:          49f819fd-e56d-48a4-86d3-7ebe0a68ec88Filesystem magic number:  0xEF53Filesystem revision #:    1 (dynamic)Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_fileFilesystem flags:         signed_directory_hash Default mount options:    user_xattr aclFilesystem state:         clean          <==这个系统是没问题的Errors behavior:          ContinueFilesystem OS type:       LinuxInode count:              1310720          <==inode总数Block count:              5242624          <==block总数Reserved block count:     262129            Free blocks:              4792058          <==可用block数Free inodes:              1273966          <==可用inode数First block:              0Block size:               4096             <==每个block的大小Fragment size:            4096Reserved GDT blocks:      510Blocks per group:         32768...(中间省略)...Check interval:           0 (<none>)Lifetime writes:          21 GBReserved blocks uid:      0 (user root)Reserved blocks gid:      0 (group root)First inode:              11Inode 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 -litotal 8131079 -rw-------. 1 root root 2523 Apr 21  2016 anaconda-ks.cfg131085 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/bindr-xr-xr-x.  4 root root  4096 Feb 19 10:45 /boot            <==14K blockdrwx------.  2 root root 16384 Apr 21  2016 /lost+found      <==4个4K blockdr-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/           <==54K 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 /etc459281 -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:            8Journal backup:           inode blocksJournal features:         journal_incompat_revokeJournal 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 / home2 drwxr-xr-x 23 root root 4096 Sep 22  12:09 /2 drwxr-xr-x  4 root root 1024 Sep  4 18:06 /boot2 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 /boot278529 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)

0 0
原创粉丝点击