你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

你知道Linux系统中“软链接”和“硬链接”的区别吗?

[复制链接]
gaosmile 发布时间:2020-4-18 18:24
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。% d0 i' N3 p- a, }- m" l

  s4 `( K8 j' D: Y8 I$ R" t: ~. |在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。而有一种方法可以快速的寻找到数据元,那就是软硬链接,让我们一起来看一下吧。
5 C, W/ U* o- `! q
什么是链接?
+ R: w5 O+ ^/ X2 k/ h9 d
链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。

8 w# \! i# ?/ }9 D" N* }  H
它是用来干什么的?

5 Y  z9 o, `3 u: x9 I
你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。
* G. Y2 \3 T! S8 E) V5 Y( c8 b1 F+ G
软链接和硬链接的区别是?
. d1 n: I% k! S% v) d8 @9 W; c

. D" \+ `' t5 T- C' H( m2 G
首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。那区别在哪呢?在底层的原理上。为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建:& V9 t8 b, F7 o% Q: X7 O
$ touch myfile && echo "This is a plain text file." > myfile
0 Y* m  d1 e$ W9 m" h$ cat myfile
( p7 `. O! w* m; wThis is a plain text file.
& ]$ o0 l* r2 I. v
/ g& R0 T1 y- n1 O! u
& P3 B5 _, o$ z/ H

) g( h; i+ }$ t, A& q) S+ U
现在我们创建了一个普通地不能再普通的文件了。然后我们对它创建一个硬链接,并查看一下当前目录:
3 g( b0 ]$ O# u" K" n6 `$ ln myfile hard
7 }  s5 W% y$ A6 _6 A% I$ ls -li
! b" ^. t0 g; b25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 hard& f( ~% l' M$ ]5 \
25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 myfile
- F' U& \/ w5 d2 y7 r: w1 _0 E/ D
5 Y# M/ c% e2 n6 }, y/ E) Z

3 d7 l+ q6 j: b# w: F5 y
/ R- c& c8 s! m# U
在 ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。

) l8 q# g3 R: L; h7 W( i
然后我们修改一下刚才创建的 hard 链接文件:

* Q5 X& [+ L5 W8 \" r* ~
$ echo "New line" >> hard
0 {5 R4 i" B( B" R# a6 W$ cat myfile
( \/ ]. z9 Y) c# x2 {2 GThis is a plain text file.
! j5 k# |( Q0 Y3 {  h" J* O! DNew line

. j0 N, x: ^; @% P6 V% b

: K* r# V1 f8 S- Z5 V% h
0 b' z0 M  ?% f" S( s
可以看到,这两个文件果真就是一个文件。下面我们看看软链接(也就是符号链接)和它有什么区别。
! F7 X) n8 E7 i) \$ ln -s myfile soft
+ O$ D; ~. Q$ g6 P' ~( f/ B9 K$ ls -li$ t' @' O/ w4 G* _
25869085 -rw-r--r-- 2 unixzii staff 36 7 8 17:45 hard8 t; ^& Q6 k, O) g
25869085 -rw-r--r-- 2 unixzii staff 36 7 8 17:45 myfile
- s/ K. Z! {5 R1 o2 G; s: M! o25869216 lrwxr-xr-x 1 unixzii staff 6 7 8 17:47 soft -> myfile
# x  K+ U. z/ Y# b! F

/ ]- m$ s1 p' |2 n; S1 ?- V' M9 J9 o

7 W% @8 s% e* A

+ j8 v7 w  l$ |* F  G" h4 t
诶,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上也有一个 l 的 flag,这就说明它与之前我们创建的两个文件根本不是一个类型。
" e* j' V0 ?( x* u; I2 f5 z
下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容:

- g; B, O' q# K$ N5 n& @
$ rm myfile6 c1 ^3 [' t/ @
$ cat hard
+ a0 w! D, `& g  B# \This is a plain text file.
3 o6 K$ {: }/ J* N+ g; dNew line+ l3 j( n/ q/ G+ b7 ^+ [- q
$ cat soft
; h7 F, f0 G* P9 K# h! `cat: soft: No such file or directory
4 Z  Y" n* v$ S: q7 }
/ b2 }7 a! A# @0 O8 a# o

: k: `2 |7 f/ j# k
6 c$ s) R+ k: k- j: T1 E% V2 E! \$ Q
之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。
2 p' _" w3 j' z# O7 J& @
为验证这一猜想,我们再向这个软链接写点东西:

) ^6 G  C3 C  C, k
$ echo "Something" >> soft$ d# ?& s! b; _2 W6 G, N/ L, j
$ ls4 v$ o3 f/ m$ v+ ~( b5 J' I0 j
hard myfile soft
6 u( a- t* Y( v+ G3 ~6 I3 m

4 A7 W7 ^4 G: S4 N$ M# Q# P& B1 V; J

2 V4 r4 ^% x! R/ O7 J

$ H' x: \" {5 `
可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。* t' v& [3 N: b9 ]% e
$ echo "Something" gtgt soft$ lshard myfile soft
" ]5 U" h2 o8 d, g/ P. t! ^! w) M. K# C( b9 E6 u/ D
可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。

. ~- Y8 J0 ?% ]. ]9 l( o  T
到这里我们其实可以总结一下了:
7 D, a2 R% G: j( f3 O
硬链接:与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块* R, `- n, o3 b5 V$ F: _+ |' t
软链接:保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。

2 x: l  V6 P5 _
赞 收藏 评论0 发布时间:2020-4-18 18:24

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版