|
我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。 用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。% d0 i' N3 p- a, }- m" l 在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。而有一种方法可以快速的寻找到数据元,那就是软硬链接,让我们一起来看一下吧。 什么是链接? + R: w5 O+ ^/ X2 k/ h9 d 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。它是用来干什么的? * G. Y2 \3 T! S8 E) V5 Y( c8 b1 F+ G 软链接和硬链接的区别是? $ touch myfile && echo "This is a plain text file." > myfile $ cat myfile This is a plain text file.& ]$ o0 l* r2 I. v / g& R0 T1 y- n1 O! u & P3 B5 _, o$ z/ H $ ln myfile hard $ ls -li 25869085 -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 / R- c& c8 s! m# U 在 ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。然后我们修改一下刚才创建的 hard 链接文件: $ cat myfile This is a plain text file. New line 0 b' z0 M ?% f" S( s 可以看到,这两个文件果真就是一个文件。下面我们看看软链接(也就是符号链接)和它有什么区别。$ ln -s myfile soft $ 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 25869216 lrwxr-xr-x 1 unixzii staff 6 7 8 17:47 soft -> myfile# x K+ U. z/ Y# b! F " e* j' V0 ?( x* u; I2 f5 z 下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容: $ cat hard This is a plain text file. New line+ l3 j( n/ q/ G+ b7 ^+ [- q $ cat soft cat: soft: No such file or directory4 Z Y" n* v$ S: q7 } / b2 }7 a! A# @0 O8 a# o 之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。 2 p' _" w3 j' z# O7 J& @ 为验证这一猜想,我们再向这个软链接写点东西: $ ls4 v$ o3 f/ m$ v+ ~( b5 J' I0 j hard myfile soft6 u( a- t* Y( v+ G3 ~6 I3 m $ echo "Something" gtgt soft$ lshard myfile soft ! w) M. K# C( b9 E6 u/ D 可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。 到这里我们其实可以总结一下了: 7 D, a2 R% G: j( f3 O 硬链接:与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块* R, `- n, o3 b5 V$ F: _+ |' t软链接:保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。 |
微信公众号
手机版