Linux中硬链接和软链接的区别和联系

        硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一。通过剖析硬链接与软链接的联系与区别,我们可更好的了解 Linux 中 VFS 这一通用文件模型。并让 Linux 普通用户和系统管理员正确使用硬链接与软链接,帮助文件系统开发者获取 inode 的相关知识。

        我们知道文件都有文件名与数据,这在Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。

        如下图所示通过文件名访问文件


  链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。 

 一、硬链接 

  硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。可以用:ln命令来建立硬链接。语法:

ln [options] existingfile newfile
ln[options] existingfile -list directory
用法: 第一种:为”existingfile”创建硬链接,文件名为”newfile”。第二种:在”directory”目录中,为 ”existingfile-list”中包含的所有文件创建一个同名的硬链接。常用可选[options] –f 无论”newfile”存在与否,都创建链接。-n 如果”newfile”已存在,就不创建链接。 


下面举一些例子:

总计 8
1848715 -rw-r--r-- 1 root root 759 01-0717:09 file1
1848717 -rw-r--r-- 1 root root 320 01-0717:09 file2
[root@localhost test]# ln file1 file1hard
[root@localhost test]# ll -i
总计 12
1848715 -rw-r--r-- 2 root root 759 01-0717:09 file1
1848715 -rw-r--r-- 2 root root 759 01-0717:09 file1hard
1848717 -rw-r--r-- 1 root root 320 01-0717:09 file2
[root@localhost test]#

  注意在创建链接前,file1 显示的链接数目为1,创建链接后

(1)file1和file1hard的链接数目都变为2;

(2) file1和file1hard在inode号是一样的

(3) file1和file1hard显示的文件大小也是一样。

        可见进行了ln命令的操作结果:file1和file1hard是同一个文件的两个名字,它们具有同样的索引节点号和文件属性,建立文件file1的硬链接,就是为file1的文件索引节点在当前目录上建立一个新指针。
  链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。

  还可以在不同目录,但同一文件系统中建立文件的硬链接。设file1、file2在目录/root/apue/12/test中,下面的命令,在/root/apue/12/test2中建立file2的硬链接。

 

[root@localhost test2]# ln/root/apue/12/test/file2 file2hard
[root@localhost test2]# ll -i
总计 4
1848717 -rw-r--r-- 2 root root 320 01-0717:09 file2hard

  下面的程序,是将/root/apue/12/test目录中所有文件,在目录/root/apue/12/test2中建立硬链接

[root@localhost test2]# ln/root/apue/12/test/* .
[root@localhost test2]# ll -i
总计 16
1848715 -rw-r--r-- 4 root root 759 01-0717:09 file1
1848715 -rw-r--r-- 4 root root 759 01-0717:09 file1hard
1848717 -rw-r--r-- 3 root root 320 01-0717:09 file2
1848717 -rw-r--r-- 3 root root 320 01-0717:09 file2hard

  如果使用了 ln –f existingfile newfile,如果newfile已经存在,则无论原来newfile是什么文件,只要当前用户对它有写权限,newfile就成为exisitngfile的硬链接文件。 

  尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:

(1)不可以在不同文件系统的文件间建立链接
(2)不能为目录创建硬链接,硬链接不能对目录创建是受限于文件系统的设计。

二、软链接(符号链接)

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

  建立软链接,只要在ln后面加上选项 –s,下面举个例子

[root@localhost test]# ls -il
总计 12
1848715 -rw-r--r-- 5 root root 759 01-0717:09 file1
1848715 -rw-r--r-- 5 root root 759 01-0717:09 file1hard
1848717 -rw-r--r-- 2 root root 320 01-0717:09 file2
[root@localhost test]# ln -s file1file1soft
[root@localhost test]# ll -i
总计 12
1848715 -rw-r--r-- 5 root root 759 01-0717:09 file1
1848715 -rw-r--r-- 5 root root 759 01-0717:09 file1hard
1848716 lrwxrwxrwx 1 root root   5 01-07 17:54 file1soft -> file1
1848717 -rw-r--r-- 2 root root 320 01-0717:09 file2

   从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。区别:硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了,file1大小是48B,而file1soft是5B,这里面的5实际上就是“file1”的大小。 

  总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。
     当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了。 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值