Linux-软链接的创建

软链接的创建

1.需求场景

- 项目进行集群部署,nginx进行负载均衡。后期如果修改配置文件,单台的话可以很方便的在服务器上进行修改
- 如果是多台,那么每一台都需要进行修改,工作量繁琐而且还容易出错,对于此场景有没有更好的解决方案?

分析:

- 如果集群的配置文件只有一份或者每个集群的配置信息都指向同一个,这样就会能够解决后期修改配置的问题。

解决方案:

- 使用软链接

2.什么是软链接

  • 可以从上述问题的角度出发,多个文件指向同一个文件,一个文件进行了修改,其他文件也进行了同步修改,类似于C语言的指针,JAVA的引用类型对象的概念。
  • 从操作系统的角度出发,软链接就像是桌面上的快捷方式,软件其实并不是安装在桌面,而是在其他的磁盘中,但为什么点击桌面图片就能够让程序运行起来,其实就是这个桌面图标指向了实际的安装位置。

3.创建软链接

命令: ln -s 源目标 软链接文件

注意事项: 无论是原目标还是软链接文件,都必须使用绝对路径,主要是在观察的时候能够知道创建的软链接具体指向的是哪个路径,非常清晰明了

口令(自创): 为哪个软件(源目标)创建一个桌面图标(软链接文件)

例子:

# 在test目录下创建aa目录
[root@localhost test]# mkdir aa

# 我现在想对aa这个文件创建一个软连接,也可以说为aa创建一个桌面图标并指向它,桌面图标为cc
[root@localhost test]# ln -s /usr/local/tmp/test/aa /usr/local/tmp/test/cc

# 创建完成之后进行查看
[root@localhost test]# ll
总用量 0
drwxr-xr-x. 2 root root  6 9月  14 09:36 aa
lrwxrwxrwx. 1 root root 22 9月  14 09:38 cc -> /usr/local/tmp/test/aa

# 进入cc目录,在cc目录中创建1.txt文件
[root@localhost test]# cd cc
[root@localhost cc]# echo 'aaa' > 1.txt
[root@localhost cc]# ll
总用量 4
-rw-r--r--. 1 root root 4 9月  14 09:40 1.txt

# 进入aa目录,观察是否也存在1.txt文件
[root@localhost cc]# cd ../aa/
[root@localhost aa]# ll
总用量 4
-rw-r--r--. 1 root root 4 9月  14 09:40 1.txt

# 以上就说明软链接创建成功,且数据出现了同步

简单的创建之后,有几处需要注意点地方需要提醒:

命令:ln -s /usr/local/tmp/test/aa /usr/local/tmp/test/cc

软链接为cc,此目录可以在当前test目录存在,也可以不存在。不存在会创建并指向,存在则直接指向。

但还有一种情况,我希望创建的软链接与源目录名称保持一致,那此时就需要注意,软链接的名称不能在指定的目录中存在,因为它会默认进入到你指定的路径中再创建一个名称一样的文件,即使已经创建。

# 错误示范
- 我在test目录下再创建一个test1目录(上述创建的文件都删除,只留下aa文件)
[root@localhost test]# mkdir test1
[root@localhost test]# ll
总用量 0
drwxr-xr-x. 2 root root 19 9月  14 09:40 aa
drwxr-xr-x. 2 root root  6 9月  14 10:47 test1

- 进入test1目录再创建一个aa
[root@localhost test]# cd test1/
[root@localhost test1]# mkdir aa
[root@localhost test1]# ll
总用量 0
drwxr-xr-x. 2 root root 6 9月  14 10:48 aa

- 我希望test1目录下的aa为软链接
[root@localhost test1]# ln -s /usr/local/tmp/test/aa /usr/local/tmp/test/test1/aa

- 当执行完成之后,观察test1目录下单aa,我的预想的结果:aa -> /usr/local/tmp/test/aa
[root@localhost test1]# ll
总用量 0
drwxr-xr-x. 2 root root 16 9月  14 10:51 aa

