初识linux软链接和硬链接

  • Post author:
  • Post category:linux


1.从文件开始到软硬链接


在认识软链接和硬链接之前,我们先来了解一下整个系统当中的文件存放特点,在linux当中,数据分为元数据和用户数据,元数据包括文件的一些属性,例如文件大小,创建时间等一些内容。元数据当中有一个叫做inode(它是元数据的一部分,可以叫做索引节点号),inode作为文件的唯一标识。而文件名,是为了方便记忆。linux系统通过inode来查找正确的数据块,获取对应的信息,而对于用户数据,就是存放真是数据的地方,我们可以理解为磁盘。

这里写图片描述

为了解决文件的共享使用,所以引入了两种链接,硬链接和软链接(符号链接)。

2.硬链接


若一个inode对应多个别名,我们就把这些别名叫做硬链接。

硬链接就是多个文件名对应相同的inode。

而且对于硬链接使用引用计数的方式进行维护。

硬链接创建命令:

ln 文件名 目的链接文件名

我们在这里进行测试一番,我们首先建立一个文件,然后建立两个对应的硬链接,我们查看他们的inode号,我们会发现,他们的inode号是是相同,另外,我们也可以看出来它们的引用计数,就是有多少个文件名指向inode就是这个计数就显示多少。

这里写图片描述

所以,因为它们指向的是相同的inode,所以当你修改这三个的任何一个,他们都会全部被修改。

硬链接的特点:

1)相同的硬链接有相同的inode和数据块

2)不能交叉系统创建

3)无法创建文件夹的硬链接

4)当删除一个硬链接的时候,对另外的一个硬链接是没有影响的。

5)硬链接的大小显示的就是你原来数据块的大小

硬链接就是采用引用计数的方式,一个磁盘文件被引用的此时共有几次。

硬链接只有在引用计数变为0的时候才会被删除。

3.软链接


关于软链接理解为一种windows当中常见的快捷方式,linux当中常常用它解决一些库版本的问题。将一些目录层次较深的文件链接到一个更加容易访问的目录当中。我们通常会使用到软链接。

软链接命令

ln -s 文件名 软链接文件名

当我们创建两个软链接后,我们可以发现它们的inode号是不一样的。它们有软链接对应独立的inode号。另外,软链接的文件也是和一般文件不一样,这个时候显示为链接文件。

另外我们通过stat命令来查看数据块,发现软链接和硬链接他们都在一个数据块,但是他们的inode有区别,而且还可以看到,硬链接的大小都是本身所存数据的大小,而软链接的大小就不一样了。

[yuzhe@bogon 12_22]$ stat test hard_link_1 soft_link_1
  File: `test'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 3
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 03:53:29.193946464 -0800
  File: `hard_link_1'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 3
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 03:53:29.193946464 -0800
  File: `soft_link_1' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931341      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:00.429945859 -0800
Change: 2016-12-22 04:05:00.429945859 -0800
[yuzhe@bogon 12_22]$ stat soft_link_2
  File: `soft_link_2' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931342      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:11.083945668 -0800
Change: 2016-12-22 04:05:11.083945668 -0800

另外,我们需要说一下我们删除软链接被指向的文件,当我们删除了这个文件时,软链接就会变成死链接。

这里写图片描述

死链接就好像是windows当中的没有了源文件的快捷方式。当你删除了链接的文件,就找不到了,软链接更接近一种快捷方式,这种快捷方式当它的源文件被删除以后,这个时候你这个快捷方式就无用了。

但是对于死链接,你是可以恢复的,我们可以尝试着想软链接当中进行输入信息。

这里写图片描述

我们可以看到test恢复了,但是当我们使用stat再次去查看信息的时候。

[yuzhe@bogon 12_22]$ stat test hard_link_1 hard_link_2 soft_link_1 soft_link_2
  File: `test'
  Size: 4             Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931345      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:26:12.171945209 -0800
Modify: 2016-12-22 04:26:12.171945209 -0800
Change: 2016-12-22 04:26:12.171945209 -0800
  File: `hard_link_1'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 04:22:13.793945047 -0800
  File: `hard_link_2'
  Size: 16            Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 931216      Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 03:53:56.400946549 -0800
Modify: 2016-12-22 03:53:29.193946464 -0800
Change: 2016-12-22 04:22:13.793945047 -0800
  File: `soft_link_1' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931341      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:00.429945859 -0800
Change: 2016-12-22 04:05:00.429945859 -0800
  File: `soft_link_2' -> `test'
  Size: 4             Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d    Inode: 931342      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/   yuzhe)   Gid: (  500/   yuzhe)
Access: 2016-12-22 04:05:14.497945726 -0800
Modify: 2016-12-22 04:05:11.083945668 -0800
Change: 2016-12-22 04:05:11.083945668 -0800

我们发现test创建到了新的inode上了。

所以,软链接的特点有:

1)软链接邮资机的文件属性和权限

2)软链接可以对文件和目录进行创建

3)软链接可以对不存在的文件和目录进行创建软链接

4)软链接可以交叉文件系统

5)软链接的inode不一样,引用计数不会增加。

6)删除软链接不影响被指向的文件,但是被指向的文件被删除了,那么软链接就变成了一个死链接。

6.其他关于链接的命令


ls -i

用来查看文件的inode号

stat 文件

显示文件的属性,包括inode和IO Block以及大小等信息。

find 路径 -inum 123456

查找路径下inode号是123456的硬链接

find 路径 -samefile 文件

查看路径下与文件相同的inode的所有硬链接。

find 路径 -lname 文件

查看路径下该文件的软链接。

find 路径 -type l -ls

查看路径下所有软链接

5.总结


所以根据这些特性,我们可以绘制一张图来写出软链接和硬链接的关系。

这里写图片描述

当需要原文件移动后链接依然可用,这个时候使用硬链接。如果需要对文件夹创建链接或者跨文件系统,这个时候需要使用软链接。创建软链接,注意精良使用相对路径,还可以为不存在的文件创建软链接。只要链接到文件存在,这个链接就有效。



版权声明:本文为qq_26768741原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。