当前位置: 首页 > 编程日记 > 正文

【Linux】Linux下的硬链接与符号链接

  Linux的初学者常常混淆Linux中的硬链接(hard link)与符号链接(symbol link)的概念,分不清楚它们的区别。因此,本文将向读者全面介绍硬链接与符号链接,给予读者以全面的认识。

1.Linux下的文件系统

1.1 Ext2文件系统结构

  为了能够从本质上理解硬链接与符号链接,我们必须要对Linux下的文件系统有一定的认识。这一小节将向读者简要地介绍Linux下的文件系统(以Ext2文件系统为例)知识作为背景。

  Ext文件系统是对minix文件系统的扩展,而Ext2文件系统是第二代扩展文件系统。磁盘分区大小可达4TB,磁盘布局采用了组块。

  上图是Ext2文件系统结构示意图。其中:

  Boot Block:每个硬盘分区开头的第一个块为分区的启动块。这个块不受Ext2文件系统管理,为分区的引导扇区所保留。

  一个Ext2硬盘可以有许多个组块。每一个组块都可以看作一个分区。每一个分区由超级块、组描述符、数据块位图、inode位图、inode表以及数据块组成。

  Super Block:超级块。Block Group 0中的Super Block被内核所使用,定义了诸如文件系统的静态结构,包括块的大小、总块数、每组内inode数、空闲块、索引结点数等全局信息。其他Block Group中的Super Block仅仅是Block Group 0中Super Block的一个拷贝。Linux启动时,Block Group 0中的Super Block的内容会被读入到内存中,如果某个Block Group损坏时,可以用其进行恢复。

  Group Descriptors:组描述符。组描述符记录了块位图(Data Block Bitmap)所在块的块号,inode位图(inode Bitmap)所在块的块号,inode表(inode Table)所在块的起始块号,本组空闲块的个数等组内信息。文件系统根据这些信息来查找数据块位图,索引结点位图,索引结点表的位置。

  Data Block Bitmap:Ext2文件系统的数据块位图。这是Ext2管理存储空间的方法,即位图法。Data Block Bitmap中每一位对应了一个数据块,某一位上位0时表示该位所对应的数据块空闲,反之为1时,表示该位所对应的数据块已经被分配。Data Block Bitmap占了1个块的空间,因此,一个组中的数据块的个数就已经决定了。如果每个块为b-byte,那么该Group Block就有8*b个块,可以存放(8*b)*b字节的数据。

  inode Bitmap与inode Table:inode Bitmap的作用于Data Block Bitmap差不多,但Data Block Bitmap索引的是数据块。而inode Bitmap索引的则是inode Table中的inode结点。每一个inode都是一个数据结构,其大小为128字节。每一个inode对应一个文件(包括了目录),包含了有关该文件的除了文件名,文件类型之外的所有属性,例如访问权限,文件创建时间,访问时间,修改时间,文件所占的数据块的个数,指向数据块的指针,该inode被引用的个数(这个十分重要!)等等。

  Data Block:数据块存放文件的实际内容。需要特别指出的是,在Linux下目录也是一种文件。目录中的文件及子目录都以目录项(directory entry)的形式存放在该目录的数据块中。目录项中主要记录了文件的inode号,文件名以及文件类型等内容。

1.2 一个简单的示例

  在前面已经简单地介绍了必要的Ext2文件系统知识。可能有些读者还有一些困惑。下面我用一个具体的实例来看一下再Ext2文件系统下如何找到某一个文件,以便对前一小节所讲的内容有形象的认识。

  以定位“/xjtu/chenny”文件为例。通过Super Block中的根目录inode号,我们可以在文件系统被挂载时就能得到其根目录结点。假设根目录“/”在inode 0中(实际上,在Ext2文件系统中,根目录的inode值为2,为了示例简单,假设其inode为0)。文件系统首先读取inode 0(“/”),获得它的数据块指针(指向数据块3),然后读取数据块3的内容。数据块3中存放的是3个目录项:

      “.”当前目录,inode为0;

      “..”父目录,inode为0;

      “xjtu”子目录,inode为43。

  按照前面指示的路径中的“xjtu”分量,读取inode 43的内容,然后获取它的数据块指针,为6,然后再访问数据块6,读取其内容。xjtu包含了3个文件:

      “.”当前目录,inode为43;

      “..”父目录,inode为0;

      “chenny”子文件,inode为55;

  接下来就访问inode 55,读取其inode内容,直接访问其数据块11,数据块11中包含了它的内容,为文本“Hello!”。

