Linux文件系统介绍
知识点概况
物理磁盘介绍
我们知道文件最终是保存在硬盘上的。硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些参数可以得到硬盘的容量,基计算公式为:
存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
要点:
(1)硬盘有数个盘片,每盘片两个面,每个面一个磁头
(2)盘片被划分为多个扇形区域即扇区
(3)同一盘片不同半径的同心圆为磁道
(4)不同盘片相同半径构成的圆柱面即柱面
(5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
(6)信息记录可表示为:xx磁道(柱面),xx磁头,xx扇区
linux文件系统介绍
“什么是文件系统”。文件系统是对一个存储设备上的数据和元数据进行组织的机制。而这个过程就是格式化,格式化就是将分区划分成一格一格的block及多少个Inode可以使用,而每个block就是文件系统存取资料的最小单位,所以才可以将资料存放在这些block中,而且每多个 block 会组成一个 group。如下图所示:除了boot sector (引导扇区)之外,第一个block 称为 super block 用来记录这个分区共有多少个block和inode 已经使用、多少block和inode等信息;如果super block 损坏,这个分区将无法访问,所以每隔一段block 就会备份一次这个super block
[root@nfs data]# mkfs -t ext4 /dev/sdb1
......
81 block groups #表示这个分区被划分出了81个block group;
32768 blocks per group, 32768 fragments per group #表示每个group中有32768个block;
8096 inodes per group #表示每个group中有8096个inodes
Superblock backups stored on blocks: #下面的数值就是备份super block 所在的block的位置。
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
......
超级块,文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。包括整个文件系统的inode和block的总的数量,己经使用的数量,剩余数量等。
I-节点表。超级块的下一个部分就是i-节点表。每个i-节点就是一个对应一个文件/目录的结构,这个结构它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号
数据区。文件系统的第3个部分是数据区。文件的内容保存在这个区域。磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独产的磁盘块中
软连接与硬链接
硬链接
当系统要读取某个文件时,它会先读inode table,然后根据inode的信息到数据区域将数据取出备用。硬链接就是再建立一个inode链接到文件放置的Block块。也就是说,进行硬链接时,实际上您的文件内容不会改变,只是原来的inode与后来添加的inode均可指定到该文件存放的地点,因此,读取两个inode的结果都是读取同一个文件的内容。不过,这样一来就有个问题,因为inode会链接到Block块,而"目录"本身仅消耗inode,这样,硬链接就不能链接目录。
软链接(符号链接)
相对于硬链接,符号链接比较好理解,基本上,它是再建立一个独立文件,而这个文件会让数据读取操作指向它链接的那个文件。由于只是利用文件作为指向的动作,所以,当源文件被删除,符号链接的文件就打不开了,屏幕会显式"无法开启某文件"
软链接和硬链接的区别
在linux系统中,链接分两种:一种被称为硬链接(Hardlink),另一种被称为符号链接或软链接(Symbolic Link)。
默认不带参数情况下,ln命令创建的是硬链接,带-s参数创建的是软链接。
硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。
不能对目录创建硬链接,但可以创建软链接。
删除软链接文件,对源文件及硬链接文件无任何影响。
删除文件的硬链接文件,对源文件及软链接文件无任何影响
删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效
同时删除源文件及其硬链接文件,整个文件才会被真正的删除。
很多硬件设备中的快照功能,使用的就类似硬链接的原理。
软链接可以跨文件系统,硬链接不可以跨文件系统
block与inode知识小结
inode就是用来存储目录或文件属性信息的(也就是ls -l的结果),inode包含的属性信息包括文件大小、属主、属组、读写权限、文件类型.修改时间,还包含指向文件实体的指针的功能(inode节点--block的对应关系)等,但是,inode唯独不包含文件名。文件名存放在上一级目录的block中。inode越大存储的文件属性越多。Block 是用来存储实际数据的。文件系统的每个inode和block都有数字编号
1)磁盘分区格式化为ext4文件系统后会生成一定数量的inode和block
2)block的大小一般有1k、2k、4k几种。其中引导分区等为1K,其他普通分区为4k(C6)
3)inode是一块磁盘存储空间,C6非启动分区inode默认大小256字节,C5是128字节。
4)inode是一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的。
5)inode相同的文件,互为硬链接文件。
6)一个文件被创建后至少要占用一个inode和一个block
7)如果一个文件很大,可能占多个block,如果文件很小,至少占一个,并且剩余空间浪费了。
8)inode与block大小查看
[root@nfs data]# dumpe2fs /dev/sdb1|egrep -i "block size|inode size"
dumpe2fs 1.41.12 (17-May-2010)
Block size: 4096
Inode size: 256
9)格式化时指定inode及block大小
mkfs.ext3 -b 4096 -i 1024 /dev/sdb1 #经过测试有矛盾
10)磁盘读取数据是以block为单位读取的
11)一个文件可能占用多个block,每读取一个block就会消耗一次磁盘IO。
12)如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多。
13)一个block只能存放一个文件的内容,无论内容有多小。如果block 4K,那存放1K的文件,剩余3K就浪费了。
14)Block并非越大越好。Block太大对于小文件存放就会浪费磁盘空间,例如:1000K的文件,BLOCK为4K,占用250个BLOCK,BLOCK为1K,占1000个BLOCK。访问效率谁更高?消耗10分别为250次和1000次。
15)文件较大时,block设置大一些会提升磁盘访问效率,设置较小会消耗磁盘IO;小文件(小于IK)一般设置block小一点会节省磁盘空间;设置太大会浪费磁盘空间。
16)ext3/ext4文件一般设置为4K。
Linux目录结构介绍
Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的。各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差不多。
1. / 文件系统的入口,最高一级目录;
2. /bin 基础系统所需要的命令位于此目录,是最小系统所需要的命令,如:ls, cp,等。
这个目录中的文件都是可执行的,一般的用户都可以使用。
3. /boot 包含Linux内核及系统引导程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;
4. /dev 设备文件存储目录,比如声卡、磁盘...... 这是一个非常有趣的目录,是Linux文件系统的一个闪亮的特性 - 所有对象都是文件或目录。仔细观察这个目录你会发现hda1, hda2等, 它们代表系统主硬盘的不同分区。
/dev/cdrom和/dev/fd0代表你的CDROM驱动器和floppy驱动器。看上去可能有些奇怪,但比较文件和硬件的特性这却是十分合理的。它们都可以读出和写入。例如/dev/dsp,这个文件代表你的扬声器。那么写入这个文件的数据都回传送到喇叭。试一试 'cat /etc/lilo.conf > /dev/dsp' 你会听到一些声音。这是你的 lilo.conf 文件的声音!同样,向 /dev/ttyS0 (COM 1)读出或写入数据你可以和接到上面的设备进行通讯。
5. /etc 存放系统程序或者一般工具的配置文件。
如安装了apache2之后,配置文件在/etc/apache2/目录下。
/etc/init.d 这个目录是用来存放系统或服务器以System V模式启动的脚本,这在以System V模式启动或初始化的系统中常见。
如apache2的/etc/init.d apache2 start|stop|restart MySQL为/etc/init.d mysql start|stop|restart 6. /home 普通用户默认存放目录 Linux 是多用户环境,所以每一个用户都有一个只有自己可以访问的目录(当然管理员也可以访问)。它们以 /home/username 的方式存在。这个目录也保存一些应用对于这个用户的配置,比如 IRC, X 等。
7. /lib 库文件存放目录这里包含了系统程序所需要的所有共享库文件,类似于 Windows 的共享库 DLL 文件。
8. /lost+found 在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。
Linux 应该正确的关机。但有时你的系统也可能崩溃掉或突然断电使系统意外关机。那么启动的时候 fsck 将会进行长时间的文件系统检查。Fsck 会检测并试图恢复所发现的不正确的文件。被恢复的文件会放置在这个目录中。所恢复的文件也许并不完整或并不合理,但毕竟提供了一些恢复数据的机会。
9. /media 即插即用型存储设备的挂载点自动在这个目录下创建,比如USB盘系统自动挂载后,会在这个目录下产生一个目录 ;CDROM/DVD自动挂载后,也会在这个目录中创建一个目录,类似cdrom 的目录。这个只有在最新的发行套件上才有. 10. /mnt /mnt 这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。有时我们可以把让系统开机自动挂载文件系统,把挂载点放在这里也是可以的。比如光驱可以挂载到/mnt/cdrom 。
这是一个普通的加载目录,在这里你可以加载你的文件系统或设备。
加载是使一个文件系统对于系统可用的过程。
在加载后你的文件可以在加载目录下访问。
这个目录通常包含加载目录或用于加载软驱和光驱的子目录。
如果需要,你也可以在这里建立其它的加载目录。
对于加载目录的位置并没有强制性的要求,你可以在系统的任意位置建立加载目录。
建立 /mnt 只是为了使系统更工整的惯例。
11. /opt 表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包,比如在Fedora Core 5.0中,OpenOffice就是安装在这里。有些我们自己编译的软件包,就可以安装在这个目录中;通过源码包安装的软件,可以通过 ./configure --prefix=/opt/,将软件安装到opt目录。
这个目录包含所有默认系统安装之外的软件和添加的包。
12. /proc 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录是伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。
这是系统中极为特殊的一个目录,实际上任何分区上都不存在这个目录。它实际是个实时的、驻留在内存中的文件系统。
13. /root Linux超级权限用户root的家目录;
14. /sbin 大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令;
这个目录和
/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin 目录是相似的; 我们记住就行了,凡是目录sbin中包含的都是root权限才能执行的。
15. /tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。 /tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。
许多程序在这里建立lock文件和存储临时数据。有些系统会在启动或关机时清空此目录。
16. /usr 这个是系统存放程序的目录,比如命令、帮助文件等。
这个目录下有很多的文件和目录。
当我们安装一个Linux发行版官方提供的软件包时,大多安装在这里。
如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。
/usr目录下包括:
涉及字体目录/usr/share/fonts ,
帮助目录 /usr/share/man或/usr/share/doc,
普通用户可执行文件目录/usr/bin 或/usr/local/bin 或/usr/X11R6/bin ,
超级权限用户root的可执行命令存放目录,比如 /usr/sbin 或/usr/X11R6/sbin 或/usr/local/sbin 等;
还有程序的头文件存放目录/usr/include。
/usr/bin 这个目录是可执行程序的目录,普通用户就有权限执行; 当我们从系统自带的软件包安装一个程序时,他的可执行文件大多会放在这个目录。
/usr/sbin 这个目录也是可执行程序的目录,但大多存放涉及系统管理的命令。只有root权限才能执行;相似目录是/sbin 或/usr/local/sbin或/usr/X11R6/sbin等;
/usr/local 这个目录一般是用来存放用户自编译安装软件的存放目录;一般是通过源码包安装的软件,如果没有特别指定安装目录的话,一般是安装在这个目录中。这个目录下面有子目录。
/usr/lib 和/lib 目录相似,是库文件的存储目录;
/usr/share 系统共用的东西存放地,比如 /usr/share/fonts 是字体目录,是用户都共用的吧。
/usr/share/doc和/usr/share/man帮助文件,也是共用的吧;
/usr/src 是内核源码存放的目录,比如下面有内核源码目录,比如 linux 、linux-2.xxx.xx 目录等。有的系统也会把源码软件包安装在这里。比如Fedora/Redhat,当我们安装file.src.rpm的时候,这些软件包会安装在 /usr/src/redhat相应的目录中。请参考: 《file.src.rpm 使用方法的简单介绍》 。另外Fedhat 4.0 5.0,他的内核源码包的目录位于/usr/src/kernels目录下的某个目录中(只有安装后才会生成相应目录);
17. /var 这个目录的内容是经常变动的,看名字就知道,我们可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。
/var/www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地;
/var/log 系统日志存放,分析日志要看这个目录的东西;
/var/spool 打印机、邮件、代理服务器等假脱机目录;
linux文件权限管理
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。
r:文件:读取文件内容;目录:浏览目录
w:文件:修改文件内容;目录:删除、移动目录内文件,但必须同时又x权限
x:文件:执行文件;目录:进入目录
用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。
语法:chmod [ugoa...][[+-=][perms...]...] file
特殊权限对应的数字
suid 4000权限字符s(S),属主位上的x位上设置。
sgid 2000权限字符s(S),属组位上的x位上设置。
粘滞位1000权限字符t(T),其他用户位的x位上设置。如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。
如果对应位有x则,字符权限表现为小写,否则表现为大写
文件系统的高层体系结构
尽管大多数文件系统代码在内核中(后面讨论的用户空间文件系统除外),但是图1所示的体系结构显示了用户空间和内核中与文件系统相关的主要组件之间的关系。
用户空间包含一些应用程序(例如,文件系统的使用者)和GNU C库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。
VFS是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode和den仰)。它们缓存最近使用过的文裤系统对象。
每个文件系统实现(比如extZ、开S等等)导出一组通用接口,供VFS使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用sync命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。
在Linux支持的文件系统类型户,其中ext、ext2、ext3、ext4是Redhat和Centos采用的默认文件系统类型,其中ext2、ext3、ext4是依次升级的ext文件系统版本。ext3是Centoss.x默认使用的文件系统,ext4是centos6,x默认的文件系统,这些不同的文件系统的高版本是向下兼容的,因此,我们就从ext2文件系统开始给大家文件系统的相关知识体系。
相关操作系统使用的文件系统
SUSE linux的默认文件系统ReiserFS文件系统
IBM的AIX使用的jfs日志文件系统
Sun OS所用的文件系统Ufs
ext2文件系统介绍
ext2文件系统也称为第二扩展文件系统(英语:second extended file system,缩写为ext2),目的是克服早期Linux版本中使用的Minix文件系统的缺点。多年来,该文件系统一直广泛应用于Linux。但ext2中没有日志,现在基本上己被ext3(Centoss.x默认的文件系统)取代,ext3文件系统也正逐渐被ext4取代(Centos6.x默认的文件系统)。
什么是块设备?
块设备就是以块(比如磁盘扇区)为单位收发数据的设备,它们支持缓冲和随机访问(不必顺序读取块,而是可以在任何时候访问任何块)等特性。块设备包括硬盘、CD-ROM和RAM盘等。与块设备相对的是字符设备,字符设备没有可以进行物理寻址的媒体。字符设备包括串行端口和磁带设备,只能逐字符地读取这些设备中的数据。
什么是逻辑快
逻辑块就是我们前面提到的block的概念。
硬盘的最小存储单位是扇区,而数据存储的最小单位则不是扇区,因为用扇区来存储效率非常低。根据前面的知识,一个扇区的大小为512字节,读数据时,磁头是一个扇区一个扇区地读取,也就是说,如果文件是10MB,那么为了读这个文件,磁头必须要进行读取(10M=1024*1024*10)字节/512字节=20480次I/0。这样效率是极其低下的。
为了提高硬盘读取数据效率,就有了逻辑块(Block)的概念,也叫做数据块。逻辑块是在每个分区进行格式化创建文件系统时所指定的“最小存储单位”,这个最小存储单位是以扇区为基础的,所以逻辑块的大小一般为扇区的2的n次方倍数。
那么如果磁盘按照数据块读取数据,磁头可以一次读取一个数据块,这样效率就高了很多。按一个逻辑块设定为4K大小计算,10M=10240K=10240*1024bytes/(1024*4bytes)=2560次IO。10M=10240K/4K=2560次IO。
逻辑块的规划是需要思考的,并不是越大越好,因为一个逻辑块最多只能容纳一个文件(在Linux的ext2中),所以如果逻辑块的大小被规划的太大,那么,可能会浪费磁盘空间。
举个例子,如果文件系统的一个逻辑块为4KB,而有一个文件只有0.1KB大小,而这个小文件仍然要占用一个逻辑块,因此就会浪费3.9KB的空间。
所以,在规划磁盘时,需要考虑到主机的用途。比如BBS,BLOG服务器,由于程序文件,图片附件等资源大小,不会太大,那么逻辑块分配为和多个单个文件最小大小相当最好,如BBS的程序文件多障都是20K的文件,那么对于ext2、ext3、ext4文件系统,给逻辑块分配为4K就是不错的选择。
如果业务主要用在存储大容量的文件(如视频,流媒体文件),那么考虑到数据读取效率,逻辑块大一点好,如:16-32K,当然了不是所有文件系统都支持大逻辑块大小的,例如:ext2、ext3、ext4文件系统支持的逻辑块大小为1k,2k,4k!
面试考试题:往1OM的一块硬盘里写0.1K和10K的文件,分别能写多少个?
解答:不用给结果,分析技术点
ext2,ext3文件系统中,一个文件至少要占用一个inode和一个block,因此文件的多少和1node和block的数量有关,当然也决定于inode和block的大小,inode和bIock的大小在格式化的时候指定的
文件系统的磁盘布局
我们可以把一个磁盘分成一个或多个分区。然后在每个分区上创建一个文件系统(LVM,RAID等的情况除外),存放数据。
下面是一个分层细化的过程:
1、磁盘是由一个个分区组成的集合,即磁盘=分区+分区+分区...
2、每个分区内都有一个文件系统,且一个常规分区内有且仅有一个文件系统
3、每个分区文件系统内都次包含这些内容:自举块(也叫引导块),超级块,块组O,块组l,…块组n。即分区=引导块+超级块+若干块组。
4、每个块组又包括了这些内容:超级块副本,配置信.息,i节点位图(记录哪些i节
点可用),块位图(记录哪些块是否可用),i节点(许多),数据块(也叫逻辑块)。,
ext2文件系统总体存储布局
我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,这个分区格式化的过程会在磁盘上写一些文件系统管理存储布局的信息。下图是一个磁盘分区格式化成ext2文件系统后的存储布局。
GDT
超级块
超级块(superblock)是记录整个文件系统相关信息的地方,它的作用是存储文件系统的块和inode大小、空的和填满的块与inode数量,以及它们各自的总数和其他诸如此类的信息。要访问一个分区内的数据,那么第一个要访问的就是超级块。所以,如果超级块坏了,那磁盘也就基本没救了。换句话,没有超级块就没有这个文件系统。
超级块内部记录的信息主要有:
1、数据块block与inode的总的数量。
2、未使用和己经使用的inode和block的数量。
3、上次mount的时间,最近写入数据的时间及磁盘检查(fsck)的时间。
4、inode的大小(Centoss.x128bytes,Centos6.4 256bytes)
5、Block的大小(1k,2k,4k。其中默认/boot为1k,其他分区为4k),
6、有效位,O为载入,l为未载入。
既然超级块包含这么多文件系统的重要信息,因此,超级块是相当重要的,超级块的大小为1K,我们可以通过dumpe2fs命令查看磁盘分区的超级块信息。
另外,超级块位于每个块组的最前面,每个块组包含超级块的内容是相同的(超级块在某些块组的开头都有一份拷贝);系统运行期间,把超级块复制到系统缓冲区内,只需把块组0的超级块读入内存,其它块组的超级块做为备份。只有块组0的超级快会被加载到缓冲区使用。
超级块的起始位置为其所在分区的前1024个字节,占用1k的空间
dumpe2fs /dev/sda1 #查看块组中的信息
块组描述符表(GDT,Group Descriptor Table)
块组描述符表由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(GroupDescriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的Inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第O个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第O个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。
存放于超级块所在块的下一个块中。
块位图(Block Bitmap)
块位图就是用来描述整个块组中哪些块己用哪些块空闲的,一个块组中的块是这样利用的:数据块存储所有文件的数据,比如某个分区的块大小是4K,谋个文件是13K,那么就需要4个数据块来存,即使第三个块只存了一个字节也需要占用一个整块;超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描述信息。那么如何知道哪些块己经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为l表示该块已用,这个bit为O表示该块空闲可用。
为什么用df命令统计整个磁盘知己用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的己用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。
与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块。用mke2fs格式化时默认块大小是1024字节,可以用-b参数指定块大小,现在设块大小指定为b字节,那么一个块可以有8b个bit,这样大小的一个块位图就可以表示8b个块的占用情况,因此一个块组最多可以有8b个块,如果整个分区有s个块,那么就可以有s/(8b)个块组。格式化时可以用-g参数指定一个块组有多少个块,但是通常不需要手动指定,mke2fs工具会计算出最优的数值。
inode位图(inode Bitmap)
和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。
inode表(inode Table)
我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls –l命令看到的那些信息,这些信息(文件名除外)存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。
inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode。由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候Inode表会得到比较充分的利用,数据块也不浪费。如果这个分区存的都是很大的文件(比如电影),则数据块用完的时候inode会有一些浪费,如果这个分区存的都是很小的文件(比如源代码),则有可能数据块还没用完inode就己经用完了,数据块可能有很大的浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs的-i参数手动指定每多少个字节分配一个inode。
inode表用于跟踪定位每个文件,包括位置、大小等(但不包括文件名,文件名包含于dentry结构中),一个块组只有一个inode表。
inode是EXT2基本构件,表示文件系统树型结构的节点。
EXT2文件系统中的每个文件由一个Inode描述,且只能由一个inode描述。
inode与文件一起存放在外存,系统运行时,把inode写入内存建立映像,加快文件系统速度。
数据块(Data Block)
根据不同的文件类型有以下几种情况:
对于常规文件,文件的数据存储在数据块中。
对于目录,该目录下的所有文件名和目录名存储在数据块中,特别注意:文件名保存在它所在目录的数据块中,而不是在文件的inode中,除文件名之外,1s -1命令看到的其它信息都保存在该文件的inode中。注意一个概念:目录也是一种文件,是一种特殊类型的文件。
创建目录细节
先来看看有关目录操作的细节:,
如果我们建立了一个目录,那么系统会分配给该目录一个inode和至少一个块。这个inode就记录该目录的相关属性,并将其中的指针指向分配的那个数据块。而所分配的块内则记录了这个目录下的相关文件(和子目录)的关联性,目录块中存储了一个包括三列的表:三列分别为:inode,文件名或目录名,指向数据块的指针。
一个目录其实也是一个文件,只不过它其中不存储用户数据,而是存储目录下的文件和子目录列表。
创建文件细节
如果在Linux中新建一个普通文件,则系统会为该文件分配至少一个inode与相对于该文件大小的块数量。例如,假设一个块为4KB,要建一个1OOKB的文件,则Linux将分配一个inode与25个块来存储该文件。
有一点要特别提醒的是:inode本身并不记录文件名,而是记录文件的相关的属性(在上文提到过的那些属性),文件名则记录在目录所属的块区域。正因为这个原因,使得如果Linux读取一个文件的内容,就要先由根目录/获取该文件的上层目录所在的inode,再由该目录所记录的的文件关联性获取该文件的inode,最后通过inode内提供的块指针来获取最终的文件内容。
有关文件删除的说明
linux中的文件名是存在于父目录的bolck里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的bolck的数据块。我们删除一个文件,实际上并不清除inode节点和block的数据。只是在这个文件的父目录里面的bolck中,删除这个文件的名字和这个文件inode的对应关系,使这个文件名消失,并且无法指向这个文件的inode节点,当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inodeMAP和blockMAP,让这些位置可以用于放置其他新的文件数据。
数据的读取过程
读取/tmp/file文件过程
因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据,因此,和上级目录权限关联。更多的原理。·知识见文件删除原理
文件系统新增文件操作流程
1.先确定用户对于欲增文件的目录是否具有w与x的权限,若有的话才能新增;
2.根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入;
3.根据block bitmap找到没有使用中的block号码,并将实际的数据写入block中,并更新inode的block指向数据;
4.将刚刚写入的inode与block数据同步更新到inode bitmap与block bitmap中,并更新superblock的内容。
在一般正常的情况下,上述的新增操作当然可以顺利完成,但是如果遇到意外情况,就会产生superblock、inodebitmap、block bitmap这些中间数据与实际数据存放区产生不一致的情况。
在早期的ext2系统中,如果发生不一致,那么系统再重新启动时,就会通过Superblock当中记录的valid bit(是否有挂载)不file system state(clean与否)等状态来判断是否强制进行数据一致性的检查!若有需要检查时则以eZfsck这个程序来进行的。
不过这样的检查需要耗费很多时间,因为要针对整个文件系统来进行搜索和对比。因此就产生了Ext3日志文件系统。
Linux文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了,那时就是神仙也没有办法了。
文件系统类型
在Linux中,我们经常接触的文件系统有ext3、ext2、reiserfs、fat32、msdos(fat16)以及NTFS。fat32、msdos(fat16)以及NTFS是Windows或DOS操作系统常用文件系统。Linux操作系统常用的文件系统是ext2、ext3、ext4、reiserfs,目前大家都用ext3,ext4或reiserfs,ext2已经被ext3所取代,ext4也有取代ext3的趋势;CDROM用的是ISO9660文件系统;现在大多数移动存储都用fat32或fat16文件系统。Linux支持的每个文件系统都有自己的优缺点和性能特征。文件系统的一个重要属性是日志功能,它允许系统在崩溃后更快地恢复。通常,日志文件系统比非日志文件系统在数据保护方面会更好一些。
ext3文件系统
为了避免上述提到的ext2文件系统不一致的情况发生,人们想到了一个方式,在file system当中规划出一个区块,该区块专门记录写入或修订文件时的步骤,就可以简化一致性检查的步骤了。也就是说:
1.预备:当系统要写入一个文件时正会先在日志记录区块中记录某个文件准备要写入的信息;
2.实际写入:开始写入档案的权限与数据;开始更新metadata的数据;
3.结束:完成数据与matadata的更新后,在日志记录区块当中完成该档案的记录。
在这样的程序当中,万一数据的记录过程当中收发生了问题,那么我们的系统只要去检查日志记录区块,就可以知道那个文件发生了问题,针对该问题来做一致性的检查即可,而不必针对整块file system去检查,这样就可以达到快速修复filesystem的能力了!这就是日志式文件系统最基础的功能。,
Ext3就是日志文件系统,Ext3是Ext2的升级版本,并且可以向下兼容Ext2。目前建议大家直接使用Ext3这个文件系统。
ext3文件系统向标准ext2文件系统添加了日志功能,因此是一个非常稳定的文件系统的一个演化发展.它在大多数情况下提供合理的性能并且仍旧在改进。由于它在可靠的ext2文件系统之上添加了日志功能,因此可以将现有ext2文件系统转换为ext3文件系统,并且在必要时还可以转换回来。ext3文件系统是一个成熟的文件系统,用作Redhat/Centos发行版上的默认文件系统。
ext4文件系统
Linux kernel自2.6.28开始正式支持新的文件系统Ext4。Ext4是Ext3的改进版,修改了Ext3中部分重要的数据结构,而不仅仅像Ext3对Ext2那样,只是增加了一个日志功能而已。Ext4可以提供更佳的性能和可靠性,还有更为丰富的功能:
1、与Ext3兼容。执行若干条命令,就能从Ext3在线迁移到Ext4,而无须重新格式化磁盘或重新安装系统.原有Ext3数据结构照样保留,Ext4作用于新数据,当然,整个文件系统因此也就获得了Ext4所支持的更大容量。
2.更大的文件系统和更大的文件。较之Ext3目前所支持的最大16TB文件系统和最大2TB文件,Ext4分别支持IEB(l,048,576TB,IEB=1024PB,1PB=1024TB)的文件系统,以及16TB的文件。
3.无限数量的子目录.Ext3目前只支持32,000个子目录,而Ext4支持无限数量的子目录。
4.Extents。Ext3采用间接块映射,当操作大文件时,效率低下.比如一个IOOMB大小的文件,在Ext3中要建立25,600个数据块(每个数据块大小为4KB)的映射表。而Ext4引入了现代文件系统中流行的extents概念,每个extent为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的25,600个数据块中”,提高了不少效率。
5.多块分配:当写入数据到Ext3文件系统中时,Ext3的数据块分配器每次只能分配一个4KB的块,写一个100MB文件就要调用25,600次数据块分配器,而Ext4的多块分配器"multiblockallocator”(mballoc)支持一次调用分配多个数据块。
6.延迟分配。Ext3的数据块分配策略是尽快分配,而Ext4和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在cache中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。
7.快速fsck。以前执行fsck第一步就会很慢,因为它要检查所有的inode,现在Ext4给每个组的inode表中都添加了一份未使用inode的列表,今后fsck Ext4文件系统就可以跳过它们而只去检查那些在用的inode了。
8.日志校验。日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏:Ext4的日志校验功能可以很方便地判断日志数据是否损坏,而且它将Ext3的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能.
9.“无日志”(No Journaling)模式。日志总归有一些开销,Ext4允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
10.在线碎片整理:尽管延迟分配、多块分配和extents能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4支持在线碎片整理,并将提供e4defrag工具进行个别文件或整个文件系统的碎片整理。
1l.inode相关特性。Ext4支持更大的inode,较之Ext3默认的inode大小128字节,Ext4为了在inode中容纳更多的扩展属性(如纳秒时间教或inode版本),默认inode大小为256字节。Ext4还支持快速扩展属性(fast extended attributes)和inode保留(inodes reservation)。
12.持久预分配(Persistent preallocation)。P2P软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时成数天之内磁盘空间不足导致下载失败。Ext4在文件系统层面实现了持久预分配并提供相应的API(libc中的posix_fallocate()),比应用软件自己实现更有效率。
13.默认启用barrier。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写commit记录,若commit记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4默认启用barrier,只有当barrier之前的数据全部写入磁盘,才能写barrier之后的数据。(可通过”mount –o barrier=0"命令禁用该特性。)
ReiserFS文件系统
ReiserFS是一个基于B状树的文件系统,拥有非常好的总体性能,特别是对于大量小文件。ReiserFS拥有良好的伸缩性并具有日志功能。但该文件系统不再受到积极开发,不支持SELinux,基本上己被Reiser4取代。ReiserFS文件系统多年来一直用作一些发行版(包括SUSE)的默认文件系统,但现在用得少了。
XFS文件系统
XFS文件系统拥有日志功能,包含一些健壮的特性,并针对可伸缩性进行了优化。XFS在以M中强制缓存中转数据,因此如果使用XFS,建议采用不间断电源供应。淘宝的数据库在使用此文件系统。
XFS最初是由Silicon Graphics,InC.于90年代初开发的。那时,SGI发现他们的现有文件系统(existing filesystem,EFS)正在迅速变得不适应当时激烈的计算竞争。为解决这个问题,SGI决定设计一种全新的高性能64位文件系统,而不是试图调整EFS在先天设计上的某些缺陷。因此,XFS诞生了,并于1994年随IRIX5.3的发布而应用于计算。它至今仍作为SGI基于IRIX的产品(从工作站到超级计算机)的底层文件系统来使用.现在,XFS也可以用于L1nux。XFS的L1nux版的到来是激动人心的,首先因为它为Linux社区提供了一种健壮的、优秀的以及功能丰富的文件系统,并且这种文件系统所具有的可伸缩性能够满足最苛刻的存储需求。
vfat文件系统
vfat文件系统(也称为FAT32)没有日志功能,且缺乏完整的Linux文件系统实现所需的许多特性。它可用于在Windows和Linux系统之间交换数据,因为WindowS和Linux都能读取它。不要将这个文件系统用于Linux,除非要在windows和Linux之间共享数据。如果您在一个vfat磁盘上解压缩一个Linux归档文件,那么您将丢失权限(比如执行权限),还会丢失该归档文件中可能存储的符号链接。
vfs虚拟文件系统
虚拟文件系统VFS也称为虚拟文件系统开关(virtual filesystem Switch),它是内核的一个子系统,提供了一个通用文件系统模型,该模型囊括了所能见到的文件系统常用功能和行为,并为应用程序提供一致性的文件系统接口,安装的所有物理文件系统不但依赖于VFS共存,而且也依靠VFS协同工作。它的主要设计思想有以下3点:
(1)应用层:VFS模型源于UNIX文件系统,使得用户可以直接使用标准UNIX文件系统调用来操作文件,无需考虑具体文件系统特性和物理存储介质,通过VFS访问文件系统,才使得不同文件系统之间的协作性和通用性成为可能。
(2)虚拟层:在对所有具体文件系统的共同特性进行抽象的基础上,形成一个与具体文
件系统实现无关的虚拟层,并在此层次上定义与用户的一致性接口
(3)实现层:该层使用类似开关表技术进行具体文件系统转接,实现各种文件系统的物理操作细节,每个文件系统是自包含的,包含文件系统实现的各种设施,如超级块、节点区、数据区以及各种数据结构和文件类的操作函数。
一般地说,VFS提供以下功能
记录可用的文件系统类型;
把文件系统与对应的存储设备联系起来;
处理面向文件的通用操作;
涉及具体文件系统的操作时,把它们映射到相关的具体文件系统。
VFS抽象层之所以能衔接各种不同的文件系统,是因为它定义了所有文件系统都支持的基本抽象接口和数据结构,同时具体的文件系统也将自己的诸如“文件如何打开”、“目录如何定义”等概念在形式上与VFS的定义保持一致。对于像FAT和NTFS这类非UNIX风格文件系统,必须经过封装,提供符合VFS概念的接口。比如,一个文件系统不支持inode概念,它也必须在内存中装配inode结构体,就像它本身包含inode一样。这些装配和转换需要在使用现场引入特别处理,使得非UNIX文件系统能够兼容UNIX文件系统的使用规则和满足VFS的需求,这样一来,非UNIX文件系统便可与VFS一道工作,只是性能上会有少许影响。
下面看一个文件操作的例子,假如应用程序执行如下文件操作:write(fd,&buf,len);要求将buf指针指向的、长度为len字节的数据写入文件描述符fd对应的文件的当前位置。用户执行的系统调用首先被VFS的sys_write()处理,该函数首先处理一些与设备无关的操作,并找到f所在的文件系统,再根据VFS结构及它的inode数据结构提供的信息,重定向到具体文件系统中相对应的写函数,由它来处理与特定设备相关的操作,并把数据写到物理介质。
linux文件系统选型
- SAS/SATA硬盘文件系统选择
a.reiserfs大量小文件业务首选reiserfs(100K以内)。
b.xfs有的门户的数据库MysQL业务。
c.ext4视频下载,流媒体,数据库,小文件业务也OK,可以用默认的。
d.ext2没有日志,蓝汛的cache业务,CDN网站加速服务的。
常规应用:
对于Centos5.x系列,常规应用就选默认的ext3文件系统即可。
对于Centos6.x系列,常规应用就选默认的exl4文件系统即可。
对于Centos7-x系列,常规应用就选默认的xfs文件系统即可。
注意:如果服务器数量少,怎么选择都可以。
如果海量服务器,考虑维护成本和性能,选一个折中。
SSD文件系统选择
ext4/reiserfs可以作为SSD文件系统,但未对SSD做优化,不能充分发挥SSD性能,并影响SSD使用时间。
btrfs对SSD作了优化,mount通过参数启用。但Btrfs仍处于实验阶段,生产环境谨慎使用。
JFFS2/Nilfs2/YAFFS是常用的flash file system,在嵌入式环境广泛应用,建议使用。性能目前还未作测试评估。
选择小结:
a.Centos默认的文件系统都是比较优秀的。
b.xfs,reiserfs需要单独安装。默认不支持的。海量服务器使用多种文件系统
维护可能不方便。
c.大并发并不是过多的做磁盘系统的优化,而是在架构前端增加缓存,存储数据库的前端增加缓存,这是架构师的能力。
通过partprobe重载分区表,避免重启系统
kudzu 检测硬件
发表评论