服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux文件系统中的硬链接及常见面试题

Linux文件系统中的硬链接及常见面试题

2021-07-19 01:59SunnyZhang的IT世界 Linux

inode是Linux(Unix)操作系统中文件系统的一个概念。inode的全称为index node,也就是索引节点。那么inode是用来索引什么的呢?其实inode表示的是一个文件,它是用来索引文件数据的。

Linux文件系统中的硬链接及常见面试题

如果能对inode的概念有所了解,对理解本文会有所帮助。如果对inode的概念不太清楚也没有关系,我们会捎带介绍一下。在文件系统的实现层面,我们可以认为包含两个组件:一个是包含数据块的池子,池子中的数据块是等大小的,比如4KB,8KB等;另外一个是管理这些数据块的数据库。当普通用户访问文件数据时,正是通过前面所说的数据库来找到文件对应的数据块的。

什么是inode

 

inode是Linux(Unix)操作系统中文件系统的一个概念。inode的全称为index node,也就是索引节点。那么inode是用来索引什么的呢?其实inode表示的是一个文件,它是用来索引文件数据的。以Ext3文件系统为例,其文件数据通过间接块的方式来管理,inode通过一个间接块树来管理整个文件的数据。

Linux文件系统中的硬链接及常见面试题

图1 Ext3间接块数组组织形式

如图所示,inode中包含索引信息,通过文件的逻辑地址和inode中的索引信息,可以很方面的找到文件特定位置的数据。关于inode与文件系统的更多知识,大家可以翻阅本号的其它文章,本文不再赘述。

需要注意的是,在inode中并没有文件名称相关的信息。文件名称相关的信息是存储在目录当中,在目录当中有文件名称与inode ID之间的对应关系,具体如下所示。由于有两者之间的对应关系,因此可以根据文件名轻松地获取到inode ID,进而得到inode的信息。

Linux文件系统中的硬链接及常见面试题

图2 目录内数据格式

什么是硬链接

 

文件的硬链接是一个指向inode的目录项。硬链接从表面上来说就是一个文件,但是该文件是基于原始文件创建的链接文件。硬链接与源文件指向相同的inode,因此其数据也是完全一样的。

相对于硬链接,还有一个软链接的概念。软链接是指向一个具体的文件的,而非文件的inode,所以当文件重新命名时,软链接就会失效。因为该软链接原本指向的文件不存在了。而硬链接则不会存在这种情况。

Linux文件系统中的硬链接及常见面试题

假设如图所示的目录结构,在目录Linux中有file1和file2两个文件。目录编程语言中有file2文件一个指向目录linux中file1的硬链接。这是在用户层面的形态,那么在文件系统层面是如何的呢?

在文件系统层面,我们知道文件系统通过一个inode来指示一个文件(包括目录)的内容。目录“电子书”的inode ID是15,其内容图下图所示,包含Linux,编程语言等子目录,对应的inode ID分别如图所示。

对于目录“Linux”来说,其中包含文件file1和file2,inode ID分别是19和20。目录“编程语言”的包含文件file2和硬链接file1_hlink,可以看出file1的inode ID和硬链接file1_hlink的inode ID是相同的,都指向19。inode 19 的内容如下所示。

Linux文件系统中的硬链接及常见面试题

通过上图可以看出硬链接与源文件的对应关系。

如何在Linux创建一个硬链接

 

前面介绍了很多原理性的内容,那么如何在Linux中创建一个硬链接呢?很简单,通过ln命令即可,如下是创建硬链接的命令格式。

  1. ln target_file link_name 

上述命令将为文件target_file创建一个名为link_name的硬链接。通过对比你会发现两者没有任何差异,包括文件内容和属性。

如果你通过ls -li命令可以看到,两个文件的inode ID是相同的(第一列的内容),而文件的计数则是2(rwx权限后面的数字),说明有两个文件名称指向该inode。

  1. 134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  target_file 
  2. 134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  link_name 

下面这些知识点在面试中经常遇到

 

在后端程序员面试过程中经常会遇到链接相关的面试题,下面几个面试题是硬链接相关的题目。

如果一个文件有硬链接,删除源文件会怎样?

 

如果存在硬链接,删除源文件将不会删除文件的数据。通过硬链接仍然能够访问文件的数据。

