linux 硬链接与软连接

简                介

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

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

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

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

硬链接

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

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

创建一个目录和子目录 -p 选项为创建目录和子目录
# mkdir -p lpi104-6/subdir
创建文件和它的默认组
#touch lpi104-6/file1
创建另一个文件
#touch lpi104-6/file2
创建链接
#ln lpi104-6/file1 lpi104-6/file3
#ln lpi104-6/file1 lpi104-6/subdir/file3sub
给file添加内容
#echo "something" > lpi104-6/file1
给file3添加内容
#echo "else" >> lpi104-6/file3
显示文件file3usb
#cat lpi104-6/subdir/file3sub
something 
els

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

 # df . research
 Filesystem     1K-blocks     Used Available Use% Mounted on 
 /dev/sda5       71168700 31642752  35887712  47% / 
 /dev/sdb3       60326992 30677592  26578276  54% /home/ian/research 
# mkdir -p research/lpi104-6/
# ln lpi104-6/file1 research/lpi104-6/file3
 ln: failed to create hard link ‘ research/lpi104-6/file3 ’ => 
‘ lpi104-6/file1 ’ : Invalid cross-device link 
# ln lpi104-6 lpidir104-6
 ln: ‘ lpi104-6 ’ : hard link not allowed for directory

软链接

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

以下是创建文件软连接的两种方式及目录软连接

# # Create symlink using absolute paths
# ln -s ~/lpi104-6/file1 ~/lpi104-6/file4
# # Create symlink using relative paths
# cd lpi104-6/
# ln -s file1 file5
# lpi104-6]$ cd ..
# # Create symlink across file systems
# mkdir -p ~ian/research/lpi104-6
# ln -s ~/lpi104-6/file1 ~ian/research/lpi104-6/file4
# # Create symlink for directory
# ln -s lpi104-6 lpidir104-6

与之前一样,您可以使用任何链接或目标文件名来引用该文件或目录。

# echo "another line" >> ~ian/research/lpi104-6/file
# # cat a symlink
# cat lpi104-6/file5
 something 
 else 
# # cat a hard link
# cat lpi104-6/file1
 something 
 else 
# # display directory contents using symlink
# ls lpidir104-6
 file1  file2  file3  file4  file5  subdir

创建不良的软链接

# ln -s lpi104-6/file1 lpi104-6/file6

识别链接

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

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

在旧配置上,可能使用深蓝色背景来显示硬链接。这些颜色可使用 dircolors 程序来配置。如果要自定义您的终端外观,您可能希望更改 ls 的一些输出的颜色。

# # Save a copy of dircolors defaults
# dircolors -p > dircolors-defaults
# grep MULTI dircolors-defaults 
# # Change MULTIHARDLINK to blue background 
# sed -e‘/MULTI/s/00/00;44/‘ dircolors-defaults > dircolors-new 
# grep MULTI dircolors-new 
MULTIHARDLINK 00;44 # regular file with more than one link 
# # Set the new colors for the current terminal session 
# eval $(dircolors dircolors-new )

识别链接

# ls --color=none -lR lpi104-6
lpi104-6: 
total 12 
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1 
-rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2 
-rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3 
lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1 
lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1 
lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1 
drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir 

lpi104-6/subdir: 
total 4 
-rw-rw-r--. 3 ian ian 15 Aug  9 14:19 file3sub 
# /bin/ls -l ~ian/research/lpi104-6/file4
lrwxrwxrwx. 1 ian ian 24 Aug  9 14:27 /home/ian/research/lpi104-6/file4 -> /home/ian/lpi104-6/file1 
# /bin/ls -l lpidir104-6
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 目录的短和长输出。

显示 inode 信息

# ls -i lpi104-6
 1988884 file1  1988884 file3  1988892 file5  1988605 subdir 
 1988886 file2  1988885 file4  1988891 file6 
# ls -il lpi104-6
total 12  1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1 
 1988886 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2 
 1988884 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3 
 1988885 lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1 
 1988892 lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1 
 1988891 lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1 
 1988605 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

使用 find 命令,使用 -type l 查找表达式来搜索符号链接

使用 find 查找 symlink

# find lpi104-6 research/lpi104-6 -type l
 lpi104-6/file4 
 lpi104-6/file6 
 lpi104-6/file5
 research/lpi104-6/file4

破坏的 symlink:在上面的不良链接中就是一个被破坏的symlink

硬链接始终指向一个表示文件的 inode,所以它们始终有效。但是,symlink 可能出于许多原因而遭到破坏,包括:

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

