Linux 硬链接和软链接详细介绍 及 软链接注意事项

1、Linux 文件介绍

Linux 文件系统及相关管理工具 详细介绍

stat 和 touch 的命令使用(文件元数据的修改和查看)

1.1 文件组成

一个文件通常有两部分组成:

  • 元数据(metadata):使用 stat 命令查看
  • 数据(data):使用文件查看命令查看,如 cat、tac、less等

1.2 文件 Inode

在 Linux 中,元数据中的 Inode 号(Inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。

在这里插入图片描述
可使用以下两种方式进行文件 Inode 。

[root@Tang link]# touch link.txt

# 第一种查看方式
[root@Tang link]# ls -i
101662104 link.txt

# 第二种查看方式
[root@Tang link]# stat link.txt 
  File: ‘link.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 101662104   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-05-15 14:27:32.015638699 +0800
Modify: 2020-05-15 14:27:32.015638699 +0800
Change: 2020-05-15 14:27:32.015638699 +0800
 Birth: -

1.3 改变文件名称,Inode 不改变

[root@Tang link]# ls
link.txt

# 改变文件名称
[root@Tang link]# mv link.txt link-rename.txt 

[root@Tang link]# ls
link-rename.txt

# 查看文件 Inode
[root@Tang link]# ls -i
101662104 link-rename.txt

[root@Tang link]# stat link-rename.txt 
  File: ‘link-rename.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 101662104   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-05-15 14:27:32.015638699 +0800
Modify: 2020-05-15 14:27:32.015638699 +0800
Change: 2020-05-15 14:34:04.751308144 +0800
 Birth: -

2、硬链接和软链接

2.1 前提

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。

链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。

在这里插入图片描述

2.2 硬链接

2.2.1 硬链接介绍

硬链接是新的目录条目,其引用系统中的现有文件。

文件系统中的每一文件默认具有一个硬链接。

为节省空间,可以不复制文件,而创建引用同一文件的新硬链接。

新硬链接如果在与现有硬链接相同的目录中创建,则需要有不同的文件名,否则需要在不同的目录中。指向同一文件的所有硬链接具有相同的权限、连接数、用户/组所有权、时间戳以及文件内容。指向同一文件内容的硬链接需要在相同的文件系统中。

简单说,硬链接就是一个 inode 号对应多个文件。就是同一个文件使用了多个别名(上图中 hard link 就是 file 的一个别名,他们有共同的 inode)。

2.2.2 硬链接创建

# 创建文件内容
[root@Tang link]# echo "Hello" > link-rename.txt
[root@Tang link]# cat link-rename.txt
Hello
[root@Tang link]# ll
total 4
-rw-r--r--. 1 root root 6 May 15 14:53 link-rename.txt

# 使用 ln 创建硬链接
[root@Tang link]# ln link-rename.txt link-rename-hardlink.txt 
[root@Tang link]# ll
total 8
-rw-r--r--. 2 root root 6 May 15 14:53 link-rename-hardlink.txt
-rw-r--r--. 2 root root 6 May 15 14:53 link-rename.txt

# 文件 Inode 一致
[root@Tang link]# ll -i
total 8
101662104 -rw-r--r--. 2 root root 6 May 15 14:53 link-rename-hardlink.txt
101662104 -rw-r--r--. 2 root root 6 May 15 14:53 link-rename.txt
[root@Tang link]# cat link-rename-hardlink.txt 
Hello

# 删除原有文件后,创建后的硬链接依旧能够使用
[root@Tang link]# rm -rf link-rename.txt 
[root@Tang link]# ll -i
total 4
101662104 -rw-r--r--. 1 root root 6 May 15 14:53 link-rename-hardlink.txt
[root@Tang link]# cat link-rename-hardlink.txt 
Hello

2.2.3 硬链接特点

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

  1. 文件有相同的 inode 及 data block
  2. 只能对已存在的文件进行创建
  3. 不能交叉文件系统进行硬链接的创建
  4. 不能对目录进行创建,只可对文件创建
  5. 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

2.2.4 硬链接答疑

  • 第三条不能交叉文件系统进行硬链接的创建,为什么?
    inode 是随着文件的存在而存在,因此只有当文件存在时才可创建硬链接,即当 inode 存在且链接计数器(link count)不为 0 时。inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,因此硬链接创建时不可跨文件系统。

  • 第四条中不能对目录创建硬链接,为什么?
    简单说,如果针对文件做硬连接,等于针对这个文件对应的inode又做一个链接。所以硬链接等于是同一个inode对应多个文件名。对于目录来说,就是保存这些链接的一个inode。如果针对目录做硬链接,一个子目录的硬链接指向父目录的话,这样就循环了。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(…)。查看这两个特殊目录的inode号可知其实这两目录就是两个硬链接。若系统允许对目录创建硬链接,则会产生目录环。

2.3 软链接

2.3.1 软链接介绍

软链接(又称符号链接,即 soft link 或 symbolic link), 软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。

软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。

软连接可以指向目录,而且软连接所指向的目录可以位于不同的文件系统中。

2.3.2 软链接创建文件

# 重命名
[root@Tang link]# mv link-rename-hardlink.txt link-rename.txt 
[root@Tang link]# ll -i
total 4
101662104 -rw-r--r--. 1 root root 6 May 15 14:53 link-rename.txt

# 查看当前工作目录
[root@Tang link]# pwd
/root/link

# 创建软链接
[root@Tang link]# ln -s /root/link/link-rename.txt link-rename-softlink.txt 
[root@Tang link]# ll
total 4
lrwxrwxrwx. 1 root root 26 May 15 15:13 link-rename-softlink.txt -> /root/link/link-rename.txt
-rw-r--r--. 1 root root  6 May 15 14:53 link-rename.txt

# 软链接的 Inode 不一致
[root@Tang link]# ll -i
total 4
101657099 lrwxrwxrwx. 1 root root 26 May 15 15:13 link-rename-softlink.txt -> /root/link/link-rename.txt
101662104 -rw-r--r--. 1 root root  6 May 15 14:53 link-rename.txt

# 通过软链接查看内容
[root@Tang link]# cat link-rename-softlink.txt 
Hello

# 删除原文件
[root@Tang link]# rm -rf link-rename.txt 
[root@Tang link]# ll -i
total 0
101657099 lrwxrwxrwx. 1 root root 26 May 15 15:13 link-rename-softlink.txt -> /root/link/link-rename.txt

# 使用软链接无法查看文件内容
[root@Tang link]# cat link-rename-softlink.txt 
cat: link-rename-softlink.txt: No such file or directory

2.3.3 软链接创建目录(可用于系统升级)

可用于系统升级,创建软链接后,使用软链接进行系统配置。需要升级时,修改软链接指向的原目录即可。

# 查看目录内容
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 15:30 1.txt
-rw-r--r--. 1 root root 0 May 15 15:30 2.txt
-rw-r--r--. 1 root root 0 May 15 15:30 3.txt

# 针对于目录创建软链接
[root@Tang link]# ln -s soft-link/ soft-test
[root@Tang link]# ll -i
total 0
  7129962 drwxr-xr-x. 2 root root 45 May 15 15:30 soft-link
101657099 lrwxrwxrwx. 1 root root 10 May 15 15:31 soft-test -> soft-link/

# 通过软链接进行目录文件查看
[root@Tang link]# ll soft-test/
total 0
-rw-r--r--. 1 root root 0 May 15 15:30 1.txt
-rw-r--r--. 1 root root 0 May 15 15:30 2.txt
-rw-r--r--. 1 root root 0 May 15 15:30 3.txt

# 对原目录文件进行修改
[root@Tang link]# touch soft-link/4.txt
[root@Tang link]# touch soft-link/5.txt
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 15:30 1.txt
-rw-r--r--. 1 root root 0 May 15 15:30 2.txt
-rw-r--r--. 1 root root 0 May 15 15:30 3.txt
-rw-r--r--. 1 root root 0 May 15 15:31 4.txt
-rw-r--r--. 1 root root 0 May 15 15:31 5.txt

# 软链接中也同样进行增加
[root@Tang link]# ll soft-test/
total 0
-rw-r--r--. 1 root root 0 May 15 15:30 1.txt
-rw-r--r--. 1 root root 0 May 15 15:30 2.txt
-rw-r--r--. 1 root root 0 May 15 15:30 3.txt
-rw-r--r--. 1 root root 0 May 15 15:31 4.txt
-rw-r--r--. 1 root root 0 May 15 15:31 5.txt

2.3.4 软链接特点

  1. 软链接有自己的文件属性及权限等
  2. 可对不存在的文件或目录创建软链接;
  3. 软链接可交叉文件系统
  4. 软链接可对文件或目录创建
  5. 创建软链接时,链接计数 i_nlink 不会增加;
  6. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接或悬挂的软链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)

