为什么你删了链接文件,原文件也被删除了?

数据在Linux系统中是如何存储

为了理解什么是硬链接和软链接,需要了解数据在Linux系统中是如何存储的。

在计算机中,数据存储在硬盘上。硬盘被分成多个Block,每个Block又被分成很多称为扇区(sector)的小块。典型情况下,每个扇区的大小是 512 字节,Block的大小为4096字节,这种情况下,一个Block包含8个扇区。

文件系统是以Block为单位分配空间的,你可以这么理解,即使你创建一个大小只有1字节的文件,它都会占用一个完整的Block。你用ls -l去查看这个文件的大小,会显示是4096 个字节大小。

但是如果你创建的文件大小超过4096个字节怎么办?答案是文件将被“碎片化”并存储到多个不同的Block中。

什么是 inode

Inode 本质上是用于描述文件的数据结构,innode主要存储了如文件权限、文件类型、文件大小等文件元数据信息,但最重要的是存储了该文件的真实数据存放在磁盘上的哪些Block中。

需要注意的是文件名不是 inode 的一部分。

关于文件名和 inode

在 Linux 系统上,文件名保存在单独的索引中,这个单独的索引记录了系统上所有文件(包括目录)的文件名,并且它也知道每一个文件其对应的inode。

Linux 上的硬链接和软链接是什么

有了上面的背景,现在我们可以来介绍硬链接和软链接了。

让我们从软链接开始,因为它可能是最容易理解的。

软链接

软链接,也称为符号链接,运行 ls 命令时,符号链接用文件类型“ l ”标识,同时文件名那一列是链接名称 -> 所引用文件的文件名。

这个图中,文件“shortcut”指向我文件系统上的文件“file.txt ”。

现在我们来看一下原文件file.txt的 inode 和shortcut的 inode。

$ stat shortcut
  File: shortcut -> file.txt
  Size: 3               Blocks: 0          IO Block: 4096   symbolic link
Device: fc01h/64513d    Inode: 258539      Links: 1

$ stat file.txt
  File: job
  Size: 59              Blocks: 8          IO Block: 4096   regular file
Device: fc01h/64513d    Inode: 258545      Links: 2

可以看出,两个文件的 inode不同,但是两者也有一定的关联:原始文件 inode 直接指向文件内容(即包含实际数据的块),而符号链接“shortcut”的 inode 指向包含原始文件路径的块。

不难看出,软链接下,链接文件和原始文件是共享文件的实际数据,这意味着如果我修改链接 文件的内容,其实就是修改了原始文件的内容。

如果我删除链接文件,它只会删除对第一个 inode(原始文件的 inode) 的引用。由于原始文件的 inode仍然引用磁盘上文件的内容,因此内容不会丢失,但是,如果我删除原始文件,将无法再读取该文件,符号链接会变成一个“断开”的链接,因为它指向的文件已经不存在了,这就是我们所说的悬空符号链接,即未指向任何内容的链接。

现在,我们来思路另外一个问题:软链接的大小是多少?

为了说明这个问题,下面我创建了一个名为“devconnected”的文件,并使用 ln 命令为它建立了一个软链接。

可以看出软链接的大小是12,这个大小正好是原始文件名 “devconnected”的长度。

最后需要说明的是:软链接可以指向不同的文件系统,包括指向远程文件系统。如果您使用 NFS(网络文件系统),则可以创建从一个文件系统到网络访问的文件系统的软链接。

硬链接

我们再来看一下原始文件 inode和硬链接 inode。

$ stat hardlink
  File: hardlink
  Size: 59              Blocks: 8          IO Block: 4096   regular file
Device: fc01h/64513d    Inode: 258545      Links: 2

$ stat file.txt
  File: file.txt
  Size: 59              Blocks: 8          IO Block: 4096   regular file
Device: fc01h/64513d    Inode: 258545      Links: 2

您可能已经注意到,inode 是相同的,但是文件名不同!

以下是此情况下文件系统发生的情况。

因此,如果修改硬链接文件中的内容,则原文件中的内容也会改变,同样地,如果你修改了原始文件中的内容,那么在硬链接文件中也会被修改。

但是,如果删除硬链接文件,您仍然可以访问原始文件内容,同样,删除原始文件不会对硬链接的内容产生任何影响,这也是和软链接一个显著的不同点。

最后需要注意的一点是不能为目录创建硬链接

链接相关操作

创建软链接

要创建软链接,需要使用ln命令,带有-s选项(表示符号)和两个参数,第一个参数指定想要链接到的原文件名称,第二个参数指定即将创建的软链接的名称。

