硬链接与软链接的简述

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

相关推荐

  • 超文本传输协议-HTTP

        超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。     设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或…

    Linux干货 2017-07-31
  • NFS服务器的安装与配置

    一、NFS服务简介 NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。 NFS 的基本原则是“容许…

    Linux干货 2017-05-02
  • 计算机和linux基础

    计算机的组成及其功能 计算机硬件主要由5部分组成:运算器 、控制器、存储器、input、output。 但是这和我们平时见到的计算机不一样?我们平时见到的计算机有CPU,内存,硬盘,显示器,鼠标键盘,显卡、主板等。这些东西也都归在以上五类设备中。下面我们简单介绍一下计算机这五个组成部分。 运算器: 运算器是计算机中做运算的部分,可以执行各种指令,加减乘除,与…

    Linux干货 2016-09-16
  • Centos7下的systemd管理

    systemd简介 Systemd是由红帽公司的一名叫做Lennart Poettering的员工开发,systemd是Linux系统中最新的初始化系统(init),它主要的设计目的是克服Sys V 固有的缺点,提高系统的启动速度,systemd和upstart是竞争对手,ubantu上使用的是upstart的启动方式,centos7上使用systemd替换…

    Linux干货 2016-09-23
  • MairaDB之基于openssl的主从复制

    一、配置openssl   1、   在master server(node0)上根CA的搭建(及生成自签名证书) [root@node0 ~]# cd /etc/pki/CA/ [root@node0 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Gen…

    2014-10-03
  • 网络配置——CentOS7

    CentOS 7 网络属性配置 使用传统命名方式: (1) 编辑/etc/default/grub 配置文件 GRUB_CMDLINE_LINUX ="rhgb quiet net.ifnames=0" 或:修改/boot/grub2/grub.cfg (2) 为grub2 生成其配置文件 grub2-mkconfig -o /etc/g…

    Linux干货 2016-09-11