热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

linux不允许将硬链接指向目录,为什么UNIX/Linux不允许目录硬链【翻译】

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?导语:在学习Linux文件系统的硬链接和符号连接

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

导语:

在学习Linux文件系统的硬链接和符号连接时,我也产生了这个疑问。搜索找到几篇中文资料,总感觉像是隔靴搔痒,似懂非懂。改用英文搜索,找到了这篇文章,短短几句话,一针见血,深入浅出。于是翻译出来与大家分享。

提问:

教科书中说,Unix/Linux不允许硬链接指向目录,但软链接却可以。这是因为目录的硬链接会在文件系统中产生循环吗?还是因为如果我们给目录创建了硬链接后再删除原目录,会导致硬链接指向垃圾数据呢?若只是因为文件系统循环就禁用目录硬链接的话,那为什么又允许使用目录的软链接呢?

回答:

硬链接指向目录是行不通的。因为我们没有办法区分目录和它的硬链接,两者没有任何区别。

如果允许目录的硬链接,就有可能产生循环目录或空挂的子目录树,从而破坏文件系统的有向无环图(directed acyclic graph)结构,这将使fsck等用于遍历文件树的命令无法运行。

要理解这一点,我们首先来讨论一下inode。文件系统中的数据储存在磁盘的block中,每个inode管理着若干个block。我们可以认为这个inode就是文件。但inode无法记录文件名。这时我们需要link来帮忙了。

link是一个指向inode的指针,同时记录了文件名。目录也是一个inode,它的blocks保存的数据是若干link。

硬链接也指向inode。观察ls -l的输出,权限字段后面的那个数字的含义是指向该inode的链接数。大多数普通文件只有一个链接。而创建一个硬链接会使两个链接指向同一个inode。

% ls -l test

ls: test: No such file or directory

% touch test

% ls -l test

-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test

% ln test test2

% ls -l test*

-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test

-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2

% touch test3

% ls -l test*

-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test

-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2

-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3

^

^ this is the link count

现在,我们可以清楚的发现,其实根本没有硬链接这个东西。所谓的硬链接其实就是一个link。在上面的例子中,我们根本没法分辨出test和test2哪个是原文件那个是硬链接(连时间戳都一样)。因为,这两个文件名指向同样的inode,指向同样的数据。

% ls -li test*

14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test

14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2

14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3

参数-i用于显示文件的inode号。我们可以看到test和test2的inode号相同,而test3不同。

好了,如果我们为目录创建一个硬链接,那么位于文件系统中不同位置的两个目录就会指向同一内容。我们可以让子目录指向祖父目录,从而产生一个循环。

为什么不能有循环呢?因为遍历文件树时,我们没法知道我们是不是在兜圈子(除非一边遍历一边记录inode号)。比如,du命令会递归地遍历所有子目录来计算磁盘使用量。而循环会让du陷入麻烦,它不得不做大量的记录工作来完成原本简单的任务。

而符号链接(Symlinks)则是完全不同的一个物种了。它是一类特殊的文件类型,很多文件系统都支持符号链接。(win系统中的快捷方式就是符号链接————译者注)。注意,符号链接可以指向一个不存在的文件,因为它指向文件名而非inode。硬链接则不能指向空文件,只要硬链接存在就意味着文件存在。

那么为什么du能轻松处理目录的符号链接却不支持目录的硬链接呢?经过上面的讨论我们知道,目录的硬链接和普通目录是同一个东西。而符号链接则是一种特殊的文件类型,du能够检测出来并在遍历文件树时跳过它!

% ls -l

total 4

drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/

lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1

% du -ah

242M ./test1/bigfile

242M ./test1

4.0K ./test2

242M .

By Danny Dulai & G-Man

背单词英文含义directed acyclic graph有向无环图

symlink / symbol link符号链接/软链接

原文封面图: 天山 - 2015夏 - Sandii



推荐阅读
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 本文介绍Linux中的Diff命令,该命令用于逐行对比两个文本文件,展示它们之间的差异。通过系统性检查,它能有效标识出文件间所有不同的行,无需事先对文件进行排序。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • PHP中去除换行符的多种方法及应用场景
    本文将详细介绍在PHP中去除换行符的各种方法,并结合实际应用场景进行说明。通过本文,您将了解如何根据不同操作系统的特点,选择最合适的换行符处理方式。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文详细介绍了网络存储技术的基本概念、分类及应用场景。通过分析直连式存储(DAS)、网络附加存储(NAS)和存储区域网络(SAN)的特点,帮助读者理解不同存储方式的优势与局限性。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
author-avatar
小北甜甜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有