$ ln -s file shortcut

$ ls -l
-rw-rw-r-- 1 schkn schkn 0 Aug 14 20:12 file
lrwxrwxrwx 1 schkn schkn 4 Aug 14 20:12 shortcut -> file

还可以创建到目录的软链接:

$ mkdir folder
$ ln -s folder shortcut-folder

$ ls -l
drwxrwxr-x  2 schkn schkn   4096 Aug 14 20:13 folder
lrwxrwxrwx  1 schkn schkn      7 Aug 14 20:14 shortcut-folder -> folder/
删除软链接

要删除现有的软链接,使用unlink命令,后面的参数是要删除的软链接名称。

$ unlink shortcut

$ ls -l 
-rw-rw-r-- 1 schkn schkn 0 Aug 14 20:12 file
创建硬链接

创建硬链接也是使用ln命令,只是不需要-s选项。

$ ln file hardlink

$ ls -l
-rw-rw-r--  2 schkn schkn      0 Aug 14 20:12 file
-rw-rw-r--  2 schkn schkn      0 Aug 14 20:12 hardlink
删除硬链接

同样,可以使用unlink命令删除 Linux 系统上的硬链接。

$ ln file hardlink
$ unlink hardlink
$ ls -l
-rw-rw-r--  2 schkn schkn      0 Aug 14 20:12 file
查找系统上的链接

在 Linux 系统上可以使用find 命令查找链接,find 命令有一个选项可以指定类型来查找文件,因此可以使用它来查找系统上的链接:

$ find . -type l -ls
262558      0 lrwxrwxrwx   1 schkn    schkn           7 Aug 14 20:14 ./shortcut-folder2 -> folder2/
262558      0 lrwxrwxrwx   1 schkn    schkn           7 Aug 14 20:14 ./shortcut-folder -> folder/

更多高质量原创技术文章可扫码关注公众号:“非科班大厂码农”
在这里插入图片描述

### 回答1: 硬链接不能跨文件系统,因为硬链接是基于 inode 编号实现的,不同文件系统的 inode 编号是不同的。而软链接可以跨文件系统,因为软链接是一个指向目标文件或目录的符号链接,它是通过路径名实现的,所以可以跨文件系统。 ### 回答2: 硬链接是通过文件系统中的inode进行链接的。inode是文件文件系统中的索引节点,包含了文件的元数据信息,如文件长度、访问权限等。硬链接创建时文件系统中创建一个新的目录项,指向同一个inode。因此,硬链接只能在同一个文件系统中产生作用,不能跨越文件系统。 软链接(符号链接)是一个指向目标文件或目录的特殊文件软链接创建时,文件系统中创建一个新的文件,其中包含了指向目标文件或目录的路径信息。由于软链接存储的是路径信息,而不是inode信息,所以软链接可以跨越不同文件系统,指向其他文件系统中的目标文件或目录。 为什么硬链接不能跨文件系统,软链接可以呢?这是因为硬链接通过inode来链接文件,在同一个文件系统中,不同目录中的目录项可以指向同一个inode。而不同文件系统中的inode编号不重复,因此无法直接通过inode进行链接。而软链接存储的是路径信息,对于不同文件系统来说,只要能正常解析路径,就可以链接到目标文件或目录,所以软链接可以跨越文件系统。 ### 回答3: 硬链接不能跨文件系统,而软链接可以。 硬链接是通过文件索引节点(inode)来实现的,在同一个文件系统中,inode是唯一的。因此,硬链接只能在同一个文件系统中的文件之间进行创建。即使在不同的目录下创建硬链接,只要它们是在同一个文件系统下,它们都共享同一个inode。当一个硬链接所指向的文件删除时,inode并不删除,只有当所有指向inode的硬链接都被删除时,该inode才被释放。因此,硬链接只能在同一个文件系统中的文件之间实现链接软链接是一种特殊的文件,它具有其自己的inode和数据块,并用于指向另一个文件软链接与原始文件之间没有直接的连接关系,只是通过路径名进行关联。因此,软链接可以跨越文件系统边界,指向不同文件系统中的文件。当软链接所指向的文件删除时,软链接本身变为无效,称为“断链”。因为软链接与原始文件之间没有直接的连接关系,所以即使原始文件删除软链接本身还存在于文件系统中。 总结起来,硬链接不能跨文件系统是因为它们共享同一个inode,而软链接可以跨文件系统是因为它们与原始文件之间没有直接的连接关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值