ln命令:软链接与硬链接的区别与应用

ln命令:软链接与硬链接的区别与应用

摘要#

Linux系统中,链接是一个十分常见且实用的文件处理命令,它分为软链接和硬链接两种类型。软链接类似于Windows中的快捷方式,硬链接又有着与原文件保持同步更新的特性,两种链接方式各有特点,也各有其应用。接下来我们一起来深入认识一下这两种链接方式。

ln命令详解#

英文原意:link

命令所在路径:/bin/ln

执行权限:所有用户

语法:

Copy
ln -s [原文件] [目标文件] -s 创建软链接 默认是硬链接(不指定-s)

功能描述:生成链接文件

范例:

Copy
> ln -s /etc/issue /tmp/issue.soft #创建文件/etc/issue的软链接/tmp/issue.soft > ln /etc/issue /tmp/issue.hard #创建文件/etc/issue的硬链接/tmp/issue.hard

1. 软链接#

A. 特征:类似Windows快捷方式#

(1) lrwxrwxrwx 其中l 表示软链接。任何新建的软链接文件权限都为rwxrwxrwx,此权限不决定原文件权限

(2) 文件大小-只是符号链接,非常小,一般只有十几个字节,与原文件大小无关

(3) /tmp/issue.soft->/etc/issue 箭头指向原文件

B. 应用场景:#

Copy
Q:什么时候用软链接文件? A:需要快捷方式的时候就用软链接文件,只是为了便于管理和使用。

2. 硬链接#

A. 特征:#

(1) 相当于 拷贝(cp -p) + 同步更新 的功能

实验:

这里默认已经执行了范例中的命令创建了软/硬链接

Copy
[root@centos7-master /]# cat /etc/issue #查看当前原文件内容 \S Kernel \r on an \m [root@centos7-master /]# cat /tmp/issue.hard #查看当前硬链接内容 \S Kernel \r on an \m [root@centos7-master /]# echo "this is a test" >> /etc/issue #向原文件末尾追加新内容 [root@centos7-master /]# cat /etc/issue #查看更新后原文件内容 \S Kernel \r on an \m this is a test [root@centos7-master /]# cat /tmp/issue.hard #查看原文件更新后硬链接的内容 \S Kernel \r on an \m this is a test #可以看到,这里硬链接与原文件保持了同步更新 [root@centos7-master /]# rm /etc/issue #删除原文件 rm: remove regular file ‘/etc/issue’? y [root@centos7-master /]# cat /tmp/issue.soft #检验软链接是否仍有效 cat: /tmp/issue.soft: No such file or directory [root@centos7-master /]# cat /tmp/issue.hard #原文件就算删除或丢失,硬链接依然可以访问 \S Kernel \r on an \m this is a test

上述实验我们可以看到,原文件有修改和更新,则硬链接也同步会进行更新;且原文件就算删除或丢失,硬链接依然可以访问,即如同拷贝(cp -p) + 同步更新功能。

(2) 可通过i节点识别。

一个文件一定有一个i节点,一个i节点不一定只对应一个文件。某文件的i节点和某文件的硬链接的i节点一般相同。当我们把原文件删除,硬链接依然会映射到对应的i节点。

关于i节点的知识,请浏览这篇文章:——————

实验:

软链接很好判断,如果软链接对应的原文件被删除后,我们通过ls查看软链接的文件信息,会发现软链接被标红,并不停闪烁。

原文件被删除后的软链接被标红并闪烁

如何判断硬链接呢?我们分别创建软/硬链接后查看i节点编号。

Copy
[root@centos7-master tmp]# cd /tmp [root@centos7-master tmp]# ln issue.bak issue.bak.hard [root@centos7-master tmp]# ln -s issue.bak issue.bak.soft [root@centos7-master tmp]# ls -i issue.bak issue.bak.hard issue.bak.soft 8395173 issue.bak 8395173 issue.bak.hard 9116906 issue.bak.soft

可以看到,原文件的i节点编号是8395173,硬链接也是对应8395173编号的i节点的一个映射,而软链接的i节点编号则不同。

这样我们也可以十分容易理解为什么硬链接可以同步更新了,因为当我们对原文件进行修改操作时,在内核层面来看,这个操作实际上是针对对应的i节点进行操作,因为该i节点同时映射到了两个文件,所以硬链接也自然能体现出同步更新。

(3) 硬链接不能跨分区,但软链接可以

Copy
[root@centos7-master tmp]# ln /tmp/issue.bak /boot/issue.bak.hard ln: failed to create hard link ‘/boot/issue.bak.hard’ => ‘/tmp/issue.bak’: Invalid cross-device link # 根分区/ 和 /boot分区不属于同一个分区 [root@centos7-master tmp]# ln -s /tmp/issue.bak /boot/issue.bak.soft

这相当于在Windows下将C盘的一个文件硬链接到D盘,是不被系统允许的。

(4) 硬链接不能针对目录使用,但软链接可以

Copy
[root@centos7-master tmp]# ln /tmp /root/tmp.hard ln: ‘/tmp’: hard link not allowed for directory [root@centos7-master tmp]# ln -s /tmp /root/tmp.soft

这相当于在Windows下将D盘的一个目录软链接到桌面,系统是允许的。

B. 应用场景:#

硬链接使用场景并不多,但可以将其作为一个实时备份来使用。

参考文献#

[1] 兄弟连.兄弟连Linux入门视频教程[DB/OL].http://c.biancheng.net/view/1713.html,2018-12-21/2020-05-04

posted @   JasonCeng  阅读(1239)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
CONTENTS