如果您使用颜色输出,破坏的 symlink 可能在黑色背景上显示为红色文本,您需要使用 ls 的 -H 或 -L 选项来取消引用该链接,并提供有关目标的信息。-H 选项在命令行上取消引用链接,-L 选项取消引用显示中包含的附加链接。

使用 ls -H 和 ls -L 取消引用链接

# /bin/ls -lH lpidir104-6
 total 12 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1 
 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3 
 lrwxrwxrwx. 1 ian ian   24 Aug  9 14:26 file4 -> /home/ian/lpi104-6/file1 
 lrwxrwxrwx. 1 ian ian    5 Aug  9 14:26 file5 -> file1 
 lrwxrwxrwx. 1 ian ian   14 Aug  9 14:34 file6 -> lpi104-6/file1 
 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir 
# /bin/ls -lL lpidir104-6
 /bin/ls: cannot access lpidir104-6/file6: No such file or directory 
 total 20 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file1 
 -rw-rw-r--. 1 ian ian    0 Aug  9 14:19 file2 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file3 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file4 
 -rw-rw-r--. 3 ian ian   15 Aug  9 14:19 file5 
 l?????????? ? ?   ?      ?            ? file6 
 drwxrwxr-x. 2 ian ian 4096 Aug  9 14:19 subdir

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

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

清单 11. 读取和写入一个破坏的 symlink
 [[email protected] ~]$ cat lpi104-6/file6
 cat: lpi104-6/file6: No such file or directory 
 # echo "Testing file6" > lpi104-6/file6
 bash: lpi104-6/file6: No such file or directory 
 # mkdir lpi104-6/lpi104-6
 # cat lpi104-6/file6
 cat: lpi104-6/file6: No such file or directory 
 # echo "Testing file6" > lpi104-6/file6
 # cat lpi104-6/file6
 Testing file6 
 # ls lpi104-6/lpi104-6
 file1 
 [[email protected] ~]$ ls -l lpi104-6/file6
 lrwxrwxrwx. 1 ian ian 14 Aug  9 14:34 lpi104-6/file6 -> lpi104-6/file1

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

查找一个文件或目录的符号链接

# find lpi104-6 research/lpi104-6 -lname "*file1"
 lpi104-6/file4 
 lpi104-6/file6 
 lpi104-6/file5 
 research/lpi104-6/file4

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

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

链接和系统管理

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

将命令别名化为一个特定版本

 # which python
 /usr/bin/python 
 # ls -l /usr/bin/python
 lrwxrwxrwx. 1 root root 7 May 27 14:12 /usr/bin/python -> python2 
 # ls -l /usr/bin/python2
 lrwxrwxrwx. 1 root root 9 May 27 14:12 /usr/bin/python2 -> python2.7 
 # ls -l /usr/bin/python2.7
 -rwxr-xr-x. 1 root root 7120 May 27 14:12 /usr/bin/python2.7

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

命令别名的示例

# which halt
 /usr/sbin/halt 
# ls -l /usr/sbin/halt
 lrwxrwxrwx. 1 root root 16 Jun  9 09:16 /usr/sbin/halt -> ../bin/systemctl 
#find /usr/sbin /usr/bin -lname "*/systemctl"
 /usr/sbin/halt 
 /usr/sbin/telinit 
 /usr/sbin/shutdown 
 /usr/sbin/runlevel 
 /usr/sbin/poweroff 
 /usr/sbin/reboot 
# which mkisofs
 /usr/bin/mkisofs 
