设为首页 收藏本站
查看: 495|回复: 0

[经验分享] Ubuntu 12.04 link file详解

[复制链接]

尚未签到

发表于 2018-5-5 12:03:44 | 显示全部楼层 |阅读模式
  在Unix世界里有两个’link’(链接)概念,一般称之为硬链接和软链接。
  在学习link之前,先了解一下inode和block的概念。inode 译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件的类型和权限属性,属主,属组,文件大小,修改日期等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据inode值能最快的找到相对应的文件。
  用ls可以查看文件的inode
  $ touch goodluck
  $ ls -li
  32908 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
  32908 就是文件goodluck的inode值。
  硬链接
  一个硬链接仅仅是一个文件名。(一个文件可以有好几个文件名,只有将 最后一个文件名从磁盘上删除,才能把这个文件删掉。文件名的个数是由 ls(1)来确定的。所有的文件名都处于同一个状态,也就没有什么源名字 之说。通常文件系统里的一个文件的所有名字包含着一样的数据信息,不 过这样也不是必需的。)
  在Linux 文件系统中,inode值相同的文件是硬链接文件,也就是说,不同的文件名,inode可能是相同的,一个inode值可以对应多个文件。
  $ ls -li
  32908 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
  $ ln goodluck goodluck1
  $ ls -li
  32908 -rw-r--r-- 2 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
  32908 -rw-r--r-- 2 ubuntu ubuntu    0 2007-01-12 00:20 goodluck1
  由上面的代码可以看到,为文件goodluck创建一个硬链接goodluck1,两个文件的inode值都是32908,即两个文件用同一个inode值,而文件链接的个数由1变成了2。硬链接的文件是互为链接的,并没有所谓谁是源文件的说法。删除任何一个硬链接文件,并不会对跟它互为链接的文件产生任何影响。但是如果对文件进行修改,互为链接的文件也会跟着修改。在上面代码的基础上:
  $ echo 'hello world!'>goodluck
  $ cat goodluck1
  hello
  $ ls -li
  35159 -rw-r--r-- 2 ubuntu ubuntu   13 2007-01-12 14:06 goodluck
  35159 -rw-r--r-- 2 ubuntu ubuntu   13 2007-01-12 14:06 goodluck1
  修改goodluck,在里面写入"hello world!",可以看到goodluck1里也写入了"hello world!",再用ls -li查看,可以看到两个文件的大小和修改日期一样的都改变了。
  $ rm goodluck1
  $ ls -li
  35159 -rw-r--r-- 1 ubuntu ubuntu   13 2007-01-12 14:06 goodluck
  删除了goodluck1之后,goodluck完全没有变化,不过链接的个数变成了1.
  另外注意:硬链接不可以跨文件系统,而且只可以对文件做链接,不可以对目录做链接。
  软链接
  软链接(也叫符号链接)是 一个包含了路径信息的小小的指定文件。因此,软链接可以指向不同文件系统里的文件(比如由NFS装载的不同机器文件系统上的文件),甚至可以 指向一个不一定确实存在的文件。在软链接文件被访问(系统调用open(2) 或stat(2))的时 候, 操 作 系 统 用 该 文件所包含的路径替换该文件的访问介 入点,从而实现对所指文件的访问。(用命令rm(1)和unlink(2)可以删除 链接,但不是删除该文件所指向的文件。系统指定调用lstat(2)和readlink(2) 来读取链接文件与其所指文件的状态。到底是对软链接文件操作,还是对被 指向文件操作,由于不同操作系统件存在不同的系统调用,而存在着差异。)
  $ touch goodluck
  $ ln -s goodluck goodluck2
  $ ls -li
  36277 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 14:06 goodluck
  36279 lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:26 goodluck2 -> goodluck
  创建一个文件goodluck,并做一个符号链接goodluck2。可以看到,goodluck和goodluck2两个文件的inode是不相同的,由goodluck2的文件类型和权限lrwxrwxrwx可以看到,goodluck2不是文件,它只是个链接,相当于一个路径。goodluck2 -> goodluck就是说goodluck2的源文件是goodluck。
  当符号链接文件发生改变时,源文件也会跟着改变,但是如果源文件被删除了,符号链接也就不存在意义了,也就是所谓的断链。
  $ echo 'hello world!'>goodluck2
  $ cat goodluck
  hello
  $ ls -l
  -rw-r--r-- 1 ubuntu ubuntu   13 2007-01-12 14:39 goodluck
  lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:38 goodluck2 -> goodluck
  $ rm goodluck
  $ cat goodluck2
  cat: goodluck2: No such file or directory
  lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:38 goodluck2 -> goodluck
  当删除了goodluck后,goodluck2就成了断链。
  注意:符号链接不仅可以对文件做链接,同样也适用于目录。要特别注意,对目录做符号链接跟对文件做符号链接有一点不同,当把符号链接目录中的文件删除了,也就是把源文件给删除了。而对于文件做的符号链接,删除符号链接文件并不会对源文件有任何影响。
  $ mkdir goodluck
  $ cd ./goodluck
  $ touch goodluck1 goodluck2
  $ cd ..
  $ln -s ./goodluck/ ./luckgood
  $ ls -li
  36562 drwxr-xr-x 2 ubuntu ubuntu 4096 2007-01-12 14:52 goodluck
  36657 lrwxrwxrwx 1 ubuntu ubuntu   11 2007-01-12 14:54 luckgood -> ./goodluc
  $ rm ./luckgood/goodluck1
  $cd ./goodluck
  $ls -l
  goodluck2
  创建文件夹goodluck,在goodluck下建立两个文件goodluck1,goodluck2。给文件夹goodluck做符号链接luckgood,把符号链接文件夹里面的goodluck1删除,可以看到源文件./goodluck/goodluck1被删除了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-456148-1-1.html 上篇帖子: 【Linux技术】ubuntu常用命令 下篇帖子: Ubuntu 如何切换到超级用户
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表