软链接和硬链接——Linux中的文件共享
硬链接(Hard Link)和软链接也称为符号链接(Symbolic Link)的目的是为了解决文件的共享使用问题。要阐明其原理,必须先理解Linux的文件存储方式。
索引结点
Linux是一个UNIX类操作系统,所有类型的UNIX文件都是由操作系统通过索引节点来管理的。
索引节点是一个控制结构,包含操作系统所需的关于某个文件的关键信息。多个文件名能与一个索引节点相关联,但一个活跃的索引节点只能与一个文件相关联,且每个文件只能由一个索引节点来控制。文件的属性、访问权限和其他控制信息都保存在索引节点中。此处以Linux中ext2的索引结点示例。
Ext2文件系统的每一个文件和目录都对应一个索引结点,每一个数据块组中的索引结点都保存在索引结点表中。
ext2的索引结点的一些主要字段:
Mode:包含次索引结点描述的是什么(比如描述文件、目录、符号链接、块设备、字符设备以及FIFO结构等)以及用户拥有的权限
Owner
information:文件或目录所有者的用户和组标识符,这使得文件系统可以正确地授权某种存取操作
Size:文件大小
Timestamps:建立时间和最后修改时间
Datablocks:指向存储此索引结点描述的文件数据块的指针。直接指针指向存储数据的物理数据块,间接指针、两级指针和三级指针指向不同级别的指针块或数据。
具体的索引节点结构会因为UNIX实现的不同而发生变化,再举一个FreeBSD的索引节点结构:
当访问一个文件时,通过文件名在目录表中查找到其索引节点号,通过索引节点号查索引节点表得到其索引节点,通过索引节点得到文件数据所在的位置。
索引结点也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据(data block);另一个是索引结点区(inode table),存放索引结点所包含的信息。
每个索引结点的大小,一般是128字节或256字节。索引结点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个索引结点。
Linux中的相关命令:
查看每个硬盘分区的索引结点总数和已经使用的数量,可使用df命令:df -
查看每个索引结点节点的大小,可以用如下命令:sudo dumpe2fs -h /dev/hda | grep “Inode size”
使用ls –l命令会显示出在大部分信息.
ls –i option显示文件的索引号.
而stat命令则可以列出索引节点中的几乎所有信息.
文件系统第一次被创建时, 会为每一个文件系统创建若干数量的索引节点。该数目是文件系统所能容纳的最大文件数。只要不重新初始化文件系统, 就不能改变这个数目, 否则会损坏该文件系统上所有的数据。当文件系统中有很多很多小文件时文件系统会可能将索引节点全部用光。
一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。操作系统用索引结点号码来识别不同的文件。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的索引结点号码;其次,通过索引结点号码,获取索引结点信息;最后,根据索引结点信息,找到文件数据所在的block,读出数据。
使用ls -i命令,可以看到文件名对应的inode号码:ls -i example.txt
由于索引结点与文件名分离,这种机制导致了一些Unix/Linux系统特有的操作
1. 若出现文件名包含特殊字符,无法正常删除的情况。这时,可以通过直接删除索引结点来删除文件。
2. 移动文件或重命名文件,只是改变文件名,不影响索引结点号码。
3. 打开一个文件以后,系统就以索引结点号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从索引结点号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。更新的时候,新版文件以同样的文件名,生成一个新的索引结点,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的索引结点则被回收。
硬链接和软连接
基于索引结点共享:硬链接(hard link)
文件索引节点中设有一个链接计数字段inode link count,用来表示连接到本索引结点上的用户目录项的数目
用户A创建一个新文件时,inode
link count;
用户B要共享该文件,B的目录中增加一个目录项,并填上新的文件名和指向该共享文件的索引结点的指针,inode link count;
缺点:文件主无法删除被他人共享的文件。
•在系统中占用的空间与源文件相同,但在系统中引用的是相同的对象(不是拷贝)
•在操作系统层解析
•图标和创建快捷方式的图标不同
•移除源文件不会影响硬链接
•移除硬链接不会影响源文件
•如果源文件被删除,它的内容依然通过硬链接存在
•硬链接文件的任何更改都会影响到源文件
$ln a b # b是a所指文件的硬链接
硬链接实际上是为原文件建立一个别名,链接文件和原文件实际上是同一个文件。可以通过ls
-i来查看。两个文件的inode号是同一个,说明它们是同一个文件。它只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨文件系统的。硬链接删除的时候,系统调用会检查inode link count的数值,如果它大于等于1,那么inode不会被回收,因此文件的内容不会被删除。目录不能进行硬连接。目录硬连接引用计数,如果形成环,删除的时候会产生dangling dir。
基于文件路径共享:符号链接(symbolic link)&软连接(junction link or soft link)
为了能使B共享A的一个文件,系统为B建立一个类型为link的新文件,将该文件放在B的目录下,在新文件中只包含了目标文件的路径名,当B读该link类型的文件时,将被OS截获,并根据新文件中的路径名去读目标文件。这种实现文件共享的方式成为符号链接。
在这种方式下,文件主删除被他人共享的文件后,其他用户再去访问该共享文件,会因找不到文件而失败,再将该符号链删除不会造成任何影响
缺点:其他用户访问共享我共享文件时,必须根据路径中的分量名逐级检索目录,加大了访问文件的开销;尽管Link类型文件很简单,但任需为它配置一个索引结点,并分配一个盘块来存放目标文件的路径名,这样也增加了系统的开销。
•创建链接后的图标和快捷方式很像
•在系统中不占用空间
•在文件系统中不是一个单独的文件
•在操作系统层解析
•如果源文件被删除了,链接就没用了
•移除源文件不会影响符号链接
•移除链接文件也不会影响源文件
$ ln –s a b #为a创建一个符号链接b
rm b:a不受影响
rm a:a不存在,b能被控制但无法访问
软链接实质是新建立一个inode,产生一个新的文件,但这个文件的作用就是专门指向某个文件的,删除这个软链接文件,原来的实体原文件还是存在的,保持不变。但要是删除原来的文件,则相应的软链接不可用(cat那个软链接文件,则提示“没有该文件或目录”)。符号链接可以跨文件系统,可以跨磁盘分区,符号链接的文件类型位是l。
比较
硬链接
1.只允许文件链接,不允许目录链接;
2.只能在同一个文件系统范围内进行,不允许跨文件系统。
3.删除文件时,如果还有其他链接链至该文件,则该文件不能被删除。
软链接
1.访问速度相对较慢,但适用范围和灵活性更大。
2.允许目录链接,允许在不同的文件系统间进行链接,这两个文件系统可以在同一个计算机上,也可以在不同的计算机上。
3.被链接文件的删除和符号链接的删除是完全独立的
资料出处
1. 操作系统第八版
2. 操作系统原理、设计及应用。高等教育出版社
3. 电子科技大学计算机学院蒲晓蓉老师操作系统课件
4. 电子科技大学计算机学院薛瑞尼老师操作系统课件
软链接和硬链接——Linux中的文件共享的更多相关文章
- 深入解读键值产生原理,linux中的软链接和硬链接(转)
键值 = 文件标示符 + 项目ID 当用到进程间的通信时, 必须要注意到的是键值是怎么产生的,我们知道任何一个文件时通过文件名来访问的, 而内核在对应的给其一个值,也就是文件标示符. 系统建立IPC通 ...
- linux 下的使用 ln 创建 软链接 和 硬链接
linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...
- Linux学习笔记 软链接和硬链接
Linux 中,"everything is file".接下来给大家介绍 linux 如何通过链接,达到节省磁盘空间.共享文件等目的.链接文件有两种方式,软链接(soft lin ...
- Linux链接命令及软链接、硬链接详解
命令ln详解 命令ln,所在路径为: 可以看到,它的路径为:/usr/bin/ln,因此,它的执行权限是所有用户 命令的基本功能是创建链接文件(硬链接),例如:ln /etc/issue /tmp 选 ...
- linux中inode、软链接、硬链接
1 软链接 linux中软链接理解成window中的快捷方式.创建软链接的命令 ln -s 源文文件或目录 目标文件或目录 2 硬链接 创建硬链接的命令如下 ln 源文文件或目录 目标文件或目录 3 ...
- linux中软链接和硬链接的区别与小结
ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...
- Linux中的链接文件_软链接和硬链接
一.链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link).两种链接的本质区别在于inode.以下是详细介绍: 硬链接:当系统要读取一个 ...
- Linux 中软链接和硬链接的使用
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link). 硬链接和软链接 硬链接 --- ln 要链接的文件 新硬链接名 软连接 --- l ...
- Linux之软链接与硬链接
什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS ...
随机推荐
- SEO 搜索 形成一个关联
- c# 一维数组和二维数组的几种定义方式<转>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- c#数字图像处理(七)直方图匹配
直方图匹配,又称直方图规定化,即变换原图的直方图为规定的某种形式的直方图,从而使两幅图像具有类似的色调和反差.直方图匹配属于非线性点运算. 直方图规定化的原理:对两个直方图都做均衡化,变成相同的归一化 ...
- 异想家Ubuntu安装的软件
[替换国内源] https://developer.aliyun.com/mirror/ubuntu 我提供一个下载,方便第一次安装懒得敲命令: https://jfz.me/16.04/source ...
- laravel aritisan命令大全
1常用命令 显示某个命令的帮助 php artisan -h make:controller 实例命令 php artisan make:controller -r Api/TestControlle ...
- Day10-Python3基础-协程、异步IO、redis缓存、rabbitMQ队列
内容目录: Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko S ...
- ios--->上下拉刷新控件MJRefresh
上下拉刷新控件MJRefresh 一.类结构 MJRefreshComponent.h MJRefreshHeader.h MJRefreshFooter.h MJRefreshAutoFooter. ...
- abp vnext2.0之核心组件模块加载系统源码解析与简单应用
abp vnext是abp官方在abp的基础之上构建的微服务架构,说实话,看完核心组件源码的时候,很兴奋,整个框架将组件化的细想运用的很好,真的超级解耦.老版整个框架依赖Castle的问题,vnext ...
- windows 删除无用服务
Windows中无用的服务怎么删除? Windows服务也称为Windows Service,它是Windows操作系统和Windows网络的基础,属于系统核心的一部分,它支持着整个Windows的各 ...
- springIOC源码接口分析(六):ResourceLoader
参考博客: https://www.cnblogs.com/jixp/articles/10702486.html 一 定义方法 Spring提供了ResourceLoader接口用于实现不同的Res ...