在 Linux 的文件系统中,磁盘块分成了 3 个部分。一部分称为数据区,用来存放文件内容。另一部分称为 inode 表,用来存放文件属性。第三部分称为超级块,用来存放文件系统本身的属性。文件的内容和属性分开存放,文件的属性存储在一个称为 inode 的数据结构中,inode 存放在 inode 表里,每个 inode 有一个唯一的编号对应其在 inode 表中的位置。

Linux 中有两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接也称为符号链接(Symbolic Link)。

硬链接

硬链接其实是已存在文件的另一个名字,链接与原来的文件并没有什么区别,它们共享一个 inode,而 inode 包含了一个文件的所有属性。当为一个文件创建硬链时,内核不会分配新的 inode。

huey@huey-K42JE:~/huey/linux/cmdline$ touch f1
huey@huey-K42JE:~/huey/linux/cmdline$ ln f1 f1-hard
huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
total 0
10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1
10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1-hard

系统并没有为 f1-hard 分配新的 inode,f1-hard 的 inode 与 f1 一致,这说明了它们是同一个文件的两个名字。创建链接后,f1 和 f1-hard 的链接数也由 1 增加到 2。再看看使用 rm 命令的过程:

huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
total 0
10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1
10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1-hard
huey@huey-K42JE:~/huey/linux/cmdline$ rm f1
huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
total 0
10272788 -rw-rw-r-- 1 ng ng 0 Apr 20 15:33 f1-hard
huey@huey-K42JE:~/huey/linux/cmdline$ rm f1-hard
huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
total 0

当删除文件的时候,系统只是将文件的链接数减 1,直到文件的链接数为 0 时,系统才会将磁盘的文件内容删除。

硬链接有两个重要的限制:
1) 硬链接不能引用自身文件系统之外的文件。即链接不能引用与该链接不在同一磁盘分区的文件。
2) 硬链接不能引用目录(有些 Linux 版本允许超级用户使用 -d 选项创建引用目录的链接)。

符号链接

符号链接是为了克服硬链接的局限性而创建的。符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。从这点来看,符号链接与 Windows 的快捷方式很相似。符号链接指向的文件与符号链接自身几乎没有区别。例如,将一些内容写进符号链接里,那么这些内容同样也写进了引用文件。而当删除一个符号链接时,删除的只是符号链接而没有删除引用文件。如果先于符号链接之前删除引用文件,那么这个链接依然存在,但是不指向任何文件。此时,这个链接就称为坏链接。ls 命令一般会用不同的颜色来显示坏链接,比如红色。

软链接相比硬链接有个不足的地方是:由于软链接包含引用文件的路径信息,所以如果引用文件移动到其他目录,链接则变成一个坏链接。

ln 命令格式

ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)

ln 命令参数

--backup[=CONTROL]
  如果指定的链接名已经存在,为该同名文件创建备份文件

-b
  类似 --backup 选项,但不接受参数。

-d, -F, --directory
  允许超级用户创建目录的硬链接(注:由于系统限制很有可能会失败,即使是超级用户)

-f, --force
  如果指定的链接名已经存在,则覆盖该同名文件

-n, --no-dereference
  如果指定的链接名是一个引用目录的符号链接,则将其当作是普通文件

-i, --interactive
  如果指定的链接名已经存在,提示是否覆盖该同名文件

-s, --symbolic
  创建符号链接而非硬链接

-S, --suffix=SUFFIX
  使用 SUFFIX 作为备份文件的后缀

-v, --verbose
  显示链接过程的信息

--help display this help and exit
  打印帮助信息

--version
  打印版本信息

ln 实例

a) 创建硬链接

huey@huey-K42JE:~/huey/linux/cmdline$ ln testfile testfile-hard

b) 创建符号链接

huey@huey-K42JE:~/huey/linux/cmdline$ ln -s testfile testfile-sym

c) 强制创建链接,如果指定的链接名已经存在,则覆盖该同名文件

huey@huey-K42JE:~/huey/linux/cmdline$ ln -f testfile testfile-hard

d) 为被覆盖的文件创建备份

huey@huey-K42JE:~/huey/linux/cmdline$ ln -bf testfile testfile-hard

e) 为被覆盖的文件创建备份,并以 ".~[num]~" 作为后缀

huey@huey-K42JE:~/huey/linux/cmdline$ ln -f --backup=numbered testfile testfile-hard

f) 为被覆盖的文件创建备份,并指定备份文件的后缀为 ".bak"