- 然而通过观察并没有,我进入aa这个目录中查看,发现在这个aa目录中又创建了一个aa,把它当成了软链接
[root@localhost test1]# cd aa
[root@localhost aa]# ll
总用量 0
lrwxrwxrwx. 1 root root 22 9月  14 10:51 aa -> /usr/local/tmp/test/a

` 所以我的预想结果:test1目录下aa  aa -> /usr/local/tmp/test/aa
` 而执行的结果是:test1目录下aa 又创建了一个aa aa -> /usr/local/tmp/test/aa

根据上述的错误示范进行总结,如果希望软链接的名字与源文件的名称一样,那么写软链接的时候,只需要写路径即可,且不允许先创建,如果名字不一样,则先创建后创建都可以,但路径上必须执行名称。

# 正确示范(将前面的软链接进行删除)
# 目前test目录状态
[root@localhost tmp]# tree test
test
├── aa
└── test1
    └── aa
 
# 删除test1目录下的aa
[root@localhost tmp]# rm -rf test/test1/aa

# 目的是在test1目录下创建一个名字aa的软链接
[root@localhost tmp]# ln -s /usr/local/tmp/test/aa /usr/local/tmp/test/test1/

# 进入test1目录中进行查看,成功
[root@localhost tmp]# cd /usr/local/tmp/test/test1/
[root@localhost test1]# ll
总用量 0
lrwxrwxrwx. 1 root root 22 9月  14 11:02 aa -> /usr/local/tmp/test/aa

4.模拟真实场景创建

虽然是模拟真实场景创建,但毕竟条件有限,只能在单机上去模拟集群的形式,建立两个内容一样的项目,但名称不同sky01和sky02。

# 查看目录结构
[root@localhost tmp]# tree test
test
├── sky01
│   └── xml
│       └── 1.xml
└── sky02
    └── xml
        └── 1.xml

假设在后期,如果需要对1.xml的内容进行修改的话,那么两台都需要修改
但是现在已经学会创建软链接,只要让这个两个文件指向同一份,那么只需修改指向的那一份即可。

分析:
想要的结果是:

  • 在sky01的目录下 xml -> 指向某个目录
  • 在sky02的目录下 xml -> 指向某个目录

这两个项目下的xml目录都指向同一个目录,也就可以说明,这两个xml此时的名称应该就是软链接,而指向的那个目录才是真正的源文件(软件安装的目录只有一个,但快捷方式的创建可以有多个)

操作:

# 在/usr/local目录下创建一个data目录
[root@localhost local]# mkdir data

# 把任意一个项目中的xml目录复制到这个data目录中
[root@localhost local]# cp -r /usr/local/tmp/test/sky01/xml /usr/local/data/
[root@localhost local]# cd data
[root@localhost data]# ll
drwxr-xr-x. 2 root root 19 9月  16 10:56 xml
[root@localhost data]# cd xml
[root@localhost xml]# ll
-rw-r--r--. 1 root root 19 9月  16 10:56 1.xm

# 由于我创建的软链接要跟目录的名称保持相同,所以需要将两个项目的xml目录进行删除
[root@localhost xml]# rm -rf /usr/local/tmp/test/sky01/xml
[root@localhost xml]# rm -rf /usr/local/tmp/test/sky02/xml

# 对两个项目分别创建创建软链接,任意目录都可以创建,因为是用的绝对路径,软链接文件只需要路径即可,不需要名称
[root@localhost sky01]# ln -s /usr/local/data/xml /usr/local/tmp/test/sky01/
[root@localhost sky01]# ln -s /usr/local/data/xml /usr/local/tmp/test/sky02/

# 进入sky01目录进行查看
[root@localhost sky01]# cd /usr/local/tmp/test/sky01/
[root@localhost sky01]# ll
总用量 0
lrwxrwxrwx. 1 root root 19 9月  16 11:00 xml -> /usr/local/data/xml

