linux 软连接和硬链接的区别

来源:互联网 发布:linux c语言创建线程 编辑:程序博客网 时间:2024/05/21 18:48

4点不同 :
(1)软连接可以 跨文件系统 ,硬连接不可以 。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln aa.txt /root/bb 失败 。
(2)关于 I节点的问题 。硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加 ,只要结点的连接数不是 0,文件就一直存在 ,不管你删除的是源文件还是 连接的文件 。只要有一个存在 ,文件就 存在 (其实也不分什么 源文件连接文件的 ,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候 ,其他的 文件都会做同步的修改 。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以 删除连接文件 对源文件无影响,但是 删除 源文件,连接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软连接可以对一个不存在的文件名进行连接 。
(4)软连接可以对目录进行连接。

备注:I节点 :它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点 含有关于文件的大部分的重要信息,包括文件数据块在磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.

=============================================================

http://www.shocr.com/linux-hard-link-and-soft-link-the-difference-between/

 

虽然linux ln 建立链接文中提到了在linux下如何建立硬链接和软连接,但是仍然有很多童鞋不知道硬链接和软连接的区别.

所以呢,今天Redhat有必要详细介绍下linux 下硬连接与软连接的区别.

首先我们需要了解linux下硬链接以及软连接的基本概念.

硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用.

软连接:也成符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似.

下面详细介绍一下硬链接和软连接之间的区别.

1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识);而软链接不共享 inode,也可以说是个特殊的 inode,所以和原来的 inode 有区别。

2.若原文件删除了,则该软连接则不可以访问,而硬连接则是可以的。

3.由于符号链接的特性,导致其可以跨越磁盘分区,但硬链接不具备这个特性.

另外在转载一下网上的介绍.

硬链接(hard link)

   UNIX文件系统提供了一种将不同文件链接至同一个文件的机制,我们称这种机制为链接。它可以使得单个程序对同一文件使用不同的名字。这样的好处是文件系统只存在一个文件的副本。系统简单地通过在目录中建立一个新的登记项来实现这种连接。该登记项具有一个新的文件名和要连接文件的inode号(inode与原文件相同)。不论一个文件有多少硬链接,在磁盘上只有一个描述它的inode,只要该文件的链接数不为0,该文件就保持存在。硬链接不能对目录建立硬链接!

   硬连接是直接建立在节点表上的(inode),建立硬连接指向一个文件的时候,会更新节点表上面的计数值。举个例子,一个文件被连接了两次(硬连接),这个 文件的计数值是3,而无论通过3个文件名中的任何一个访问,效果都是完全一样的,但是如果删除其中任意一个,都只是把计数值减1,不会删除实际的内容的, (任何存在的文件本身就算是一个硬连接)只有计数值变成0也就是没有任何硬连接指向的时候才会真实的删除内容。

软链接(symbolic link)

   我们把符号链接称为软链接,它是指向另一个文件的特殊文件,这种文件的数据部分仅包含它所要链接文件的路径名。软链接是为了克服硬链接的不足而引入的,软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接:文件名 + 数据部分-->目标文件的路径名)。软件有自己的inode,并在磁盘上有一小片空间存放路径名。因此,软链接能够跨文件系统,也可以和目录链接!其二,软链接可以对一个不存在的文件名进行链接,但直到这个名字对应的文件被创建后,才能打开其链接。

 

==============================================================

http://witmax.cn/linux-links.html

linux系统下提供ln指令来进行文件链接。文件链接分为硬链接和软链接两种。

习惯看英文的同学建议看Hard links and Soft links这篇。

硬链接Hard link

由于linux下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向原文件inode的指针,系统并不为它重新分配inode和创建文件;即硬链接文件和原文件其实是同一个文件,只是名字不同。每添加一个硬链接,文件inode的链接数就加1;删除一个硬链接,inode的链接数减1,文件内容依然存在,直到inode的链接数为0,才删除inode对应的文件。

可以用ln命令来建立硬链接。语法:

 

1
2
ln [options] existingfile newfile
ln [options] existingfile-list directory

用法:

  • 第一种:为 existingfile 创建硬链接,文件名为 newfile 。
  • 第二种:在 directory 目录中,为 existingfile-list 中包含的所有文件创建一个同名的硬链接。

常用选项[options]

  • -f 无论 newfile 存在与否,都创建链接。
  • -n 如果 newfile 已存在,就不创建链接。

例子:

1
2
3
4
5
6
7
8
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
$ ln file2 file2hard
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard

