linux 硬链接和软链接深入理解

时间:2022-06-01 19:52:13

在学习linux的过程中,我经常把软硬链接,所以今天专门查了一些资料,然后整合在自己的博客中,方便以后复习,查看。

一方面也是因为看了vamei的linux的概念与体系系列文章,感觉不全的做些补充。

简而言之:

软链接相当于windows中的快捷方式

硬链接相当于一个灾备系统,数据存放在两处,与复制不同的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外一处数据如果被删除了,不会影响到另一处的数据.

下面是详细的介绍:

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)

软链接文件

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。 链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。

命令格式:

代码: ln [-s] source_path target_path 硬链接文件

info ln 命令告诉您,硬链接是已存在文件的另一个名字,硬连接的命令是:

代码: ln -d existfile newfile //如果不加任何参数,默认情况下是硬链接.

硬链接文件

硬链接文件有两个限制:

1、不允许给目录创建硬链接;

2、只有在同一文件系统中的文件之间才能创建链接。

对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了原有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修

改.

代码:

$ cp /etc/httpd/conf/httpd.conf /usr/sam

$ ln httpd.conf httpd1.conf (硬链接)

$ ln -s httpd.conf httpd2.conf (软链接)

第一条为硬链接,第二条为软链接

代码:

$ ls -li //查看一个文件或目录的inode,要通过ls 命令的的 -i参数,inode值相同的文件,他们的关系是互为硬链接的关系

代码:

总用量 80

1077669 -rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd1.conf (连接数变为2)

1077668 lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf -> httpd.conf (类似于Win快捷方式)

1077669 -rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd.conf (连接数变为2)

可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的

,而软链接不一样.对http1.conf进行编辑,可以发现httpd.conf也发生了一样的变化.

代码:

$ rm httpd.conf

现在删除链接的源文件,来比较不同之处

代码:

$ ls -l

总用量 44

drw-r--r-- 2 sam adm 4096 10月 30 20:14 file6

-rw-r--r-- 1 sam adm 34890 10月 31 00:57 httpd1.conf

lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf -> httpd.conf

发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件.

详细示例分析(截图):

linux 硬链接和软链接深入理解

查看硬链接ln关联的所有文件及路径

ls -i myInfo.txt

3814056 myInfo.txt

find / -inum 3814056

/home/homer/me/myInfo.txt

/home/homer/me/.me/myInfo.txt_ln

/home/homer/bin/myInfo.txt

一 链接文件

链接有两种方式,软链接和硬链接。

1 软链接文件

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。

链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。

用ln -s 命令可以生成一个软连接,如下:

[root@linux236 test]# ln -s source_file softlink_file

在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。

2 硬链接文件

info ln 命令告诉您,硬链接是已存在文件的另一个名字(A "hard link" is another name for an existing file),这多少有些令人困惑。硬连接的命令是

ln -d existfile newfile

硬链接文件有两个限制

1)、不允许给目录创建硬链接;

2)、只有在同一文件系统中的文件之间才能创建链接。

对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。

这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。

二 两者之间的区别

硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。

在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。

软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

而硬链接就没有上面的缺陷,你想怎么移就怎么移

软链接相当于windows中的快捷方式。硬链接相当于一个灾备系统,数据存放在两处,与复制不同的是两处之间存在同步机制,一处数据的改变会实时同步到另一处,另外,一处数据如果被删除了,不会影响到另一处的数据.

详细的介绍:

硬连接指向的是节点(inode),是已存在文件的另一个名字,修改其中一个,与其连接的文件同时被修改;对硬链接文件进行读写和删除操作时候,效果和软链接相同。但如果我们删除硬链接文件的源文件, 硬链接文件仍然存在,而且保留了原有的内容。这时,系统就“忘记”了它曾经是硬链接文件,而把他当成一个普通文件。 硬链接文件有两个限制: 1、不允许给目录创建硬链接; 2、只有在同一文件系统中的文件之间才能创建链接。

软链接指向的是路径,又叫符号链接,这个文件包含了另一个文件的路径名可以是任意文件或目录,还可以链接不同文件系统的文件,和win下的快捷方式差不多。软链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己,类似于编程语言中的递归。

示例

ln exitfile newfile

ln -s exitfile newfile

这里的newfile为创建的链接名字,第一个没有参数,默认是硬链接,第二个 -s 表示是软链接。

ls -il 可以查看文件的inode号等属性,例如:

[root@server tmp]# touch file

[root@server tmp]# ln file file1

[root@server tmp]# ln -s file file2

[root@server tmp]# ls -il

total 0

27127 -rw-r--r--. 2 root root 0 Nov 20 10:40 file

27127 -rw-r--r--. 2 root root 0 Nov 20 10:40 file1

27132 lrwxrwxrwx. 1 root root 4 Nov 20 10:40 file2 -> file

在 /tmp 目录下,创建名为file的文件,先后创建硬链接file1,软链接file2.观察ls -il的输出

file 和 file1 的inode是一样的,所以可以说硬链接是指针指向同一个inode,系统并不为他重新分配inode。file2指向file,说明file2是软链接,inode号也发生变化,

若删除原始文件file,硬链接继续使用,但软链接就失效了。这点与win下的快捷方式类似。

这里需要强调的是,ls -l 命令输出中的第3个字段内容,此为inode链接数,只要不为0,对于硬链接来说,文件就一直存在,不管你删的是源文件还是之前生成的硬链接。