频道栏目
首页 > 资讯 > 其他 > 正文

什么是inode

18-12-20        来源:[db:作者]  
收藏   我要投稿
### 什么是inode?

理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块是文件存取的最小单位,块的大小,最常见的是4KB,即连续八个sector组成一个block,文件数据都储存在块中,那么很明显,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创年日期、文件的大小等等。这种储存元信息的区域叫做inode,中文译名为”索引节点”。inode (index node) 表中包含文件系统的所有文件列表。

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

### inode包含文件的信息(元数据)

文件的字节数

文件拥有者的User ID

文件的Group ID

文件的读、写、执行权限

文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

链接数,即有多少文件名指向这个inode

文件数据block的位置

---------------------

### inode表结构

inode.png

### 直接块指针:

inode指针.png

前12个直接指针,直接指向存储数据的区域。如Blocks大小为4*1024KB,前12个直接指针就可以保存48KB的文件

间接块指针:

设每个指针占用4个字节,则以及指针指向的Blocks可以保存(4*1024)/4KB,可指向1024个Blocks,一级指针可存储文件数据大小为1024*(4*1024)KB=4MB

双重间接块指针:

同样Blocks大小为4*1024,则二级指针可保存Blocks指针数量为((4*1024)/4)*((4*1024)/4),则二级指针保存文件数据大小为(1024*1024)*(4*1024)=4GB

三重间接块指针:

以次类推三级指针可以储存文件数据大小为(1024*4*1024*1024)*(4*1024)=4TB

---------------------

### inode的大小:

1. ```

每个inode都有一个编号,操作系统用inode号来识别不同文件。Unix/Linux系统不使用文件名,而使用inode号来识别文件,对于系统来说,文件名只是inode号码便于识别的别称或绰号。表面上,通过文件名打开文件;实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号;其次,通过inode号,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据

inode号并不是无限的,如果一个分区的节点数被使用完了,那么即使磁盘空间还有剩余也不能再存放任何数据。可以使用df -i或者stat命令查看节点使用情况

[root@centos6 ~]#df -i

Filesystem Inodes IUsed IFree IUse% Mounted on

/dev/sda3 320000 133693 186307 42% /

tmpfs 125377 6 125371 1% /dev/shm

/dev/sda1 128016 38 127978 1% /boot

/dev/sda2 1281120 17 1281103 1% /data

/dev/sr0 0 0 0 - /media/CentOS_6.10_Final

```

---------------------

### 目录文件:

```

目录inode.png

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件目录文件的结果非常简单,就是一系列目录项(direct)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号。

ls命令只列出目录文件中的所有文件名:

[root@centos6 /data]#ls

httpd.conf httpd.conf.bak lost+found my.cnf test1.text test2.text test3.text

ll -i命令列出整个目录文件,即文件名和inode号:

[root@centos6 /data]#ll -i

total 92

15 -rw-r--r-- 1 root root 34419 Dec 15 09:39 httpd.conf

17 -rw-r--r-- 1 root root 34419 Dec 15 09:41 httpd.conf.bak

11 drwx------. 2 root root 16384 Dec 12 11:16 lost+found

16 -rw-r--r-- 1 root root 251 Dec 15 09:39 my.cnf

12 -rw-r--r-- 1 root root 0 Dec 15 09:36 test1.text

13 -rw-r--r-- 1 root root 0 Dec 15 09:36 test2.text

14 -rw-r--r-- 1 root root 0 Dec 15 09:36 test3.text

[root@centos6 /data]#stat /etc/fstab

File: `/etc/fstab'

Size: 899 Blocks: 8 IO Block: 4096 regular file

Device: 803h/2051dInode: 25 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2018-12-15 13:01:33.284289685 +0800

Modify: 2018-12-12 11:21:05.675000006 +0800

Change: 2018-12-12 11:28:55.543999998 +0800

理解了上面的知识,就能理解目录的权限,文件的读权限(r)和写权限(w),都是针对目录文件本身。由于目录文件内只有文件名和inode号,所以只有读权,只能获取文件名,无法获取其他信息,因为其他信息都储存在inode节点中,而读取inode节点内的信息需要目录文件的执行权限(x)。

```

### Linux中cp、rm、mv 、ln对inode的影响:

cp命令:

- [ ] ```

分配一个空闲的inode号,在inode表中生成新条目在目录中创建一个目录项,将名称与inode编号关联

