Linux上创建和更改硬链接和符号链接(软连接)



对于Linux上的硬链接和软连接而言,使用cp命令,无论覆盖其中的那个文件(源文件,软连接文件,硬链接文件),其它文件的内容都会同步修改。

点击(此处)折叠或打开

  1. [oracle@edsir4p1- ~]$ ll
  2. [oracle@edsir4p1- ~]$ touch a.txt
  3. [oracle@edsir4p1- ~]$ ln -s a.txt b.txt
  4. [oracle@edsir4p1- ~]$ ll
  5. -rw-r--r-- 1 oracle oinstall 0 Dec 4 12:32 a.txt
  6. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  7. [oracle@edsir4p1- ~]$ ln a.txt c.txt
  8. [oracle@edsir4p1- ~]$ ll
  9. -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 a.txt
  10. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  11. -rw-r--r-- 2 oracle oinstall 0 Dec 4 12:32 c.txt
  12. [oracle@edsir4p1- ~]$ echo lhr > a.txt
  13. [oracle@edsir4p1- ~]$ more a.txt
  14. lhr
  15. [oracle@edsir4p1- ~]$
  16. [oracle@edsir4p1- ~]$ more a.txt
  17. lhr
  18. [oracle@edsir4p1- ~]$ more b.txt
  19. lhr
  20. [oracle@edsir4p1- ~]$ more c.txt
  21. lhr
  22. [oracle@edsir4p1- ~]$ echo lihuarong > b.txt
  23. [oracle@edsir4p1- ~]$ more a.txt
  24. lihuarong
  25. [oracle@edsir4p1- ~]$ more b.txt
  26. lihuarong
  27. [oracle@edsir4p1- ~]$ more c.txt
  28. lihuarong
  29. [oracle@edsir4p1- ~]$ echo best > d.txt
  30. [oracle@edsir4p1- ~]$
  31. [oracle@edsir4p1- ~]$
  32. [oracle@edsir4p1- ~]$ cp d.txt b.txt
  33. [oracle@edsir4p1- ~]$ ll *.txt
  34. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  35. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  36. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  37. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  38. [oracle@edsir4p1- ~]$ more a.txt
  39. best
  40. [oracle@edsir4p1- ~]$ more b.txt
  41. best
  42. [oracle@edsir4p1- ~]$ more c.txt
  43. best
  44. [oracle@edsir4p1- ~]$ more d.txt
  45. best
  46. [oracle@edsir4p1- ~]$ ls -i a.txt
  47. 46236787 a.txt
  48. [oracle@edsir4p1- ~]$ ls -li *.txt
  49. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  50. 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  51. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  52. 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  53. [oracle@edsir4p1- ~]$ echo xxxoooo > e.txt
  54. [oracle@edsir4p1- ~]$ ls -li *.txt
  55. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 a.txt
  56. 46236797 lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  57. 46236787 -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:36 c.txt
  58. 46236798 -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  59. 46236799 -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  60. [oracle@edsir4p1- ~]$ cp b.txt b.txt_bk
  61. [oracle@edsir4p1- ~]$
  62. [oracle@edsir4p1- ~]$
  63. [oracle@edsir4p1- ~]$ cp e.txt b.txt
  64. [oracle@edsir4p1- ~]$
  65. [oracle@edsir4p1- ~]$ more b.txt
  66. xxxoooo
  67. [oracle@edsir4p1- ~]$ more a.txt
  68. xxxoooo
  69. [oracle@edsir4p1- ~]$ more c.txt
  70. xxxoooo
  71. [oracle@edsir4p1- ~]$ more b.txt_bk
  72. best
  73. [oracle@edsir4p1- ~]$ cp b.txt_bk a.txt
  74. [oracle@edsir4p1- ~]$ more a.txt
  75. best
  76. [oracle@edsir4p1- ~]$ more b.txt
  77. best
  78. [oracle@edsir4p1- ~]$ more c.txt
  79. best
  80. [oracle@edsir4p1- ~]$ ll *.txt
  81. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
  82. lrwxrwxrwx 1 oracle oinstall 5 Dec 4 12:32 b.txt -> a.txt
  83. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
  84. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  85. -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  86. [oracle@edsir4p1- ~]$ rm -rf b.txt
  87. [oracle@edsir4p1- ~]$ ll *.txt
  88. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 a.txt
  89. -rw-r--r-- 2 oracle oinstall 5 Dec 4 12:58 c.txt
  90. -rw-r--r-- 1 oracle oinstall 5 Dec 4 12:36 d.txt
  91. -rw-r--r-- 1 oracle oinstall 8 Dec 4 12:57 e.txt
  92. [oracle@edsir4p1- ~]$



