linux(8) 软硬链接

前言:

都坐好哦,我们今天来讲讲软硬链接:

我们上一次呢,讲的是文件系统,详见这篇文章:

其中我们并没有讲软硬连接,所以我们在这里补上~~~

在讲完软硬连接这个小demo之后呢,我们明天就要来正式讲讲库啦:

我们今天的内容不多,所以篇幅不会太长,我们直接开始啦~

正文:

硬链接:

硬链接语法:

ln 源文件 目标硬链接名

硬链接后的现象:

我们先来个示例:

复制代码
[tsx@VM-0-10-centos 916]$ touch ceshi
[tsx@VM-0-10-centos 916]$ ln ceshi hard_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- hard_link

0 directories, 2 files
[tsx@VM-0-10-centos 916]$ ls -li 
total 0
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 ceshi
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 hard_link

我们在给ceshi创建硬链接之后,我们就会发现,

这个数字变成2了!!!!

这个数字是什么呢?

我们当年说过,这个数字代表的是硬链接数(那硬链接数是啥?)

硬链接数:代表有多少个 dentry(目录项)指向这个 inode。创建 1 个硬链接,数字就 + 1

同时我们知道,第一列代表的是inode,也就是说......这俩货inode是同一个咯?

我们在一节中知道了,我们要找一个文件,归根结底找的就是inode,然后数据储存在数据块之中,而inode中存在指向数据块的数组,所以inode一样,指向的文件,也就一样!!!!

那这个是不是就,类似于我们c++中的取别名啊!

复制代码
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 ceshi
920939 -rw-rw-r-- 2 tsx tsx 0 Sep 16 15:28 hard_link
[tsx@VM-0-10-centos 916]$ vim ceshi
[tsx@VM-0-10-centos 916]$ rm ceshi
[tsx@VM-0-10-centos 916]$ cat hard_link
jin tian shi 9 yue 16 r

这里呢,我们在ceshi中写入如下数据:

然后我们将ceshi删掉,我们再读取hard------link之中的数据,我们发现和被删掉的ceshi中的数据相同,这是不是就相当于一个备份的作用?

同时通过这个例子,我们也就知道了,当硬链接数>=2的时候,我们删除一个文件,只是删除了其一个硬链接(相当于别名)而已,并不会真正的删除该文件,当硬链接数为1时,我们删除文件,就是真的把该文件删除了

作用:

①:文件多入口:可以多文件名访问同一个文件

②:给文件做备份,防止文件被误删

局限性:

①:因为inode在一个分区内有效,不可跨分区,所以硬链接也不可以跨分区

②:目录是树形结构,而如果我硬链接之后,可能会形成目录环,破坏目录的树状结构,故:硬链接不可以对目录创建

软链接:

软链接语法:

ln -s 源文件/源目录 目标软链接名

软链接后的现象:
复制代码
[tsx@VM-0-10-centos 916]$ tree
.

0 directories, 0 files
[tsx@VM-0-10-centos 916]$ touch ceshi
[tsx@VM-0-10-centos 916]$ ln -s ceshi soft_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> ceshi

0 directories, 2 files
[tsx@VM-0-10-centos 916]$ ls -li
total 0
920937 -rw-rw-r-- 1 tsx tsx 0 Sep 16 16:05 ceshi
920939 lrwxrwxrwx 1 tsx tsx 5 Sep 16 16:05 soft_link -> ceshi

显然,不同于硬链接的是,这两个文件的inode显然是不同的

我们此时往ceshi中写入:

我们打开soft_link,我们看到的是:

我们发现,通过soft_link,我们也可以看到测试中的数据哎~那么soft_link里存的就是和ceshi一样的数据吗?当然不是!!!!!!

软链接会新建独立 inode,文件里存放的是源文件的路径字符串,相当于 Windows 的快捷方式。

而在我用vim编译器打开的时候:

vim 默认会自动跟随软链接,打开的是源文件,不是软链接本身!

所以就有如上现象;

那么有了软链接,我就可以把藏得很深的文件的软链接拿到前面,这样好找呀!说干就干:

复制代码
.
|-- 811
|   |-- get
|   |-- get.c
|   |-- haha
|   |-- haha.c
|   `-- makefile
|-- 916
|   |-- ceshi
|   `-- soft_link -> ceshi
|-- 99
|   |-- haha
|   |-- haha.c
|   |-- makefile
|   |-- xinwenjian
|   |-- xixi.c
|   `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
`-- makefile

3 directories, 19 files
[tsx@VM-0-10-centos ~]$ mv 916/soft_link ./
[tsx@VM-0-10-centos ~]$ tree
.
|-- 811
|   |-- get
|   |-- get.c
|   |-- haha
|   |-- haha.c
|   `-- makefile
|-- 916
|   `-- ceshi
|-- 99
|   |-- haha
|   |-- haha.c
|   |-- makefile
|   |-- xinwenjian
|   |-- xixi.c
|   `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
|-- makefile
`-- soft_link -> ceshi

3 directories, 19 files
[tsx@VM-0-10-centos ~]$ vim soft_link

好,那我打开之后:

哇!!!!居然是黑的!!

这显然和我们的预期不符合吧?我的测试文件里面可是写了数据的,那我怎么拿出来,就什么都没了?

我们移回去看看?