拷贝数据生成新的文件

[root@centos6 /data]#df -i

/dev/sda2 1281120 13 1281107 1% /data

[root@centos6 /data]#cp a.txt a.cp

[root@centos6 /data]#ls -il a.txt a.cp

13 -rw-r--r-- 1 root root 7 Dec 15 18:43 a.cp

11 -rw-r--r-- 2 root root 7 Dec 15 18:39 a.txt

[root@centos6 /data]#df -i

/dev/sda2 1281120 14 1281106 1% /data

我们只对比这两个文件,发现Inode number不一样,发现inodes减少了一个,而blocks也少了,这就说明,复制文件是创建文件,并占Inode和Block的。

```

rm命令:

```

减少链接数量,如果链接数为0,释放inode(inode号也已被重新使用);

如果inode被释放,则数据块放到可用空间列表中;

删除目录中的目录项

```

mv命令:

```

如果mv命令的目标和源在相同的文件系统,作为mv 命令

用新的文件名创建对应新的目录项

删除旧目录条目对应的旧的文件名

不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!

如果目标和源在一个不同的文件系统, mv相当于cp和rm

```

### 链接与inode

```

[root@centos6 /data]#touch a.txt

[root@centos6 /data]#mkdir a

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

11 -rw-r--r-- 1 root root 0 Dec 15 18:18 a.txt

目录的链接数为2,文件的链接数为1。为什么会这样呢?其实很好理解。对于目录而言,每个目录里面肯定会有两个特殊目录,那就是.和..这两个目录,我们前面的课程中也讲到,.表示当前的目录,而..则是表示上层目录。我们也知道,在Linux系统中,是从根来开始查找的,要想找到某个目录,必需要先找到他的上层目录,所以说,空目录(严格的来说,不能叫空目录)是有两个链接到相应的Inode number的。作为文件很明显,他只有一个链接到相应的Inode number。

[root@centos6 /data]#ln a.txt a.hard

[root@centos6 /data]#ln -s a.txt a.soft

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

11 -rw-r--r-- 2 root root 0 Dec 15 18:18 a.hard

12 lrwxrwxrwx 1 root root 5 Dec 15 18:27 a.soft -> a.txt

11 -rw-r--r-- 2 root root 0 Dec 15 18:18 a.txt

再查看文件和目录的属性,我们就发现:创建一个硬链接后,a.txt的inode值增加了一个;a.txt和a.hard的inode值是一样的。这个硬链接就是重新创建了一个文件名对应到原文件的Inode。实质就是在Directory中增加了一个新的对应关系。

下面再来看看这个软链接

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

11 -rw-r--r-- 2 root root 0 Dec 15 18:18 a.hard

12 lrwxrwxrwx 1 root root 5 Dec 15 18:27 a.soft -> a.txt

11 -rw-r--r-- 2 root root 0 Dec 15 18:18 a.txt

他的Inode number和原文件不一样。而且大小也发生了变化。可见,这个软链接是重新建立了一个文件,而文件是指向到原文件,而不是指向原Inode。当然他会占用掉 inode 与 block。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。但软链接是可以跨文件系统,而且是可以链接目录。他就相当于windows系统下的快捷方式一样。通过这个特性,我们可以通过软链接解决某个分区inode conut不足的问题(软链接到另一个inode count足够多的分区)。

```

### **硬链接和软链接**

```

硬链接:其实就是同一个文件具有多个别名,具有相同inode,而dentry不同。

1. 文件具有相同的inode和data block

2. 只能对已存在的文件进行创建;

3. 不同交叉文件系统进行硬链接的创建

4. 不能对目录进行创建,只能对文件创建硬链接

5. 删除一个硬链接并不影响其他具有相同inode号的文件;

软链接:软链接具有自己的inode,即具有自己的文件,只是这个文件中存放的内容是另一个文件的路径名。因此软链接具有自己的inode号以及用户数据块。

1. 软链接有自己的文件属性及权限等;

2. 软链接可以对不存在的文件或目录创建;

3. 软链接可以交叉文件系统;

5. 创建软链接时,链接计数i_nlink不会增加;

6. 删除软链接不会影响被指向的文件,但若指向的原文件被删除,

相关TAG标签
上一篇:Linux文件系统
下一篇:基础命令ls总结
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站