linux系统创建连接文件_Linux文件系统中链接的用户指南

linux系统创建连接文件

在文章中,我写了有关Opensource.com的Linux文件系统的各个方面的内容,包括Linux EXT4文件系统的简介在Linux中管理设备 ; Linux文件系统简介 ; 以及Linux逻辑卷管理用户指南 ,我已经简要提到了Linux文件系统的一个有趣功能,该功能可以通过提供对文件系统目录树中多个位置的文件的访问来简化某些任务。

Linux文件系统链接有两种类型:硬链接和软链接。 两种类型的链接之间的区别很明显,但是两种类型的链接都用于解决类似的问题。 它们都为单个文件提供多个目录条目(或引用),但它们的执行方式却大不相同。 链接功能强大,并为Linux文件系统增加了灵活性,因为所有内容都是文件

例如,我发现某些程序需要特定版本的库。 当库升级替换了旧版本时,该程序将崩溃,并显示指定的旧库名称错误。 通常,库名称中唯一的更改是版本号。 凭直觉,我只是向新库添加了一个链接,但以旧库名命名了该链接。 我再次尝试了该程序,它运行良好。 而且,好的,该程序是一款游戏,每个人都知道为了保持游戏的运行状态,游戏玩家们会竭尽所能。

实际上,几乎所有应用程序都使用通用名称链接到库,而通用名称的链接名称中只有主版本号,而链接指向的实际库文件也具有次要版本号。 在其他情况下,所需文件已从一个目录移至另一个目录以符合Linux文件规范,并且旧目录中具有链接,以便与尚未赶上新位置的那些程序向后兼容。 如果您在/ lib64目录中列出了很长的清单,则可以找到很多两者的示例。



   
   
lrwxrwxrwx.  1 root root       36 Dec  8  2016 cracklib_dict.hwm -> ../../usr/share/cracklib/pw_dict.hwm
lrwxrwxrwx.  1 root root       36 Dec  8  2016 cracklib_dict.pwd -> ../../usr/share/cracklib/pw_dict.pwd
lrwxrwxrwx.  1 root root       36 Dec  8  2016 cracklib_dict.pwi -> ../../usr/share/cracklib/pw_dict.pwi
lrwxrwxrwx.  1 root root       27 Jun  9  2016 libaccountsservice.so.0 -> libaccountsservice.so.0.0.0
-rwxr-xr-x.  1 root root   288456 Jun  9  2016 libaccountsservice.so.0.0.0
lrwxrwxrwx   1 root root       15 May 17 11:47 libacl.so.1 -> libacl.so.1.1.0
-rwxr-xr-x   1 root root    36472 May 17 11:47 libacl.so.1.1.0
lrwxrwxrwx.  1 root root       15 Feb  4  2016 libaio.so.1 -> libaio.so.1.0.1
-rwxr-xr-x.  1 root root     6224 Feb  4  2016 libaio.so.1.0.0
-rwxr-xr-x.  1 root root     6224 Feb  4  2016 libaio.so.1.0.1
lrwxrwxrwx.  1 root root       30 Jan 16 16:39 libakonadi-calendar.so.4 -> libakonadi-calendar.so.4.14.26
-rwxr-xr-x.  1 root root   816160 Jan 16 16:39 libakonadi-calendar.so.4.14.26
lrwxrwxrwx.  1 root root       29 Jan 16 16:39 libakonadi-contact.so.4 -> libakonadi-contact.so.4.14.26

/ lib64目录中的一些链接

上面/ lib64目录的长长的清单显示,文件模式下的第一个字符是字母“ l”,这意味着每个字符都是软链接或符号链接。

硬链接

Linux EXT4文件系统的简介中 ,我讨论了以下事实:每个文件都有一个索引节点,该索引节点包含有关该文件的信息,包括属于该文件的数据的位置。 该文章中的图2显示了一个指向inode的目录条目。 每个文件必须至少具有一个目录条目,该目录条目指向描述文件的索引节点。 目录条目是一个硬链接,因此每个文件至少具有一个硬链接。

在下面的图1中,多个目录条目指向一个索引节点。 这些都是硬链接。 我已经对主目录使用了波浪号( )约定来简化了三个目录条目的位置,因此在此示例中, 等效于/ home / user 。 请注意,第四个目录条目位于完全不同的目录/ home / shared中 ,该目录可能是计算机用户之间共享文件的位置。

