linux不允许将硬链接指向目录,为什么 UNIX/Linux 不允许目录硬链 【翻译】
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
linux不允许将硬链接指向目录,为什么 UNIX/Linux 不允许目录硬链 【翻译】相关推荐
- linux不允许将硬链接指向目录,linux 文件(目录)之软链接,硬链接 -
前提必须清楚一点,当指向数据的文件个数为0 时,数据块就会被释放掉,硬链接相当于硬盘上一块数据的多个指针,而软链接相当于指向数据指针的指针.个人理解成下面的图例 左边的是硬链接,右边的是软链接,无论对 ...
- linux查看硬链接的对应文件,区分Linux硬链接与软链接
在Linux中,连接文件有两种,一种类似于Windows的快捷方式,可以让你快速地链接到目标文件(或目录),这种称为软链接(soft link),也叫作符号链接(symbolic link):另一种则 ...
- linux系统如何配置ssh链接方式【以kali linux系统为例】【有一个坑,网上很多配置找不到PermitRootLogin选项】
参考:https://blog.csdn.net/nzjdsds/article/details/82262228 [非常重要]在/etc/ssh/ssh_config中没有PermitRootLog ...
- Linux随笔2 - Linux的目录配置、文件元数据信息、符号链接与硬链接和常用文件和目录管理命令示例
目录 1. Linux的目录配置与FHS(Filesystem Hierarchy Standard) 1.1 根目录(/)的意义与内容 1.1.1 FHS要求根目录中必须存在的目录 1.1.2 FH ...
- linux目录硬链接,linux查看硬链接对应的所有文件
在linux中,链接文件分为硬链接和软链接文件两种,其中硬链接通过ln source_file dist_file建立,软链接通过ln -s source_file dist_file建立. 软硬链接 ...
- 【Linux】Linux下的硬链接与符号链接
Linux的初学者常常混淆Linux中的硬链接(hard link)与符号链接(symbol link)的概念,分不清楚它们的区别.因此,本文将向读者全面介绍硬链接与符号链接,给予读者以全面的认识. ...
- linux硬链接与软链接
详细文章链接:https://www.cnblogs.com/crazylqy/p/5821105.html (上面这个也是转载的!) 区别: 1.硬链接原文件/链接文件公用一个inode号,说明他们 ...
- 实例讲解Linux系统中硬链接与软链接的创建
导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...
- Linux 硬链接和软链接的区别
硬链接和软链接的区别 Linux 与其他类 UNIX 系统一样并不区分文件与目录:目录是记录了其他文件名的文件.我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user ...
最新文章
- Richard Feynman, 挑战者号, 软件工程,自顶而下
- Layui框架 中table解决日期格式问题
- comet4j开发指南
- Linux—系统文件和目录介绍
- C# Check is No number
- LeetCode 552. 学生出勤记录 II(动态规划)
- jpa 连接多个mysql 数据库_SpringBoot 连接多个数据库
- [Java] 蓝桥杯ALGO-27 算法训练 FBI树
- 锐捷校园网环境下使用虚拟机上网
- phpquery中文手册
- 外卖返利系统公众号外卖cps返利小程序淘宝客程序淘客侠客外卖CPS
- 内容创作者周刊:第4期
- 沈阳农业大学计算机专业排名,2019沈阳农业大学专业排名
- 计算机系统(六):应用层(上篇)
- EPLAN界面编辑背景颜色更改
- 使用bat脚本上传文件到Linux服务器
- x射线管的kV、mA、mAs
- Visual C++网络编程经典案例详解 第5章 网页浏览器 CHtmlView类 查看源文件
- html中添加水印效果
- Hadoop HA介绍