软链接
软链接首先是一个符号文件,它的inode号与被链接文件的inode号不同。软链接文件的大小与它被链接对象的名字有关,被链接文件的名字有几个字符,软链接文件大小就多大,它就行windows下的快捷方式。eg abc -> b 则大小为1字节
软链接的列子,我们进在跑的一个进程,我们可以在/proc目录,根据正在跑的进程的一个pid号,找到一个相应的目录,该目录有个叫为 cwd 的一个符号链接,这个符号链接就指向该进程的当前工作目录。
使用心得
ln -svf 源文件path(要被建立软链接的文件) 生成的符号链接文件的path.
path :对于软链接而言必须是绝对路径,否则报错Too many levels of symbolic links.
硬链接
硬链接链接只能在同一个文件系统内链接,它的大小为被链接对象的大小。它的inode号为被链接对象的inode号,也就是说被链接对象的inode号的计数会再硬链接被链接后,inode计数会增一。
硬链接的列子,比如我们Linux下,使用 ll -ai 命令,可以看到当前目录下名为 . 的这个目录项的inode号与当前目录的inode号相同,这就是一个硬链接的列子。
区别和指令
区别
1.软链接可以跨文件系统进行建立链接,而硬链接只能在同一个文件系统能进行链接。(因为一个inode节点只能指向本文件系统的block)
2.专门有个文件类型叫做符号链接,但没有文件类型叫做硬链接
3.硬链接会对目标文件的inode节点链接数增加1,而软链接不会
4.当目标文件删除了,在使用软链接的时候,会显示目标文件不存在,而硬链接仍然可以打开
5.硬链接不会增在inode节点数和block数(block数是不会增加的除非父目录的当前block块被写满了,新增一个目录项会申请新的目录块),而建立软链接会消耗inode和block。
6.软链接可以给目录建立,而硬链接不能对目录建立
共同点
都可以通过它们修改目标文件
ln指令
ln 源文件 新链接文件名
默认建立硬链接
-s选项 链接软链接
-f 选项 如果新链接文件名存在,删除该文件来建立链接
目录中都保存了什么
首先,目录中不会保存,所有目录项的数据。它只保存了所有目录项的名字和inode号。这个可以从Linux下的一个库函数 readdir看出,它返回一个结构体,这个结构体中保存了相应目录项的文件名(C风格式的一个字符串)和与之对应inode号。
更深层的认识,只要一个文件,它都有俩部分构成,一部分是该文件的属性,就是权限/访问时间/类型/适合I/O的字节大小。一部分就是该文件的数据。实际上在文件系统上,文件的这俩部分是分开来存储的。文件属性存在inode节点中,数据保存在数据块中。对于目录来说它的数据块里保存的都是一个个键值对一样的东西,都是一个文件名和该文件名的inode节点号。所以一个目录树下,只保存了文件名和inode号。