# 进入sky02目录进行查看
[root@localhost sky01]# cd /usr/local/tmp/test/sky02/
[root@localhost sky02]# ll
总用量 0
lrwxrwxrwx. 1 root root 19 9月  16 11:00 xml -> /usr/local/data/xml

# 从上述查看,已经创建成功,然后尝试进入共同指向的/usr/local/data/xml目录中创建新的文件看是否同步
[root@localhost sky02]# cd /usr/local/data/xml/
[root@localhost xml]# echo '1111' > 2.xml
[root@localhost xml]# ll
总用量 8
-rw-r--r--. 1 root root 19 9月  16 10:56 1.xml
-rw-r--r--. 1 root root  5 9月  16 11:02 2.xml

# 查看两项目是否同步
[root@localhost xml]# cat /usr/local/tmp/test/sky01/xml/1.xml 
qiang
[root@localhost xml]# cat /usr/local/tmp/test/sky01/xml/2.xml 
1111

[root@localhost xml]# cat /usr/local/tmp/test/sky02/xml/1.xml 
qiang
[root@localhost xml]# cat /usr/local/tmp/test/sky02/xml/2.xml 
1111

以上就已经创建完成,且也实现了文件内容的同步

5.删除软链接

删除方式有两种,不同删除方式有不同的效果:

# 删除方式一:
- rm -rf ./软链接名
- 作用:只删除当前的软链接,对指向的文件内容无影响
- 注意:此处链接名最后一定要记得不能有/

需求: 将上述sky01目录下的xml软链接删除,不指向那个公共文件,但也不影响其他项目指向那个公共文件。

# 进入sky01目录
[root@localhost xml]# cd /usr/local/tmp/test/sky01
[root@localhost sky01]# ll
总用量 0
lrwxrwxrwx. 1 root root 19 9月  16 11:00 xml -> /usr/local/data/xml

# 删除当前软链接
[root@localhost sky01]# rm -rf ./xml
[root@localhost sky01]# ll
总用量 0

# 查看指向的公共文件是否有影响,根据结果查看没有影响
[root@localhost sky01]# ll /usr/local/data/xml
总用量 8
-rw-r--r--. 1 root root 19 9月  16 10:56 1.xml
-rw-r--r--. 1 root root  5 9月  16 11:02 2.xml

# 虽然删除了这个软链接,但这个项目还需要使用者里面的文件,以及这个xml文件夹,所以还需要从指向的这个文件中拷贝一份到sky01项目中
[root@localhost sky01]# cp -r /usr/local/data/xml /usr/local/tmp/test/sky01/
[root@localhost sky01]# ll
总用量 0
drwxr-xr-x. 2 root root 32 9月  16 11:18 xml

以上软链接就删除完成,只是删除本地项目的软链接,对指向的目录文件没有任何影响。

# 删除方式二:
- rm -rf ./软链接名/
- 作用:当前的软链接不会删除,是对指向文件的内容进行清空
- 注意:链接名后面记得有/

需求: 对指向的文件内容进行清空。

# 由于上面操作已经把sky01的软链接删除了,所以这次进入sky02目录
[root@localhost sky02]# ll
总用量 0
lrwxrwxrwx. 1 root root 19 9月  16 11:00 xml -> /usr/local/data/xml

# 执行删除操作,从观察的结果来看,并没有将此目录的软链接进行删除
[root@localhost sky02]# rm -rf ./xml/
[root@localhost sky02]# ll
总用量 0
lrwxrwxrwx. 1 root root 19 9月  16 11:00 xml -> /usr/local/data/xml

# 进入到指向的目录进行观察,内容全部删除
[root@localhost sky02]# cd /usr/local/data/xml
[root@localhost xml]# ll
总用量 0

总结(注意):在进行删除操作的时候,文件后带 \ 和不带 \ 有很大的区别,所以一定在确定自己的主要目的是什么然后在进行操作

  • rm -rf ./软链接名 :只删除当前的软链接,对指向的文件内容无影响
  • rm -rf ./软链接名/ :当前的软链接不会删除,是对指向文件的内容进行清空

你可能感兴趣的:(Linux,linux,java)