在Linux系统里文件链接有两种——符号链接和硬链接
一、符号链接(Symbolic Link)
相对于硬链接,故有时称为软链接,其相当于Windows系统下的快捷方式。
1、创建符号链接
ln -s [链接指向的文件][链接名]
但是在 share 目录内同样创建链接却失败了,这些文件是从Windows中,通过VMWare虚拟机共享进Linux的,而虽然此种操作在Linux系统中很常见,但Windows不支持,其实是因为windows下的文件系统不支持这种操作,而Linux的文件系统才能支持链接文件这种操作,所以编译会报错。
2、符号链接和源文件区别
我们发现首先文件类型不同,符号链接是 l (符号链接文件),源文件是普通文件;拥有者和用户组不同(创建时用户不同造成的);文件大小不同,符号链接比源文件要小很多;文件名字同样也不同。唯一相关的是打开的内容是一样的,因为符号链接就是链接到源文件的。当源文件路径被修改后,符号链接失效(这和windows下快捷方式一样);当再次恢复源文件路径,符号链接再次生效。如下图所示:
二、硬链接
1、Linux 文件的存储:
文件的实际数据存储在 Data Block 区,而文件的唯一标识 Inode-number 及其他属性存储在 Inode 区的一个 Inode 中,Inode 和 Inode-number 是一一对应的,Linux 中通过文件的 Inode 找到到 Data Block 区的数据部分,在一个硬盘分区中,不可能有两个文件公用一个 Inode,自然也不可能有两个文件的 Inode-number 是一样的(不同分区就说不定了)。把硬盘分区中的所有文件比作一本书,那 Inode 区就是书的目录,Data Block 区就是内容。可以通过 ls -il 查看文件的 Inode-number (文件最前面的数字),现在我们也能看到符号链接和源文件的 Inode-number 同样是不一样的。
Linux 的文件查找是这样:Filename(文件名) → Inode-number → Inode → Data(数据)
2、硬链接创建
硬链接就是让一个 Inode-number 对应多个文件名,文件 Inode 和数据都没变,只是文件多了一个名字
ln -s [链接指向的文件][链接名]
但是在 share 目录内同样创建链接却失败了,这些文件是从Windows中,通过VMWare虚拟机共享进Linux的,而虽然此种操作在Linux系统中很常见,但Windows不支持,其实是因为windows下的文件系统不支持这种操作,而Linux的文件系统才能支持链接文件这种操作,所以编译会报错。
如果在家目录下同样创建 share 目录下文件的硬链接也会报错,因为两者不属于同一个文件系统(相当于不属于同一个分区),当我们把 share 目录下文件拷贝到家目录下后便可以创建硬链接了
2、硬链接、符号链接和源文件区别
由此看出,符号链接和源文件属性基本不同,硬链接和源文件属性完全一致,这正如硬链接的定义一样,它们本质上是一个文件,多了一个名字而已,同时我们发现文件硬链接数目由 1 变成了 2。
3、删除源文件后,硬链接和符号链接的区别
这是我们发现符号链接已经断链了,而硬链接完全不受影响,只是硬链接数目减少一个而已。
当我们把该源文件所有的硬链接都删除了,也就相当于链接不到 Data Block 中的数据了(相当于windows里文件删除),但是并不代表 Data Block 中的数据丢失了,当我们使用某种方法重新寻找到 Data Block 中数据对应的 Inode-number 时,我们又能查看源文件了,这就是数据恢复了,但是当 Data Block 中的数据被其他文件全面覆盖了,那就真正意义上的文件丢失了。