DDR爱好者之家 Design By 杰米

Linux 中的文件分为 Hard Link 和 Symbolic Link 两种。Hard Link 文件又被称为硬链接文件、实体链接文件,Symbolic Link 文件则常被称为符号链接、软链接文件。

ln 命令用来在文件之间建立链接。在介绍 ln 命令前,让我们先来搞清楚究竟什么是硬链接,什么又是软链接。

Hard Link(硬链接)

我们知道,在 Linux 系统中,每个文件对应一个 inode,文件的内容在存储在 inode 指向的 data block 中。要读取该文件的内容,需要通过文件所在的目录中记录的文件名找到文件的 inode 号,然后通过 inode 找到存储文件内容的 data block(参考《Linux 文件与目录》)。

也就是说,文件名存储在目录中,inode 号执行文件存储的内容,文件名和 inode 之间有一个对应关系。那么多个文件名可不可以同时指向同一个 inode 呢?答案是可以的,这就是硬链接!从本质上来说,硬链接只是在目录下新添加了一个文件名,这个文件名与一个已有文件的 inode 相关联。让我们也通过 /etc/crontab 文件来进行观察:

$ ll -i /etc/crontab
131213 -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab

使用 ln 命令在当前目录下创建一个 /etc/crontab 文件的硬链接,然后观察其文件属性:

$ sudo ln /etc/crontab .
$ ll -i /etc/crontab crontab
131213 -rw-r--r-- 2 root root 722 Nov 16 2017 crontab
131213 -rw-r--r-- 2 root root 722 Nov 16 2017 /etc/crontab

这两个文件名关联的 inode 号完全相同,都是 131213,所以它们指向的是同一个文件。同时请注意文件属性中的第三个字段,由 1 变成了 2。这个字段被称为 "链接数",它说明有多少个文件名链接到同一个文件的 inode。

另外需要注意的一点是上面所有输出中的第二个字段中的第一位,它们都是 "-",它说明这个文件的类型为普通文件,链接类型为硬链接。

我们可以通过下图来理解硬链接在文件系统中的实现方式:

详解Linux ln 命令

硬链接的特点

  • 几乎不额外占用空间
  • 只要还有一个文件名引用着文件,文件就不会被真正删除

由于硬链接只是在目录中添加了一条包含文件名和 对应 inode 的记录,所以它几乎不会消耗额外的磁盘容量。
另外在删除硬链接所关联的文件时,其实只是删除了一条目录中的记录,真正的文件并不受影响。只有在删除最后一个硬链接时才会真正删除文件的内容数据。

硬链接的局限性

  • 不能跨文件系统创建硬链接
  • 不能链接目录

由于这两个限制,实际使用中硬链接并没有软链接使用的广泛,下面我们看看究竟什么是软链接。

Symbolic Link(软链接)

软链接的实现方式与硬链接有本质上的不同。创建软链接时会创建一个新的文件(分配一个 inode 和对应的 data block),新文件的 data block 中存储了目标文件的路径。
还拿 /etc/crontab 文件举例子,这次创建一个软链接并查看其文件属性:

$ sudo ln -s /etc/crontab crontab2

详解Linux ln 命令

第一列,两个文件名对应的 inode 不同,说明这是两个文件。

第二列显示的文件权限也不一样,这一点和硬链接完全不同。注意文件类型被标记为 "l",说明这是一个软链接文件。

第三列很有意思,注意 /etc/crontab 文件的链接数量,还是 2,这和创建软链接文件 crontab2 前是一样的。也就是说创建软链接并不增加原文件的链接数。

第六列是文件大大小,注意新建的软链接文件大小为 12 Bytes,也就是字符串 "/etc/crontab" 的长度。

最后一列会友好的显示出软链接文件指向的源文件。

我们可以通过下图来理解软链接在文件系统中的实现方式:

详解Linux ln 命令

从上图我们可以看出,软链接文件 crontab2 是一个实实在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目标文件的地址:/etc/crontab。 像 open() 这样的 API 能够识别出软链接,并根据 data block 中的目标文件径把操作重定向到目标文件上。

可以链接目录是软链接的一大优势,创建目录链接的方式和普通文件一样:

$ ln -s /bin testbin

此时进入 testbin 目录和进入 /bin 目录是一样的。

更厉害的是,还可以跨文件系统创建软链接!

删除源文件

对于软链接来说,删除源链接后,链接文件就会无法找到指向的源文件了。看下面的演示:

$ echo "hello world" > hello.txt
$ ln -s hello.txt hello2
$ cat hello2
hello world
$ rm hello.txt
$ cat hello2
cat: hello2: No such file or directory

删除原文件后,操作链接文件时的提示是:"No such file or directory"。

文件的链接数

从上文中的示例我们可以看到,当创建硬链接文件时,文件的链接数会增加 1,而创建软链接时文件的链接数却不发生变化。

下面让我们看一个目录文件的链接数,先创建一个空目录:

$ mkdir /home/nick/testdir
$ ll /home/nick | grep testdir
drwxr-xr-x 2 nick nick 4096 Jul 10 08:58 testdir/

新建的空目录有两个硬链接,分别是:

/home/nick/testdir
/home/nick/testdir/.

而 /home/nick/testdir 目录下还有一个指向其父目录的硬链接:/home/nick/testdir/..
也就是说当我们创建一个目录时,其父目录的硬链接数会增加 1。

ln 命令

ln 命令用来在文件之间建立链接,其的常用方式为:

ln source target
ln -s source target

它们分别用来创建硬链接文件和软链接文件。还有一个比较常用的选项是 f,它会强制删除已经存在的目标文件。

总结

以上所述是小编给大家介绍的Linux ln 命令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。