Linux基础命令-ln创建链接文件
在Linux世界里,ln命令就像一位神奇的魔术师,能够让你的文件变得“身分多变”。今天,我们就来聊聊这位魔术师的两大绝活:硬链接和软链接,它们就像双胞胎一样,看似相似却又各有千秋!
问题1:硬链接和软链接到底有什么区别?
答案1: 硬链接就像是“分身术”,多个文件名共享同一份数据,删除原文件,副本依然“健在”。而软链接就像“指路牌”,指向原文件的位置,原文件没了,它就“迷路”了。
问题2:软链接这么“脆”吗?为什么删除原文件它就失效了?
答案2: 软链接就像是租了一个“虚拟办公室”,当你搬走了,办公室的地址就失效了。硬链接则像是买了两套房产,房子的产权证在两个名字里都有。
问题3:硬链接是不是更安全?为什么有时候不能跨分区使用?
答案3: 硬链接虽然安全,但它是“本地英雄”,只能在一个文件系统里发挥作用,就像小区里的“通行卡”不能到隔壁小区用一样。
问题4:软链接这么“脆弱”,还有存在的必要吗?
答案4: 软链接就像“导航软件”,可以跨分区、跨目录,而且还能指向目录,灵活性极高,适合需要频繁调整的情况。
问题5:在实际工作中,我应该如何选择?
答案5: 如果需要多份备份且不希望跨分区,硬链接是最佳选择。但如果需要跨分区或指向目录,软链接才是“真命天子”。
记住,选择合适的工具能让你事半功倍!无论是硬链接还是软链接,理解它们的原理和应用场景,都是Linux世界里的必修课哦!
文章目录
ln
命令介绍
命令格式
基本参数
参考实例
1) 创建文件的硬链接
2)创建文件的软链接
3)创建链接文件时,相同目标文件创建备份文件
命令总结
ln
命令介绍
先看下帮助文档中的含义
NAME
ln - make links between files
ln(link)命令的主要功能是给源文件建立一个链接文件,系统中存在两种链接文件,一个是硬链接(hard link),一个是软连接(symbolic link)。
- 硬链接:硬链接的原理就是多个文件名指向同一个inode,因此多个文件名公用一个inode号,达到共享和备份的目的,即使将源文件删除,硬链接文件依然可以指向block读取该文件的数据;但硬链接只能针对文件进行操作,无法对目录建立硬链接,也不能进行跨分区建立。
- 软链接:可以理解成是windows中的快捷方式,建立软链接之后,是重新生成一个新的inode号,软链接文件增加信息,源文件信息也会跟着修改,如果将源文件删除了,那么软链接也会跟着失效;优势是可以对文件和目录进行操作,也可进行跨分区建立。
命令格式
命令的语法格式:ln 【参数】【源文件】【目标文件】
SYNOPSIS
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)
基本参数
先看下命令的参数有哪些,表格形式显示:
-b | 为已存在的目标文件创建备份文件 |
-d | 允许root用户尝试创建硬链接目录(由于系统限制,大概率会失败) |
-f | 强制覆盖现有的目标文件 |
-n | 把指向目录的符号链接视为一个普通文件 |
-i | 提示是否删除目录文件 |
-s | 对源文件建立(符号链接)快捷方式 |
参考实例
1) 创建文件的硬链接
创建文件的硬链接后,可以看到源文件和目标文件的inode号是一致的,并且文件的链接数是2。
[root@localhost ~]# cd data
[root@localhost data]# ll
总用量 0
[root@localhost data]# touch a.txt
[root@localhost data]# ln a.txt b.txt
[root@localhost data]# ll
总用量 0
-rw-r--r--. 2 root root 0 2月 28 15:44 a.txt
-rw-r--r--. 2 root root 0 2月 28 15:44 b.txt
[root@localhost data]# ll -i
总用量 0
67259420 -rw-r--r--. 2 root root 0 2月 28 15:44 a.txt
67259420 -rw-r--r--. 2 root root 0 2月 28 15:44 b.txt
测试一:创建文件的硬链接后,删除源文件看看对硬链接文件有没有影响
首先先往文件中写入一些内容,让它成为一个有数据的文件。
[root@localhost data]# echo "hello world" > a.txt
[root@localhost data]# cat b.txt
hello world
[root@localhost data]# cat a.txt
hello world
[root@localhost data]# rm -f a.txt
[root@localhost data]# echo "this is centos7.9" >> b.txt
[root@localhost data]# cat b.txt
hello world
this is centos7.9
[root@localhost data]# ll -hi b.txt
67259420 -rw-r--r--. 1 root root 30 2月 28 15:48 b.txt
删除源文件后,硬链接文件完全不受影响,依然可以往其中写入内容,只是链接数变回了1。
测试二:对目录创建硬链接,看是否能创建
可以看到加上了-d参数,还是不能创建硬链接目录
[root@localhost data]# ln -d test test1
ln: 无法创建硬链接"test1" => "test": 不允许的操作
测试三:把文件的硬链接放到/dev目录
结果显示无法创建硬链接,这个是因为硬链接无法进行目录,跨分区实现建立,因为每个分区都有自己独立的INODE编号。
[root@localhost data]# ll
总用量 4
-rw-r--r--. 1 root root 30 2月 28 15:48 b.txt
drwxr-xr-x. 2 root root 6 2月 28 15:52 test
[root@localhost data]# ln b.txt /dev/b.txt
ln: 无法创建硬链接"/dev/b.txt" => "b.txt": 无效的跨设备连接[root@localhost data]# df -ih
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 488K 351 488K 1% /dev
tmpfs 492K 1 492K 1% /dev/shm
tmpfs 492K 1.4K 491K 1% /run
tmpfs 492K 16 492K 1% /sys/fs/cgroup
/dev/mapper/centos-root 18M 130K 18M 1% /
/dev/sda1 512K 340 512K 1% /boot
tmpfs 492K 22 492K 1% /run/user/0
/dev/sr0 0 0 0 - /run/media/root/CentOS 7 x86_64
2)创建文件的软链接
创建软链接就需要加上-s的参数才行
[root@localhost data]# touch c.txt
[root@localhost data]# ln -s c.txt d.txt
[root@localhost data]# ll d.txt
lrwxrwxrwx. 1 root root 5 2月 28 16:07 d.txt -> c.txt
创建好之后会显示d.txt文件指向了c.txt,当然可以看ll显示的文件类型,这里显示的文件类型是链接文件。
测试一:创建文件的软链接后,删除源文件看看对软链接文件有没有影响
还是一样,先写入一些内容到文件里
[root@localhost data]# touch c.txt
[root@localhost data]# ln -s c.txt d.txt
[root@localhost data]# ll -i c.txt d.txt
67259384 -rw-r--r--. 1 root root 9 2月 28 16:17 c.txt
67259421 lrwxrwxrwx. 1 root root 5 2月 28 16:17 d.txt -> c.txt
[root@localhost data]# echo "hello world " > d.txt
[root@localhost data]# rm -f c.txt
[root@localhost data]# ll -h d.txt
lrwxrwxrwx. 1 root root 5 2月 28 16:17 d.txt -> c.txt
[root@localhost data]# cat d.txt
cat: d.txt: 没有那个文件或目录
对比源文件和软连接文件的inode号是不一样的,删除了源文件也就意味着链接文件失效了,里面的内容也查看不到。
测试二:对目录创建软链接,看是否能创建
目录是无法创建硬链接的,看下能否创建软连接
[root@localhost data]# mkdir test
[root@localhost data]# ln -s test test_dir
[root@localhost data]# ll -id test test_dir421301 drwxr-xr-x. 2 root root 6 2月 28 16:25 test
67259384 lrwxrwxrwx. 1 root root 4 2月 28 16:25 test_dir -> test
答案是肯定的,软链接是可以对目录进行创建的,创建出来的inode号是不相同的。
测试三:把文件的软链接放到/dev目录
前面有测试过硬链接是不能跨分区创建的,现在来看下软链接是否可行。
[root@localhost data]# ln -s test /dev/test_dir
[root@localhost data]# ll -id /dev/test_dir
107112 lrwxrwxrwx. 1 root root 4 2月 28 16:28 /dev/test_dir -> test
[root@localhost data]# ll
总用量 0
drwxr-xr-x. 2 root root 6 2月