熟悉Windows操作系统的用户对于它的快捷方式一定印象深刻吧?通过快捷方式,可以把本来保存在D盘等地方的文件或者目录定位到桌面,方便用户进行访问。其实在Linux系统中也有类似的功能,不过其从功能上来说要比快捷方式略胜一筹。
一、硬连接的原理。
在inode节点中存储着文件的相关属性,如权限等等。但是在这个节点中却没有存储文件的名字。这个特性给与了用户很多的想象力。如如此的话,一个文件只有一个节点,但是却可以有多个文件名字。当一个文件有多个文件名字时,在Unix系统中就叫做文件有多个连接。用户可以通过文件的任何一个连接访问这个文件。虽然他们有不同的文件名字,但是他们却是同一个文件,因为他们文件的inode号是同一个。通常情况下,只要inode节点数相同,就是同一个文件。虽然有多个文件名字,但是在硬盘上只有一个文件副本。从严格意义上来说,并不存在节点数相同的多个文件,他们只是一个文件,只是由不同的名字而已。就像一个人,其可能有多个绰号,但是这个人只有独一无二的一个。即使通过克隆等技术再生成一个人,那么他们是两个不相同的人,而不是一个人。了解这个内容对于认识硬连接与快捷方式的差异具有很大的作用。
二、硬连接与快捷方式的差异。
Unix系统中地硬连接与快捷方式有比较大的差异。简单的来说,Unix操作系统中的硬连接其实就是一个文件不同的别名而已。而微软操作系统中的快捷方式则是两个不同的问题。如下图所示:
文件doc1与文件doc2他们由于节点数是相同的,所以说他们是同一个文件。文件doc2是文件doc1的一个硬连接。即这个文件具有两个绰号,对其中的一个绰号(即链接)的修改会影响到另外一个绰号。通过ls等命令可以查询到这两个绰号代表的文件可能会存储在两个不同的目录中,但是通过查询他们的节点数却可以发现他们属于同一个文件。
但是快捷方式则不同。如上图的右边所示,文件doc2是文件doc1的一个快捷方式。其实此时他们是两个文件。文件doc1保存着文件本身的内容,而文件doc2则保存着指向文件doc1的一个路径。也就是说,这两个名字所对应的文件是不同的。或者说,这两个文件名字代表着不同的文件。当用户打开doc2文件时,系统首先打开的就是doc2这个文件。然后再从这个文件中读取文件doc1的路径,再把文件doc1打开。由于这个过程对于用户来说是透明的,故用户看起来他们好像代表着同一个文件。其实是不同的。只需要把文件doc1换一个位置,那么当打开doc2文件时系统就会提示找不到文件doc1的错误信息。从这里就可以判断出,文件doc2只保存了文件doc1的一个连接方式,而不是文件doc1本身的内容。
以上这个就是硬连接与快捷方式的主要差异。这个差异也决定了硬连接在某些场合有其独到的用处。
三、硬连接的主要用途。
硬连接的主要特性就在于即使文件名字不同,但是他们仍然是同一个文件名。这个特性让硬连接能够在很多场合发挥其独到的作用。下面笔者就根据自身的工作经验,谈谈硬连接在那些方面能够帮助系统工程师解决实际问题。
1、用来防止文件被意外删除。如上面两个存在硬连接的文件,其中doc1保存在home/user目录下;而文件doc2则保存在/user/sales文件夹下。其实这两个文件名指向硬盘中某个扇区的某一部分内容。如果不存在硬连解的情况下,用户把这个文件删除的话,其实文件的内容还是存在硬盘中的。只是文件存储在硬盘中的哪个扇区等信息被删除了。只有当用户对硬盘进行低级格式化或者后来的文件覆盖了被删除文件所用的扇区,这个文件的内容才会从硬盘中被删除。此时如果用户意外的删除了目录/home/user下的doc1文件,其实用户没有真正从硬盘的扇区中删除这个文件。故通过目录/user/sales下的doc2文件仍然可以找到硬盘扇区中的文件,并打开它。所以说硬连接在一定程度上能够为用户提供一种防止文件被意外删除的安全机制。不过这个安全机制也有其不安全的地方。如用户真的想删除这个文件,可是在其他目录中可能还存在着这个文件的连接,那么就会泄露用户的信息。故在这种情况下,用户只能够删除所有的文件连接或者对硬盘进行低级格式化来实现彻底删除文件的目的。
2、对文件进行重定向。如现在笔者在一个Unix系统的服务器上部署了一个应用程序。这个应用程序在启动的时候需要一些参数,如需要设置环境变量等等。笔者为了后续管理的方便,就把这些参数都保存在一个文件中(如文件名字为doc1,目录为/home/user中)。现在因为某些原因,笔者把这个文件移动到了/user/sales目录下,并把文件名字改为了doc2。此时当这个应用程序启动的时候就会出现错误提示,如找不到环境变量等等。因为系统从启动的时候,会从原先那个目录中读取doc1这个文件,而现在这个文件在原先的位置不存在了,故应用系统就无法正常启动。此时为了让应用系统能够正常启动,该怎么处理呢?难道又要把文件复制回去吗?其实不用这么麻烦。只需要在原先的目录中,设置一个doc2文件的硬连接,并把文件名字取为doc1即可。
3、在程序开发时,可以作为不同业务逻辑地共有参数文件。如在这个文件中存储着一些参数。如现在有一个应用程序中有两个功能都需要用到这个参数文件,而需要根据不同的情况来采用不同的功能。此时这个文件的绰号可以作为这个逻辑判断的工具。如当采用doc1文件时调用什么功能;而当采用doc2文件时采用什么功能。虽然此时他们采用的是同一个文件,却可以实现不同的功能。这个在文件打印的时候特别有用。如可以预先给文件doc1、文件doc2各自根据需求的不同设置两个不同的打印格式,如分别为销售部门打印与采购部门打印。他们虽然内容相同,但是打印格式不同。如销售部门需要彩色打印,而采购部门则需要黑白打印。此时每个部门只需要打开自己部门的文件即可,在打印的时候不需要进行任何格式的调整。所以说,当一个文件有多个连接文件式,就可以让应用程序根据被调用的文件名字不同,而按不同的逻辑功能运行程序。这在设计Unix系统的脚本程序时非常的有用。
4、可以在Unix系统原有命令文件的基础上,加强一些功能。如系统工程师有时候可能认为系统who命令的功能太过于复杂了,其一般只需要显示用户名字以及其通过什么方式登陆系统即可。此时虽然也可以通过后面带参数的方式来实现。不过有些系统工程师可能比较懒,他想更改who命令的实现方式,让其能够一劳永逸的实现这个方式。此时就可以为原先的who命令文件设置一个硬连接,并设置不同的名字。然后根据第三点提到的功能,可以通过程序调用不同的文件名而实现不同的业务逻辑。即可以通过硬连接来实现扩展系统原有命令的目的。
四、硬连接的实现。
既然硬连接有这么大的作用,那么其实现是不是很困难呢?恰恰相反。在Unix系统中要实现硬连接非常的简单。因为Unix系统已经为此专门设计了一个命令,通过这个命令用户可以轻松的为文件建立一个硬连接。如in命令就可以为用户创建一个文件的硬连接,他需要用两个文件名作为参数,第一个文件名为需要创建硬连接的文件名字;第二个文件名为需要创建软连接的文件名字。如in doc1 doc2即可。
可见,在文件的硬连接管理时,其难点并不是硬连接的具体实现。而是系统工程师要理解硬连接的具体用途。另外对于硬连接的缺陷也需要清楚。硬连接并不是万能的,其跟普通的快捷方式相比,仍然存在着一些缺陷。如快捷方式即可以为一个文件创建快捷方式,也可以为一个目录创建快捷方式;但是硬连接技术的话了能够文文件创建硬连接,而不能够连接到一个目录。其次,快捷方式即使在不同的文件系统中也可以实现。如Windows操作系统C盘为FAT32文件系统;而D盘则为NTFS文件系统。如果在D盘中有一个文件doc1,则用户仍然可以为其在C盘桌面上创建一个快捷方式。其快捷方式可以支持不同的文件系统。但是如果采用硬连接的话,则不行。在Unix系统中只能够在同一个文件系统下为文件创建硬连接。