百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

详解Linux的硬链接与软链接之间的区别

bigegpt 2024-08-05 11:45 2 浏览

概述

最近有朋友问硬链接与软链接之间的区别,说总感觉很容易混淆,刚好之前没这块内容,所以今天抽空整理了下。


一、从inode了解Linux文件系统

硬链接与软链接是Linux文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一。

在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i(若是 AIX 系统,则使用命令 istat)。


二、Linux的文件与目录

UNIX 系统中除进程之外的一切皆是文件,而Linux保持了这一特性。为了便于文件的管理,Linux还引入了目录(有时亦被称为文件夹)这一概念。目录使文件可被分类管理,且目录的引入使Linux的文件系统形成一个层级结构的目录树。

Linux与其他类 UNIX 系统一样并不区分文件与目录:目录是记录了其他文件名的文件。使用命令 mkdir 创建目录时,若期望创建的目录的名称与现有的文件名(或目录名)重复,则会创建失败。


三、硬链接与软链接的联系与区别

文件都有文件名与数据,这在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。

用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。

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

下图展示了程序通过文件名获取文件内容的过程。

在Linux系统中查看inode号可使用命令stat 或 ls -i(若是 AIX 系统,则使用命令istat)。使用命令 mv 移动文件 ,其结果不影响文件的用户数据及 inode 号,文件移动前后 inode 号均为:1573119 ,操作如下:

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

链接为Linux系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。

简单来说,就是有多个文件名对应到同一个inode号码,注意,是多个文件名,不是多个文件。一般来说,使用硬连接(hard link)设置连接文件,磁盘的空间与inode的数目是不会变的,它只是在某个目录下的block多写入一个关联数据而已,既不会耗用inode也不会耗用block数量。硬链接可由命令link或ln创建。

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

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

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:

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

测试操作:

# 可对不存在的文件创建软链接;
$ ln -s old.file soft.link 
$ ls -liF 
total 0 
789467 lrwxrwxrwx 1 root root 8 Sep 1 18:00 soft.link -> old.file 
 
# 由于被指向的文件不存在,此时的软链接soft.link就是死链接;
$ cat soft.link 
cat: soft.link: No such file or directory 
 
# 创建被指向的文件old.file,soft.link恢复成正常的软链接;
$ echo "This is an original file_A" >> old.file 
$ cat soft.link 
This is an original file_A 
 
# 对不存在的目录创建软链接;
$ ln -s old.dir soft.link.dir 
$ mkdir -p old.dir/test 
$ tree . -F --inodes 
. 
├── [ 789497] old.dir/ 
│ └── [ 789498] test/ 
├── [ 789495] old.file 
├── [ 789495] soft.link -> old.file 
└── [ 789497] soft.link.dir -> old.dir/

当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接。


四、利用硬链接原理秒删MySQL大文件

原理:硬链接基础,当多个文件共同指向同一inode、inode链接数N>1、删除任何一个文件都是巨快。因为、此时删除的仅仅是指向inode的指针,而当N=1时、则不一样了、此时删除的文件相关的所有数据块、所以慢。

测试:

这里可以发现stock.ibd的INODES属性变成了2;

下面继续来删表。

mysql> show table status like 'stock'\G 
*************************** 1. row *************************** 
Name: stock 
Engine: InnoDB 
Version: 10 
Row_format: Compact 
Rows: 49916863 
Avg_row_length: 356 
Data_length: 17799577600 
Max_data_length: 0 
Index_length: 1025507328 
Data_free: 4194304 
Auto_increment: NULL 
Create_time: 2019-03-18 14:55:08 
Update_time: NULL 
Check_time: NULL 
Collation: utf8_general_ci 
Checksum: NULL 
Create_options: 
Comment: 
1 row in set (0.23 sec) 
 
mysql> drop table stock ; 
Query OK, 0 rows affected (0.99 sec)

1秒不到就删除完成; 也就是DROP TABLE不用再HANG这么久了。但table是删除了,数据文件还在,所以你还需要最后数据文件给删除。

$ ll 
total 19096666112 
-rw-r–r– 2 mysql mysql 19096666112 Apr 15 09:55 stock.id.hdlk 
 
$ rm stock.id.hdlk