2.3.5 软链接注意事项1

一定要注意,当删除软链接文件时,如果不小心会把原始文件删掉。

2.3.5.1 删除软链接错误示例

# 查看当前目录文件
[root@Tang link]# ll 
total 0
drwxr-xr-x. 2 root root 45 May 15 16:11 soft-link
lrwxrwxrwx. 1 root root 10 May 15 15:31 soft-test -> soft-link/
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 16:11 1.txt
-rw-r--r--. 1 root root 0 May 15 16:11 2.txt
-rw-r--r--. 1 root root 0 May 15 16:11 3.txt
[root@Tang link]# ll soft-test/
total 0
-rw-r--r--. 1 root root 0 May 15 16:11 1.txt
-rw-r--r--. 1 root root 0 May 15 16:11 2.txt
-rw-r--r--. 1 root root 0 May 15 16:11 3.txt
[root@Tang link]# ll
total 0
drwxr-xr-x. 2 root root 45 May 15 16:11 soft-link
lrwxrwxrwx. 1 root root 10 May 15 15:31 soft-test -> soft-link/

# rm -rf 删除软链接
[root@Tang link]# rm -rf soft-test/

# 发现把目录中的文件全部删除了
[root@Tang link]# ll soft-link/
total 0
[root@Tang link]# ll soft-test/
total 0