复制代码
[tsx@VM-0-10-centos ~]$ mv soft_link 916
[tsx@VM-0-10-centos ~]$ cd 916
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> ceshi

0 directories, 2 files
[tsx@VM-0-10-centos 916]$ vim soft_link

我们打开以后:

哎?好神奇,找到了哎!

那我们的问题是什么呢:

我们刚才写的嘛:

soft_link文件里面放的是源文件的路径字符串,那我们路径又分为绝对路径和相对路径,我们在创建软链接的时候,只写了:

复制代码
ln -s ceshi soft_link

所以呀,我们的soft_link里面,放的也就只是一个简单的ceshi,我们如果在一个目录下,操作系统给我前面补上cwd,那我能找到;那如果不在一个目录下,我怎么找?

所以这个问题我们如何解决呢.......

没错!我们可以使用绝对路径!!!!

我们先把上一个soft_link删掉,下面代码已删

复制代码
[tsx@VM-0-10-centos 916]$ ln -s /home/tsx/916/ceshi soft_link
[tsx@VM-0-10-centos 916]$ tree
.
|-- ceshi
`-- soft_link -> /home/tsx/916/ceshi

0 directories, 2 files
[tsx@VM-0-10-centos 916]$ mv soft_link ..
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi

0 directories, 1 file
[tsx@VM-0-10-centos 916]$ cd ..
[tsx@VM-0-10-centos ~]$ vim soft_link

打开以后:

显然这样,我们就实现了目的;

同时:

不仅第一个参数有说法,第二个参数,它也有说法!!!

复制代码
[tsx@VM-0-10-centos ~]$ cd 916
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi

0 directories, 1 file
[tsx@VM-0-10-centos 916]$ pwd
/home/tsx/916
[tsx@VM-0-10-centos 916]$ ln -s /home/tsx/916/ceshi /home/tsx/s_link
[tsx@VM-0-10-centos 916]$ tree
.
`-- ceshi

0 directories, 1 file
[tsx@VM-0-10-centos 916]$ cd ..
[tsx@VM-0-10-centos ~]$ tree
.
|-- 811
|   |-- get
|   |-- get.c
|   |-- haha
|   |-- haha.c
|   `-- makefile
|-- 916
|   `-- ceshi
|-- 99
|   |-- haha
|   |-- haha.c
|   |-- makefile
|   |-- xinwenjian
|   |-- xixi.c
|   `-- \344\273\212\345\244\251\345\220\203\344\273\200\344\271\210
|-- ceshi
|-- code
|-- code.c
|-- haha
|-- haha.c
|-- install.sh
|-- makefile
`-- s_link -> /home/tsx/916/ceshi

3 directories, 20 files
[tsx@VM-0-10-centos ~]$ vim s_link

这时我们发现,如果给第二个参数带上路径,那么它就会在指定目录下生成s_link

软链接的作用:

①:给文件/目录起别名:

可以通过给长路径,深层的目录或者文件起一个简单的名字,方便访问

②:跨分区创建:

虽然硬链接不可以跨分区(文件系统),但是软链接并不受这个限制

③:给目录创建软链接:

软链接可以给目录创建,并且很常用

格外注意:

①:非常建议在创建软连接的时候,给第一个参数带上绝对路径,方便我们找到

②:软链接的文件大小=源路径名字符串的大小,不等于源文件的大小

③:源文件删除,软链接会变成红色闪烁断链,打开是空的,如下:

表格汇总:

这里有一头表格,总结一下上文内容:

对比项 硬链接(Hard Link) 软链接(Symbolic Link / 符号链接)
创建命令 ln 源文件 目标 ln -s 源文件/目录 目标
inode 共用同一个 inode,inode 编号相同 独立全新 inode,inode 编号和源文件不一样
本质 给同一个 inode,新增一条目录项 dentry(文件的另一个名字) 独立的小文件,里面存放源文件的路径字符串,类似 Windows 快捷方式
支持目录 不能对目录创建硬链接(防止目录环路) 可以链接文件,也可以链接目录
跨文件系统(跨分区) 不支持,inode 仅在单个分区内唯一 支持,可以跨分区创建
文件大小 和源文件大小完全一致 大小 = 内部存储的路径字符串的字符长度,和原文件无关
删除源文件 仅仅删除一条目录项,只要链接计数 > 0,数据还在,其余硬链接正常访问 源文件删除后,软链接变成断链(悬挂链接),无法访问,终端标红
移动链接文件 移动硬链接,不受位置影响,永远正常 相对路径创建 :移动软链接容易断链;绝对路径创建:移动后依旧可用
ls -li 查看 inode 号一致,链接计数数字增加 inode 号不同,会用->箭头标出指向路径

尾:

其实这是我原来的打算......

我本来打算快速讲完软硬连接,然后进入库的......没想到写的似乎有点多,给我干困了......

哎,一到下午就没什么精神,为了写的更好些,我决定等我更有精神了再写......

我看看:明天上午有一节马克思主义原理,还有一节离散数学,哈哈

明天七点起来继续写!

相关推荐
未济1 天前
linux 配置环境变量
linux
傲世仙尊1 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
_艾伦 耶格尔.1 天前
进程间通信
linux
AI职业加油站1 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
Liuqy-051 天前
Linux IO编程——静态库、动态库
linux
此冬歌咏1 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
彧azz1 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
Wang's Blog1 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发