当前位置: 首页 > news >正文

Linux中的硬链接与软链接

inode

在unix系统中,文件的储存分为两个部分,一个是数据块(datablock),用来保存文件中储存的数据。另一部分称为索引节点(inode),用来储存文件的大小、创建日期、读写权限等信息,这一部分信息被称为文件的“元数据”(metadata)。

inode中包含了文件的如下信息:
  • 文件数据block的位置

  • 文件的字节数

  • 文件拥有者的User ID

  • 文件的Group ID

  • 文件的读、写、执行权限

  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  • 链接数,即有多少文件名指向这个inode

在linux系统中,每个inode有自己的唯一inode号,可以通过ls -i命令显示文件的inode号

操作系统通过inode号码来标识唯一文件而不是文件名,文件名只是便于用户记忆的inode号的‘绰号’,一个文件可以有多个文件名,但是一个文件的inode号码是唯一的。
inode号和块数据是分开储存的,所以有的时候一个分区还有空间,但是操作系统却提示分区已满无法写入,这种情况下可能是当前分区的inode号已经用完了,造成这种情况发生的原因可能是当前分区有大量的占空间较小的文件。

硬链接和软链接

硬链接(hard link)

如上所述,文件名对inode号来说只是一个绰号,一个inode号可以有多个绰号或者说是别名。每一个别名就是该inode号对应的文件的一个硬链接,也就是说硬链接相当于一个文件的别名。
可以使用link或者ln命令来创建硬链接。

ln FileA FileB

以上命令会创建一个文件A的硬链接文件B,文件B相当于是文件A的别名,指向同一个文件。

硬链接有如下特点:
  • 文件有相同的 inode 及 data block;

  • 不能对目录进行创建,只可对文件创建;

  • 不能交叉文件系统进行硬链接的创建;

  • 删除一个硬链接文件并不影响其他有相同 inode 号的文件。

为什么不能对目录创建硬链接?我们知道在linux中目录也是一种文件,其中包含关联列表。实际在创建目录时会自动创建多个硬链接其中"."是自身的硬链接,".."是其父目录的硬链接。所以一个目录的硬链接最少为2(指向自身的一个和父目录指向它的一个)。也就是说每有一个子目录其父目录的硬链接就会+1(子目录的”..")。所以若对目录创建一个硬链接操作系统会认为创建了一个子目录,所以该硬链接指向的目标目录的".."会指向该目录。这样会导致遍历的时候逻辑混乱,甚至会出现死循环。

软链接(soft link)

软链接又称符号链接(symbolic link),软链接和硬链接不同,软链接是一个普通的文件,拥有自己独立的inode号以及数据块,只不过软链接的数据块中存储的是源文件的路径。使用如下命令创建软链接:

ln -s FileA FileB 

上面的命令会创建FileA的一个软链接FileB,创建软链接不会导致FileA的inode号的连接数增加,因为软链接指向源文件的文件名而不是源文件的inode号,软链接的存在形式类似于windows中的快捷方式。

软链接有如下几点特性:
  • 软链接有自己的文件属性及权限等;

  • 可对不存在的文件或目录创建软链接;

  • 软链接可交叉文件系统;

  • 软链接可对文件或目录创建;

  • 创建软链接时,链接计数不会增加;

  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接,若被指向路径文件被重新创建,死链接可恢复为正常的软链接。

    最后硬链接和软链接的区别可总结为:
  • linux的硬链接与软链接的区别为硬链接只是指向inode号的一个别称,自身不具有inode号和数据块,而软链接有自身的inode号和数据块

  • 硬链接只能对存在的文件创建,软链接可以对不存在的文件创建,可以之后再创建源文件。

  • 硬链接不能交叉系统创建,而软链接可以。

  • 硬链接不可对目录创建,软链接可以。

  • 创建硬链接会增加文件的连接数,软链接不会。

  • 删除软链接不会删除文件,删除硬链接时若剩余硬链接数大于0不会删除文件,若某文件的所有硬链接都被删除,该文件会被删除。

参考文献

王华东,理解 Linux 的硬链接与软链接[EB\OL].
https://www.ibm.com/developer...

阮一峰,理解inode[EB\OL].
http://www.ruanyifeng.com/blo...

相关文章:

  • 中国电信用软件定义来“去电信化”
  • 浙江居然隐藏着这么一匹DDoS攻击防护黑马
  • 从云端到山巅,YunOS让数据和计算的价值无处不在
  • 测试用例级别总结
  • 物联网重新唤醒了这项失意已久的技术
  • 【转】单日峰值2T发送量邮件营销平台实践经验
  • 联手美的进军智能家居 阿里YunOS野心恐落空
  • 阿里曾尝试回购雅虎所持阿里集团余下股份
  • 为追踪网络攻击 美将建立大规模数据库
  • 大数据产业峰会云集 概念股有望再站风口
  • 印度体育教育初创公司 KOOH Sports 获得 220 万美元风险投资
  • 传百度拆分部分资产回国上市 进入实质操作阶段
  • 2017年4月份宁夏电网“两个细则”考核补偿情况
  • 维基解密爆料CIA监控技术 科技公司如何接招
  • 应用托管在SAE不登录也能通过 phpmyadmin 管理数据库
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • go语言学习初探(一)
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java教程_软件开发基础
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL几个简单SQL的优化
  • PAT A1017 优先队列
  • Spark学习笔记之相关记录
  • spring + angular 实现导出excel
  • vue的全局变量和全局拦截请求器
  • Web Storage相关
  • 阿里研究院入选中国企业智库系统影响力榜
  • 初识 beanstalkd
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 回流、重绘及其优化
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 译自由幺半群
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #stm32驱动外设模块总结w5500模块
  • #图像处理
  • (03)光刻——半导体电路的绘制
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (未解决)macOS matplotlib 中文是方框
  • (一)UDP基本编程步骤
  • (转) Face-Resources
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core中的去虚
  • .Net FrameWork总结
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET企业级应用架构设计系列之技术选型