面试题:软连接和硬链接介绍

Linux系统引入了两种链接,硬链接(hard link)与软连接(又称符号链接,即soft link或symbolic link)

ln 命令语法格式

NAME
       ln - make links between files

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME
       ln [OPTION]... TARGET
       ln [OPTION]... TARGET... DIRECTORY
       ln [OPTION]... -t DIRECTORY TARGET...

说明

  • TARGET:表示需要创建链接文件的目标文件
  • LINK_NAME:表示生成的链接文件
选项 说明
-b 覆盖以前备份
-d, -F, --directory 允许超级用户制作目录的硬链接,因系统限制可能出错
-f, --force 强制执行
-i, --interactive 交互模式,文件存在则提示用户是否覆盖
-n, --no-dereferenc 把符号链接视为一般目录
-s, --symbolic 软连接(符号链接)
-v, --verbose 显示详细的处理过程
-S, --suffix=SUFFIX 指定备份的文件后缀
--help 显示帮助信息
--version 显示版本信息

1.什么是软连接

软连接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名指向,则该文件就是软连接,软连接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块,因此软连接的创建与使用没有类似硬链接的诸多限制,其主要特点如下

  • 软连接有自己的文件属性及权限等

  • 可对不存在的文件或目录创建软链接

  • 软链接可跨分区创建

  • 软链接可对文件或目录创建

  • 创建软链接时,链接数目不会增加

  • 删除软链接并不影响指向的文件,但若执行的原文件被删除,则相关软链接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接

  • 创建软链接也使用 ln 命令,但是在创建的时候需要跟上参数 "-s" ,软链接的用户也可以是另一个软链接的路径,其解析过程是递归的,及对链接文件创建链接文件

软连接相当于windows的快捷方式,可以设置目录和文件,并且设置软链接的时候,真实源文件最好用绝对路径表示。

软连接文件会将inode指向源文件的block,当我们访问这个软连接文件时,其实访问的是源文件本身

那么当我们对一个文件创建多个软连接,其实就是多个inode指向同一个block,当我们删除软连接文件时,其实只是删除了一个inode指向并不会对源文件造成影响,但如果删除的是源文件则会造成所有软连接文件失效

[root@centos ~/TEST]#ls -l
total 4
-rw-r--r--. 1 root root 62 Mar 25 20:04 sum.sh
[root@centos ~/TEST]#ln -s sum.sh sum.sh.link     # 创建软链接
[root@centos ~/TEST]#ls -li                       # 生成软链接后,不会增加链接数
total 4
201370617 -rw-r--r--. 1 root root 62 Mar 25 20:04 sum.sh
201370618 lrwxrwxrwx. 1 root root  6 Mar 25 20:04 sum.sh.link -> sum.sh
[root@centos ~/TEST]#
[root@centos ~/TEST]#ln -s /tmp/2021-03-25.log today.log.link        # 使用绝对路径创建软链接
[root@centos ~/TEST]#ll today.log.link
lrwxrwxrwx. 1 root root 19 Mar 25 20:05 today.log.link -> /tmp/2021-03-25.log
[root@centos ~/TEST]#ls -li
total 4
201370617 -rw-r--r--. 1 root root 62 Mar 25 20:04 sum.sh
201370618 lrwxrwxrwx. 1 root root  6 Mar 25 20:04 sum.sh.link -> sum.sh
201370619 lrwxrwxrwx. 1 root root 19 Mar 25 20:05 today.log.link -> /tmp/2021-03-25.log             # 显示绝对路径
[root@centos ~/TEST]#ln -s /root/TEST /root/TEST.link   # 对目录或文件创建软链接
[root@centos ~/TEST]#cd ../
[root@centos ~]#ls -li
total 4
201334302 drwxr-xr-x. 2 root root   61 Mar 25 20:05 TEST
201370620 lrwxrwxrwx. 1 root root   10 Mar 25 20:06 TEST.link -> /root/TEST
201326774 -rw-r--r--. 1 root root    0 Mar 25 18:22 TEST.txt
201326736 -rw-------. 1 root root 1456 Mar 24 12:23 anaconda-ks.cfg