为什么会出现这种情况?这是因为当有目录项指向inode的时候,inode会增加引用计数。通常情况下引用计数是1,当有一个硬链接时为2,再有一个硬链接的时候就变成了3。

当我们删除普通文件(无硬链接)的时候,首先会删除目录项中的内容,然后将inode的引用计数减1,如果此时inode中引用计数为0,则删除该inode,同时删除相关联的数据。如果非0,则只删除目录项,而不删除相关内容。所以,如果存在硬链接则可以正常访问文件内容。

为什么没法为目录创建硬链接?

 

我们可以为目录创建一个软链接,但是当我们为目录创建硬链接的时候将会出现如下错误提示:

  1. ln: newdir/test_dir: hard link not allowed for directory 

为什么不能为目录创建硬链接呢?这是因为在目录中除了文件相关内容外,还有一个指向父目录的目录项,具体如下图所示的".."目录。如果我们在其它目录创建该目录的硬链接,那么该内容就会被改写,从而导致混乱。

Linux文件系统中的硬链接及常见面试题

除了导致目录数据混乱外,还有一种问题就是会形成路径环。至于如何形成路径环本文不再赘述,大家可以自己思考一下。

能否区分源文件与硬链接?

实际上并没有任何信息区分硬链接和源文件。如果我们在文件名命名规则上没有限制,那么我们将无法区分两者。也就是说,文件本身也是一个硬链接。

  1. 134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  target_file 
  2. 134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  link_target_file 

比如上面这个例子,我们可以通过文件名称来知道哪个是硬链接。但是并没有其它信息进行区分。

如何查找一个文件的硬链接?

 

如果你发现一个文件的引用计数大于1,那么该文件肯定是有硬链接的。那么如何找到这个文件的所有硬链接呢?其实很简单,通过find命令就行。find命令有个-inum选项,用于查找指定inode ID的文件,具体如下。

  1. find . -inum inode_number 

今天的内容先到这里。

原文链接:https://www.toutiao.com/i6656730521013322244/

延伸 · 阅读

精彩推荐
  • LinuxLinux中环境变量配置的步骤详解

    Linux中环境变量配置的步骤详解

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的...

    Myths7882022-02-10
  • LinuxLinux上设置用户通过SFTP访问目录的权限的方法

    Linux上设置用户通过SFTP访问目录的权限的方法

    这篇文章主要介绍了Linux上设置用户通过SFTP访问目录的权限的方法,SFTP可以理解为使用SSH协议进行FTP传输的协议,因而同时要对OpenSSH进行相关设置,需要的朋...

    OSChina10022019-06-19
  • LinuxLinux lnmp下无法使用mail发邮件的两种解决方法

    Linux lnmp下无法使用mail发邮件的两种解决方法

    在配置了lnmp环境后,出现了mail函数不能发送邮件的问题,其实有两种方法,一是使用sendmail组件,而是使用postfix。下面为大家一一介绍下 ...

    Linux之家4042019-09-17
  • Linux确保Linux系统安全的前提条件 漏洞防护

    确保Linux系统安全的前提条件 漏洞防护

    Linux 作为开放式的操作系统受到很多程序员的喜爱,很多高级程序员都喜欢编写Linux操作系统的相关软件。这使得Linux操作系统有着丰富的软件支持,还有无...

    Linux之家2642020-04-11
  • LinuxLinux常用的日志文件和常用命令

    Linux常用的日志文件和常用命令

    成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。 Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所...

    Linux教程网2632020-04-18
  • Linuxlinux中rmdir命令使用详解(删除空目录)

    linux中rmdir命令使用详解(删除空目录)

    今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的 ...

    linux命令大全5372019-11-19
  • Linux手把手教您在 Linux 上使用 GPG 加解密文件

    手把手教您在 Linux 上使用 GPG 加解密文件

    在本教程中,我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程,你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令,并在你...

    Linux中国6962021-12-15
  • Linux详解Linux系统下PXE服务器的部署过程

    详解Linux系统下PXE服务器的部署过程

    这篇文章主要介绍了Linux系统下PXE服务器的部署过程,包括对PXE的API架构作了一个基本的简介,需要的朋友可以参考下...

    运维之道9812019-07-04