Linux的软硬连接

##软连接: 也叫符号连接,实际上就是windows之中的快捷方式,软链接是一个文件,这个文件保存这目标文件完整路径。因此建立软链接的时候目标文件必定输入完整路径。不然你将软链接文件移动到别的地方就很差用了。 建立软链接命令:node

<!-- lang: shell -->
ln -s /home/myhome/vim/vimrc /home/myhome/.vimrc #-s选项表示建立符号链接

此外你彻底能够建立一个目标文件不存在的软链接,以做为特殊用途。shell

##硬连接: 相对于软链接,硬连接要复杂的多。在了解硬连接前,首先须要知道inode的概念。编程

inode 是 UNIX 操做系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中建立文件系统时,同时将会建立大量的 inode 。一般,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。vim

咱们都知道,磁盘是将文件分割成许多块,放到由扇区(sector,512字节)组成的块(block,通常为4mb)之中。而为了快速查找文件,必须有索引来指示那个文件的第一块的位置。这就是inode的做用之一。 在Linux当中,最多见的就是EXT系列文件系统,它们的inode组成大体以下:windows

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime指inode上一次变更的时间,mtime指文件内容上一次变更的时间,atime指文件上一次打开的时间。
  • 连接数,即有多少文件名指向这个inode
  • 文件数据block的位置

其次是目录项。Linux中全部的目录都被视为文件,内容是他所包含的文件的文件名和对应inode。特别的,对于根目录,每个分区都包含一个磁道组信息。根分区也不例外,根分区的 Cylinder Group Blocks里面也包含了根分区的inodes数据,其中包含了根的inode编号。 Linux查找一个文件,例如/home/wgj/ak47.txt,假设咱们未对/home独立分区。 那么系统首先读取分区的头部分,得到根目录的inode值,而后获得根目录文件的内容,查找wgj目录,获取其inode值,递归下去,直到找到ak47.txt的inode值为止。数据结构

了解了这个过程,硬连接就不难理解了:实际上全部的你见到的文件都是硬连接。添加一个硬连接实际上就是在目录文件中添加一个文件名和inode值的key-value对。操作系统

这样就能够理解硬连接的一些特性了,例如不占用inode值(只是对目录文件的修改),没法跨分区建立硬连接(分区不一样,inode值多是同样的),删除源文件,不影响硬连接。(inode值未丢失。还有至少一个)code

学过JAVA编程的能够这么理解,硬连接就至关于变量的引用,一个对象能够有多个引用。若是没有引用指向这个对象,那就能够回收了。因此对于垃圾文件或者非重要文件不要创建硬连接,要否则你删除的时候还要找它全部的硬连接Orz。对象

建立硬连接(无需完整路径):递归

<!-- lang: shell -->
ln ak47.txt ak48.txt

##软连接和硬连接的场景

  1. 软连接会占用inode值,若是存在大量软链接,可能形成硬盘空间未满,inode值却耗尽的问题。(软链接很小,可是却至少要占一个block),但这种状况不多发生。
  2. 根据硬连接的特性,能够为重要文件建立多个硬连接,防止误操做删除致使的问题。
  3. 若是遇到了磁盘空间占满的状况,但又忘记配置LVM的状况,可是文件不是太大的话,能够将数据迁移到其余磁盘,经过软链接访问。(不过若是是文件数目特别大的时候,消耗的时间就。。。因此尽快迁移到LVM吧)

##关于硬连接目录和软连接目录 根据ln的man page,Linux使能够创建目录的硬连接的,可是须要root权限。这么作的缘由是为了防止环的存在。例若有一个目录A,如今创建一个目录A的硬连接,添加到A当中,做为A的子文件夹,那么递归搜索的时候,就会造成一个环,进入死循环。若是要防止这种状况发生,那么就必须将访问过的目录储存在内存中,而后每访问一个文件都检查一下是否已经访问过了。这个过程对于系统来讲,不管是时间复杂度和空间复杂度都是没法接受的。因此原则上并不建议为目录创建硬连接,虽然这对于系统来讲并非很麻烦。

可是软连接却不存在上述问题。对于系统来讲,软链接数目相对较少,并且识别一个文件是软连接的成本很低,所能以较小的代价在内存中创建一个软连接的树或者散列。因此当存在软链接目录环的时候就能够十分方便的判断。

相关文章
相关标签/搜索