fig1directory_entries.png
图1

硬链接仅限于单个文件系统中包含的文件。 在这里,“文件系统”在分区或逻辑卷(LV)的意义上使用,该分区或逻辑卷(LV)安装在指定的安装点上,在这种情况下为/ home 。 这是因为inode编号仅在每个文件系统中都是唯一的,并且不同的文件系统(例如/ var/ opt )将具有与我们文件的inode编号相同的inode。

因为所有硬链接都指向包含有关文件元数据的单个索引节点,所以所有这些属性都是文件的一部分,例如所有权,权限和指向索引节点的硬链接总数,并且对于每个硬链接。 它是一个具有一组属性的文件。 唯一可以不同的属性是文件名,该文件名不包含在索引节点中。 硬链接到位于同一目录中的单个文件/ inode必须具有不同的名称,因为在单个目录中不能有重复的文件名。

使用ls -l命令显示文件的硬链接数。 如果要显示实际的inode编号,请使用命令ls -li进行操作。

符号(软)链接

硬链接和软链接(也称为符号链接(或符号链接))之间的区别在于,尽管硬链接直接指向属于该文件的索引节点,但是软链接指向目录条目,即其中一个硬链接。 因为软链接指向文件而不是索引节点的硬链接,所以它们不依赖于索引节点号,并且可以跨分区和LV跨文件系统工作。

这样做的缺点是:如果删除或重命名了符号链接指向的硬链接,则符号链接会断开。 该符号链接仍然存在,但是它指向一个不再存在的硬链接。 幸运的是, ls命令在长列表中的红色背景上以闪烁的白色文本突出显示断开的链接,并带有闪烁的白色文本。

实验室项目:尝试链接

我认为了解硬链接和软链接的用法和区别的最简单方法是使用您可以做的实验室项目。 该项目应以非root用户身份在空目录中完成。 我为此项目创建了〜/ temp目录,您也应该这样做。 它为执行该项目提供了一个安全的地方,并提供了一个新的空目录供您使用,以便仅将与该项目关联的文件放在该目录中。

最初设定

首先,创建一个临时目录,您将在其中执行此项目所需的任务。 确保当前工作目录(PWD)是您的主目录,然后输入以下命令。


mkdir temp 

使用此命令更改为〜/ temp使其成为PWD。


cd temp 

首先,我们需要创建一个可以链接到的文件。 以下命令可以做到这一点,并提供一些内容。


du -h > main.file.txt 

使用ls -l长列表来验证是否正确创建了文件。 它看起来应该与我的结果相似。 请注意,文件大小仅为7个字节,但您的文件大小可能相差一两个字节。



   
   
[ dboth @ david temp ] $ ls -l
total 4
-rw-rw-r-- 1 dboth dboth 7 Jun 13 07: 34 main.file.txt

注意清单中文件模式后面的数字“ 1”。 该数字表示该文件存在的硬链接数。 现在,它应该为1,因为我们还没有创建任何指向测试文件的链接。

试验硬链接

硬链接会创建一个指向相同inode的新目录条目,因此,将硬链接添加到文件时,您会看到链接数量增加。 确保PWD仍为〜/ temp 。 创建一个指向文件main.file.txt的硬链接,然后对该目录进行另一个长列表。



   
   
[ dboth @ david temp ] $ ln main.file.txt link1.file.txt
[ dboth @ david temp ] $ ls -l
total 8
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07: 34 link1.file.txt
-rw-rw-r-- 2 dboth dboth 7 Jun 13 07: 34 main.file.txt

请注意,两个文件都有两个链接,并且大小完全相同。 日期戳也相同。 这实际上是一个具有一个索引节点和两个链接的文件,即指向该文件的目录条目。 创建与此文件的第二个硬链接,并列出目录内容。 您可以创建指向现有链接的链接: link1.file.txtmain.file.txt



   
   
[ dboth @ david temp ] $ ln link1.file.txt link2.file.txt ; ls -l
total 16
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07: 34 link1.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07: 34 link2.file.txt
-rw-rw-r-- 3 dboth dboth 7 Jun 13 07: 34 main.file.txt

