面试题:软连接和硬链接介绍
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的快捷方式,当我们访问这个软连接文件时,其实访问的是源文件本身
-
软连接可以跨盘操作,即建立软链接时,链接文件和被链接文件可以位于不同的文件系统,甚至可以跨越机器
-
建立硬链接时链接文件和被链接文件必须位于同一文件系统中,即,硬链接只能在同一块盘内操作
-
软链接一旦原始文件被删除,链接文件立即失效,即,删除源文件后,软连接文件失效
-
硬链接指向一个原始文件时,即使原始文件被删除,链接文件依然有效,即,删除源文件后,硬链接文件不受影响