学到linux上的软连接和硬链接,不得不了解inode,要想知道inode,不得不了解一些文件系统,至少是Linux文件系统
Linux文件系统
文件系统是什么
我的理解,文件系统类似现实中的档案管理,条理化的存储数据。它定义了磁盘上储存文件的方法和数据结构。
不同的人管理档案有不同的管理方法,那么相对于不同的系统格式有不同的存储办法,所以就有了不同的文件系统类型。什么ext2,ext3,ext4,xfs,NTFS,FAT等。但是不同人的管理方法有的领导不承认或者是不认识,那么领导就不能来按照他的管理方法来查找档案,就像不同的操作系统只认识特定的文件系统一样。要想让“领导”认识某些文件系统,则需要教会领导,那么这就涉及到更深层次的编译系统了。
inode是什么
inode又要扯到存储了,我们知道数据是保存在磁盘中的,磁盘上最小存储数据的是扇区,每个扇区一般都是可以存放512字节的数据。
那么如果数据大于512字节时候,磁盘需要不停地移动磁头来查找数据,我们知道一般地文件很容易超过512字节那么如果把多个扇区合并为一个块,那么磁盘就可以提高效率了,。那么磁头一次读取多个扇区就为一个块“block”(linux上称为块,Windows上称为簇)。
一个块多为4KB,因为块是文件系统层面上的概念,所以块也可以在格式化时候自行定义。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
Linux文件系统工作原理初识
我们知道文件系统记录的数据,除了其自身外,还有数据的权限信息,所有者等属性,这些信息都保存在inode中,那么谁来记录inode信息和文件系统本身的信息呢,比如说文件系统的格式,inode与data的数量呢?那么就有一个超级区块(supper block)来记录这些信息了.
每个inode和block,都有编号。通俗讲
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等
- inode:记录文件的属性信息,可以使用stat命令查看inode信息。
- block:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。(因为数据是由inode指向的,如果有两个文件的数据存放在同一个块中,就会乱套了)
inode用来指向数据block,那么只要找到inode,再由inode找到block编号,那么实际数据就能找出来了。我来试着画一个简图
Linux文件系统格式化时候,格式化上面三个区域,supper block, inode 与 block 的区块,假设某一个数据的属性与权限数据是放置到 inode 5 号,而这个 inode 记录了档案数据的实际放置点为 3,4,10 这四个 block 号码,此时我们的操作系统就能够据此来寻找数据了。称为索引式文件系统。
Windows中的FAT文件系统就不是索引式文件系统,如下简图
很明显,我们懂了每一个数据块都存放下一个数据块的索引,如上1>7>4>15。
但这就有了一个问题,如果文件系统中碎片太多,那么将大大降低数据的读取速度。虽然linux系统也会存在碎片化的问题,但由于是索引式文件系统,所以影响并不大,所以一般情况下windows需要经常进行碎片化整理,而linux很少需要进行整理,但是也可以写脚本进行整理,不过这都是那些高手们干的事情。
Inode
inode内容
可以使用stat命令进行查看
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个inode
- 文件数据block的位置
inode大小与数量
inode也会占用磁盘空间,大小一般为128k或256k.
inode 数量也可以使用mke2fs -N来进行指定,这在实际的生产中很有必要,比如说论坛系统,因为里面的文件很小,并且很多,很可能会出现inode先用完,而数据空间并没没有使用完。此时就需要根据经验,根据磁盘总空间来进行估算出inode的需求,最好在使用inode完的同时,block也使用完。
生产环境下如果inode不够使用了的缓解办法
如果/data 所在分区inode不够使用
1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
2、用软连接将其他分区目录连接到/data/cache,使用其他分区的inode来缓解/data分区inode不足的问题:
ln -s /opt/newcache /data/cache
硬链接与软连接
说到inode,那么硬链接与软连接不用说我们就可以明白了其中的原理了,我就总结了点两者的不同吧。
(1).软硬链接实现的原理不同
硬链接是建立一个目录项,包含文件名和文件的inode,但inode是原来文件的inode号,并不建立其所对应得数据。所以硬链接并不占用inode。
软连接也创建一个目录项,也包含文件名和文件的inode,但它的inode指向的并不是原来文件名所指向的数据的inode,而是新建一个inode,并建立数据,数据指向的是原来文件名,所以原来文件名的字符数,即为软连接所占字节数
(2).软硬链接所能创建的目标有区别
因为每个分区各有一套不同的inode表,所以硬链接不能跨分区创建而软连接可以,因为软连接指向的书文件名。
(3).硬链接不能指向目录
如果说目录有硬链接那么可能引入死循环,但是你可能会疑问软连接也会陷入循环啊,答案当然不是,因为软连接是存在自己的数据的,可以查看自己的文件属性,既然可以判断出来软连接,那么自然不会陷入循环,并且系统在连续遇到8个符号连接后就停止遍历。但是硬链接可就不行了,因为他的inode号一致,所以就判断不出是硬链接,所以就会陷入死循环了。