最后一步删除原始大文件也可以选择rsync来删除、比rm快多了:rsync秒删大文件。

$ rsync --delete-before -avH --progress --stats DEST SRC

解释:当SRC和DEST性质都为文件【f】时,意思是清空文件内容而不是删除文件。当SRC和DEST性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录。rsync实际上用的就是替换原理,处理速度相当快,处理几个G的文件也就是秒级的事、比rm要快很多倍;缺点就是对磁盘io的占用较高、业务高峰或要暂避。


从使用的角度讲,软链接与硬链接两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。区别在底层原理上,即:

  • 硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
  • 软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。

后面会分享更多Linux方面的内容,感兴趣的朋友可以关注一下~

相关推荐

程序员请收好:10个非常有用的 Visual Studio Code 插件

一个插件列表,可以让你的程序员生活变得轻松许多。作者|Daan译者|Elle出品|CSDN(ID:CSDNnews)以下为译文:无论你是经验丰富的开发人员还是刚刚开始第一份工作的初级开发人...

PADS在WIN10系统中菜单显示不全的解决方法

决定由AD转PADS,打开发现菜单显示不正常,如下图所示:这个是由于系统的默认字体不合适导致,修改一下系统默认字体即可,修改方法如下:打开开始菜单-->所有程序-->Windows系统--...

一文讲解Web前端开发基础环境配置

先从基本的HTML语言开始学习。一个网页的所有内容都是基于HTML,为了学好HTML,不使用任何集成工具,而用一个文本编辑器,直接从最简单的HTML开始编写HTML。先在网上下载notepad++文...

TCP/IP协议栈在Linux内核中的运行时序分析

本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看。1Linux概述  1.1Linux操作系统架构简介Linux操作系统总体上由Linux...

从 Angular Route 中提前获取数据

#头条创作挑战赛#介绍提前获取意味着在数据呈现在屏幕之前获取到数据。本文中,你将学到,在路由更改前怎么获取到数据。通过本文,你将学会使用resolver,在AngularApp中应用re...

边做游戏边划水: 基于浅水方程的水面交互、河道交互模拟方法

以下文章来源于腾讯游戏学堂,作者Byreave篇一:基于浅水方程的水面交互本文主要介绍一种基于浅水方程的水体交互算法,在基本保持水体交互效果的前提下,实现了一种极简的水面模拟和物体交互方法。真实感的...

Nacos介绍及使用

一、Nacos介绍Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS...

Spring 中@Autowired,@Resource,@Inject 注解实现原理

使用案例前置条件:现在有一个Vehicle接口,它有两个实现类Bus和Car,现在还有一个类VehicleService需要注入一个Vehicle类型的Bean:publicinte...

一文带你搞懂Vue3 底层源码

作者:妹红大大转发链接:https://mp.weixin.qq.com/s/D_PRIMAD6i225Pn-a_lzPA前言vue3出来有一段时间了。今天正式开始记录一下梗vue3.0.0-be...

一线开发大牛带你深度解析探讨模板解释器,解释器的生成

解释器生成解释器的机器代码片段都是在TemplateInterpreterGenerator::generate_all()中生成的,下面将分小节详细展示该函数的具体细节,以及解释器某个组件的机器代码...

Nacos源码—9.Nacos升级gRPC分析五

大纲10.gRPC客户端初始化分析11.gRPC客户端的心跳机制(健康检查)12.gRPC服务端如何处理客户端的建立连接请求13.gRPC服务端如何映射各种请求与对应的Handler处理类14.gRP...

聊聊Spring AI的Tool Calling

序本文主要研究一下SpringAI的ToolCallingToolCallbackorg/springframework/ai/tool/ToolCallback.javapublicinter...

「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作

一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...

在MySQL登录时出现Access denied for user ~~ (using password: YES)

Windows~~~在MySQL登录时出现Accessdeniedforuser‘root‘@‘localhost‘(usingpassword:YES),并修改MySQL密码目录适用...

mysql 8.0多实例批量部署script

背景最近一个项目上,客户需要把阿里云的rdsformysql数据库同步至线下,用作数据的灾备,需要在线下的服务器上部署mysql8.0多实例,为了加快部署的速度,写了一个脚本。解决方案#!/bi...