整理自《鸟哥的Linux私房菜》,整理者:华科小涛http://www.cnblogs.com/hust-ghtao/

Linux中的链接文件分为两种:硬链接和软链接。软链接(symbolic link)很好理解,就是类似于Windows的快捷方式功能的文件,让你可以快速链接到目标文件(或目录);另一种是通过文件系统的inode链接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link)。

1. Hard link

在前面的博客中EXT2/EXT3文件系统(一),我们知道:

  • 每个文件都会占用一个inode,文件内容由inode的记录来指向;
  • 想要读取该文件,必须经过目录记录的文件名来指向正确的inode号码才能读取。

也就是说,其实文件名只与目录有关,但是文件内容则与inode有关。那么,有没有可能多个文件名对应同一个inode呢?这就是所谓hard link的由来。简单地说:hard link只是记录某个目录下新建一条文件名连接到某inode号码的关联而已。

例如,假设我系统有个/root/crontab,它是/etc/crontab的hard link,也就是说这两个文件名连接到同一个inode,自然这两个文件名的相关信息都会完全一样:

我们发现,两个文件名都链接到inode1912701,文件的属性权限完全一致。而且你会发现第二个字段由1变成了2,这是“链接”字段,表示“有多少文件名连接到此inode”。如果将读取数据的示意图画出,则如下:

上图的意思是:可以通过1或2的目录inode去找到两个不同的文件名,而不管使用哪个文件名均可以指到real那个inode去读取最终的数据。这样做的最大好处就是安全,如果你将一个文件名删除,其实inode与block都还是存在的。此时可以通过另一个“文件名”来读到正确的数据。此外,不论使用哪个“文件名”来编辑,最终的结果都会写入到inode与block中,因此均能对数据进行修改。

硬连接的基本特性与限制:

  • 使用hard link设置链接文件时,磁盘的空间与inode的数目都不会改变,只是在某个目录下的block多写入一条关联数据;
  • 不能跨文件系统;
  • 不能链接到目录。如果设置硬链接到目录,链接的数据需要连同目录下面的所有数据都建立链接,会造成相当大的复杂度,目前不支持。

2.symbolic link

symbolic link很好理解,就是新建了一个文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是作为指向的作用,所以,当源文件被删除后,symbilic link的文件会“开不了”,实际上就是找不到源文件“文件名”。下图为symbolic link文件读取示意图:

由1号inode读取到链接文件的文件内容只有文件名,根据文件名链接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。

软链接文件的特点:

  • 软链接文件的重要内容就是它会写上目标文件的“文件名”。
  • 这个symbolic link和Windows的快捷方式可以划上等号,由symbolic link所创建的文件是一个独立的新文件,会占用inode与block。
  • hard link更安全,但限制多,所以symbolic link应用更广。

Linux下的链接文件的更多相关文章

  1. Linux下硬链接与软链接

    linux下的链接文件,尤其是软链接使用非常的频繁: 链分为硬链接(hard link)与软链接(symbolic link) 两种:关键在于inode: 硬链接: 当系统需要读取一个文件时,就会去读 ...

  2. 【Linux学习】Linux下用户组、文件权限详解

    原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...

  3. 程序的链接和装入及Linux下动态链接的实现

    http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行 ...

  4. 【原创】Linux下编译链接中常见问题总结

    前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. ...

  5. 查看Linux下*.a库文件中文件、函数、变量

    查看Linux下*.a库文件中文件.函数.变量等情况在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 中包 含哪些文件.函数.变量: 1. 查看文件:ar -t xxx.a 2. ...

  6. 【转】【Linux】Linux下统计当前文件夹下的文件个数、目录个数

    [转][Linux]Linux下统计当前文件夹下的文件个数.目录个数 统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 统计文件夹下目录的 ...

  7. (转)Mysql数据库之Binlog日志使用总结Linux下用户组、文件权限详解

    Linux下用户组.文件权限详解 原文:http://blog.csdn.net/sdulibh/article/details/51566772 用户组 在linux中的每个用户必须属于一个组,不能 ...

  8. Linux下几种文件传输命令

    Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具 ...

  9. Linux 下复制整个文件夹的命令

    在 Linux 下复制整个文件夹,包括它的子文件夹及其隐藏文件的方法是: cp -r /etc/skel /home/user 或者 mkdir /home/<new_user> cp - ...

随机推荐

  1. SQL Server 自学笔记

    --★★★SQL语句本身区分大小写吗 --SQLServer 不区分大小写 --Oracle 默认是区分大小写的 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-2 ...

  2. dhtmlx使用学习

    Var tabbar=new dhtmlXTabBar("tab","top"); tabbar.setImagePath("./tabbar/cod ...

  3. 版本管理神器git上手

    由于以前折腾过svn,虽然最终没有用成功,但是也算有经验,git入门还是比较简单的. 在新目录下建立初始化版本库  : git init git add file git add file2 git ...

  4. DW8051调试终结

    都不记得自己到底揪心了多久 —— 归根结底还是自己太菜了.终于找到了DW8051移植的bug. 这么大的一个图居然没有看到,真是气煞老夫也. 在原来移植的基础之上加两个反相器就OK 了

  5. Android 四种启动模式 已看晕

    http://blog.csdn.net/zdw890412/article/details/7386314  //有点乱 http://www.cnblogs.com/fanchangfa/arch ...

  6. “快的打车”创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - V2EX

    "快的打车"创始人陈伟星的新项目招人啦,高薪急招Java服务端/Android/Ios 客户端研发工程师/ mysql DBA/ app市场推广专家,欢迎大家加入我们的团队! - ...

  7. 使用线程新建WPF窗体(公用进度条窗体)

    使用线程新建窗体 项目中需要一个公用的进度条窗体.大家知道在wpf中,有两个线程,一个是UI线程,另一个是监听线程(一直监听用户的输入).如果我们后台有阻塞UI线程的计算存在,那么界面上的比如进度条什 ...

  8. PHP设计模式——策略模式

    概述 策略模式属于对象的行为模式.其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化 UML图 策略模式中主 ...

  9. 杭电--1862--EXCEL排序--结构体排序

    EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  10. C++中的智能指针(auto_ptr)

    实际上auto_ptr 仅仅是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势.使用它不必每次都手动调用delete去释放内存.当然有利也有弊,也不是全然完美的. 本 ...