最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

linux中硬链接和符号链接的区别及设定方法

Linux 11899浏览 0评论

1、符号链接

符号链接英文为symblolic link,有些文章也称为软链接。创建符号链接实际上就是创建了一个文件属性为l的新文件,新文件的内容就是创建时设定的目标文件路径。这个比较容易理解,可以理解成windows下的快捷方式。

下面来创建符号链接试试,在linux下创建链接使用ln命令。假设测试目录下有一个test.txt文件,创建一个符号链接到这个文件:

ln -s test.txt test

其中-s就是表示symblolic的意思,来看下这两个文件的属性:

ll -i test test.txt
linux符号链接文件属性

linux符号链接文件属性

可以观察到test的文件属性为l,就是link的意思,test的大小为8bytes,实际上就是创建符号链接时设定的目标文件”test.txt”的长度。这边还有一个信息,就是最前面的数字,这个数字是表示inode的意思,可以看出两个文件的inode并不一致。

笔者尝试用vim,less,cat,head和cp命令来操作符号链接test,最终读取到的内容都是从test.txt文件来的。使用mv和rm命令,是操作符号链接本身。

2、硬链接

硬链接英文为hard link,创建硬链接实际上就是创建一个文件,它所指向的inode和目标文件的inode一致。接上例,创建硬链接来看看:

ln test.txt test_hard

观察下test,test_hard,test.txt的文件属性:

linux硬链接文件属性

linux硬链接文件属性

可以观察到test_hard和test.txt的属性一模一样,只有名称不一样。要理解硬链接的本质内容,需要了解一些linux文件系统的知识:linux在存文件时系统会分配一个inode来记录文件的权限、文件大小、文件所有者与所属群组等属性,还会分配若干个block来存储文件实际内容,并将block的地址记录在inode中。

结合上例,要读取test.txt的内容,就要先从538782这个inode里获取相应block的地址,然后才能读取到文件存储的内容。

因为test_hard和test.txt指向了同一个inode,所以修改test_hard和test.txt文件内容实际上是一致的。那么删除其中一个文件,是否会删除另外一个呢?答案是不会,看上面图片的第三列信息(1,2,2),这个信息表示有多少个文件指向这个inode,其中538782有两个指向,就是test_hard和test.txt,删除任意一个,都只是减少一个指向,只有当指向为0时,系统才会真正删除文件内容。这也是C语言中删除文件函数unlink的含义了。

总结

因为硬链接只能在同一个文件系统内使用,为了方便在不同文件系统中使用,才推出了符号链接。硬链接和目标文件指向的是同一个文件;符号链接本身是一个单独的文件,和目标文件不同,只是系统在处理符号链接时会导向到目标文件。

查看符号链接本身的内容可以参考这篇文章:linux如何读取符号链接本身的内容

转载请注明:快乐编程 » linux中硬链接和符号链接的区别及设定方法

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址