2.硬链接(hard link)

  所谓的硬链接,为某个文件创建另外一个可供访问的“别名”。Linux中的link函数提供了这一功能。需要注意的是,如果是为目录创建硬链接,则需要具有superuser权限。这是因为,为目录创建硬链接会引起文件系统中的循环访问,在这种情况下,许多Linux组件无法正常工作。同时,在许多Linux操作系统中,硬链接都要求文件以及硬链接处于同一文件系统中。

2.1 硬链接的本质

  为一个文件创建硬链接,这个文件也就有了一个“别名”,可以通过另外的路径来访问到这个文件,这个“别名”是货真价实的。

  创建硬链接,首先是在“别名”所在的目录,新建一个目录项,用来标示这个别名。然后,这个目录项中,指向的inode就是原文件的inode,文件名即是设置的新的那个“别名”。例如,我们在为/xjtu/chenny创建一个硬链接/chenny1。依然依照上面的那个例子,新的布局为:

  我们需要注意的是,在inode中,有一个域是用来记录该inode被引用的次数。创建一个硬链接就会使该文件所对应的inode结点的link number增加1。这个域的作用显而易见。当我们要删除某个文件时,实际上只是减少了它的link number。当link number为0时,操作系统才真正地删除该文件的内容。否则,如果无视link number,直接删除文件,则会造成想不到的问题。例如上例中,如果我们删除了/xjtu/chenny文件,那么/chenny1也就会访问错误。真实的情况是,当删除/xjtu/chenny文件时,inode 55的link number减1,此时我们通过/chenny1,仍然可以访问到该文件的内容。但是当我们再删除掉/chenny1时,由于inode 55的link number减1之后变成了0,此时,inode 55会被真正删除。

3.符号链接(symbol link)

  Linux文件系统下的另外一种常用链接是符号链接(symbol link),它的使用以及本质都有别于硬链接。我们可以使用ln –s命令来为某一文件创建一个符号链接。有一点与硬链接不同的是,符号链接允许对目录进行链接。

3.1符号链接的本质

  创建符号链接的操作是:首先创建一文件,文件的路径即是“别名”的路径。这个创建,是需要为“别名”分配一个inode结点,并为其分配相应的data block,而其data block内存放的内容是被链接文件的路径。之后,为“别名”所在的父目录创建一个目录项,该目录项指示了该别名的内容。我们同样以上面的例子做示例。为/xjtu/chenny创建一个符号链接/chenny2:

  在我的博文http://www.cnblogs.com/XjChenny/archive/2012/12/10/2811995.html中,也提及了符号链接st_size大小的问题,从这里,我们就可以得到对于该问题的解答。符号链接并没有将“别名”的inode结点指向原文件,而是新创建了一个符号链接文件,这也就允许了我们可以使用符号链接,链接一个不存在的文件或者目录而没有任何问题。这样的情形,对于硬链接确实不行的,硬链接要求必须链接到已存在的文件,这也是可以理解的,因为硬链接的目录项指向的inode是原文件的inode,原文件必须存在(即已分配inode)才可以。

End。由于本博文是根据《UNIX环境高级编程》相关内容,并参考本人本科时所做的操作系统专题实验中“Ext2文件系统模拟实现”相关内容所写,关于Ext2文件系统的叙述,可能与真实的Ext2文件系统有所出入,但对于基本原理的阐述应该无误。并且对硬链接与符号链接的实现机制也是准确无误的。

硬链接与符号链接是独立于具体的文件系统的,在本文中,也只是方便,采用了Ext2文件系统的布局进行了示例,以便对硬链接与符号链接有形象的认识。如果需要准确详细地了解Ext2文件系统,请查阅其他文档。但如要了解硬链接与符号链接,本文值得一读。

写作仓促,可能存在错误,欢迎指出,并相互交流。

转载于:https://www.cnblogs.com/XjChenny/archive/2012/12/18/2823735.html

相关文章:

Unity + SQL数据库创建管理玩家排行榜学习教程

Unity SQL Databases Player Management Leaderboards More! Unity SQL数据库玩家管理排行榜更多! MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确&…

SQL基础学习总结:2(表的创建、删除、更新和名称修改)

表的创建、删除、更新和名称修改 登录MySQL(mysql -u root -p语句) 步骤: 1.首先得先使用mysql -u root -p语句登录数据库; 2.在"Enter password:"后面输入你设置的密码,然后就登录到MySQL可以进行数据库得操作了。 如下图&#…

需要抛出异常的情况

