Linux中软、硬链接那些事儿

软连接与硬链接

上一篇文章已经向大家介绍了Linux系统中文件目录结构,见http://vinsent.blog.51cto.com/13116656/1959522 。基于次,这篇博客向大家介绍Linux文件系统中的软连接(也称:符号链接)和硬链接;主要包括软、硬连接的概念,软连接与硬链接的区别以及如何创建软、硬链接。该文章中引用了https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/  中的一些概念;如有侵权,敬请相告!立即删除。

一、相对路径与绝对路径

在介绍软硬链接之前,先向大家介绍相对路径与绝对路径;我们在Linux中进行目录切换,以及系统自带的大岁数库文件均是以相对路径形成的符号链接文件来实现的。而我们的操作大多数时候接触的都是硬链接,像切换目录(cd /etc/sysconfig/network-scripts/)、挂载文件(mount /dev/sdxx /mnt/)等等。

1、绝对路径

绝对路径即“路径绝对”,说明只有唯一的路径来到达我们的“目的地”。绝对路径是从根“/”开始的(如 /etc/rc.d/inittab)即只要一个路径是从根开始的,那么毫无疑问,它一定是绝对路径。例如:

[ [email protected] ~ ]#
[ [email protected] ~ ]#pwd             # 查看当前目录
/root
[ [email protected] ~ ]#cd /etc/rc.d/init.d/  # 以绝对路径进入/etc/rc.d/init.d/目录
[ [email protected] init.d ]#ls
functions  netconsole  network  README
[ [email protected] init.d ]#pwd         # pwd 查看当前目录为/etc/rc.d/init.d/
/etc/rc.d/init.d
[ [email protected] init.d ]#

2、相对路径

相对路径:顾名思义该路径是相对的,相对于某指定目录或当前虽在目录。相对路径是以" . "或 " .. "开始的," . "表示用户当前操作所处的位置,而" .. "表示上级目录;在路径中," . "表示用户当前所处的目录,而 " .. " 上级目录,要把" . "和" .. "当做目录来看。例如:

[ [email protected] init.d ]#
[ [email protected] init.d ]#pwd      # 在硬链接是我们进入到了/etc/rc.d/init.d目录下,pwd查看当前目录
/etc/rc.d/init.d
[ [email protected] init.d ]#cd ..    # ..代表上级目录,cd .. 进入到/etc/rc.d目录下
[ [email protected] rc.d ]#pwd
/etc/rc.d
[ [email protected] rc.d ]#cd ..      
[ [email protected] etc ]#pwd
/etc
[ [email protected] etc ]#cd ../boot     # 从当前目录切换到boot目录下
[ [email protected] boot ]#
[ [email protected] boot ]#pwd         # pwd 查看当前目录为/boot
/boot
[ [email protected] boot ]#

二、软连接与硬链接

1、硬链接

硬链接是通过索引节点进行的链接。在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。如果删除硬链接对应的源文件,则硬链接文件仍然存在,而且保存了原有的内容,这样可以起到防止因为误操作而错误删除文件的作用。
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同 inode 号的文件;图解硬链接:

2、软链接(也称符号链接)与硬链接不同,文件用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。软链接可对文件或目录创建。

软链接主要应用于以下两个方面:一是方便管理,例如可以把一个复杂路径下的文件链接到一个简单路径下方便用户访问;另一方面就是解决文件系统磁盘空间不足的情况。例如某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中,这样就可以很好的解决空间不足问题。删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。
使用-s选项的ln命令即可创建符号链接。下图是软连接的工作过程:

3、软连接与硬链接的异同

从软连接与硬链接的概念我们便能感受到这两者的不同;下面对其异同加以总结。由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;

只能对已存在的文件进行创建;

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

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

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

软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块因此软链接的创建与使用没有类似硬链接的诸多限制:

软链接有自己的文件属性及权限等;

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

软链接可交叉文件系统;

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

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

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

4、创建软链接和硬链接

介绍完了软连接与硬链接的概念以及其异同;接下带着大家一步一步创建软、硬链接,从实验中领会软、硬链接的不同。硬链接的使用“ln”来实现;软连接使用“ln -s”来实现。

#------------实验环境准备-----------#

[ [email protected] ~ ]#
[ [email protected] ~ ]#rm -rf /app/*     # 为了不影响实验,我们清空/app/目录
[ [email protected] ~ ]#cd /app             # 切换到/app目录
[ [email protected] app ]#ls
[ [email protected] app ]#pwd
/app
[ [email protected] app ]#mkdir -p /app/{a/{x/{m,n/k},y},b,c/{q,w/{e/yy,r}},d}  # 创建若干目录
[ [email protected] app ]#tree /app         # tree查看/app的目录树结构
/app
├── a
│   ├── x
│   │   ├── m
│   │   └── n
│   │       └── k
│   └── y
├── b
├── c
│   ├── q
│   └── w
│       ├── e
│       │   └── yy
│       └── r
└── d