请注意,此目录中的每个新硬链接必须具有不同的名称,因为两个文件(实际上是目录条目)在同一目录中不能具有相同的名称。 尝试创建一个目标名称与现有名称相同的另一个链接。



   
   
[ dboth @ david temp ] $ ln main.file.txt link2.file.txt
ln: failed to create hard link 'link2.file.txt' : File exists

显然这不起作用,因为link2.file.txt已经存在。 到目前为止,我们仅在同一目录中创建了硬链接。 因此,请在您的主目录(到目前为止我们一直在其中使用的temp目录的父目录)中创建一个链接。



   
   
[ dboth @ david temp ] $ ln main.file.txt .. / main.file.txt ; ls -l .. / main *
-rw-rw-r--     4 dboth dboth     7 Jun 13 07: 34 main.file.txt

上面清单中的ls命令显示main.file.txt文件确实存在于主目录中,并且与temp目录中的文件同名。 当然,这些不是不同的文件。 它们是同一个文件,具有指向同一inode的多个链接(目录条目)。 为了帮助说明下一点,请添加一个不是链接的文件。



   
   
[ dboth @ david temp ] $ touch unlinked.file ; ls -l
total 12
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 link1.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 link2.file.txt
-rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 main.file.txt
-rw-rw-r-- 1 dboth dboth 0 Jun 14 08: 18 unlinked.file

使用ls命令的-i选项查看硬链接的索引号和新文件的索引号



   
   
[ dboth @ david temp ] $ ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07: 34 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08: 18 unlinked.file

请注意,在以上示例中,文件模式左侧的数字657024 。 那是索引节点号,所有三个文件链接都指向同一个索引节点。 您也可以使用-i选项来查看我们在主目录中创建的链接的inode编号,该编号也将显示相同的值。 仅具有一个链接的文件的索引节点号与其他链接不同。 请注意,您的系统上的inode编号将有所不同。

让我们更改其中一个硬链接文件的大小。



   
   
[ dboth @ david temp ] $ df -h > link2.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth     0 Jun 14 08: 18 unlinked.file

现在,所有硬链接文件的文件大小都比以前更大。 这是因为实际上只有一个文件由多个目录条目链接到。

我知道下一个实验将在我的计算机上运行,​​因为/ tmp目录位于单独的LV上。 如果您在不同的分区上有单独的LV或文件系统(如果您不使用LV),请确定您是否有权访问该LV或分区。 如果不这样做,则可以尝试插入USB记忆棒并将其安装。 如果这些选项之一适合您,则可以进行此实验。

尝试在/ tmp (或其他文件系统目录所在的位置)中创建〜/ temp目录中文件之一的链接。



   
   
[ dboth @ david temp ] $ ln link2.file.txt / tmp / link3.file.txt
ln: failed to create hard link '/tmp/link3.file.txt' = > 'link2.file.txt' :
Invalid cross-device link

为什么会发生此错误? 原因是每个单独的可安装文件系统都有其自己的索引节点号集。 在整个Linux目录结构中仅通过索引节点号引用文件会引起混乱,因为在每个已安装的文件系统中都可以存在相同的索引节点号。

有时可能需要查找属于单个索引节点的所有硬链接。 您可以使用ls -li命令找到索引节点号。 然后,您可以使用find命令查找具有该索引节点号的所有链接。



   
   
[ dboth @ david temp ] $ find . -inum 657024
. / main.file.txt
. / link1.file.txt
. / link2.file.txt

注意,因为我们从〜/ temp的当前目录开始,所以find命令没有找到到该inode的所有四个硬链接。 find命令仅在PWD及其子目录中查找文件。 要查找所有链接,我们可以使用以下命令,该命令将您的主目录指定为搜索的起始位置。



   
   
[ dboth @ david temp ] $ find ~ -samefile main.file.txt
/ home / dboth / temp / main.file.txt
/ home / dboth / temp / link1.file.txt
/ home / dboth / temp / link2.file.txt
/ home / dboth / main.file.txt

如果您没有非root用户的权限,则可能会看到错误消息。 此命令还使用-samefile选项,而不是指定inode编号。 这与使用inode编号相同,并且如果您知道其中一个硬链接的名称,则可能会更容易。