huey@huey-K42JE:~/huey/linux/cmdline$ ln -bf -S '.bak' testfile testfile-hard

ln 的 -n 选项

使用 man ln 命令,-n 选项的释义是 "treat destination that is a symlink to a directory as if it were a normal file",如何理解?

假设有 a、b 两个目录,还有一个指向 a 目录的软链接 c:

huey@huey-K42JE:~/huey/linux/cmdline$ mkdir a b
huey@huey-K42JE:~/huey/linux/cmdline$ ln -s a c

现在如果要使软链接 c 改为指向 b 目录而执行下面这条命令:

huey@huey-K42JE:~/huey/linux/cmdline$ ln -sf b c

这并不能达到预期的效果,而是会在 c 的引用目录(即 a 目录)里创建 b 目录的软链接。这种情况下, -n 选项会将软链接 c 当作一个普通文件而被覆盖:

huey@huey-K42JE:~/huey/linux/cmdline$ ln -sfn b c

Linux - 硬链接与软链接的更多相关文章

  1. linux硬链接与软链接

    在linux操作系统中的文件数据除了实际的内容外,还会含有文件权限(rwx)与文件属性(owner,group,other等),文件系统通常会将这两部分的数据存放在不同的区块,文件权限与文件属性放置在 ...

  2. (转)Linux硬链接、软链接及inode详解

    inode 文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读 ...

  3. 【转】 linux硬链接与软链接

    转自:http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.html Linux 系统中有软链接和硬链接两种特殊的“文件”. 软链接可以看 ...

  4. Linux硬链接和软链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...

  5. linux 硬链接和软链接(转)

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。 【硬连接】硬连接指通过索引节点 ...

  6. 最浅显、易懂的Linux 硬链接与软链接的理解

    正文: Linux上的文件可以这么理解:文件-->文件名.文件是一个Object,也就是磁盘上的二进制数据.一个文件可以有多个文件名,平时我们都是通过文件名访问文件Object. 这样,硬链接可 ...

  7. Linux 硬链接、软链接

    索引节点 inode(index node) 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata).用户数据,即文件数据块 ...

  8. 彻底明白Linux硬链接和软链接

    [硬连接] 在Linux的文件系统中,保存在磁盘分区中的实际文件不管是什么类型系统都给它分配一个编号,称为索引节点号(Inode Index),这个索引节点用来标识这个文件,即这个索引节点就代表了这个 ...

  9. linux硬链接和软链接的区别

    1.原理上: 硬链接(hard link):A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件 ...

随机推荐

  1. C#中Internal class与静态类说明

    C#中的internal访问修饰符表示 访问仅限于当前程序集 但是注意,internal修饰符修饰的类中,可以有public的成员变量和成员方法等 Static 关键字作为修饰符可以用于类.方法和成员 ...

  2. JAVA事务的概念

    From:http://www.cnblogs.com/kristain/articles/2038397.html 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数 ...

  3. session cookie原理及应用

    一.术语session在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中 ...

  4. too many automatic redirections were attempted

    用HttpClient时发现一下页面跳转现象. 页面A要求授权自动跳转到页面B, 页面B进行了授权,在HTTP Header里要求SetCookie并跳转到页面A. 再次请求页面A的时候没有带上此Co ...

  5. Communications link failure报错的处理

    一.报错的问题: 测试环境在做压力测试的时候爆出错误 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications l ...

  6. 图形化OpenGL调试器 BuGLe [转]

    BuGLe 结合图形化的OpenGL调试与选择的过滤器上的OpenGL命令流.调试器可以查看状态.纹理.framebuffers ,着色器,而过滤器允许日志,错误检查,自由相机控制,视频捕捉等. 主页 ...

  7. ZJU-PAT 1065. A+B and C (64bit) (20)

    Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...

  8. javascript操作

    1. >> 按位右移运算符 result = expression1 >> expression2 右移表达式的位,保持符号不变. >> 运算符将 expressi ...

  9. .net平台下C#socket通信(转)

    上篇.net平台下C#socket通信(上)介绍了socket通信的基本原理及最基本的通信方式.本文在此基础上就socket通信时经常遇到的问题做一个简单总结,都是项目中的一些小问题,拿来此处便于下次 ...

  10. c#_自动化测试 (五) 读写64位操作系统的注册表

    非Web程序(桌面程序)的设置一般都存在注册表中. 给这些程序做自动化测试时, 需要经常要跟注册表打交道. 通过修改注册表来修改程序的设置. 本章介绍如何利用C#程序如何操作注册表, 特别是如何操作6 ...