链接(links)是文件系统最常用的一类特殊文件,一般分为两类:
- 硬链接(hardlink): 硬链接和普通文件(或目录)实际并没有差别,只是它和另外的文件共用一个文件数据体,反过来说就是,同一个文件体可以有多个名字,而且这些名字可以在卷内的任意目录中。类似于同一座房子,却有着不同的门牌号。 硬链接必须在同一卷上,就像门牌号必须附着于房子实体上一样。 Linux文件系统Ext3允许针对目录和文件的硬链接的创建,但Windows文件系统NTFS只允许硬链接的创建于文件之上。造成此差别的原因在于文件系统的实现上的不同,Linux Ext3文件系统对dentry(文件名)和inode(文件数据)的管理是分开的,但对NTFS却不是,Fcb是dentry和inode的合体,二者分不开,这部分以后再详述。
- 软链接(softlink),同时又有符号链接(symbolic link, symlink)之称。符号链接不同于硬链接,它是一类特殊文件,就像是“邮政信箱”,它只是个指向一个门牌号的别名而已,门牌号可以代表一座房子的实体,但“邮政信箱”并不能。 软链接是可以跨卷的,即软链接自身位置和其目标位置,差个108000里也没关系。 Windows NTFS对符号链接的支持是从Vista才开始的,就是说XP系统并不支持。
对于Windows系统,还有另外两种比较特殊的“链接”:
- Junction: Junction其实是一种符号链接,只是在Win2k或XP系统上符号链接并没有实现的情况下的一个临时替代品。Junction只支持目录链接,不支持文件。Junction是可以跨卷的,因为它本质上符号链接。
- Reparse Point:Reparse Point最早的作为Mount Point(卷加载点)来引入的,但其功能却相当强大,比如上面提到的Symlink/Junction的实现其实都是基本Reparse Point的,再者NTFS的高级特性如Hierarchical Storage,也是通过Reparse Point来实现的。 对Linux Ext3来说,任意子目录都可以是Mount Point。对Windows文件系统NTFS来说,虽然任意子目录也可以作Mount Point,但一旦成为Mount Point,其子目录便转换为了Reparse Point属性,也正是这个实现上的差别导致了Windows系统在链接的操作上出现了不少怪现象。
后面会进一步针对Linux Ext3及Windows NTFS内部对链接的实现进行介绍和分析。
Windows的快捷方式(Shortcut)并不在此文的讨论之列,因为它是Shell层(即Windows Explorer)的行为,并非文件系统本身的特性。