文件系统

七、文件系统:
7.1文件系统介绍:

文件系统filesystem是操作系统内核中负责组织管理磁盘的程序。
在传统的磁盘与档案系统(又称为文件系统filesystem )的应用中,一个磁盘分割槽/分区只能被格式化成 为一个文件系统,所以我们可以说一个filesystem就是一个partition分区。但是由于新技术的利用,例 如我们常听到的LVM与软体磁盘阵列(software raid,又称软raid),这些技术可以将一个分区格式化为 多个文件系统(例如LVM),也能够将多个分区合成一个文件系统(LVM, RAID)!所以说,目前我们在格式 化时已经不再说成针对分区来格式化了,通常我们可以称呼一个可被挂载的资料为一个文件系统而不是 一个分区!。
linux常见文件系统有xfs、ext4和btrfs文件系统,它们都是日志文件系统(其特点是文件系统将没提 交的数据变化保存到日志文件,以便在系统崩溃或者掉电时恢复数据),三者各有优势和劣势:
•btrfs (B-tree文件系统)是个很新的文件系统(Oracel在2014年8月发布第一个稳定版),它将 会支持许多非常高大上的功能,比如透明压缩(transparent compression)、可写的COW快照
(writable copy-on-write snapshots)、去重(deduplication )和加密(encryption )。因 此,Ceph建议用户在非关键应用上使用该文件系统。更多的参考包括(1) (2) (3)。
•xfs和btrfs相比较e xt3/4而言,在高伸缩性数据存储方面具有优势。
•Ceph的这篇文章明确推荐在生产环境中使用XFS,在开发、测试、非关键应用上使用btrfs。
(Ceph文章http://docs.ceph.com/docs/master/rados/configuration/filesystem-recommendations/)
•网上有很多的文章比较这几种文件系统,包括:
•ext3, ext4, xfs和btrfs文件系统性能对比
https://www.cnblogs.com/tommyli/p/3201047.html
•固态硬盘匕Ext4和xfs性能比较
https://www.cnblogs.com/tommyli/p/3201047.html
•让你的DB再快一倍:ext4 vs xfs对比测试
https://www.cnblogs.com/tommyli/p/3201047.html
•XFS --if it's more robust, why are we using ext4 instead?
https://www.cnblogs.com/tommyli/p/3201047.html

ps: windows文件系统格式:FAT32、NTFS

7.2文件系统工作原理:

文件系统如何工作的呢?
须知一个文件的由两部分内容组成:
  -1、文件的元信息,例如权限(rwx)、拥有者、群组、时间参数等。
  -2、文件的实际内容

文件系统通常会将这两部份的分别存放在不同的区块
  -1、文件的元信息放置到inod e区块中
  -2、文件的实际内容则放置到data block区块中。
#强调:每个inode与block都有自己的编号
另外,文件还有一个超级区块(superblock)会记录整个档案系统的整体信息,包括inode与block的总量、使用量、剩余量等。

补充说明:
#硬盘的最小存取单位-》扇区
#操作系统的最小存取单位-》block块
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存512字节(相当于 0.5KB)。
操作系统读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,于是操作系统中的文件系统负责 将磁盘的多扇区组织成一个个的block块,这样操作系统就可以一次性读取一个'块'(block),即一次 性连续读取多个扇区。这种由多个扇区组成的''块”,是文件存取的最小单位。'块'的大小,最常见的是4KB,即连续八个sector组成一个block。
总结文件系统的三种区块inode、block、superblock的意义如下:
#1、 superblock:
记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
#2、inode:
(1)记录文件元信息,包括文件对应的一个或多个block块号码
(2)—个文件被分配唯一一个inode
#3、 block:
(1)记录文件实际内容
(2)—个文件过大时可能会被分配多个block快,即一个文件可能对应多个block块的号码,这些号码都存放在该文件的innode里

举例
命令# ls -di /
64 /
命令# ls -di /etc
8388673 /etc
命令# ls -i /etc/passwd
8769396 /etc/passwd 
cat /etc/passwd的整体过程如下

依据上述存取方式的特点, 我们通常称ext文件系统为索引式文件系统(indexed aIIocation)。

7.3 扩展阅读:

7.3.1 inode信息:

文件的inode中文译名为"索引节点" , 是 UNlX 操作系统中的一种数据结构, 其本质是结构体。
lnode负责储存文件的元信息, 比如文件的创建者、文件的创建日期、文件的大小inode 。
从根本上讲, inode 中存放的是除了文件的名字以及文件真实内容之外、所有有关文件的信息/元数据
(metadata), 如下
●inode 编号
●用来识别文件类型, 以及用于 stat C 函数的模式信息
●链接数, 即有多少文件名指向这个inode 。
●属主的ID (UID)
●属主的组 ID (GID)
●文件的字节数
●文件所使用的磁盘块的实际数目
●文件的时间戳, 共有三个:
ctime指inode 上一次变动的时间, 
mtime指文件内容上一次变动的时间 
atime指文件上一次打开的时间
●指向数据块的指针
可以用stat命令, , 查看某个文件的inode信息:
命令# stat egon.txt
文件: "egon.txt "
大小: 0	块: 0		Io  块: 409 6	普通空文件
设备: 803h/205ld Inode: l68l34 92	硬链接: l
权限: (0644/-rw-r--r--)	Uid: (	0/	root )	Gid: (	0/	root )
最近访问: 2022-l2-l6 l6:25:29 .664259627 +0800
最近更改: 2022-l2-l6 l6:25:29 .664259627 +0800
最近改动: 2022-l2-l6 l6:25:29 .664259627 +0800
创建时间: -
# 三种时间解释
atime:	access time 访问文件内容的时间。对文件进行一次读操作, 它的访问时间就会改变。例如像: cat、more等操作, 但是像之前的stat还有ls 命令对atime是不会有影响的。

mtime:	modify time 修改文件内容的时间。文件的内容被最后一次修改的时间, 我们经常用的ls -l命令显示出来的文件时间就是这个时间, 当用vim对文件进行编辑之后保存, 它的mtime就会相应的改变; 比如: 如: echo aa >> a.sh或vim a.txt  修改内容

ctime:	change time 指inode上一次文件属性变动的时间。当文件的状态被改变的时候, 状态时间就会随之改变, 例如当使用chmod、chown等改变文件属性的操作是会改变文件的ctime的。chmod +x a.txt
例1 : 使用cat命令查看文件后, 文件atime变更
命令# touch egon.txt   -------创建文件
命令# stat egon.txt    -------查看文件三种时间
文件: " egon.txt "
大小: 0	块: 0          IO 块:4096     普通空文件
设备: 803h/205ld Inode: l68l3492       硬链接:  1
权限: (0644/-rw-r--r--)	uid:(0/root) Gid:(0/root)
最近访问: 2022-l2-l6     l6:25:29.664259627      +0800
最近更改: 2022-l2-l6     l6:25:29.664259627      +0800
最近改动: 2022-l2-l6     l6:25:29.664259627      +0800
创建时间: -
命令# cat egon.txt     --------这里查看了一下文件
命令# stat egon.txt    --------再看一下时间
文件: " egon.txt "	
大小: 0	块: 0	Io  块: 4096	普通空文件
设备: 803h/205ld Inode : l68l3492	硬链接: l	
权限: (0644/-rw-r--r--)	uid: (0/root) Gid: (0/root)
最近访冋:2022-12-16	16:29:26.162262768	+0800   --------可以看见访问时间更改了
最近更改:2022-12-16	16:25:29.664259627	+0800
最近改动:2022-12-16	16:25:29.664259627	+0800
创建时间:-		
例2:使用vim命令写文件w后,文件atime、mtime、ctime都会变更。如果vim打开后只是查看没有写 的话,只会变更atime。
(这里自己慢慢试就行)
例3:
命令# stat egon.txt	
文件:"egon.txt"
大小:9	       块:8		   IO块: 4096	普通文件
设备:803h/2051d Inode: 17696455	硬链接:1			
权限:(0644/-rw-r--r--) Uid: (0/root)	Gid	(	0/	root)
最近访冋:2022-12-16	16:35:21.943267492	+0800			
最近更改:2022-12-16	16:35:46.131267813	+0800			
最近改动:2022-12-16	16:35:46.131267813	+0800			
创建时间:-					
命令#	chmod 000 egon.txt				
命令#	stat egon.txt				
文件:"egon.txt"					
大小:9	块:8	IO块:	4096	普通文件	
设备:803h/2051d Inode: 17696455	硬链接:1			
权限:(0000/----------)Uid: (0/	root)	Gid	(	0/	root)
最近访冋:2022-12-16	16:35:21.943267492	+0800			
最近更改:2022-12-16	16:35:46.131267813	+0800			
最近改动:2022-12-16	16:36:43.423268574	+0800			
创建时间:-				
7.3.2 inode 的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每 1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB 就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i命令。
查看每个inode节点的大小,可以用如下命令:
#查看ext文件系统信息
sudo dumpe2fs -h /dev/hda | grep "Inode size" 
-------hda一般是指IDE接口的硬盘,hda指第一块硬盘,hdb指第二块硬盘,等等;sda一般是指SATA接口的硬盘,sda指第一块硬盘,sdb指第二块硬盘,等等
#查看xfs文件系统信息
xfs_info /dev/sda3
由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时, 就无法在硬盘上创建新文件。
7.3.3 inode 号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上用户通过文件名,打开文件。实际上系统内部 这个过程分成三步:
•首先,系统找到这个文件名对应的inode号码;
•其次,通过inode号码,获取inode信息;
•最后,根据inode信息,找到文件数据所在的block,读出数据。
使用Is-i命令,可以看到文件名对应的inode号码,例如:
ls -i demo.txt
7.3.4目录项
Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含 文件的文件名,以及该文件名对应的inode号码。
Is命令只列出目录文件中的所有文件名:
ls /etc
Is -i命令列出整个目录文件,即文件名和inode号码:
ls -i /etc
如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的 详细信息。
ls -l /etc
7.3.5 FAT文件系统
U盘使用的档案系统一般为FAT格式。FAT这种格式的档案系统并没有inode存在,所以FAT没有办法将这 个档案的所有bIock在一开始就读取出来。每个bIock号码都记录在前一个bIock当中,他的读取方式有 点像底下这样:

上图中我们假设档案的资料依序写入1->7->4->15号这四个block号码中,但这个档案系统没有办法一口气就知道四个block的号码,他得要一个一个的将block读出后,才会知道下一个block在何处。如果 同一个档案资料写入的block分散的太过厉害时,则我们的磁盘读取头将无法在磁盘转一圈就读到所有 的资料,因此磁盘就会多转好几圈才能完整的读取到这个档案的内容!
常常会听到所谓的『碎片整理』吧?需要碎片整理的原因就是档案写入的block太过于离散了,此时档 案读取的效能将会变的很差所致。这个时候可以透过碎片整理将同一个档案所属的blocks汇整在一 起,这样资料的读取会比较容易啊!想当然尔,FAT的档案系统需要三不五时的碎片整理一下,那么 Ext 2是否需要磁盘重整呢?
由于Ext2是索引式档案系统,基本上不太需要常常进行碎片整理的。但是如果档案系统使用太久,常常删除/编辑/新增档案时,那么还是可能会造成档案资料太过于离散的问题,此时或许会需要进行重整一下的。
7.4 inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1.有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
2.移动文件或重命名文件,只是改变文件名,不影响inode号码。
3.打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
命令# ls -i egon.txt
17696455 egon.txt
命令# vim egon.txt # vim 编辑器写文件,会改变inode号
命令# ls -i egon.txt
17696461 egon.txt

命令# mv egon.txt EGON.txt # 重命名文件不会影响inode号
命令# ls -i EGON.txt
17696461 EGON.txt
问:为什么每次修改完服务器配置文件后,都需要重新加载一下配置文件?
答:因为vim每次修改完后,Inode号都会变,系统还是读取的原来inode号的配置文件,每次修改 完服务器的配置文件,都要重启服务,重新读一下配置文件。

原文地址:https://www.cnblogs.com/qiukangle/p/13956241.html