硬链接与软链接的简述

我们知道文件都有文件名与数据,这在 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

相关推荐

  • N25 The first week –Yorick

    1.计算机的组成及功能 ENIARC:冯诺依曼体系 1.1.运算器(所属CPU)     进行计算 1.2.控制器(所属CPU)     控制部件之间的协调,包括寻址操作     辅助性存储(加速与提升CPU性能)     寄存器(锁存数据)     缓存(缓…

    Linux干货 2016-12-04
  • bash脚本变量的使用

    bash脚本的变量使用详解 变量的类型包括整数、字符串和数组,但在bash脚本编程中不需要指定类型就可以直接赋值,默认均为字符型,其参与运算会自动进行隐式类型转换。 变量的赋值方式为:name='value',其中“=”两边一定不能有空格,如果变量值中包含有空格则需要使用引号引起来,需要注意的是强引用和弱引用的区分。此外变量的赋值也可以引…

    Linux干货 2016-08-15
  • keepalived+lvs 实现站点高可用

    lvs实现负载均衡
    keepalived 解决 director单点和realserver监控检测

    2017-12-13
  • net25-第17周作业

    1、结合图形描述LVS的工作原理; lvs-nat模型,相当于多目标的dnat,通过将请求报文中的目标地址和目标端口修改为调度出的rs的rip和port来实现转发,整个请求如下: cip -> vip -> vs(nat转换) -> rip  请求 rip -> dip(默认网关) -> vs(nat转换) ->…

    Linux干货 2017-05-15
  • 磁盘配额的操作步骤

    磁盘配额 操作步骤: 1、创建一个10G的分区 /dev/sdd1并将其格式化,挂载 2、如果是新硬盘便不存在同步问题。旧硬盘得使用命令partx  -a /dev/sdd1 3、临时创建挂载文件夹 /mnt/home    4、将/home/*  mv  到 /mnt/home 中,再将/dev/…

    Linux干货 2016-09-01
  • Linux基础——文件管理

    Linux基础——文件管理 文件管理及常用命令详解       Linux文件系统是以/为基本的倒置树状结构,我们来进一步学习下文件或者目录的操作和管理命令:  目录相关操作:cd、pwd、mkdir、rmdir 目录及文件检索:ls 复制、移动、删除:cp、mv、rm…

    Linux干货 2016-09-27