1、调用一个抛出已检查异常的方法。例如FileInputStream构造器。 2、程序运行中发现错误,并且利用throw语句抛出一个已检查异常。 3、程序出现错误。例如a[-1]0会抛出一个ArrayIndexOutOfBoundsException异常。 4、Java虚拟机和运行时库出现的内部错误。 对于可能会…

2022-2028年中国HDPE膜行业市场研究及投资发展分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国HDPE膜行业市场行业相关概述、中国HDPE膜行业市场行业运行环境、分析了中国HDPE膜行业市场…

linux+postfix+extmail+dovecot搭建邮件服务器

一、我们可以重新搭建服务器,也可以利用我前面的搭建方法编译安装,地址:http://wangzan18.blog.51cto.com/8021085/1605480,本次我们使用yum的方法来安装httpd和mysql,我的搭建环境还是我们的CentOS6.6 x86-64位mini版…

2009年3月

1、http://www.west-wind.com/Weblog/posts/509108.aspx Client Templating with jQuery http://jtemplates.tpython.com/ jTemplates is a template engine for JavaScript. 2、http://www.cnblogs.com/QLeelulu/archive/2008/11/27/1342722.html jQuery的模板与数据绑定插件…

UE4创建第一人称射击游戏学习教程

Unreal Engine 4: Create Your Own First-Person Shooter MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:38节课(9h 56m) |大小解压后:6.8 GB 学…

SQL基础学习总结:3(select语句基础算术运算符比较运算符)

select语句基础 列的查询 从表中选取数据时需要使用select语句&#xff0c;通过select语句查询并选取出必要数据的过程称为匹配查询或查询。 语法结构如下&#xff1a; select <列名1>,<列名2>,<列名3>... from <表名>;该select语句包含了select和f…

Linux——Linux概念架构的理解

摘要 Linux kernel成功的两个原因&#xff1a;&#xff08;1&#xff09;灵活的架构设计使得大量的志愿开发者能够很容易加入到开发过程中&#xff1b;&#xff08;2&#xff09;每个子系统&#xff08;尤其是那些需要改进的&#xff09;都具备良好的可扩展性。正是这两个原因使…

2022-2028年中国GPS导航行业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国GPS导航行业市场行业相关概述、中国GPS导航行业市场行业运行环境、分析了中国GPS导航行业市…

Geohash的精度问题

网上的关于Geohash的精度问题的说明都不够完整&#xff0c;做了一下补充&#xff0c;可以参见本文表格。 具体的计算方法&#xff1a;Latitude的范围是&#xff1a;-90 到 90Longitude的范围&#xff1a;-180 到 180地球参考球体的周长&#xff1a;40075016.68米geohash长度Lat…

在CentOS上把MySQL从5.5升级到5.6

在CentOS上把MySQL从5.5升级到5.6 摘要&#xff1a;本文记录了在CentOS 6.3上&#xff0c;把MySQL从5.5.28升级到5.6.19的过程。 1. 概述 在我做的一个项目中&#xff0c;最近我对生产服务器上的一系列系统软件进行了升级&#xff0c;包括Git、Nginx、MySQL和PHP。这篇文章讲的…

在3ds Max和Vray中创建赛博朋克圣诞老人室内场景

我叫奥马尔萨米罗什迪&#xff0c;建筑师、室内设计师、助理讲师、摄影师和3d艺术家。2019年获得建筑学硕士学位。我曾为多家建筑事务所和顾问工作&#xff0c;甚至建立了自己的建筑工作室。我有很长的大学教学生涯&#xff0c;从2013年开始&#xff1b;我曾在知名大学教授设计…

Java之网络通信框架mina

mina是一个基于java nio的网络通信框架。主要屏蔽了网络通信的一些细节,对Socket进行封装,并且是NIO的一个实现架构,可以帮助我们快速的开发网络通信,常用于游戏的开发、中间件服务端的程序中。Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使。

GIT常用命令大全

git config --global color.ui true //让git显示颜色//忽略特殊文件//.gitignore文件 # Windows: Thumbs.db*.egg*.egg-infodist//把该文件也提交到git$ git add -f App.class //强制添加被忽略的特殊文件。

SQL基础学习总结:5(HAVING子句的使用ORDER BY排序子句的使用)

为聚合结果指定条件 HAVING子句 HAVING子句可以让我们筛选分组之后的各种数据&#xff0c;其语法结构如下&#xff1a; SELECT <列名1>,<列名2>,<列名3> FROM <表名> GROUP BY <列名1>,<列名2>,<列名3> HAVING <分组结果对应的…

【转】android错误 aapt.exe已停止工作的解决方法