14 directories, 0 files
[ [email protected] app ]#
[ [email protected] app ]#cd /app/a/x/n/k       # 进入到/app/a/x/n/k 创建两个文件
[ [email protected] k ]#touch 1.txt
[ [email protected] k ]#touch 2.txt
[ [email protected] k ]#cd /app/c/w/e/yy         # 进入到/app/c/w/e/yy 创建两个文件
[ [email protected] yy ]#touch 11.txt
[ [email protected] yy ]#touch 22.txt

#------------创建硬链接--------------#
[ [email protected] ~ ]#ln /app/c/w/e/yy/11.txt /app/a/x/n/k/1bak.txt  # 创建硬链接
[ [email protected] yy ]#ll
total 0
-rw-r--r--. 2 root root 0 Aug 28 21:43 11.txt   # 节点数增加到2
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ [email protected] yy ]#cd /app/a/x/n/k/
[ [email protected] k ]#ll
total 0
-rw-r--r--. 2 root root 0 Aug 28 21:43 1bak.txt  # 节点数增加到2 说明硬链接创建成功
-rw-r--r--. 1 root root 0 Aug 28 21:42 1.txt
-rw-r--r--. 1 root root 0 Aug 28 21:42 2.txt
[ [email protected] k ]#echo 123634124 > 1bak.txt        # 改变文件 1bak.txt 内容
[ [email protected] k ]#cat 1bak.txt
123634124
[ [email protected] k ]#rm -rf 1bak.txt               # 删除该链接文件
[ [email protected] k ]#cd /app/c/w/e/yy              # 切换到/app/c/w/e/yy目录下
[ [email protected] yy ]#ll                            # 查看节点数减少
total 4
-rw-r--r--. 1 root root 7 Aug 28 21:54 11.txt
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ [email protected] yy ]#cat 11.txt                   # 查看源文件的内容并未发生改变
123124 
[ [email protected] app ]#ln abc /etc/abc_bak         # 跨分区创建硬链接,提示错误
ln: failed to create hard link ‘/etc/abc_bak’ => ‘abc’: Invalid cross-device link

#------------创建软连接--------------#

[ [email protected] init.d ]#cd /etc/rc.d/rc3.d/     # 切换到/etc/rc.d/rc3.d/ 
[ [email protected] rc3.d ]#ll                       # 软连接表现为一个目录指向另外一个目录
total 0
lrwxrwxrwx. 1 root root 20 Aug 14 11:09 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Aug 14 11:09 S10network -> ../init.d/network
[ [email protected] yy ]#ln -s  ../../../../c/w/e/yy/11.txt  ../../../../a/x/n/k/11bak.txt   # 创建软连接
[ [email protected] yy ]#ll
total 4
-rw-r--r--. 1 root root 38 Aug 28 22:17 11.txt
-rw-r--r--. 1 root root  0 Aug 28 21:43 22.txt
[ [email protected] yy ]#cd /app/a/x/n/k/
[ [email protected] k ]#ll            # 查看软连接
total 0
lrwxrwxrwx. 1 root root 27 Aug 28 22:18 11bak.txt -> ../../../../c/w/e/yy/11.txt
-rw-r--r--. 1 root root  0 Aug 28 21:42 1.txt
-rw-r--r--. 1 root root  0 Aug 28 21:42 2.txt
[ [email protected] k ]# 
[ [email protected] k ]#cat 11bak.txt          # 查看文件内容
1sdfsaldfhaskdh
jashdkfj
kasdfk
23124
[ r[email protected] k ]#echo 82734 > 11bak.txt     # 修改文件内容
[ [email protected] k ]#cat 11bak.txt 
82734
[ [email protected] k ]#cd /app/c/w/e/yy/          # 切换回源目录
[ [email protected] yy ]#ll              
total 4
-rw-r--r--. 1 root root 6 Aug 28 22:21 11.txt
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ [email protected] yy ]#cat 11.txt        # 查看原文件内容,发现也被修改了;说明软连接是同一个文件
82734
[ [email protected] yy ]#rm -rf 11.txt     # 删除原文件
[ [email protected] yy ]#cd -              # 切换回上次所在的目录
/app/a/x/n/k
[ [email protected] k ]#ll                 # 查看链接文件,发现变红了;
total 0
lrwxrwxrwx. 1 root root 27 Aug 28 22:18 11bak.txt -> ../../../../c/w/e/yy/11.txt
[ [email protected] k ]#cat 11bak.txt      # 查看文件 内容,提示出错
cat: 11bak.txt: No such file or directory
[ [email protected] app ]#ln -s ../app/abc ../root/abc_bak  # 在不同分区创建软连接,成功了
[ [email protected] app ]#cd /root
[ [email protected] ~ ]#ll             # 不同分区创建软连接成功;说明可以跨分区
lrwxrwxrwx. 1 root root      10 Aug 28 22:28 abc_bak -> ../app/abc

