硬链接与软链接的简述

我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。图1展示了程序通过文件名获取文件内

图 1. 通过文件名打开文件

图 1. 通过文件名打开文件

在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i。下图.中使用命令 mv 移动并重命名文件 lyx.bak,其结果不影响文件的用户数据及 inode 号,文件移动前后 inode 号均为:2685733735。

[root@centOS7-lyx ~]# stat /home/lyx/lyx.bak

  文件:"/home/lyx/lyx.bak"

  大小:0            块:0          IO 块:4096   普通空文件

设备:fd02h/64770d   Inode:268573735   硬链接:1

权限:(0664/-rw-rw-r–)  Uid:( 1003/     lyx)   Gid:( 1003/     lyx)

环境:unconfined_u:object_r:user_home_t:s0

最近访问:2016-10-13 10:13:43.666774033 +0800

最近更改:2016-10-13 10:03:33.806798019 +0800

最近改动:2016-10-13 10:05:31.566793388 +0800

创建时间:-

[root@centOS7-lyx ~]# mv /home/lyx/lyx.bak /home/lyx/mage.bak

[root@centOS7-lyx ~]#

[root@centOS7-lyx ~]# ls -i -F /home/lyx/mage.bak

268573735 /home/lyx/mage.bak

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。

              link oldfile newfile  ln oldfile newfile

图 2.硬链接和软链接的访问

blob.png

  由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

1.文件有相同的 inode 及 data block;

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

3.不能交叉文件系统(跨越设备和分区)进行硬链接的创建;

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

5.删除一个硬链接文件并不影响其他有相同 inode 号的文件,只是文件的链接数递减,所以当链接数递减到0时,文件也就被删除了。

//硬链接特性展示

 # ls -li

 total 0

  // 只能对已存在的文件创建硬连接

 # link old.file hard.link

 link: cannot create link `hard.link' to `old.file': No such file or directory

 # echo "This is an original file" > old.file

 # cat old.file

 This is an original file

 # stat old.file

  File: `old.file'

  Size: 25            Blocks: 8          IO Block: 4096   regular file

 Device: 807h/2055d   Inode: 123456      Links: 2

 Access: (0644/-rw-r–r–)  Uid: (    0/    root)   Gid: (    0/    root)

 …

 // 文件有相同的 inode 号以及 data block

 # link old.file hard.link | ls -li

 total 8

 123456 -rw-r–r– 2 root root 25 Sep  1 17:44 hard.link

 123456 -rw-r–r– 2 root root 25 Sep  1 17:44 old.file

  // 不能交叉文件系统

 # ln /dev/input/event5   /root/bfile.txt

 ln: failed to create hard link `/root/bfile.txt' => `/dev/input/event5':

 Invalid cross-device link

  // 不能对目录进行创建硬连接

 # mkdir -p old.dir/test

 # ln old.dir/ hardlink.dir

 ln: `old.dir/': hard link not allowed for directory

 # ls -iF

 123456 hard.link  54321 old.dir/  123456 old.file

硬链接不能对目录创建是受限于文件系统的设计。 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接(注意目录 /mnt/lost+found/ 的 inode 号)。若系统允许对目录创建硬链接,则会产生目录无限循环。

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

1.软链接有自己的文件属性及权限等(inode号),文件大小为指向路径的字符所占字节大小

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

  3.软链接可交叉文件系统(跨分区,跨设备);

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

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

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

//软链接特性展示

 # ls -li

 total 0

  // 可对不存在的文件创建软链接

 # ln -s old.file soft.link

 # ls -liF

 total 0

 234567 lrwxrwxrwx 1 root root 8 Sep  1 18:00 soft.link -> old.file

  // 由于被指向的文件不存在,此时的软链接 soft.link 就是死链接

 # cat soft.link

 cat: soft.link: No such file or directory

  // 创建被指向的文件 old.file,soft.link 恢复成正常的软链接

 # echo "This is an original file_A" >> old.file

 # cat soft.link

 This is an original file_A

  // 对不存在的目录创建软链接

 # ln -s old.dir soft.link.dir

 # mkdir -p old.dir/test

 # tree . -F –inodes

 .

├── [ 456789]  old.dir/

│   └── [ 456788]  test/

├── [ 23456]  old.file

├── [ 23456]  soft.link -> old.file

└── [ 456789]  soft.link.dir -> old.dir/

当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路径指向。

当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接,因为链接数据块中记录的亦是相对路径指向。

原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/53257

(0)
lyxlyx
上一篇 2016-10-20
下一篇 2016-10-20

相关推荐

  • 马哥教育网络21期+第七周练习博客

    马哥教育网络21期+第七周练习博客 1、创建一个10G分区,并格式为ext4文件系统; 首先挂载一个新的硬盘使用fdisk /dev/sdb进入相应的磁盘空间划分一个10G的磁盘空间; Command (m for help): n Command action    …

    Linux干货 2016-08-22
  • vim 常见用法、计划任务和脚本初探

    vim的常用方法 gg:跳至首行 G:跳至魔行 dd:删除光标所在行 ndd:删除光标及以下(n-1)行 yy:复制光标所在行 p:把复制行粘贴在光标下一行 P:粘贴在上一行 u:取消上一步操作 /string:查找关键字 n:往下查询 N:往上查询 %s/string1/string2/:把string1替换为string2,后面加g表示全局替换 set&…

    Linux干货 2016-12-04
  • CentOS的启动流程

                      一个操作系统的开启与关闭不是我们手动的打开与关闭电源那么简单。这个过程中涉及太多的内部服务的打开与关闭。而在这个过程中如果出现什么问题,那么以后的某些服务…

    2017-09-01
  • Linux Zabbix监控

                           Linux Zabbix监控 zabbix监控系统:    zabbix是基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zab…

    Linux干货 2016-11-19
  • 系统管理之磁盘管理(二)磁盘配额,RAID,LVM

    上篇博文给大家介绍了磁盘和文件系统的基础知识,也是最基本的使用.在实际生产环境中,对于磁盘的使用,要求稳定,灵活,那么下面给大家分享下磁盘的高级用法.磁盘配额,RAID,LVM等相关知识. 1.磁盘配额2.磁盘RAID3.LVM 一.磁盘配额 1.概述: • 在内核中执行 • 以文件系统为单位启用 • 对不同组或者用户的策略不同…

    Linux干货 2016-09-05
  • Linux程序包管理方式

    Linux程序包安装和管理方式共计三种:          一、[yum|dnf],通过官网或者其他开源网站提供的文件服务器,本机镜像源等途径进行安装。         二、rpm,通过官网或者其他开源网站通过…

    Linux干货 2016-07-29