先说个场景,你肯定遇到过:想给网站的某个目录换个地方存,又不愿意改程序里的路径;或者程序要用的一个文件放在很深很深的目录里,每次找都烦。这时候Linux的链接就派上用场了。可链接这玩意儿分两种,软链接和硬链接,名字差一个字,性格差十万八千里。我见过不少老手都说不清它俩的区别,今天咱们就拿个日常例子,一次把它俩掰扯清楚。

先打个比方,秒懂
把一份文件的数据想成仓库里的一箱货。硬链接是什么?是这箱货在仓库门口挂了两个牌子,一个写A门,一个写B门,从哪个门进去都能拿到同一箱货。你拆掉A门的牌子,B门的牌子还在,货照样能拿。软链接呢?它不是牌子,是墙上贴的一张纸条,写着:货在A门。纸条本身不是货,哪天A门拆了(原文件删了),纸条还在,但照着纸条去找,啥也找不到,纸条就成了废纸。这么一比划,是不是清楚多了?
命令长这样,先敲会再说
创建链接用的是ln命令:ln 原文件 链接名 创建的是硬链接;ln -s 原文件 链接名 创建的是软链接,-s就是symbolic,符号链接的意思。想看它俩的区别,用ls -li,-i是显示inode号,硬链接和原文件inode号是一样的,说明是同一个货;软链接inode号不同,而且大小特别小,因为它里面就存了一行路径文字。软链接用ls -l看,还会用箭头标出来它指向哪,特别直观。
区别都在这儿,对号入座
硬链接有个死规矩:不能跨文件系统,就是说原文件在系统盘,你想在数据盘建它的硬链接,不行;而且不能给目录建硬链接。软链接就没这些限制,跨分区、指向目录都行,所以日常使用里软链接占了绝大多数场景。还有个关键区别:原文件删了,硬链接照样能打开文件内容,因为它俩本来就是同一份数据;软链接就傻眼了,直接变成失效链接,ls -l里会显示红字或者提示No such file。
我打个现实的比方帮你想:软链接就是Windows桌面的快捷方式,快捷方式指向的程序被删了,快捷方式就没用了;硬链接更像是同一个文件在另一个文件夹里的副本——不对,比副本还省空间,因为压根是同一份数据,只是多挂了个名。
啥时候用软链接,啥时候用硬链接
日常场景几乎全是软链接:网站根目录想挂到数据盘,用软链接指过去;日志目录搬到新磁盘,用软链接保持老路径还能用;装软件想做个版本切换,把/usr/bin/python软链到不同版本,改一行就换版本。硬链接用得少,但在某些场景很香:比如你想让一个文件不那么容易被误删,多挂几个硬链接名,得把名字都删光数据才没,等于多了几道保险;再就是日志轮转、备份这类希望文件不被意外清掉的场景。
新手最爱踩的几个坑
第一,给目录建硬链接会被系统直接拒绝,别硬来。第二,软链接删的是链接本身,原文件好端端的,别以为删链接就是删文件,也别反过来把原文件删了还纳闷链接为啥变红。第三,用编辑器改软链接指向的文件时留个心眼,有的编辑器是另存新文件再替换,这么一搞软链接就变成普通文件了,指向关系丢了,得重新建。第四,创建软链接的时候路径别写错,写相对路径的话,链接一挪地方就容易失效,图省事就直接写绝对路径。
顺手讲讲 ln 的日常骚操作
链接除了上面说的用法,还有几个特别实用的场景值得记一下。比如升级软件不想动配置文件,可以把新版本装到新目录,然后把配置文件的软链接指向新目录,改一行就切换版本,出问题还能马上切回来。再比如网站上线想做个A/B目录切换,把当前版本目录软链成固定名字,程序永远引用那个固定名字,发版就换链接,零停机。这些招看着简单,用好了能省不少发布上的麻烦。
还有个事儿得提醒:用tar打包软链接目录的时候,默认会把链接指向的文件内容一起打包进去,解压出来链接就变真文件了,体积还翻倍。想保留链接本身,打包加个参数,-h是跟随链接,不加-h就是保留链接,按需选,别稀里糊涂把几百G的链接目录打成几T的包,那场面我见过,磁盘直接爆。
收尾之前,说个排查小技巧
哪天你发现程序报找不到文件,先看看是不是软链接失效了:ls -l看一眼那个链接,指向的文件还在不在;或者readlink 链接名,直接读出它指向哪。真失效了也别慌,原文件还在就重建一条链接,一条命令的事。要是原文件也没了,那就得从备份里捞了——说到备份,上篇文章讲的3-2-1原则,这时候就体现出价值了,所以说知识都是串起来的。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!