admin管理员组文章数量:1656825
数据在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/
更多高质量原创技术文章可扫码关注公众号:“非科班大厂码农”
版权声明:本文标题:为什么你删了链接文件,原文件也被删除了? 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729757145a1212135.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论