注意:在创建链接前,file1 显示的链接数目为1,创建链接后(1)file1和file1hard的链接数目都变为2;(2) file1和file1hard在inode号是一样的(3) file1和file1hard显示的文件大小也是一样。可见进行了ln命令的操作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file1的硬链接,就是为file1的文件索引节点在当前目录上建立一个新指针。你可以删除其中任何一个,如rm file2 ,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针删除,也即链接数减为0时,系统才会把文件内容从磁盘上删除。

硬链接的不足:

  1. 不可以在不同文件系统的文件间建立链接
  2. 只有超级用户才可以为目录创建硬链接

软链接Soft link(符号链接symbolic link)

软链接也叫符号链接,它是指向另一个文件的特殊文件,这种文件的数据部分仅包含它所要链接文件的路径名。软链接是为了克服硬链接的不足而引入的,软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针软链接:文件名+ 数据部分–>目标文件的路径名)。软链接有自己的inode,并在磁盘上有一小片空间存放路径名。因此,软链接能够跨文件系统,也可以和目录链接!其二,软链接可以对一个不存在的文件名进行链接,但直到这个名字对应的文件被创建后,才能打开其链接。

软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接,如同Windows下的快捷方式。

给ln命令加上-s选项,则建立软链接。如果[链接名]已经存在但不是目录,将不做链接。[链接名]可以是任何一个文件名,也可以是一个目录,并且允许它与原文件不在同一个文件系统中。如果[链接名]是一个已经存在的目录,系统将在该目录下建立一个或多个与原文件同名的文件,此新建的文件实际上是指向原文件的符号链接文件。

例子:

01
02
03
04
05
06
07
08
09
10
$ ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
$ln –s file1 file1soft
$ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1

总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现它是个链接文件,系统读取链接文件找到真正要访问的文件然后打开。

软链接的缺点:

因为软链接文件包含的是原文件的路径信息,所以当原文件从一个目录移到其他目录中,再访问链接文件,系统会提示找不到,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径,其实很小。

区别总结

软链接与硬链接的区别不仅仅是在概念上,在实现上也是不同的,整理如下:

  • 对于硬链接,原文件和硬链接文件公用一个inode号,这说明他们是同一个文件,而对于软链接,原文件和软链接文件拥有不同的inode号,表明他们是两个不同的文件;
  • 在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
  • 链接数目是不一样的,软链接的链接数目不会增加;
  • 文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5实际上就是“file1”的大小。
  • 在同一文件系统下,可以创建软链接或硬链接(同文件系统不同目录下也可以)。

操作实验

以下晴枫做了个实验,把上文提到的硬链接和软链接的区别体验了一遍,明白上面的原理也就很容易理解下面操作的结果了

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
$ echo "in a.txt" > a.txt
$ cat a.txt
in a.txt
$
$ ln a.txt b.txt
$ echo "add to b.txt" >> b.txt
$ cat a.txt
in a.txt
add to b.txt
$ cat b.txt
in a.txt
add to b.txt
$
$ ls -li
total 8
20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 a.txt
20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 b.txt
$
$ ln -s a.txt c.txt
$ ls -li
total 8
20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 a.txt
20327264 -rw-r--r-- 2 znan sybase 22 Nov  9 00:54 b.txt
20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt
$
$ echo "add to c.txt" >> c.txt
$ cat a.txt
in a.txt
add to b.txt
add to c.txt
$ cat b.txt
in a.txt
add to b.txt
add to c.txt
$ cat c.txt
in a.txt
add to b.txt
add to c.txt
$
$ mv a.txt d.txt
$ ls -li
total 8
20327264 -rw-r--r-- 2 znan sybase 35 Nov  9 00:56 b.txt
20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt
20327264 -rw-r--r-- 2 znan sybase 35 Nov  9 00:56 d.txt
$ cat b.txt
in a.txt
add to b.txt
add to c.txt
$ cat c.txt
cat: c.txt: No such file or directory
$
$ echo "add to d.txt" >> d.txt
$ cat b.txt
in a.txt
add to b.txt
add to c.txt
add to d.txt
$
$ rm b.txt
$ ls -li
total 4
20327265 lrwxrwxrwx 1 znan sybase  5 Nov  9 00:55 c.txt -> a.txt
20327264 -rw-r--r-- 1 znan sybase 48 Nov  9 00:58 d.txt

参考:关于硬链接和软连接(符号链接)的区别

原创粉丝点击