2.3.5.2 删除软链接正确示例

# 查看目录文件
[root@Tang link]# ll
total 0
drwxr-xr-x. 2 root root 45 May 15 16:38 soft-link
lrwxrwxrwx. 1 root root 10 May 15 15:31 soft-test -> soft-link/
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt
[root@Tang link]# ll soft-test/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt
# 删除软链接文件,千万不要带 /
[root@Tang link]# rm soft-test
rm: remove symbolic link ‘soft-test’? yes

# 删除成功
[root@Tang link]# ll 
total 0
drwxr-xr-x. 2 root root 45 May 15 16:38 soft-link

# 原目录文件中未有改变
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt

2.3.6 软链接注意事项2

当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。

但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的亦是相对路径指向。

2.3.6.1 软链接错误创建实例

# 查看目录文件
[root@Tang link]# ll
total 0
drwxr-xr-x. 2 root root 45 May 15 16:38 soft-link
[root@Tang link]# 
[root@Tang link]# ll soft-link/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt

# 使用相对路径创建软链接文件
[root@Tang link]# ln -s soft-link/ soft-link-soft
[root@Tang link]# ll
total 0
drwxr-xr-x. 2 root root 45 May 15 16:38 soft-link
lrwxrwxrwx. 1 root root 10 May 15 16:42 soft-link-soft -> soft-link/

[root@Tang link]# ll soft-link-soft/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt

# 移动软链接文件
[root@Tang link]# mv soft-link-soft /tmp/

[root@Tang link]# ll /tmp/soft-link-soft 
lrwxrwxrwx. 1 root root 10 May 15 16:42 /tmp/soft-link-soft -> soft-link/

# 移动过后的软链接变为一个死链接
[root@Tang link]# ll /tmp/soft-link-soft/
ls: cannot access /tmp/soft-link-soft/: No such file or directory

2.3.6.2 软链接错误创建实例

# 查看目录文件
[root@Tang link]# ll
total 0
drwxr-xr-x. 2 root root 45 May 15 16:38 soft-link

# 使用绝对路径创建软链接
[root@Tang link]# ln -s /root/link/soft-link/ soft-link-soft
[root@Tang link]# ll soft-link-soft/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt

# 移动软链接
[root@Tang link]# mv soft-link-soft /tmp/
mv: overwrite ‘/tmp/soft-link-soft’? yes
[root@Tang link]# ll /tmp/soft-link-soft
lrwxrwxrwx. 1 root root 21 May 15 16:46 /tmp/soft-link-soft -> /root/link/soft-link/

# 软链接能正常使用
[root@Tang link]# ll /tmp/soft-link-soft/
total 0
-rw-r--r--. 1 root root 0 May 15 16:38 1.txt
-rw-r--r--. 1 root root 0 May 15 16:38 2.txt
-rw-r--r--. 1 root root 0 May 15 16:38 3.txt

猜你喜欢

转载自blog.csdn.net/weixin_44983653/article/details/106142559
今日推荐