您的位置:首页 > Web前端 > Node.js

详解 inode节点、软链接以及硬链接

2016-07-30 17:16 197 查看
inode table 索引节点表
要理解inode,要从文件存储说起,文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个"扇区“ sector组成一个 block。

文件数据都储存在"块"中,那么显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

在linux系统里,每个分区里inode可以重复,但跨分区不行。每个分区的inode是相互独立的。一个节点可以对应多个文件。

用 ls -i 选项即可查看文件节点号。
[root@localhost testdir]# ls -i
24 a1 22 a1link 19 a2 25 a3 21 a4 20 file1 23 file2 17 lhj 16 lll1
//前面的数字为inode节点号

这里值得重复一遍,Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

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

可以使用`df -i`查看各分区inode节点使用量和剩余量
[root@localhost testdir]# df -i
文件系统 节点号总量 已经使用 未使用 已使用百分比 挂载点
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg0-root 1310720 7069 1303651 1% /
tmpfs 125517 1 125516 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
/dev/mapper/vg0-usr 655360 79377 575983 13% /usr
/dev/mapper/vg0-var 1310720 2744 1307976 1% /var

3.硬链接
硬链接指的是一个节点上有多少个文件在使用,一个节点可以多个文件使用,但多个节点不能对应一个文件,因此我们删除文件的时候实则是删除了节点的一个名称而已,需一直删除到硬链接为0,并且原有的节点号被其他文件所调用,然后覆盖了原有的数据,才能彻底的说是删除了整个文件。
1)、用ls -l 即可查看文件的硬链接数。
[root@localhost testdir]# ls -l
此列数字为硬链接
-rw-r--r-- 1 root root 30 Jul 26 01:18 a1
lrwxrwxrwx 1 root root 11 Jul 26 01:17 a1link -> /testdir/a1
-rw-r--r-- 1 root root 0 Jul 26 01:16 a2
-rw-r--r-- 2 root root 115 Jul 26 02:48 a3
-rw-r--r-- 1 root root 44 Jul 26 02:44 a4
-rw-r--r-- 2 root root 115 Jul 26 02:48 aa3
-rw-r--r-- 1 root root 21 Jul 26 05:56 file1
-rw-r--r-- 1 root root 33 Jul 26 05:58 file2
-rw-r--r-- 2 root root 0 Jul 25 21:14 lhj
drwxr-xr-x 2 root root 4096 Jul 26 00:29 lll1
硬链接不能跨分区创建,不能对目录进行创建。
链接数 = 一个节点上的文件数量

注意,目录里的'.' 和 ‘..’以及目录下的文件或目录里的 ‘ .. ’也属于当前目录的硬链接数。

2)/用 ln file1 file2即可创建文件硬链接,创建之后看似是两个独立的文件,其实是一个相同的文件。只是一个节点的两个名字而已
[root@localhost testdir]# ln a3 aa3
[root@localhost testdir]# ll -i
total 28
24 -rw-r--r-- 1 root root 30 Jul 26 01:18 a1
22 lrwxrwxrwx 1 root root 11 Jul 26 01:17 a1link -> /testdir/a1
19 -rw-r--r-- 1 root root 0 Jul 26 01:16 a2
25 -rw-r--r-- 2 root root 115 Jul 26 02:48 a3 //节点号为25
21 -rw-r--r-- 1 root root 44 Jul 26 02:44 a4
25 -rw-r--r-- 2 root root 115 Jul 26 02:48 aa3 /节点号为25 所以两个文件实则是一个文件
20 -rw-r--r-- 1 root root 21 Jul 26 05:56 file1
23 -rw-r--r-- 1 root root 33 Jul 26 05:58 file2
17 -rw-r--r-- 2 root root 0 Jul 25 21:14 lhj
16 drwxr-xr-x 2 root root 4096 Jul 26 00:29 lll1
[root@localhost testdir]#

4.符号链接、软链接
软连接相当于windows中的快捷方式,只是创建一个没有实质数据的文件然后链接到实际文件。删除机制与硬链接不同,软链接删除实际文件之后软链接就失效了。软链接可以跨分区创建。

1)、创建软链接用`ln -s `命令
格式:
ln -s f2原始文件的绝对路径或相对路径(相对于软链接文件的路径) f2link(链接名)
[root@localhost testdir]# ln -s /testdir/a4 /tmp/a4link
//在/tmp/下创建一个名为a4link的软链接,然后使用绝对地址指定链接的实际文件
[root@localhost testdir]# ls -l /tmp/a4link
//用ls -l 查看链接文件,所指向的地址是/testdir/a4
lrwxrwxrwx 1 root root 11 Jul 26 11:21 /tmp/a4link -> /testdir/a4

5、软连接和硬链接的区别。
硬链接:
1.硬链接指定是一个节点所指定的文件数量,因此,多个文件可以使用一个节点,但不能使用多个节点。
2.硬链接在删除的时候必须删除硬链接为0、并且原有的节点号被其他文件占有并覆盖之后才能算彻底删除文件。

软链接:
1.软链接可以拥有多个节点来指向一个文件,
2.软链接在删除的时候不用关心硬链接数是否为0 ,只要软链接所指向的实际文件不存在,当前的软链接即失效。

例题:一台服务器上,内存硬盘都比较大,但磁盘中各个独立的小文件比较多,然后在创建文件的时候提示磁盘空间不足了,此时并不是因为磁盘容量不够了,而是inode节点被使用完了,所以删除一些inode节点之后就又可以继续使用了。

实用小李子:
1.查看每个inode节点的大小,可以用如下命令:
#sudo dumpe2fs -h /dev/hda | grep "Inode size"
2.我们在弄inode的时候想把inode节点用完做一下磁盘实验,但是磁盘分区节点太多了,手动创建岂不是要到手抽了还得创,与其这样还不如利用linux强大的功能,循环创建文件,知道inod节点被用完为止。
#for id in {1..194569} do touch /boot/f$id;echo f$id is created;done
注意:1..194560 看自己的分区节点使用量来定,用df -i 即可查看inode节点总量及使用量,我这里就定制那么多,可以更改的,
echo后面的内容为把创建过程显示到屏幕上。
done为for语句结束

6.file:查看文件文本类型
file filename //直接显示文件文本类型
-b:不显示文件名
//可以参照看一下,使用-b选项之后标准输出的内容没有文件名,只有文件内文本的类型
[root@localhost testdir]# file a4
a4: ASCII text
[root@localhost testdir]# file -b a4
ASCII text

-f:(批量处理)读取文件中的文件路径
//创建一个文件,里面放一些文件的路径,然后使用-f选项来对文件内的文件路径逐一进行查看文本类型
[root@localhost testdir]# echo "/etc/passwd\n/testdir/a4 \n/etc/fstab" > a5
//用echo覆盖输出文件路径到a5中

[root@localhost testdir]# cat a5 //查看文件文件内容,正是我们指定的文件路径内容
/etc/passwd
/testdir/a4
/etc/fstab

[root@localhost testdir]# file -f a5 //用-f 查看a5 文件内的文件进行一一查看文件文本类型
/etc/passwd: ASCII text
/testdir/a4 : ASCII text
/etc/fstab: ASCII text

-F :指定分隔符
[root@localhost testdir]# file a3 //查看原有的分割符
a3: ASCII text
[root@localhost testdir]# file -F ' filetype is' a3
//用-F 并重新指定分割符之后输出的结果,-F指的是将原来的分隔符换成用户指定的分隔符。
a3 filetype is ASCII text
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 操作系统 inode