分类: LINUX
2010-01-04 13:54:51
darasion的发帖
问题: 当前目录下有2个目录,分别是a,b,使用 ln -s ./a ./b/a 命令为什么不行?
使用上述的命令并没有错误信息输出的,只不过链接不能用,ls出来是红色的,其实就是没有找到目标。。。
解释: ln -s ./a ./b/a
效果就是b目录下有一个连接a,连接到./a也就是“当前目录下的a目录”这个“当前目录”可并不是你输命令时候的当前目录,而是连接所在的“当前目录”,就是说,你创建的连接文件在./b目录,那么这个./就代表./b目录,b目录里建a连接连接到a,当然有问题。所以,其正确的命令应该是 ln -s ../a ./b/a
补充一些关于文件系统的原理知识(darasion的理解)
目录或文件是由一个inode及其指向的一堆block组成,其中这个inode记录着这个目录或文件的存取模式(read/write /excute)、所属用户和组、占用空间大小、创建或状态改变时间(ctime)、读取时间(atime)、修改时间(mtime)、特殊属性 (SetUID/SetGID/Sticky Bit等)和指向block的指针组成。
目录的inode指向的这一堆block记录了该目录的下的文件或目录的名字和这些名字对应的inode。而该目录的名字则是由它的上层目录的block记录。
文件的inode指向的这一堆block记录了文件的实际数据。
符号链接(symbolic link)实际上是一个记录目录路径的文件,如同windows里的快捷方式,也就是说如果我在当前目录下建立了一个符号链接,那么当前目录的block 区域记录着这个符号链接的名字和inode号码。这个inode指向一块记录着链接目标路径的一堆block。
如果我在做符号链接的时候,目标用相对路径,那么这个符号链接文件的这一堆block中记录的就是这个目标的相对于当前目录的路径。当使用这个符号链接时,系统却是由链接文件所在的目录开始找起。如果建立链接时的当前目录和链接文件所在目录不一致,那么就会找不到目标文件。因此,在作符号链接的时候,目标尽量使用绝对路径。
硬链接(hard link)不是文件,而是同一个文件的另一个文件名,硬链接和同一个文件的文件名之间没有任何区别。
具体来说,就是目录的block记录着很多文件名,而硬链接就是不同的两个文件名指向了同一个的文件的inode。不同的地方保存不同的文件名,而实际文件只有一份,不同的名字之间是同等的。
不同的文件系统之间inode号码是可以重复的,因此,硬链接不能建立在不同的文件系统之间,不同的分区之间不能建立硬链接。
目录也有硬链接,典型的就是代表当前目录的一点 . 和代表上层目录的两点 .. ,当建立一个目录的时候,新建目录的硬链接数至少是2,因为除了目录本身的名字外,在这个目录的里边还建立了一个点.的硬链接。建立了一个目录,则包含该目录的上层目录的硬链接数+1,新建目录中建立了他上层目录的硬链接两点 .. 。
但是用ln命令不允许建立目录的硬链接,这是因为,硬链接和文件名是同等的,并不是像符号链接那样是文件。在文件系统的处理上跟普通的目录一模一样,如果可以随便建立目录的硬链接,那么就会破坏目录的树型结构,变成了网状结构了,这样会大大增加文件系统处理的复杂程度。尤其是处理递归删除或查找的时候,如果目录a中有一个链接着b的硬链接,目录b中又有一个链接着a的硬链接,递归就不能达到边界条件了。
符号链接则不同,因为符号链接和真正的文件名是有区别的,因此,符号链接作为文件来处理,不存在这种问题。也就是当我们删除符号链接的时候,默认不会追踪到链接目标;如果加上追踪选项(如find -L ),也可以通过符号链接是一个文件这个性质来判断是否进入死循环。