什么是inode?
在Linux磁盘存储文件系统中,我们以块划分磁盘为两部分:超级块(superblock)和数据块(data block);同时划分单文件为用户数据(user data)和元数据(meta data)两个部分。
-
用户数据记录的是文件的真实内容。比如你的血液、骨骼和各器官等等。
-
元数据这是附加于文件的属性信息。比如身高、体重、血型和年龄等等。通常包含了文件的大小、访问模式、归属(主和组)、权限、时间戳等等。
为了快速查找分别存储于超级块和数据块的文件,我们引进了索引节点inode(index node)。我们可以理解为元数据+数据块指针=inode。每个inode大小固定为128bytes,每个文件占用一个inode。但是有一个问题,需要记录的文件属性特别多,而且一个文件可能有很多很多block,而inode又太小(记录一个block要用4byte),怎么办?linux的解决办法是:将inode记录block号码的区域定义为12个直接、一个间接、一个双间接与一个三间接记录区。总共可记录的block数量为:12+256+256*256+256*256*256(K)=16G这只符合block大小为1K时的情况。
为了方便理解,我绘制的示例如下图:
Linux是如何查找文件的?
文件的文件名是不包含在inode结构里的,用户通过文件名来引用一个文件,文件名只是为了方便用户识别文件的。
每个inode都有一个编号,我们称为索引编号(inumber),两者虽然极为相似,并且互相关联,但他们却是两个不同的概念。 inode 指的是数据结构;而inumber实际上是 inode 的标识编号,因此也称其为 inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。Linux的内核内存是通过索引编号定位inode,再从inode里的指针,定位到data block,从而找到文件的。
值得注意的是,目录也是文件,不过目录的 data block 里的数据是目录下的文件名(子目录)和它的inode 号之间的映射构成的。
现在我们通过示图来展示 Linux 查找文件
1.假设有文件目录结构如下图:
系统需要查找/testdir/A/b.txt文件,查找过程是
linux如何创建、删除、移动文件?
创建
当我们直接创建(或通过复制创建)一个普通文件/PATH/file时,系统会分配一个空闲的inode,在inode表中生成inumber,同时父目录/PATH的data block里添加file《═》inumber。这样一个新文件创建成功了。
rm删除
链接数递减,从而释放的inode 号可以被重用,
把数据块放在空闲列表中
删除父目录里的映射项
数据实际上不会马上被删除,但当另一个文件使用数据块
时将被覆盖。
mv移动
1. 如果mv 命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode 表(除时间戳)或磁盘上的数据位置:没有数据被移动!
2. 如果目标和源在一个不同的文件系统, 由于inode不能跨文件系统,所以mv 需要在目标文件系统中执行相当于cp 和rm。
软链接和硬链接
为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。
硬链接:
从上图中我们可以看到,硬链接与源文件是相同的inode和data block。因此
硬链接的特性为:
-
只能对已存在的文件进行创建,创建硬链接会在inode里添加计数
-
指向inode相同,与源文件的data block也相同
-
不能对目录创建硬链接
-
不能跨文件系统进行硬链接的创建
-
创建硬链接会在硬链接父目录添加映射条目:hard link映射源文件inode
-
删除一个硬链接文件,会在父目录清除该条映射,inode计数减一,所以不影响其他有相同 inode 号的文件。
硬链接展示:
源文件不存在, 无法创建硬链接:
不能对目录进行创建硬链接:
不能跨文件系统创建硬链接:
与源文件有相同的inode,inode里计数增加1:
软连接:
从上图中我们可以看到,软连接和源文件是两个独立inode的文件,因此
软链接的特性为:
-
可以指向一个目录
-
可以跨文件系统(分区)
-
是一个指向源文件名称的指针,是个一个文件
-
指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode 的引用计数
软链接展示:
可以对目录创建软链接:
可以跨文件系统创建软连接:
软链接是指向源文件的指针,与源文件是两个独立inode的文件:
写在结束
本文描述了 inode 的结构体。通过索引节点结构体,区分硬链接与软链接的不同存在。
本文参考资料主要来源于:
《理解 Linux 的硬链接与软链接》http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2
《学习 Linux,101: 创建和更改硬链接和符号链接》http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-6/
文中主要通过个人理解进行描述,由于初学Linux,限于本人水平有限,文中难免错误纰漏。欢迎各位看官不吝指教、讨论相关技术。谢谢。联系我:jacky18676887374@aliyun.com
原创文章,作者:昭其,如若转载,请注明出处:http://www.178linux.com/30437