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

怎样理解Linux硬链接和软链接?他们有什么区别?

bigegpt 2024-08-05 11:47 5 浏览

简介

我们现代的操作系统需要防止程序崩溃导致信息丢失,需要将信息存储在文件之中。而且文件能够被多个进程同时读取。在Linux中所以的资源,外设都抽象成了文件,所以就有了Linux中“一切皆文件”的特性。当然有文件,肯定是不够的,总不能把所有的文件放在一起管理,实在是太乱,不易管理维护。Linux就引入了目录的概念,在Windows中可以称之为文件夹。目录的引入就会让Linux的根文件系统外观上变成了一个层次分明的目录树。如下图:



目录是什么?

在Linux中“一切皆文件”,所以这个问题很好回答:目录也是文件。目录中记录的是目录下文件名。那既然是文件,如果在创建目录的时候,与当前目录下的文件或目录重名,就肯定会创建失败。

好了,既然搞清楚了目录的概念,我们接着往下看。

硬链接和软连接区别?

在Linux中表示一个文件的方式是通过两个部分来分别表示的:用户数据(user data)与元数据(meta data)。什么是用户数据呢?用户数据就是记录真实文件内容的数据,这些数据是存放在一个个大小相等的文件数据块中(data block)。

元数据呢?其实就是这个文件的附加信息属性,例如:创建时间,文件大小等等这类信息。我们用索引号(inode)来表示每一个不同文件的元数据(当然inode也是元数据的一部分)。在Linux中,inode才是表示文件的唯一标识,而不是文件名。下图展示了怎样通过文件名来找到文件内容的。注意:元数据中并不包含文件名。文件名只是为了方便用户识别和记忆罢了。




使用什么命令可以查看inode号?

可以使用stat和ls -i 命令查看,如下图所示:




什么是硬链接?

硬链接是指通过索引节点来进行连接。也就是存在多个文件名指向同一个inode。这样就可以将重要的文件建立硬链接,来防止“误删”的操作。

命令:

link oldfile newfile 

可以创建硬链接。硬链接的inode是相同的,但是文件名不同,所以它有一些特性:

  1. 文件有相同的inode和data blocks;
  2. 不能对不存在的文件创建硬链接
  3. 不能跨文件系统创建(因为在各自文件系统下inode是唯一的,当跨文件系统就会出现inode重复的情况发生
  4. 不能对目录创建,只能对文件进行创建
  5. 如果删除了一个硬链接文件,并不会影响其他的同inode文件(inode中存在链接计数器,删除一个硬链接相当于计数器减一,反之加一。直到为0,删除inode)




例如:

# ls -li 
total 0 
 
// 只能对已存在的文件创建硬连接
# link test.file test_hard.link 
link: cannot create link `test_hard.link' to `test.file': No such file or directory 
 
# echo "This is an original file" > test.file 
# cat test.file 
This is an original file 
# stat test.file 
 File: `test.file'
 Size: 25 Blocks: 8 IO Block: 4096 regular file 
Device: 807h/2055d Inode: 660650 Links: 2 
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 
... 
// 文件有相同的 inode 号以及 data block 
# link test.file test_hard.link | ls -li 
total 8 
660650 -rw-r--r-- 2 root root 25 Sep 1 17:44 test_hard.link 
660650 -rw-r--r-- 2 root root 25 Sep 1 17:44 test.file 
 
// 不能交叉文件系统
# ln /dev/input/event5 /root/bfile.txt 
ln: failed to create test_hard link `/root/bfile.txt' => `/dev/input/event5': 
Invalid cross-device link 
 
// 不能对目录进行创建硬连接
# mkdir -p test.dir/test 
# ln test.dir/ test_hardlink.dir 
ln: `test.dir/': test_hard link not allowed for directory 
# ls -iF 
660650 test_hard.link 657948 test.dir/ 660650 test.file

具体的解释可以参考硬链接的5点特性。

什么是软链接?

软连接就和硬链接完全不同,软连接是用户数据(data blocks)中记录的是另一个文件的路径名的指向。可以理解为软连接其实就是一个普通的文件,只是他的内容非常的特殊。所以软连接有他自己的inode号以及data blocks。那我总结下软连接的特性:

  1. 软连接有自己的文件属性
  2. 可以对不存在的文件创建
  3. 软链接可以跨文件系统
  4. 软链接可以对目录创建
  5. 软链接创建不会造成链接计数器增加,因为就不是同一个inode
  6. 若链接的文件被删除了,该链接就是没有意义了,但是也可以重新创建。


下图展示下软链接的访问过程:



例如:

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

具体的解释:略


觉得不错,记得关注,转发!

相关推荐

程序员请收好: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...