补充说明:

  1. 当然软链接的用户数据也可以是一个绝对路径路径。如果不在同根下,软链接创建时原文件的路径指向使用绝对路径较好。这是使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的亦是相对路径指向。如果链接文件与原文件在同个根下,那么用相对路径实现较好,他能完美实现整体迁移,不破坏结构,此时使用绝对路径将找不到原文件。故此;创建软连接时,建议视情况而定。
  2. 在软连接相对路径中,目标文件时相对当前目录而言的或者原文件所在的目录而言的;而原文件的路径是相对目标链接文件的路径而言的。可能你会觉得很难理解,下面以图解的方式帮大家一臂之力:
时间: 2024-10-04 10:46:18

Linux中软、硬链接那些事儿的相关文章

linux中的硬链接和软链接

一.ln命令概述 它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间. 二.硬链接和软链接的区别 硬链接:是通过文件系统的inode连接来产生新的文件名,而不是产生新文件 软链接:类似Windows的快捷方式功能的文件,可以让你快速连接到目标文件(或目录) 三.硬链接 语法:ln

Linux中的硬链接和软链接介绍和实验

在Linux中,链接分为硬链接和软链接,软链接又称为符号链接(Symbolic Link),在不带任何参数的情况下,使用ln命令创建的是硬链接. 硬链接:硬链接是通过索引节点来进行链接的.在Linux的文件系统中,保存在磁盘分区种的文件不管是什么类型的文件,都会为它分配一个编号,这个编号被称为索引节点编号(Inode Index)或Inode.多个文件名指向同一个索引节点(Inode),一般这种链接就称为硬链接.硬链接的作用之一是允许一个文件拥有多个有效路径名.这样用户可以建立硬链接到重要的文件

关于Windows中的硬链接

https://zhidao.baidu.com/question/748233720330351012.html linux中使用硬链接 ln a.txt b.txt 查看硬链接 ls -il 关于硬链接磁盘空间的占用情况 http://www.mamicode.com/info-detail-1914045.html 记得使用du -h;ll -h 原文地址:https://www.cnblogs.com/littlehb/p/8322170.html

LINUX系统中,软/硬链接和inode的一些关系。

前言:众所周知硬盘是计算机不可缺少的一部分,不管这个计算机上运行着的是什么系统,但是存储设备,都是必不可少的,而inode则是磁盘存储时无法替代的一部分.所以我想谈一下在linux系统中关于inode和软/硬链接的一些个人见解. 目录: 什么是inode 什么是硬链接 什么是软链接 软/硬链接在linux上的基本使用方法 软/硬链接和inode的联系 一,什么是inode 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存5

inode 、软(硬)链接及fork与vfork

一.inode.软/硬链接 (一).1.inode 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区".每个扇区储存512字节(相当于0.5KB). 操作系统读取硬盘的时候[不会一个个扇区地读取,这样效率太低],而是一次性连续读取多个扇区,即一次性读取一个"块".这种由多个扇区组成的"块",是文件存取的最小单位. 文件数据都储存在"块"中.而文件的创建者.文件的创建日期.文件的大小等等信息需要一个区域进行存储文件信息.这种储存文

第三章 Linux 软链接与硬链接

Linux 软链接与硬链接 通过实验加深理解 [[email protected]]$ touch f1          #创建一个测试文件f1 [[email protected]]$ ln f1 f2          #创建f1的一个 硬连接   文件f2 [[email protected]]$ ln -s f1 f3       #创建f1的一个 符号连接 文件f3  即软链接 [[email protected]]$ ls -li            # -i参数显示文件的ino

linux中的硬连接和软连接

linux中的硬连接和软连接 linux中的硬连接和软连接 背景 连接 硬连接 软连接 example reference 背景 linux中的文件主要分3块, - 真正的数据 - 索引节点号(inode index) - 文件名称 读取文件的顺序是通过文件名称.找到相应的inode.然后通过inode找到相应的数据,进行读取. 连接 当我们须要在不同的文件夹,用到同样的文件时.我们不须要在每个须要的文件夹下都放一个必须同样的文件,我们仅仅要在某个固定的文件夹,放上该文件,然后在 其他的文件夹下

Linux中的软硬链接

说到Linux中的软硬链接,就必须谈一下Linux的文件系统的组成的重要部分iNode和block. 首先是iNode,先用一张图了解一下iNode在Linux文件系统中的地位: Linux中的文件的文件名.文件属性和文件的数据是分开存储的.文件名存放在目录项(dentry)中,文件的属性存放在iNode中,而文件的内容,即文件的实际数据存放在block中,而目录只有iNode没有block.一般而言这个iNode的大小为128B,iNode中的内容大致如下:  1.文件的字节数: 2.文件拥有

[Linux] Linux软连接和硬链接

转载自:http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html 1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点来进行连接.在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索 引节点号(Inode Index).在Linux中,多个文件名指向同

linux 软连接和硬链接的区别

linux 软连接和硬链接的区别 2011-06-27  zale的图...   阅 3345  转 23 转藏到我的图书馆 微信分享: 4点不同 : (1)软连接可以 跨文件系统 ,硬连接不可以 .实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 .ln aa.txt /root/bb 失败 .(2)关于 I节点的问题 .硬连接不管有多少个,都指向的是同一个I节点,会把