硬链接与软链接的简述

我们知道文件都有文件名与数据,这在 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 21:01
下一篇 2016-10-20 21:06

相关推荐

  • 那些年我们一起追过的缓存写法(三)

    原文出处: 蘑菇先生    上次我们说了多级缓存,本章详细介绍下内存缓存该如何设计。 一:分析设计 假设有个项目有一定并发量,要用到多级缓存,如下: 在实际设计一个内存缓存前,我们需要考虑的问题: 1:内存与Redis的数据置换,尽可能在内存中提高数据命中率,减少下一级的压力。 2:内存容量的限制,需要控制缓存数量。 3:热点数…

    Linux干货 2015-03-04
  • shell脚本

    shell脚本 简介:         使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点是:它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可…

    Linux干货 2016-08-15
  • SRE管理职责简介

    读书笔记 摘要 SRE是Site Reliability Engineer的简称,从名字可以看出Google的SRE不只是做Operation方面的工作,更多是保障整个Google服务的稳定性。 SRE管理职责简介 监控系统 警报 工单 日志 应急事件处理 变更管理 预测需求和规划容量 资源部署 小结 监控系统 监控系统是 SRE 团队监控服务质量…

    Linux干货 2017-04-03
  • N28-第四周

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
    2、编辑/etc/group文件,添加组hadoop。
    3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。
    4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。
    5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。
    6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
    7、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
    8、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
    9、找出/etc/passwd文件中的一位数或两位数;
    10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
    11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
    12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
    13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

    2017-12-30
  • DNS and Bind

    DNS and Bind ===================================================================================== 概述:    DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使…

    Linux干货 2016-10-10
  • System作业

    1、求每班总成绩和平均成绩 [root@Centos7 bin]# awk '!/^name/{a[$2]++;b[$2]+=$3}END{for(i in a){print i,b[i],b[i]/a[i]}}' f1 4 100 50 5&nbs…

    Linux干货 2016-09-20