概述

在本篇中,学习创建和管理硬链接和符号链接。学习:

  • 创建硬或软链接
  • 识别链接并知道它们的类型
  • 理解复制与链接文件之间的区别
  • 使用链接执行系统管理任务

链接简介

在存储设备上,文件或目录包含在一些数据块中。有关某个文件的信息包含在一个 inode 中,它记录了所有者、最后访问该文件的时间、文件的大小、它是否是目录,以及谁可以读取或写入它等信息。inode 编号也称为文件序列号 ,该编号在特定文件系统内是唯一的。一个 目录条目 包含一个文件或目录的名称,以及用来存储该文件或目录的信息的 inode 的指针。

创建链接

硬链接 是指向 inode 的目录条目,而 软链接 或 符号链接 是指向提供另一个目录条目的名称的 inode 的目录条目。存储第二个名称的准确机制可能依赖于文件系统和名称的长度。符号链接也称为symlink 。

您可以只为文件创建硬链接,而不为目录创建硬链接。一个例外是一个包含该目录和它的父目录(. 和 ..)的目录中的特殊目录条目,它们是维护子目录数量的硬链接。因为硬链接指向 inode,而且 inode 仅在特定的文件系统内是唯一的,所以硬链接不能跨文件系统使用。如果一个文件有多个硬链接,那么只在指向该 inode 的最后一个链接被删除,而且链接数量变为 0 时,才会删除该文件。

软链接或 symlink 仅按名称指向另一个文件或目录,而不是按 inode。软链接可以跨越文件系统边界进行使用。删除软链接不会删除目标文件或目录,删除目标文件或目录也不会自动删除任何软链接。

首先让我们看看如何创建硬和软链接。在本教程后面,我们将介绍识别和使用我们在这里创建的链接的方式。

硬链接

使用 ln 命令创建现有文件的额外的硬链接(但不能是目录,即使系统将 . 和 .. as 设置为硬链接)。

清单 1 展示了如何创建一个包含两个文件和一个子目录的目录,其中包含 file1 的两个硬链接,一个位于同一个目录中,另一个位于子目录中。我们向 file1 添加一个词,然后向 file3 添加另一个词,并在子目录中显示该链接的内容,以表明所有链接确实都指向相同的数据。

