一. 文件系统
1.文件系统介绍
文件系统是操作系统内核中负责组织管理磁盘的程序,文件系统属于操作系统的一部分,它提供了文件的概念.
Linux中常见的文件系统有xfs,ext4,btrfs文件系统,他们都是日志文件系统(其特点是文件系统将没提交的数据变化保存到日志文件,以便在系统崩溃或者断电时恢复数据),三者各有优势和劣势.
2.文件系统工作原理
一个文件由两部分内容组成:
(1)文件的元信息,如:权限,属主属组,时间等.文件的元信息放置在inode块中
(2)文件的实际内容,放置在block块中
注意:每个inode和block都有自己的编号,另外文件系统还有一个超级区块(superblock),他会记录整个文件系统的整体信息,包括inode和block的总量,使用量,剩余量等.
cat /etc/passwd 的整体过程如下:
3.inode的大小
inode会消耗硬盘空间的,所以硬盘格式化时,操作系统自动将硬盘分为两个区域:一个是inode区,存放inode包含的信息.另一个是block区,存放的是文件数据.
每个inode节点的大小一般为128或者256字节,inode节点的总数,在硬盘格式化时就给定了,一般是每1KB或者2KB就设置一个inode.假设一块1GB硬盘,每个inode节点的大小为128字节,每1KB设置一个inode,那么inode总大小就会达到128MB.
查看inode总数和已经使用的数量可以使用: df -i
查看ext文件系统信息:sudo dumpe2fs -h /dev/hda | grep "Inode size"
查看xfs文件系统信息:xfs_info /dev/sda3
注意: 由于每个文件都必须有一个inode,所以可能发生inode数量用完,硬盘空间还没用完的情况,这时也无法在硬盘上创建新文件.
4.inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件:
首先,系统找到这个文件名对应的inode号码
其次,通过inode号码,获取inode信息
最后,根据inode信息,找到文件数据所在的block,读取数据
5.目录项
Linux系统中,目录也是一种文件,打开目录,实际上就是打开目录文件.
目录文件的结构非常简单,就是一系列目录项的列表,每个目录项由两部分组成:文件名及其对应的inode号码.
ps:为什么每次修改完服务器配置后,都要重新加载一下配置文件?
因为vim每次修改完成后,等于新建了一个文件,inode号码也会改变,而系统读取的还是原来inode号的配置文件,所以需要重启服务,根据新的inode号重新读一下文件.
二. linux文件的三种时间属性
linux文件的三种时间属性分别为:
atime,为access time(访问时间)的缩写,显示的是文件中的数据最后被访问的时间,读一次这个文件的内容,这个时间就会更新,比如被系统的进程直接使用或者通过一些命令和脚本间接使用。(执行一些可执行文件、脚本)或对这个文件运用 more、cat等命令。ls、stat命令都不会修改文件的访问时间
mtime,为modify time(修改时间)的缩写,显示的是文件的内容被改变时的最后时间,比如用vi编辑时就会改变(也就是Block的内容),ls -l列出的时间就是这个时间。
ctime,为change time(状态改动时间)的缩写,显示的是文件的权限,拥有者,所属的组,链接数发生改变时的时间。当然当内容改变时,也会改变。(也就是Inode内容发生改变和Block内容发生改变时),通过chmod、chown命令修改一次文件属性,这个时间就会更新。
使用命令stat查看:
三. 硬链接和软链接
硬链接:
通过索引节点号来进行连接,inode可以对应多个文件名.
1,硬链接文件与源文件具有相同inode号的不同文件名:一个文件只能有一个inode号,但多个文件的inode号可以相同.
2,删除硬链接或者源文件之一,不影响另一个文件名的访问,除非所有的都删除掉,所以硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止误删操作.
3,目录不可以创建硬链接,并且硬链接无法跨分区(文件系统)
创建硬链接的命令: ln [源文件] [目标文件]
软链接:
即符号链接,类似于Windows的快捷方式.它实际上是一个特殊的文件,在符号连接中,文件实际上是一个文本文件,其中包含有另一文件的位置信息.
1,软链接文件与源文件具有不同的inode号
2,删除软链接文件的源文件,软链接文件将无法使用,软链接的作用:
--软件升级
--企业代码发布
--不方便目录移动
3,可以对目录创建软链接,并且可以跨分区(文件系统)
创建软链接的命令:ln -s [源文件] [目标文件]
解决磁盘有空间但创建不了文件
实战场景:在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了80%,还有1.9G的剩余空间,但是无法创建新的文件。当时使用的是root用户。服务器没有被黑。
[root@xuegod63 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 10G 8.0G 1.9G 80% /
常识: 只要权限够,磁盘上有空间一定可以创建文件。 这个是错的。
排查:
[root@xuegod63 ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sda3 5242880 5242880 0 100% /
用df -i查看了一下/data所在的分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因:
/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。
解决方案1:删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
解决方案2 : 在/data备份好一些文件,然后删除这些文件,释放一些inode,然后创建一个文件夹/data/cache2。在cache2下挂载一个新分区: sda4 ,下次写数据需要写到新分区cache2目录下。
inode分区完后,可以增加吗? 不可以。 inode总数是在格式化时定下来。