# 删除链接文件的源文件,链接文件将成为死链
[root@centos ~]#rm -f /root/TEST/sum.sh
[root@centos ~]#ls -l /root/TEST
total 0
lrwxrwxrwx. 1 root root  6 Mar 25 20:04 sum.sh.link -> sum.sh
lrwxrwxrwx. 1 root root 19 Mar 25 20:05 today.log.link -> /tmp/2021-03-25.log
[root@centos ~]#cat /root/TEST/sum.sh.link
cat: /root/TEST/sum.sh.link: No such file or directory
[root@centos ~]#

提示:软链接创建源文件的路径可以是绝对路径和相对路径,如果是相对路径,一定是相对于软链接文件的路径,而非当前目录

软连接使用场景

  • 软件升级或代码发布rm -f /search/qq && ln -s /sarch/qq_v1.2/ /search/qq

2.什么是硬链接

硬链接本质就是对同一文件起多个文件名,所以表现为一个 inode 号可以对应多个文件名,换言之,硬链接就是同一文件名使用了多个别名,但他们的 inode 号相同,硬链接可使用命令 ln 或 link 创建

A--B,假设B是A的硬链接,那么他们两个指向了同一个文件,允许一个文件拥有多个路径,用户可以通过这种机制建立硬链接到一些重要文件上,防止误删

[root@centos ~/TEST]#pwd         
/root/TEST
[root@centos ~/TEST]#ls -li                     # 查看 inode 号
total 0
201370617 -rw-r--r--. 1 root root 0 Mar 25 18:23 TEST.txt
[root@centos ~/TEST]#ln TEST.txt test.txt       # 创建一个硬链接 test.txt
[root@centos ~/TEST]#ln TEST.txt test.txt       # 如果目标文件已存在则提示错误
ln: failed to create hard link 'test.txt': File exists
[root@centos ~/TEST]#ls -li                     # 发现两文件的 inode 号没改变
total 0
201370617 -rw-r--r--. 2 root root 0 Mar 25 18:23 TEST.txt
201370617 -rw-r--r--. 2 root root 0 Mar 25 18:23 test.txt
[root@centos ~/TEST]#echo "testhelloworld" > TEST.txt     # 向源文件写数据  
[root@centos ~/TEST]#cat TEST.txt
testhelloworld
[root@centos ~/TEST]#cat test.txt                         # 查看文件,发现两个文件内容一致
testhelloworld
[root@centos ~/TEST]#rm -f TEST.txt                       # 删除源文件后,test.txt 硬链接文件仍在
[root@centos ~/TEST]#cat test.txt
testhelloworld
[root@centos ~/TEST]#

由于硬链接是有着相同 inode 号,仅文件名不同的文件,因此硬链接存在以下几点特点

  • 文件有相同的 inode 及 data block

  • 只能对已存在的文件进行创建

  • 不能对目录进行创建,只可对文件创建

  • 不能跨设备(分区)设置硬链接

  • 删除一个硬链接文件并不影响其他相同 inode 号的文件

提示:之所以不能对目录创建文件系统,是因为受限于文件系统的设计,现 Linux 文件系统中的目录均隐藏两个特殊的目录,当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两个目录就是两个硬链接,若系统允许对目录创建硬链接,则会产生目录环

3. 硬链接和软链接区别总结

区别 硬链接 软连接
本质 本质是同一个文件 本质不是同一个文件
跨设备 不支持 支持
inode 相同 不同
链接数 创建新的硬链接,链接数会增加,删除硬链接,链接数减少 创建或删除,链接数不会变化
文件夹 不支持 支持
相对路径 原始文件相对路径是相对于当前工作目录 原始文件的相对路径是相对于链接文件的相对路径
删除源文件 只是链接数减一,但链接文件的访问不受影响 链接文件将无法访问
文件类型 和源文件相同 链接文件,和源文件无关
文件大小 和源文件相同 源文件的路径的长度
  • 软连接相当于windows的快捷方式,当我们访问这个软连接文件时,其实访问的是源文件本身

  • 软连接可以跨盘操作,即建立软链接时,链接文件和被链接文件可以位于不同的文件系统,甚至可以跨越机器

  • 建立硬链接时链接文件和被链接文件必须位于同一文件系统中,即,硬链接只能在同一块盘内操作

  • 软链接一旦原始文件被删除,链接文件立即失效,即,删除源文件后,软连接文件失效

  • 硬链接指向一个原始文件时,即使原始文件被删除,链接文件依然有效,即,删除源文件后,硬链接文件不受影响

posted @ 2021-03-27 10:05  临江仙我亦是行人  阅读(441)  评论(0编辑  收藏  举报