清单 1. 创建硬链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ mkdir -p lpi104-6/subdir
  2. [ian@atticf22 ~]$ touch lpi104-6/file1
  3. [ian@atticf22 ~]$ touch lpi104-6/file2
  4. [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/file3
  5. [ian@atticf22 ~]$ ln lpi104-6/file1 lpi104-6/subdir/file3sub
  6. [ian@atticf22 ~]$ echo "something" > lpi104-6/file1
  7. [ian@atticf22 ~]$ echo "else" >> lpi104-6/file3
  8. [ian@atticf22 ~]$ cat lpi104-6/subdir/file3sub
  9. something
  10. else

如果尝试创建跨文件系统或针对目录的硬链接,则会获得错误。清单 2 显示我的主目录和 research 目录在不同的文件系统上,而且跨这些文件系统创建硬链接的尝试失败了,与创建 lpi104-6 目录的硬链接的尝试一样。

清单 2. 硬链接创建失败

[plain] view plain copy
  1. [ian@atticf22 ~]$ df . research
  2. Filesystem     1K-blocks     Used Available Use% Mounted on
  3. /dev/sda5       71168700 31642752  35887712  47% /
  4. /dev/sdb3       60326992 30677592  26578276  54% /home/ian/research
  5. [ian@atticf22 ~]$ mkdir -p research/lpi104-6/
  6. [ian@atticf22 ~]$ ln lpi104-6/file1 research/lpi104-6/file3
  7. ln: failed to create hard link ‘ research/lpi104-6/file3 ’ =>
  8. ‘ lpi104-6/file1 ’ : Invalid cross-device link
  9. [ian@atticf22 ~]$ ln lpi104-6 lpidir104-6
  10. ln: ‘ lpi104-6 ’ : hard link not allowed for directory

软链接

使用 ln 命令和 -s 选项来创建软链接。软链接使用文件或目录名称,这些名称可能是相对或绝对的。如果使用相对名称,您可能希望当前工作目录是您创建链接的目录。否则,您创建的链接将是文件系统中的另一个位置相对的链接。

清单 3 展示了为我们刚创建的 file1 创建软链接的两种方式,以及如何创建软链接,而不是创建在 清单 2中失败的两个硬链接。

清单 3. 创建软链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ # Create symlink using absolute paths
  2. [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~/lpi104-6/file4
  3. [ian@atticf22 ~]$ # Create symlink using relative paths
  4. [ian@atticf22 ~]$ cd lpi104-6/
  5. [ian@atticf22 lpi104-6]$ ln -s file1 file5
  6. [ian@atticf22 lpi104-6]$ cd ..
  7. [ian@atticf22 ~]$ # Create symlink across file systems
  8. [ian@atticf22 ~]$ mkdir -p ~ian/research/lpi104-6
  9. [ian@atticf22 ~]$ ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4
  10. [ian@atticf22 ~]$ # Create symlink for directory
  11. [ian@atticf22 ~]$ ln -s lpi104-6 lpidir104-6

与之前一样,您可以使用任何链接或目标文件名来引用该文件或目录。清单 4 显示了一些例子。

清单 4. 使用软链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ echo "another line" >> ~ian/research/lpi104-6/file
  2. [ian@atticf22 ~]$ # cat a symlink
  3. [ian@atticf22 ~]$ cat lpi104-6/file5
  4. something
  5. else
  6. [ian@atticf22 ~]$ # cat a hard link
  7. [ian@atticf22 ~]$ cat lpi104-6/file1
  8. something
  9. else
  10. [ian@atticf22 ~]$ # display directory contents using symlink
  11. [ian@atticf22 ~]$ ls lpidir104-6
  12. file1  file2  file3  file4  file5  subdir

在创建链接时,让我们在工作目录 不是我们想要存放链接的目录时使用相对路径创建一个链接。下一节将介绍如何实现此目的。

清单 5. 创建不良的软链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ ln -s lpi104-6/file1 lpi104-6/file6

识别链接

在上一节中,您了解了如何创建链接,但不知道如何区分您创建的链接。现在让我们讨论一下这个主题。

查找信息

在许多系统上,ls 命令等同于 ls --color=auto ,它以不同颜色打印不同类型的文件系统对象。如果使用此选项,可能使用蓝绿色文本来显示 symlink,如 图 1中所示。

图 1. 使用 ls 的 --colors 选项来识别链接

在旧配置上,可能使用深蓝色背景来显示硬链接。这些颜色可使用 dircolors 程序来配置。如果要自定义您的终端外观,您可能希望更改ls 的一些输出的颜色。清单 6显示了一种在 Fedora 22 系统上获得硬链接的蓝色背景的方式,而 图 2 则显示了结果。使用手册页进一步理解该示例。

清单 6. 使用 dircolors 为硬链接设置一种蓝色背景

[plain] view plain copy
  1. [ian@atticf22 ~]$ # Save a copy of dircolors defaults
  2. [ian@atticf22 ~]$ dircolors -p > dircolors-defaults
  3. [ian@atticf22 ~]$ grep MULTI dircolors-defaults
  4. MULTIHARDLINK 00 # regular file with more than one link
  5. [ian@atticf22 ~]$ # Change MULTIHARDLINK to blue background
  6. [ian@atticf22 ~]$ sed -e'/MULTI/s/00/00;44/' dircolors-defaults > dircolors-new
  7. [ian@atticf22 ~]$ grep MULTI dircolors-new
  8. MULTIHARDLINK 00;44 # regular file with more than one link
  9. [ian@atticf22 ~]$ # Set the new colors for the current terminal session
  10. [ian@atticf22 ~]$ eval $(dircolors dircolors-new )

图 2. 使用蓝色背景来标识硬链接

对于能够区分颜色的视力正常的人而言,颜色可能很方便,但它们对其他人没多大用处,对 shell 脚本或程序肯定也没多大用处。没有颜色,就需要更多的信息,比如使用ls -l 通过一个长清单所提供的信息。在 清单 7中,我们为第一个示例显式禁用了颜色输出,但您也可以像我们对另外两个示例所做的一样显式调用/bin/ls 命令。

清单 7. 识别链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ ls --color=none -lR lpi104-6
  2. lpi104-6:
  3. total 12
  4. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
  5. -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
  6. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
  7. lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
  8. lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
  9. lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
  10. drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir
  11. lpi104-6/subdir:
  12. total 4
  13. -rw-rw-r--. 3 ian ian 15 Aug  9 14:19 file3sub
  14. [ian@atticf22 ~]$ /bin/ls -l ~ian/research/lpi104-6/file4
  15. lrwxrwxrwx. 1 ian ian 24 Aug  9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1
  16. [ian@atticf22 ~]$ /bin/ls -l lpidir104-6
  17. lrwxrwxrwx. 1 ian ian 8 Aug  9 14:27 lpidir104-6 -> lpi104-6

输出的第二列是一个链接计数,显示了此文件的硬链接数,所以我们知道 file1、file3 和 file3sub 都拥有多个指向它们表示的对象的硬链接。我们仍没有足够的信息来知道它们都表示同一个对象。如果您删除一个链接数大于 1 的文件,inode 中的链接数会减 1,但该文件只在链接数变为 0 时才会删除。同一个文件的其他所有硬链接将显示一个现在减去了 1 的链接数。

在输出的第一列中,您会看到第一个字符是表示符号链接的 “l”(L 的小写形式)。您还会看到在 -> 字符后显示了链接的目标。例如,file4 -> /home/ian/lpi104-6/file1。另一个提示是,该大小是链接目标的名称中的字符数。请注意,对于符号链接,目录清单中的链接数没有更新。删除该链接不会影响目标文件。Symlink 不会阻止文件被删除。如果目标文件被移动或删除,那么 symlink 将被破坏。出于这个原因,许多系统在目录清单中使用了颜色,通常使用淡蓝色表示正常链接,使用红色表示被破坏的链接。

您可以使用 ls 命令的 -i 选项来显示文件和目录条目的 inode 数量。清单 8同时给出了我们的 lpi104-6 目录的短和长输出。

清单 8. 显示 inode 信息

[plain] view plain copy
  1. [ian@atticf22 ~]$ ls -i lpi104-6
  2. 1988884 file1  1988884 file3  1988892 file5  1988605 subdir
  3. 1988886 file2  1988885 file4  1988891 file6
  4. [ian@atticf22 ~]$ ls -il lpi104-6
  5. total 12
  6. 1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
  7. 1988886 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
  8. 1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
  9. 1988885 lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
  10. 1988892 lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
  11. 1988891 lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
  12. 1988605 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

您还可以使用 find 命令,使用 -type l 查找表达式来搜索符号链接,如 清单 9中所示。

清单 9. 使用 find 查找 symlink

[plain] view plain copy
  1. [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -type l
  2. lpi104-6/file4
  3. lpi104-6/file6
  4. lpi104-6/file5
  5. research/lpi104-6/file4

破坏的 symlink

在 清单 5 中,我们声明要创建一个不良的软链接。这是破坏的 symlink 的一个示例。因为硬链接始终指向一个表示文件的 inode,所以它们始终有效。但是,symlink 可能出于许多原因而遭到破坏,包括:

  • 在创建链接时,链接的原始文件或目标不存在(就像 清单 5 中一样)。
  • 链接的目标被删除或重命名。
  • 目标的路径中的某个元素被删除或重命名。

所有这些条件都不会抛出错误,所以您需要仔细考虑您在创建 symlink 时可能发生了什么情况。具体地讲,对于绝对或相对路径的选择,可能受到您希望链接的对象在链接生存期中发生什么的影响。

如果您使用颜色输出,破坏的 symlink 可能在黑色背景上显示为红色文本,就像 图 1 中的 file6 的情况一样。否则,您需要使用 ls 的 -H 或 -L 选项来取消引用该链接,并提供有关目标的信息。-H 选项在命令行上取消引用链接,-L 选项取消引用显示中包含的附加链接。清单 10演示了来自这两个选项的输出中的区别。

清单 10. 使用 ls -H 和 ls -L 取消引用链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ /bin/ls -lH lpidir104-6
  2. total 12
  3. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
  4. -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
  5. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
  6. lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1
  7. lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1
  8. lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1
  9. drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir
  10. [ian@atticf22 ~]$ /bin/ls -lL lpidir104-6
  11. /bin/ls: cannot access lpidir104-6/file6: No such file or directory
  12. total 20
  13. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1
  14. -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2
  15. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3
  16. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file4
  17. -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file5
  18. l?????????? ? ?   ?      ?            ? file6
  19. drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

请注意,错误消息表明 file6 不存在,另请注意针对它的包含所有 “?” 字符的输出,它们同样表明该文件不存在。

关于破坏的符号链接,还要说明最后一点。读取该文件的尝试将失败,因为它不存在。但是,如果您拥有目标文件的合适权限,写入它的尝试将有效,如 清单 11中所示。请注意,我们需要在写入该文件之前创建 lpi104-6/lpi104-6。

清单 11. 读取和写入一个破坏的 symlink

[plain] view plain copy
  1. [ian@atticf22 ~]$ cat lpi104-6/file6
  2. cat: lpi104-6/file6: No such file or directory
  3. [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
  4. bash: lpi104-6/file6: No such file or directory
  5. [ian@atticf22 ~]$ mkdir lpi104-6/lpi104-6
  6. [ian@atticf22 ~]$ cat lpi104-6/file6
  7. cat: lpi104-6/file6: No such file or directory
  8. [ian@atticf22 ~]$ echo "Testing file6" > lpi104-6/file6
  9. [ian@atticf22 ~]$ cat lpi104-6/file6
  10. Testing file6
  11. [ian@atticf22 ~]$ ls lpi104-6/lpi104-6
  12. file1
  13. [ian@atticf22 ~]$ ls -l lpi104-6/file6
  14. lrwxrwxrwx. 1 ian ian 14 Aug  9 14:34 lpi104-6/file6 -> lpi104-6/file1

谁链接到我?

要确定哪些文件是一个特定 inode 的硬链接,可以使用 find 命令和 -samefile 选项及一个文件名,或者-inum 选项及一个 inode 编号,如 清单 12 中所示。

清单 12. 查找同一个文件的硬链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ find lpi104-6 -samefile lpi104-6/file1
  2. lpi104-6/file1
  3. lpi104-6/file3
  4. lpi104-6/subdir/file3sub
  5. [ian@atticf22 ~]$ ls -i lpi104-6/file1
  6. 1988884 lpi104-6/file1
  7. [ian@atticf22 ~]$ find lpi104-6 -inum 1988884
  8. lpi104-6/file1
  9. lpi104-6/file3
  10. lpi104-6/subdir/file3sub

要查找哪些文件通过符号链接而链接到一个特定文件,可以使用 find 命令和 -lname 选项及一个文件名,如 清单 13 所示。链接可以使用相对或绝对路径,所以您可能希望在名称中放入一个前导的星号来找到所有匹配结果。

清单 13. 查找一个文件或目录的符号链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ find lpi104-6 research/lpi104-6 -lname "*file1"
  2. lpi104-6/file4
  3. lpi104-6/file6
  4. lpi104-6/file5
  5. research/lpi104-6/file4

复制还是链接

根据您想要完成的任务,有时会使用链接,有时复制一个文件可能会更好一些。主要区别在于,链接提供了一个文件的多个名称,而副本会在两个不同的名称下创建两组相同的数据。对于备份和测试用途,肯定会使用副本,您希望试验一个新程序而不让您的操作数据处于风险之中。在需要某个文件(或目录)的别名时(可能用于提供更方面或更短的路径),可以使用链接。在下一节中,我们将介绍链接的其他一些用法。

您已经看到,在更新一个文件时,它所有的链接都会看到更新信息,而复制文件不会这样。您还看到,符号链接可以破坏,后续写入操作可以创建新的文件。请小心使用链接。

链接和系统管理

链接(尤其是符号链接)通常用在 Linux 系统管理中。命令通常具有别名,所以用户不需要知道当前命令的版本号,但在必要的时候,可以使用更长的名称来访问其他版本。如 清单 14所示,python 命令是python2 的 symlink,python2 本身是 2.7 版的 python2.7 的 symlink。

清单 14. 将命令别名化为一个特定版本

[plain] view plain copy
  1. [ian@atticf22 ~]$ which python
  2. /usr/bin/python
  3. [ian@atticf22 ~]$ ls -l /usr/bin/python
  4. lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2
  5. [ian@atticf22 ~]$ ls -l /usr/bin/python2
  6. lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7
  7. [ian@atticf22 ~]$ ls -l /usr/bin/python2.7
  8. -rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7

在多个命令名称使用相同的基础代码时,比如存储和重新启动系统的各种命令,其他用途就可以派上用场。有时,一个新命令名称(比如 genisoimage )将取代旧命令名称,但旧名称 (mkisofs) 保持为新命令的链接。一些替代性 工具会广泛使用链接,所以您可以在多个替代性工具中选择一个来用于某条命令,比如java 。清单 15显示了一些示例。

清单 15. 命令别名的示例

[plain] view plain copy
  1. [ian@atticf22 ~]$ which halt
  2. /usr/sbin/halt
  3. [ian@atticf22 ~]$ ls -l /usr/sbin/halt
  4. lrwxrwxrwx. 1 root root 16 Jun  9 09:16 /usr/sbin/halt -> ../bin/systemctl
  5. [ian@atticf22 ~]$ find /usr/sbin /usr/bin -lname "*/systemctl"
  6. /usr/sbin/halt
  7. /usr/sbin/telinit
  8. /usr/sbin/shutdown
  9. /usr/sbin/runlevel
  10. /usr/sbin/poweroff
  11. /usr/sbin/reboot
  12. [ian@atticf22 ~]$ which mkisofs
  13. /usr/bin/mkisofs
  14. [ian@atticf22 ~]$ ls -l /usr/bin/mkisofs
  15. lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs
  16. [ian@atticf22 ~]$ alternatives --display mkisofs
  17. mkisofs - status is auto.
  18. link currently points to /usr/bin/genisoimage
  19. /usr/bin/genisoimage - priority 50
  20. slave mkisofs-mkhybrid: /usr/bin/genisoimage
  21. slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz
  22. slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz
  23. Current `best' version is /usr/bin/genisoimage.

库名称通常也使用 symlink 来管理,无论是允许程序在获取当前版本时链接到一般名称,还是管理系统,比如能够运行 32 位程序的 64 位系统。清单 16显示了一些示例。请注意,一些情况会使用绝对路径,而另一些情况会使用相对路径。

清单 16. 库链接

[plain] view plain copy
  1. [ian@atticf22 ~]$ ls -l /usr/lib*/libm.so*
  2. lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6
  3. lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so
  4. lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so
  5. [ian@atticf22 ~]$ find  /usr/lib/ /usr/lib64/ -lname "*libstdc++*"
  6. /usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so
  7. /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so
  8. /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a
  9. /usr/lib64/libstdc++.so.6
  10. [ian@atticf22 ~]$ ls -l /usr/lib64/libstdc++.so.6
  11. lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
  12. [ian@atticf22 ~]$ ls -l /usr/lib64/libwbclient*
  13. lrwxrwxrwx. 1 root root 19 Jul  1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12
  14. lrwxrwxrwx. 1 root root 40 Jul  1 10:37 /usr/lib64/libwbclient.so.0.12 ->
  15. /etc/alternatives/libwbclient.so.0.12-64

原文地址:

http://blog.csdn.net/sinat_31726559/article/details/51835785



1 . 使用方式 :ln [option] source_file dist_file 
                    -f 建立时,将同档案名删除. 
                    -i 删除前进行询问. 
                    ln -s abc cde 建立abc 的软连接 
                    ln abc cde 建立abc的硬连接,

2. 软链接与硬链接的区别(通俗): 
                    硬链接可认为是一个文件拥有两个文件名;而软链接则是
                    系统新建一个链接文件,此文件指向其所要指的文件

3. 软链接与硬链接的区别(讲解):

Linux 软连接与硬连接

对于一个文件来说,有唯一的索引接点与之对应,而对于一个索引接点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问该文件。注意在Linux下是一切皆文件的啊,文件夹、新加的硬盘 ...都可以看着文件来处理的啊。
    连接有软连接和硬连接(hard link)之分的,软连接(symbolic link)又叫符号连接。符号连接相当于Windows下的快捷方式。
    不可以对文件夹建立硬连接的,我们通常用的还是软连接比较多。     
    
eg:
    ln -s source dist        # 建立软连接
    ln source dist            # 建立硬连接

软链接实际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对应的文件位置处进行处理;相反,硬联接为文件开设一个新的目录 项,硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件。
(1)软连接可以 跨文件系统 ,硬连接不可以 。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln aa.txt /root/bb 失败 。

(2)关于 I节点的问题 。硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加,只要结点的连接数不是 0,文件就一直存在,不管你删除的是源文件还是 连接的文件 。只要有一个存在 ,文件就 存在 (其实也不分什么源文件连接文件的 ,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候 ,其他的文件都会做同步的修改。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以 删除连接文件 对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软连接可以对一个不存在的文件名进行连接 。
(4)软连接可以对目录进行连接。

备 注:I节点 :它是UNIX内部用于描述文件特性的数据结构.我们通常称I节点为文件索引结点(信息结点).i节点含有关于文件的大部分的重要信息,包括文件数据块在 磁盘上的地址.每一个I节点有它自己的标志号,我们称为文件顺序号.I节点包含的信息 1.文件类型 2.文件属主关系 3.文件的访问权限 4.文件的时间截.

 
最后 删除符号链接,有创建就有删除
rm -rf   symbolic_name   注意不是rm -rf   symbolic_name/ 


1.Linux链接概念
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

【硬连接】
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

2.通过实验加深理解
[oracle@Linux]$ touch f1          #创建一个测试文件f1
[oracle@Linux]$ ln f1 f2          #创建f1的一个硬连接文件f2
[oracle@Linux]$ ln -s f1 f3       #创建f1的一个符号连接文件f3
[oracle@Linux]$ ls -li            # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。

[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory

通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效

3.总结
依此您可以做一些相关的测试,可以得到以下全部结论:
1).删除符号连接f3,对f1,f2无影响;
2).删除硬连接f2,对f1,f3也无影响;
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。



【硬链接(Hard Link)】

硬链接指通过索引节点来进行连接,在Linux为文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号; 
硬链接指的就是在Linux中,多个文件名指向同一索引节点; 
常见用途:通过建立硬链接到重要文件,防止误删,删除其实对应的是删除其中的一个硬链接,当文件对应的硬链接都被删除了,该文件才真正被删除; 
注意: 默认情况下,ln命令产生硬链接;

点击(此处)折叠或打开

  1. [root@centos7 home]# vi 1.txt
  2. hello, this is 1.
  3. [root@centos7 home]# cp -l 1.txt 2.txt # 为1.txt建立硬链接2.txt,等同于ln 1.txt 2.txt
  4. [root@centos7 home]# more 2.txt # 查看2.txt文件中的内容和1.txt文件内容一样
  5. hello, this is 1.
  6. # 这两个文件的索引节点号,可以看见索引号一样:
  7. [root@centos7 home]# ls -li
  8. 总用量 69868
  9. 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 1.txt
  10. 33845219 -rw-r--r--. 2 root root 44 1月 21 10:12 2.txt
  11. [root@centos7 home]# vi 2.txt # 编辑2.txt,在末未添加:
  12. hello, this is 2.
  13. [root@centos7 home]# more 1.txt # 查看1.txt中是否内容改动
  14. hello, this is 1.
  15. hello, this is 2.
  16. [root@centos7 home]# rm -f 1.txt # 删除1.txt
  17. [root@centos7 home]# more 2.txt # 查看2.txt的内容
  18. hello, this is 1.
  19. hello, this is 2.
  20. 创建硬链接命令:cp -l 1.txt 2.txt等同于ln 1.txt 2.txt # 为1.txt建立硬链接2.txt

【软链接】

也成为符号链接(Symbolic Link),类似于Windows的快捷方式,其中包含的是另一个文件的位置信息;

点击(此处)折叠或打开

  1. [root@centos7 home]# cp -s 2.txt sLink # 为2.txt文件建立符号链接sLink,等同于ln –s 2.txt sLink
  2. [root@centos7 home]# ls –li # 可以看到两个文件有不同的索引节点号
  3. 总用量 69864
  4. 33845219 -rw-r--r--. 1 root root 44 1月 21 10:12 2.txt
  5. 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
  6. [root@centos7 home]# more sLink
  7. hello, this is 1.
  8. hello, this is 2.
  9. [root@centos7 home]# rm -f sLink # 删除符号链接,不影响源文件
  10. [root@centos7 home]# more 2.txt
  11. hello, this is 1.
  12. hello, this is 2.
  13. [root@centos7 home]# rm -f 2.txt # 删除2.txt
  14. [root@centos7 home]# ls -li
  15. 总用量 69860
  16. 36830246 lrwxrwxrwx. 1 root root 5 1月 21 10:21 sLink -> 2.txt
  17. [root@centos7 home]# more sLink
  18. sLink: 没有那个文件或目录

创建符号链接命令:cp -s 2.txt sLink 等同于ln –s 2.txt sLink # 为2.txt文件建立符号链接sLink

注意: 
只能在同种存储媒体上的文件之间创建硬链接(Hard Link),不能在不同挂载点下的文件间创建硬链接,对于后一种情况,可以使用软链接;(区分不同挂载点与同一挂载点不同目录) 
如跨不同的挂载点建立硬链接的报错信息:

[root@centos7 home]# ln 2.txt /dev/hLink
ln: 无法创建硬链接"/dev/hLink" => "2.txt": 无效的跨设备连接

小结:

1: 硬链接是同一文件的不同访问路径,其对应的索引节点号是一样的,删除文件其实就是删除其中的一个硬链接,如果该文件对应的硬链接都被删除了该文件才被删除,常用于保护文件; 
2: 符号链接类似于Windows中对应的快捷方式,删除符号链接不影响源文件,删除源文件,则对应的符号链接也没有意义;



About Me

.............................................................................................................................................

● 本文内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/

● 本文博客园地址:http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ群号:230161599(满)、618766405

● 微信群:可加我微信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友(646634621),注明添加缘由

● 于 2017-11-01 09:00 ~ 2017-11-30 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

.............................................................................................................................................

● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。

小麦苗的微信公众号      小麦苗的DBA宝典QQ群2     《DBA笔试面宝典》读者群       小麦苗的微店

.............................................................................................................................................

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2148266/,如需转载,请注明出处,否则将追究法律责任。

Linux上创建和更改硬链接和符号链接(软连接)相关推荐

  1. linux怎样创建硬链接,Linux下创建软、硬链接

    在linux系统中,内核为每一个新创建的文件分配一个Inode(索引节点),每个文件都有唯一的inode号.文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存,从而实现文件的快速访问. 链接 ...

  2. linux怎么创建软硬链接,Linux下创建软、硬链接

    在linux系统中,内核为每一个新创建的文件分配一个Inode(索引节点),每个文件都有唯一的inode号.文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存,从而实现文件的快速访问. 链接 ...

  3. linux给文件添加链接,Linux给文件或目录创建软链接或硬链接的方法

    有时linux用户们为了使用方便,会想给电脑中的文件或目录创建软链接或硬链接.不过有些用户不清楚该怎么给这些文件或目录创建软链接或硬链接该怎么办呢?别急,现在小编就来教你解决的方法. 解决方法: 当我 ...

  4. linux命令创建硬链接,Linux中的ln命令:创建软链接和硬链接

    软链接是Linux文件系统的基本组成部分之一.在本教程分享了如何使用ln命令创建软链接和硬链接. 链接是对另一个文件的引用.链接为同一个文件赋予多个名称,并允许它们同时存在于两个或多个位置. 链接有两 ...

  5. Linux创建软链接和硬链接的命令

    Linux创建软链接和硬链接的命令 link oldfile newfile # 硬链接 ln oldfile newfile # 硬链接 ln -s old.file soft.link # 软链接 ...

  6. linux 符号链接有什么用,硬链接和符号链接有什么区别?

    问题描述 正如标题所示,我想知道命令ln创建的硬链接和软链接之间的区别.命令man ln确实提供信息,但没有充分回答我的问题. 另外,如果有人能提供一个硬链接比符号链接更可取的设置,那将会很好. 最佳 ...

  7. 【Linux】Linux下的硬链接与符号链接

    Linux的初学者常常混淆Linux中的硬链接(hard link)与符号链接(symbol link)的概念,分不清楚它们的区别.因此,本文将向读者全面介绍硬链接与符号链接,给予读者以全面的认识. ...

  8. Linux中的软链接与硬链接

    Linux中的软链接与硬链接 一.inode的概念 二.软链接 三.硬链接 硬链接的两个限制 四.软链接与硬链接的区别 一.inode的概念 此部分参考:https://blog.csdn.net/M ...

  9. echo添加换行 linux_在 Linux 上创建文件的 10 个方法

    我下面将会介绍多个在 Linux 上创建文件的方法.我建议你选择几个简单高效的来辅助你的工作. -- Vinoth Kumar 我们都知道,在 Linux 上,包括设备在内的一切都是文件.Linux ...

最新文章

  1. 如何高效入门 PyTorch ?
  2. SP-45ML光电二极管放大电路设计
  3. 深入理解Java:类加载机制及反射
  4. 文件服务器上传文件的过程,文件服务器上传文件实现过程【分享】
  5. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
  6. 删除顺序表中重复元素,并按照原序输出
  7. 升级glic: 解决“libc.so.6: version ‘GLIBC_2.14‘ not found“问题
  8. php中的脚本加速扩展opcache
  9. 发一个成熟好用的电池供电切换电路
  10. jmeter元件的作用域与执行顺序
  11. sublim插件(待续)
  12. hive sql 日期格式转换
  13. 自动文本摘要任务背景调研
  14. 六度分离_hdu_1869(floyd算法).java
  15. mk突变点检测_科学网—从网上找的M-K突变检验的程序 - 张乐乐的博文
  16. Context-Aware Zero-Shot Recognition 论文翻译
  17. 计算机应用项目概述,计算机应用包括哪些项目?
  18. 深度学习:欠拟合问题的几种解决方案
  19. 【07月02日】A股滚动市盈率PE最低排名
  20. vim配置即.vimrc文件的配置及vim操作技巧

热门文章

  1. 疫情数据爬取,可视化及其预测
  2. c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. c++调节控制台字体(c++入门练习)
  4. 开源工单系统 python_PESCMS Ticket 客服工单系统 v1.2.0 发布
  5. 基于stm32的两轮自平衡小车4(软件调试篇)
  6. freetype的简单使用之 生成一个字体bmp
  7. Java 创建pdf
  8. 解决升级Flutter3.0后出现警告Operand of null-aware operation ‘!‘ has type ‘WidgetsBinding‘ which excludes null
  9. Spark综合项目:企业电商分析平台
  10. centos 7.6—— Apache网页压缩——网页缓存