# ls -l /usr/bin/mkisofs
 lrwxrwxrwx. 1 root root 25 Jun 15 08:02 /usr/bin/mkisofs -> /etc/alternatives/mkisofs 
 [[email protected] ~]$ alternatives --display mkisofs
 mkisofs - status is auto. 
 link currently points to /usr/bin/genisoimage 
 /usr/bin/genisoimage - priority 50 
 slave mkisofs-mkhybrid: /usr/bin/genisoimage 
 slave mkisofs-mkhybridman: /usr/share/man/man1/genisoimage.1.gz 
 slave mkisofs-mkisofsman: /usr/share/man/man1/genisoimage.1.gz 
 Current `best‘ version is /usr/bin/genisoimage.

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

库链接

# ls -l /usr/lib*/libm.so*
 lrwxrwxrwx. 1 root root 21 Feb 23 10:31 /usr/lib64/libm.so -> ../../lib64/libm.so.6 
 lrwxrwxrwx. 1 root root 12 Feb 23 10:33 /usr/lib64/libm.so.6 -> libm-2.21.so 
 lrwxrwxrwx. 1 root root 12 Feb 23 10:35 /usr/lib/libm.so.6 -> libm-2.21.so 
 [[email protected] ~]$ find  /usr/lib/ /usr/lib64/ -lname "*libstdc++*"
 /usr/lib/gcc/x86_64-redhat-linux/5.1.1/libstdc++.so 
 /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.so 
 /usr/lib/gcc/x86_64-redhat-linux/5.1.1/32/libstdc++.a 
 /usr/lib64/libstdc++.so.6 
 # ls -l /usr/lib64/libstdc++.so.6
 lrwxrwxrwx. 1 root root 19 Jun 18 06:52 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21 
 # ls -l /usr/lib64/libwbclient*
 lrwxrwxrwx. 1 root root 19 Jul  1 10:37 /usr/lib64/libwbclient.so.0 -> libwbclient.so.0.12 
 lrwxrwxrwx. 1 root root 40 Jul  1 10:37 /usr/lib64/libwbclient.so.0.12 -> 
 /etc/alternatives/libwbclient.so.0.12-6

时间: 2024-08-08 09:24:10

linux 硬链接与软连接的相关文章

Linux硬链接和软连接的区别与总结

图示软硬链接的区别 有关硬链接的总结 具有相同inode节点号的多个文件互为硬链接文件: 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除: 只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除: 硬链接文件是文件的另一个入口: 可以通过给文件设置硬链接文件来防止重要文件被误删: 创建硬链接命令 ln 源文件 硬链接文件: 硬链接文件是普通文件,可以用rm删除: 对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除.注意:如果有进程正在调用,则无法删除或者即使文件名被删除

linux文件和目录的属性及硬链接与软连接

1.文件属性概述 linux系统中的文件或目录的属性主要包括:索引节点(inode).文件类型.权限属性.链接数.所归属的用户和用户组.最近修改的时间等内容. 我们用ls –lhi命令查看一下结果,也可以用stat详细查看文件属性. [[email protected] ~]# ls -lhi total 92K 400420 -rw-------. 1 root root 1.1K Jun 14 05:02 anaconda-ks.cfg 400431 -rw-r--r--. 1 root r

Linux 的硬链接与软连接

首先我们需要了解linux下硬链接以及软连接的基本概念. 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以"路径"的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 下面详细介绍一下硬链接和软连接之间的区别. 1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识):而软链接不共享 inode,也可以说是个特殊的 inode,所以

linux命令4 find、三个时间属性、硬链接和软连接、用户名和密码文件、增加和删除用户组、usermod、su、sudo

find搜索命令 其他搜索命令如下: [[email protected] 333]# which ls alias ls='ls --color=auto' /bin/ls [[email protected] 333]# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/usr/local/jdk1.6.0_23/b

Linux下硬链接与软连接有什么不同

linux硬链接和软链接的区别 1.原理上: 硬链接(hard link):A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的.如果删除了其中一个,对另外一个没有影响.每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收.注:文件和文件名是不同的东

linux硬链接和符号连接

linux硬链接与软链接1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.[硬连接]硬连接指通过索引节点来进行连接.在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index).在Linux中,多个文件名指向同一索引节点是存在的.一般这种连接就是硬连接.硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬

硬链接与软连接的区别_(转)

首先我们需要了解linux下硬链接以及软连接的基本概念. 硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 下面详细介绍一下硬链接和软连接之间的区别. 1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识):而软链接不共享 inode,也可以说是个特殊的 inode,所以和原来的

【文件管理(硬链接与软连接 ,ls, cp, ....)和标准Io】

文件管理:(1):文件系统文件系统从根目录下开始,用"/"表示文件名是区分大小写的以.开头的文件为隐藏文件文件有两类数据元数据:metadata数据:data(2):文件名规则文件名最长225个字节蓝色----目录 绿色----可执行文件红色----压缩文件浅蓝色----链接文件灰色------其他文件(3):文件系统结构/boot:引导文件存放目录/bin:供所有用户使用的基本命令/sbin :管理类基本命令/etc :配置文件目录/home :普通用户家目录/root :管理员夹目

硬链接和软连接的区别以及 ln -s 和mv的区别

linux链接分两种,一种是硬链接(hand link) 一种是软链接 (symbolic link)ln命令是创建链接,默认是创建硬链接ln -s 是创建软连接 ??什么是硬链接硬链接是通过索引节点来进行连接,在linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会分配一个节点编号,或者称之为索引节点. 多个文件名称指向一个节点编号,一般这种连接是硬链接一个文件有硬链接的时候,想要真正删除.需要吧所有的连接全部删除,文件的数据库和目录的链接才会被释放.??? 什么是软连接软连接类似