Linux文件系统——链接文件

链接文件是Linux文件系统的一个特性。如需要在系统上维护同一文件的两份或多份副本,除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种不同类型的文件链接: 

  • 符号链接(软链接)
  • 硬链接

符号链接

符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。使用 ln -s 命令创建符号链接时,源文件必须存在,链接文件必须不存在。

使用相对路径创建符号链接

[root@localhost ~]# mkdir test
[root@localhost ~]# cd test

[root@localhost test]# touch test.txt 
[root@localhost test]# ln -s test.txt test
[root@localhost test]# ll
total 4
lrwxrwxrwx 1 root root    8 Aug 24 16:34 test -> test.txt
-rw------- 1 root root 1672 Aug 24 16:33 test.txt

上面的例子中,源文件test.txt是第一个参数,符号链接(目标文件)test是第二个参数,命令执行结果是创建一个由目标文件指向源文件的链接。

注意:符号链接的文件大小与源文件的大小是不同的,符号链接test是8个字节,而test.txt是1672个字节,因为是一个链接指向,实际内容是不相同的,是两个完全不同的文件。证明链接文件与源文件是否相同,可以通过查看文件的inode(索引节点编号)号,如

[root@localhost test]# ls -i test*
34306370 test  34306369 test.txt

 使用绝对路径创建符号链接

当源文件使用相对路径,而符号链接使用绝对路径时,创建的符号链接文件是有问题的,但是执行结果($?)是0

[root@localhost test]# ln -s test.txt /root/a

[root@localhost test]# ll /root/a
lrwxrwxrwx 1 root root 8 Aug 24 16:44 /root/a -> test.txt

当源文件使用绝对路径,而符号链接使用相对路径时,是没有问题的

[root@localhost test]# ln -s /root/test/test.txt b

[root@localhost test]# ll 
total 4
lrwxrwxrwx 1 root root   19 Aug 24 16:48 b -> /root/test/test.txt
lrwxrwxrwx 1 root root    8 Aug 24 16:34 test -> test.txt
-rw------- 1 root root 1672 Aug 24 16:33 test.txt

[root@localhost test]# ll /root/test/b 
lrwxrwxrwx 1 root root 19 Aug 24 16:48 /root/test/b -> /root/test/test.txt

所以,源文件使用相对路径时,链接文件必须使用相对路径;当源文件使用绝对路径的时候,链接文件可以是相对路径,也可以是绝对路径

删除软连接时,不影响源文件,删除源文件后,软连接失效

不要对软链接文件创建软链接,会形成易断裂的链接链

硬链接

硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在

[root@localhost test]# ll
total 4
-rw------- 1 root root 1672 Aug 24 16:33 test.txt

[root@localhost test]# ln test.txt test

[root@localhost test]# ll -i test*
34306369 -rw------- 2 root root 1672 Aug 24 16:33 test
34306369 -rw------- 2 root root 1672 Aug 24 16:33 test.txt

硬链接文件是共享inode编号的,因为硬链接文件是同一个文件,文件大小也一样。上面的例子中,显示这两个文件有两个链接,因为文件本身也是自己的硬链接。

注意:不能对目录创建硬链接,因为会形成网状的链接关系。另外,不能对不同文件系统的文件创建硬链接。也就是说,只有同一文件系统中,inode号相同的文件互为硬链接

[root@localhost test]# mkdir a 

[root@localhost test]# ln a h_a
ln: ‘a’: hard link not allowed for directory

删除硬链接文件对源文件无影响,删除源文件也不影响链接文件

[root@localhost test]# ll
total 4
-rw------- 1 root root 1672 Aug 24 16:33 test

链接文件的复制

如果使用cp命令复制一个文件,而该文件又已经被链接到了另一个源文件上,那么你得到的其实是源文件的一个副本。

[root@localhost test]# ll
total 4
-rw------- 1 root root 1672 Aug 24 16:33 test

[root@localhost test]# ln -s test s_test

[root@localhost test]# ll
total 4
lrwxrwxrwx 1 root root    4 Aug 24 17:19 s_test -> test
-rw------- 1 root root 1672 Aug 24 16:33 test

[root@localhost test]# cp s_test s_test1

[root@localhost test]# ll
total 8
lrwxrwxrwx 1 root root    4 Aug 24 17:19 s_test -> test
-rw------- 1 root root 1672 Aug 24 17:19 s_test1              ## 此文件为源文件的副本
-rw------- 1 root root 1672 Aug 24 16:33 test

所以,当需要使用新的链接文件,一般都是重新创建

[root@localhost test]# ln -s test s1_test

[root@localhost test]# ll -i
total 8
34306372 lrwxrwxrwx 1 root root    4 Aug 24 17:28 s1_test -> test
34306370 lrwxrwxrwx 1 root root    4 Aug 24 17:19 s_test -> test
34306371 -rw------- 1 root root 1672 Aug 24 17:19 s_test1
34306369 -rw------- 1 root root 1672 Aug 24 16:33 test

软链接文件用于升级应用

当应用升级后,目录名发生变化,可以将软链接文件指向新的目录

[root@localhost opt]# tar xzf jdk-8u191-linux-x64.tar.gz 

[root@localhost opt]# ll
total 329372
drwxr-xr-x 7    10   143       245 Oct  6  2018 jdk1.8.0_191
-rw-r--r-- 1 root  root  191753373 Dec 16  2018 jdk-8u191-linux-x64.tar.gz

[root@localhost opt]# ln -sv jdk1.8.0_191/ jdk
‘jdk’ -> ‘jdk1.8.0_191/’

[root@localhost opt]# ll
total 329372
lrwxrwxrwx 1 root  root         13 Aug 24 17:32 jdk -> jdk1.8.0_191/
drwxr-xr-x 7    10   143       245 Oct  6  2018 jdk1.8.0_191
-rw-r--r-- 1 root  root  191753373 Dec 16  2018 jdk-8u191-linux-x64.tar.gz

[root@localhost opt]# jdk/bin/java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

应用升级

[root@localhost opt]# ll
total 329372
drwxr-xr-x 9 root  root        220 Aug 24 10:52 apache-tomcat-9.0.52
lrwxrwxrwx 1 root  root         13 Aug 24 17:32 jdk -> jdk1.8.0_191/
drwxr-xr-x 7    10   143       265 Aug 24 17:33 jdk1.8.0_191
drwxr-xr-x 8 10143 10143       273 Jun  9 09:58 jdk1.8.0_301
-rw-r--r-- 1 root  root  191753373 Dec 16  2018 jdk-8u191-linux-x64.tar.gz
-rw-r--r-- 1 root  root  145520298 Aug 25  2021 jdk-8u301-linux-x64.tar.gz


[root@localhost opt]# rm -f jdk

[root@localhost opt]# ln -sv jdk1.8.0_301/ jdk
‘jdk’ -> ‘jdk1.8.0_301/’

[root@localhost opt]# jdk/bin/java -version
java version "1.8.0_301"
Java(TM) SE Runtime Environment (build 1.8.0_301-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)

软链接文件扩容磁盘

当前有一个目录/home/weblogic没有空间了,新增加了一块盘,需要通过软链接的方式扩容

1、创建一个新目录,将新增磁盘挂载到此目录

# mkdir /home/app

# mount /dev/sdb1 /home/app/

2、将weblogic目录移动到这个app目录

# mv /home/weblogic /home/app/

3、做软链接,实现扩容

# ln -s /home/app/weblogic /home

这样,在home下就有一个weblogic的链接文件指向/home/app/weblogic,相当于扩容了

原文地址:https://www.cnblogs.com/zh-dream/p/15195975.html