当前位置: 首页 > 科技观察

如何理解Linux软链接和硬链接?

时间:2023-03-17 20:48:15 科技观察

简介我们的现代操作系统需要防止程序崩溃导致信息丢失,需要将信息存储在文件中。并且文件可以同时被多个进程读取。在Linux中,所有的资源和外设都被抽象成文件,因此在Linux中有“一切皆文件”的特点。当然,光有文件是不够的。不可能将所有文件集中管理。过于凌乱,难以管理和维护。Linux引入了目录的概念,在Windows中可以称为文件夹。目录的引入将使Linux根文件系统呈现为分层目录树。如下图所示:什么是目录?在Linux中,“一切皆文件”,所以这个问题很容易回答:目录也是文件。目录中记录的是目录下的文件名。既然是文件,那么在创建目录的时候如果和当前目录下的文件或者目录重名,肯定会创建失败。好了,现在我们已经弄清楚了目录的概念,让我们继续。硬链接和软链接有什么区别?文件在Linux中的表示方式由两部分表示:用户数据(userdata)和元数据(metadata)。什么是用户数据?用户数据是记录真实文件内容的数据,这些数据存储在大小相等的文件数据块(数据块)中。元数据呢?其实就是这个文件的附加信息属性,比如:创建时间,文件大小等等。我们用索引号(inode)来表示每个不同文件的元数据(当然inode也是元数据的一部分)。在Linux中,inode是代表文件的唯一标识符,而不是文件名。下图显示了如何通过名称查找文件的内容。注意:文件名不包含在元数据中。文件名只是为了方便用户识别和记忆。什么命令可以查看inode号?可以使用stat和ls-i命令查看,如下图:什么是硬链接?硬链接是指通过索引节点的连接。即有多个文件名指向同一个inode。这样就可以为重要文件建立硬链接,防止“误删”操作。命令:linkoldfilenewfile可以创建硬链接。硬链接的inode是一样的,只是文件名不同,所以它有一些特点:文件有相同的inode和数据块;不存在的文件不能创建硬链接,不能跨文件系统创建(因为各自文件系统中的inode是完美的,跨文件系统时会出现inode重复)不能创建目录,只能创建文件如果一个硬链接文件被删除,不会影响同一个inode的其他文件(inode有一个链接计数器,删除一个硬链接相当于计数器减一,反之亦然。直到为0,删除inode)例如:#ls-litotal0//只能创建到已有文件的硬链接#linktest.filetest_hard.linklink:cannotcreatelink`test_hard.link'to`test.file':Nosuchfileordirectory#echo"这个是一个原始文件">test.file#cattest.fileThisisanoriginalfile#stattest.fileFile:`test.file'Size:25Blocks:8IOBlock:4096regularfileDevice:807h/2055dInode:660650Links:2Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)...//文件的inode号和datablock相同#linktest.filetest_hard.link|ls-litotal8660650-rw-r--r--2rootroot25Sep117:44test_hard.link660650-rw-r--r--2rootroot25Sep117:44test.file//不能跨文件系统#ln/dev/input/event5/root/bfile.txtln:failedtocreatetest_hardlink`/root/bfile.txt'=>`/dev/input/event5':Invalidcross-devicelink//无法创建到目录的硬链接#mkdir-ptest.dir/test#lntest.dir/test_hardlink.dirln:`test.dir/':test_hardlinknotallowedfordirectory#ls-iF660650test_hard.link657948test.dir/为660650t的具体解释est.file,请参考硬链接的5大特点。什么是软链接?软链接与硬链接完全不同。软链接是指向记录在用户数据块中的另一个文件的路径名。可以这样理解,软链接其实就是一个普通的文件,只是它的内容很特殊。所以软链接有自己的inode号和数据块。那么我总结一下软链接的特点:软链接有自己的文件属性,可以为不存在的文件创建软链接,可以跨文件系统创建软链接,可以为目录创建软链接。inode如果链接文件被删除,链接就没有意义了,但是可以重新创建。下图为软链接的访问过程:例如:#ls-litotal0//可以为不存在的文件建立软链接#ln-stest.filetest_soft.link#ls-liFtotal0789467lrwxrwxrwx1rootroot8Sep118:00test_soft.link->test.file//由于指向的文件不存在,所以此时的软链接test_soft.link为死链接链接返回普通软链接#echo"Thisisanoriginalfile_A">>test.file#cattest_soft.linkThisisanoriginalfile_A//为不存在的目录创建软链接#ln-stest.dirtest_soft.link.dir#mkdir-ptest.dir/test#tree.-F--索引节点。├──[789497]test.dir/│└──[789498]test/├──[789495]test.file├──[789495]test_soft.link->test.file└──[789497]test_soft.link.dir->test.dir/具体解释:略