http://www.jb51.net/article/57420.htm 在使用eclipse进行安卓java的编程的时候&#xff0c;有时候我们会遇到这样的问题&#xff1a;那就是无故弹出aapt.exe停止工作的提示&#xff0c;虽然程序不会崩溃&#xff0c;但是这个提示经常弹出很是烦人。今天&#xff0c;小编就来教…

2022-2028年中国FEP薄膜行业市场发展规模及市场分析预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国FEP薄膜行业市场行业相关概述、中国FEP薄膜行业市场行业运行环境、分析了中国FEP薄膜行业市…

Android-----View绘制流程以及invalidate()等相关方法分析 .

引自&#xff1a;http://blog.csdn.net/qinjuning/article/details/7110211 前言&#xff1a; 本文是我读《Android内核剖析》第13章----View工作原理总结而成的&#xff0c;在此膜拜下作者 。同时真挚地向渴望了解 Android 框架层的网友&#xff0c;推荐这本书&#xff0c;希望…

实现ASP.NET MVC3 HtmlHelper 的 RadioButtonList 与CheckBoxList 扩展

ASP.NET MVC3也出来有一段时间了&#xff0c;对于没有RadioButtonList 与CheckBoxList的问题&#xff0c;网上也已经有很多解决方案了&#xff0c;可以for循环拼接出来&#xff0c;也可以引用ASP.NET MVC Toolkit&#xff0c;等等方法。其实本没有必要写出来的&#xff0c;不过…

Blender从头到尾创建一个低多边形场景学习教程

Low Poly Landscapes – Blender Bite Sized Course 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.9 GB |时长:6h 0m 从头到尾创造一个低聚…

SQL基础学习总结:6(INSERT语句的相关使用方法)

数据的插入(INSERT语句的使用方法) 我们之前在表的创建部分简单地介绍了一下INSERT语句的功能和使用方法&#xff0c;现在我们再详细讲一下它的用法。 INSERT语句的基本语法 其语法结构如下&#xff1a; INSERT INTO <表名> (列名1,列名2,列名3...)-> VALUES (数据…

JVM安全退出(如何优雅的关闭java服务)

为了保障应用重启过程中异步操作的执行,避免强制退出JVM可能产生的各种问题,我们可以采用关闭钩子、自定义信号的方式,主动的通知JVM退出,并在JVM关闭前,执行应用程序的一些扫尾工作,进一步保证应用程序可以安全的退出。

常用的CSS(收集)

1. 防padding属性改变盒子模型宽度 Css代码 * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } 当前css将固定盒子模型宽度总是以(显示)指定的宽度(width:300px)为准, 并不会受到padding而强制改变和模型宽…

2022-2028年中国EMI膜产业发展态势及市场发展策略报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国EMI膜行业市场行业相关概述、中国EMI膜行业市场行业运行环境、分析了中国EMI膜行业市场行业…

JS报“Uncaught TypeError: undefined is not a function ”异常

最终的原因是&#xff1a;js引用的位置太靠后&#xff0c;导致使用js方法时&#xff0c;js库还没加载。报此异常的可能原因有&#xff1a; 1、函数名写错了&#xff1b; 2、没有引用js文件&#xff1b; 3、定义晚了转载于:https://www.cnblogs.com/finalstar/p/4254632.html

密码学摘要算法之MD5

摘要算法 摘要算法是一种能产生特殊输出格式的算法&#xff0c;这种算法的特点是:无论用户输入什么长度的原始数据&#xff0c;经过计算后输出的密文都是固定长度的&#xff0c;这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取&#xff0c;这种提取就是摘要&…

Revit:从入门到精通学习教程

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小:8.07 GB |时长:12h 16m Revit:从开始到专业掌握Revit 你会学到什么 Revit的最新功能 在Revit中创建…

JDBC编程:1(使用JDBC连接数据库)

使用JDBC连接数据库 下载连接MySQL数据库的驱动 这个jar包可以在官网上对照着你的MySQL版本来下载&#xff0c;这里我下载的是最新的8.0.20版本&#xff0c; 这里是8.0.20版本的驱动包&#xff1a;mysql-connector-java-8.0.20.zip 因为CSDN的积分不能设置永久免费&#xff0…

VS2010 编译 QT4.8.7 x64

1 下载qt4.8.7源代码&#xff0c;解压到合适位置(如本文为d:\qt\4.8.7) 2 设置环境变量&#xff1a; set QMAKESPECwin32-msvc2010set QTDIRd:\qt\4.8.7 3 修改配置文件&#xff1a; 修改\mkspecs\win32-msvc2010\qmake.conf将QMAKE_CFLAGS_RELEASE的O2改为O1 或 安装补丁http…