linux 创建软链接和硬链接
Linux 系统中有软链接和硬链接两种特殊的“文件”。
软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。
硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。
创建方法都很简单:
- 软链接(符号链接) ln -s source target
- 硬链接 (实体链接)ln source target
inode
要解释清楚两者的区别和联系需要先说清楚 linux 文件系统中的 inode 这个东西。当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个 文件的 inode。 Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。

通常会根据分区的用途来安排inode的数量(这是另外一个话题了),比如文件数量很多而文件都很小,则需要调增inode较大,以便能索引全部文件。否则将会出现这个分区并没有写满而无法写入任何文件的情况。
目录文件与档案文件
目录文件:记录该目录下的文件名
档案文件:记录实际文件数据
inode本身并不记录文件名,文件名记录在目录文件的block当中,所以新增、删除、更改文件名与目录的W权限有关。因此当我们要读某个档案时,就务必经过其目录的inode和block,然后才能够找到待读取档案的inode号,最终才会读到正确的档案block内的数据。系统是通过索引节点(而不是文件名)来定位每一个文件。
目录inode(满足权限?) => 目录block => 档案inode(满足权限?) => 档案block
硬链接

多个档名对应同一个inode,硬链接只是在某个目录下新增一笔档名链 接到某个inode号码的关联记录而已。如果将上图中任何一个档名删除,档案的inode与block都还存在,依然还可以通过另一个档名来读取正确的档 案数据。此外,不论用哪一个档名来编辑,最终的结果都会写入相同的inode和block中,因此均能进行数据的修改。
软连接

软连接就是建立一个独立的文件,而这个文件会让数据的读取指向它link的那个档案的档名,由于只是作为指向的动作,所以当来源档案被删除之后,软连接的档案无法开启,因为找不到原始档名。连结档的内容只有档名,根据档名链接到正确的目录进一步取得目标档案的inode,最终就能够读取到正确的数据。如果目标档案的原始档名被删除了那么整个环节就进行不下去了。
下面用一个实例来说明硬链接和软链接。
现在目录下有两个文件,一个名为AAA,一个名为BBB。
引用
$ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
首先先做一个AAA的硬链接。
引用
$ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
这里我们注意在创建链接前,AAA显示的链接数目为1,创建链接后
1.AAA和AAAhard的链接数目都变为2。
2.AAA和AAAhard的inode号是一样的,都是963922。
3.AAA和AAAhard显示的文件大小也是一样,都是92B。
可见进行了ln命令的操作结果:AAA和AAAhard是同一个文件的两个名字, 它们具有同样的索引节点号和文件属性,建立文件AAA的硬链接,就是为 AAA的文件索引节点在当前目录上建立一个新指针。你可以删除其中任何一个,如rm AAA,每次只会删除一个指针,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除。
尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一些不足之处:
1.不允许给目录创建硬链接。
2.不可以在不同文件系统的文件间建立链接。因为 inode 是这个文件在当前分区中的索引值,是相对于这个分区的,当然不能跨越文件系统了。
接着我们做一个指向BBB的软链接,软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
引用
$ ln -s BBB BBBsoft
$ ls -il
总用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB
从上面链接后的结果可以看出来软链接与硬链接,区别不仅仅是在概念上,在实现上也是完全不同的。
区别:
1.硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;
2.在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;
3.链接数目是不一样的,软链接的链接数目不会增加;
4.文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B。因为BBB共有3个字符
5.软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接
总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。
当然软链接也有硬链接没有的缺点:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
linux 创建软链接和硬链接的更多相关文章
- Windows和Linux创建软链接和硬链接
1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...
- linux 下的使用 ln 创建 软链接 和 硬链接
linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...
- [转帖]Linux 下软链接和硬链接的区别
Linux 下软链接和硬链接的区别 http://os.51cto.com/art/201911/605267.htm 软连接 文件是小的 只是一个链接 删除和其他处理不影响 原始文件的计数 删除源文 ...
- linux命令大全之ln命令详解(创建软链接和硬链接)
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接,分为软链接.硬链接.软链接相当于windows的快捷方式,下面是使用方法和示例 ln是linux中又一 ...
- 描述Linux下软链接和硬链接的区别(计时2分钟)
在linux系统中,链接分两种 :一种被称为硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link). 1)默认不带参数情况下,ln命令创建的是硬链接. 2)硬链接文件 ...
- linux中软链接和硬链接的区别与小结
ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...
- Linux之软链接与硬链接
什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS ...
- linux下软链接与硬链接及其区别
linux下创建链接命令 ln -s 软链接 这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个不同的链接,这个命令最常用的参数是-s, 具体用法是:ln ...
- linux文件软链接与硬链接
1.命令格式: ln [参数][源文件或目录][目标文件或目录] 软链接只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间. 2.命令功能: Linux文件系统中,有所谓的链接(link),我们 ...
随机推荐
- Spring MyBatis Oracle 多数据源
数据源1 <bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"&g ...
- 安装一个Redis
1. 官网 http://redis.io/ 2.下载 官方不提供windows版本,但https://github.com/MSOpenTech/redis 可以从这里获取64位. 3.
- C# BackgroundWorker 的使用、封装
示例代码: PT_USER_INFO user = new PT_USER_INFO(); IList<TES_COMBAT_TASK> taskList = new List<TE ...
- WPF自定义ComboBox
<ControlTemplate x:Key="ComboBoxTextBox" TargetType="{x:Type TextBox}"> &l ...
- FIM控制同步用户
C:\Program Files\Microsoft Office Servers\15.0\Synchronization Service\UIShell 这个路径下,你如果懂FIM,可以进去看看 ...
- std::shared_ptr之deleter的巧妙应用
本文由作者邹启文授权网易云社区发布. std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期. 实例 在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的: 每一个账号都有一个 ...
- python--内置模块(二) os sys pickle json
1.os模块 常用方法: os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目 ...
- python中的函数(基础)
1.什么是函数 函数是指将一组数据的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用函数名即可 (函数就是对功能或者动作的封装) 2.函数的语法和定义 def 函数名() 函数体 调用: ...
- WPF 无边框拖动
无边框之后的拖动方法有三种. 我个人是喜欢第一和第三的方法,看个人去需求. 第三种代码比较仓促,有需要者可以立马用,或者稍作整理修改. 对于WIN10 .NET 4.5以上的框架可以使用 WIndow ...
- JavaWeb -pageContext/request/session/application
pageContext/request/session/application总结 一.范围差异 1. pageContext jsp页面容器 当前页面有效 2. request 请求对象 同一次请求 ...