试用软链接

如您所见,不可能跨越文件系统边界来创建硬链接。 即从一个LV或分区上的文件系统到另一个LV上的文件系统。 软链接是通过硬链接解决该问题的一种方法。 尽管他们可以达到相同的目的,但是它们却截然不同,因此了解这些差异很重要。

让我们从在〜/ temp目录中创建一个符号链接开始,开始我们的探索。



   
   
[ dboth @ david temp ] $ ln -s link2.file.txt link3.file.txt ; ls -li
total 12
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 link1.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth   14 Jun 14 15 : 21 link3.file.txt - >
link2.file.txt
657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14 : 14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth     0 Jun 14 08: 18 unlinked.file

硬链接(其索引节点号为657024的那些)保持不变,并且为每个硬链接显示的硬链接的数量没有更改。 新创建的符号链接具有另一个索引节点,编号658270 。 名为link3.file.txt的软链接指向link2.file.txt 。 使用cat命令显示link3.file.txt的内容。 符号链接的文件模式信息以字母“ l ”开头,表示该文件实际上是符号链接。

在上面的示例中,符号链接link3.file.txt的大小仅为14个字节。 那就是文本link3.file.txt-> link2.file.txt的大小,即目录条目的实际内容。 目录条目link3.file.txt没有指向一个索引节点。 它指向另一个目录条目,这对于创建跨越文件系统边界的链接很有用。 因此,让我们从/ tmp目录创建我们之前尝试过的链接。



   
   
[ dboth @ david temp ] $ ln -s / home / dboth / temp / link2.file.txt
/ tmp / link3.file.txt ; ls -l / tmp / link *
lrwxrwxrwx 1 dboth dboth 31 Jun 14 21 : 53 / tmp / link3.file.txt - >
/ home / dboth / temp / link2.file.txt

删除链接

当您需要删除链接或链接所指向的文件时,还应该考虑其他一些事项。

首先,让我们删除链接main.file.txt 。 请记住,每个指向索引节点的目录条目都只是一个硬链接。



   
   
[ dboth @ david temp ] $ rm main.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14 : 14 link1.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14 : 14 link2.file.txt
658270 lrwxrwxrwx 1 dboth dboth   14 Jun 14 15 : 21 link3.file.txt - >
link2.file.txt
657863 -rw-rw-r-- 1 dboth dboth     0 Jun 14 08: 18 unlinked.file

链接main.file.txt是创建文件时创建的第一个链接。 现在删除它仍然会将原始文件及其数据以及所有剩余的硬链接保留在硬盘上。 要删除文件及其数据,您将必须删除所有剩余的硬链接。

现在删除link2.file.txt硬链接。



   
   
[ dboth @ david temp ] $ rm link2.file.txt ; ls -li
total 8
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14 : 14 link1.file.txt
658270 lrwxrwxrwx 1 dboth dboth   14 Jun 14 15 : 21 link3.file.txt - >
link2.file.txt
657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14 : 14 main.file.txt
657863 -rw-rw-r-- 1 dboth dboth     0 Jun 14 08: 18 unlinked.file

注意软链接发生了什么。 删除软链接指向的硬链接会留下断开的链接。 在我的系统上,断开的链接以彩色突出显示,并且目标硬链接正在闪烁。 如果需要修复断开的链接,则可以在同一目录中创建一个与旧名称相同的硬链接,只要并非所有硬链接都已删除即可。 您也可以重新创建链接本身,使链接保持相同的名称,但指向其余的硬链接之一。 当然,如果不再需要软链接,则可以使用rm命令将其删除。

unlink命令还可用于删除文件和链接。 就像rm命令一样,它非常简单并且没有选项。 但是,它确实更准确地反映了删除的基本过程,因为它删除了到要删除文件的链接(目录条目)。

最后的想法

在开始了解它们的功能和特质之前,我已经使用了两种类型的链接很长时间了。 我为我所教的Linux类编写了一个实验室项目,以充分理解链接是如何工作的。 本文是对我在那堂课中所教内容的简化,我希望它能加快您的学习进度。

翻译自: https://opensource.com/article/17/6/linking-linux-filesystem

linux系统创建连接文件

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值