Saturday, February 3, 2024

mklink的用法

 

在xp系统下,junction命令要用微软开发的小程序 junction.exe实现,从http://live.sysinternals.com/可以下载。

现在Windows Vista之后的系统自带了mklink的功能。

Windows操作系统启动时不支持符号链接。所以不应该对下列文档夹重定向:

    目录包含了hiberfil.sys (如果被配置在根目录以外)
    \Windows
    \Windows\system32
    \Windows\system32\Config

Windows Installer不完整支持符号链接。对\Windows\Installer重定向会导致多数基于.msi的Windows installers失败报告error 2755 或 error 1632.

可以重定向下列目录:

    \Documents and Settings
    \ProgramData
    \Program Files
    \Program Files (x86)
    \Users

但是对\Users与\ProgramData重定向不被推荐,因为会打破Windows Update与Windows Store Apps.

Windows Vista中预先创建了一些符号链接(Junction point),以增进与旧版操作系统(Windows XP)间的兼容性,部分示例如下:

    C:\Document and Settings → C:\Users(连接点)
    C:\Users\All Users → C:\ProgramData(目录符号链接)

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      创建目录符号链接。默认为文档符号链接。
/H      创建硬链接,而不是符号链接。
        /J      创建目录联接。
        Link    指定新的符号链接名称。
        Target  指定新链接引用的路径(相对或绝对)。

默认情况:

    文档的符号链接(SYMLINKD),如没有参数指定,则创建文档的符号链接,删除文档链接不影响目标文档,且创建链接时允许目标文档不存在;
    目录的符号链接(SYMLINKD) /D该参数可以创建目录的符号链接,删除目录链接不会影响目标目录,且创建链接时允许目标目录不存在;
    目录的软链接(JUNCTION) /J 该参数可以创建目录的软链接(联接),作用基本和符号链接类似,NT6系统的用户目录就是以这种形式存在的;
    文档的硬链接 /H 该参数可以创建文档的硬链接,即一个文档的多个别名,NT6系统WinSXS目录下的大部分文档是以这个形式存在的;

NTFS符号链接(Symbolic Link),又称符号链接,是NTFS文档系统中指向文档系统中的另一个对象的一类对象。

被指向的对象叫做“目标”。它们可以像普通文档一样操作,但所有对符号链接的操作都实际作用于目标对象。

符号链接对用户而言是透明的,符号链接看上去和普通的文档和文档夹没有区别,操作方法也一模一样。

NTFS符号链接的设计目的是为了和POSIX标准的操作系统兼容、并用来增进与旧版操作系统的兼容性,它首次出现于Windows Vista。

 

Windows 2000开始就有的NTFS连接点,只能用于目录,且只能用于本地文档系统。

而符号链接既可以指向本地文档,也可以指向远程SMB网络路径。

NTFS连接点只支持本地驱动器的绝对路径,但NTFS符号链接允许使用相对路径。

还有,NTFS符号链接允许跨文档系统使用,但是对于跨主机的符号链接,还需要远程机器也支持这一功能才行。

硬链接只能用于文档,不能用于目录。

硬链接相当于一个实体文档有多个彼此平等的名字。

删除一个文档名字后,还可以用其它名字访问该文档。

硬链接只能用于同一个磁盘分区内的文档。

硬链接不能用于空文档,而符号链接可以用于空文档或空目录。

 

符号链接(Symlink,Softlink)是对文档或目录的引用,实际上符号链接本身是一个

“记录着所引用文档或目录的绝对或相对路径”的特殊文档,通过符号链接的操作都会被重定向到目标文档或目录。

交接点(Junction),也称为“再分析点”,是 NTFS 3.0 及以上文档系统(Windows 2000 及以上系统)的特性,

它是链接本地目录(可跨卷)的访问点,通过交接点的操作都会被系统映射到实际的目录上。

通过创建交接点,可以在保证一个目录实例(目录的一致性)的前提下,允许用户或程序从本地文档系统中的多个位置访问此目录。

对符号链接和快捷方式的“读、写、遍历”等操作都会被重定向到目标文档或目录;
但对它们的“复制、删除、移动、配置 ACL”等操作只针对自身;
符号链接不但可以应用于本地系统,还可以应用 UNC 路径。

对交接点内文档和子目录的“创建、删除、修改”等操作都被映射到对应的目录中的文档和子目录上;
对交接点的“复制、粘贴、剪切、配置 ACL”,只会影响此交接点;
在同一卷内移动交接点,只会影响此交接点;但在不同卷间移动交接点,会将此交接点转换为正常目录,并且交接点对应目录下的所有内容都会被移动;
通过“资源浏览器(Explorer.exe)”和“命令行 del”等工具删除交接点时,会同时删除对应目录下的所有内容(但不会删除目录);
可通过“linkd.exe /d”安全的删除交接点;但在 vista 及以后的系统中,对交接点的删除会被正确的处理。

符号链接 symlink 与 交接点 junction 在重定向对目录下的子目录和文档的操作上基本没有什么区别。
它们两最大的区别在于 符号链接 symlink 可以用于引用文档,而 交接点 junction 只能引用目录。

创建符号链接和软链接时允许目标文档或目录不存在,此时若访问链接文档会得到一个“位置不可用”的提示,
若之后重新将目标文档或目录补上(路径、名称一致即可),则该链接仍然有效;

目录符号链接和软链接的区别在于,软链接在创建时会自动引用目标目录的绝对路径,而符号链接允许相对路径的引用,

如分别用 mklink /D dira tdir 和 mklink /J dirb tdir 创建 dira、dirb 对 tdir 的符号链接和软链接,
之后将 dira、dirb 移动到其它目录下,则访问 dira 时会提示“位置不可用”,访问 dirb 时仍然正常指向 tdir;

而分别用 mklink /D dira c:\demo\tdir 和 mklink /J dirb c:\demo\tdir 创建 c:\demo\tdir 的符号链接和软链接,
再将这两个目录链接移动到其它目录下,则 dira 和 dirb 均可正常指向 c:\demo\tdir;

由此可见当创建目录链接时对目标目录使用绝对路径,D 和 J 两个参数实现的目录链接效果是一样的

只能创建文档的硬链接,使用/H 参数创建目录的硬链接时会提示拒绝访问;

硬链接是同一个文档的不同别名,例如对

a.txt 创建了b.txt 和c.txt 两个硬链接,此时 a.txt、b.txt 和 c.txt 均是同一个文档的别名,
若删除其中任意一个或两个,则剩下的那个文档(无论是事先存在还是之后创建)不受影响,仍然指向原先那个文档。

创建文档或目录链接仅限于 NTFS 文档系统,且链接只能针对同一个磁盘上的文档或目录;

硬链接只能创建对本分区文档的引用,即不可创建跨分区的文档硬链接;

通过硬链接创建的别名文档在统计大小时会按原文档的大小计算,而软链接和符号链接大小均为零;

硬链接在创建时会事先检测目标文档是否存在,即不允许空链接的存在。

 

通过mklink命令的帮助信息,可以看到mklink可以创建目录和文档链接。

比如D:\temp目录下有目录dir1,我想在当前目录下创建到dir1目录的软链接,可以使用如下命令来操作:

mklink /D dir2 dir1
mklink /J dir3 dir1

上面两个命令都可以实现到dir1的软链接,参数/D和/J是创建目录软链接必须的,目前来说着两个参数都可以实现目录软链接,
而且应用过程中也没有发现有什么区别的地方,唯一的区别就是dir2和dir3链接的类型不懂,可以通过dir命令查看得到结果如下:

2011/05/17  14:05    <DIR>          dir1
2011/05/24  13:07    <JUNCTION>     dir2 [D:\temp\dir1]
2011/05/24  13:07    <SYMLINKD>     dir3 [dir1]

 

我们可以发现dir1是DIR类型(这个是我们创建的实际目录),dir2是JUNCTION类型,而dir3是SYMLINKD类型,这个或许是区别,但应用中效果一样。

说完了目录软链接,文档当然也可以创建软链接了,而且还可以创建硬连接,比如d:\temp目录下有abc.txt文档,我要创建到这个文档的软链接的命令如下:

mklink abc1.txt abc.txt

 

这样我们就创建了一个到abc.txt文档的软链接abc1.txt,对于文档还可以创建硬链接,硬链接个人感觉用处不大,因为创建硬链接是磁盘上空间是增加了双倍,
对于硬链接而言,修改硬链接文档和原始文档的内容都会相互影响,即内容是一致的但空间占用确是双份的。使用如下命令创建硬链接:

mklink /H abc2.txt abc.txt

  文档的软链接和硬链接的类型查看如下(用dir命令):

2011/05/24  13:33                 7 abc.txt
2011/05/24  13:30    <SYMLINK>      abc1.txt [abc.txt]
2011/05/24  13:33                 7 abc2.txt

 

 发现硬链接和普通的文档没有什么区别,唯一的区别就是修改的内容会直接影响到原始文档。

 顺带补充一句,软链接的目录和文档都可以直接删除,不会影响到原始目录和文档的,这个也非常方便,

而且软链接的目录和文档图标上都有一个小箭头,很好区分。

使用/D创建的连接是类似于linux下的软连接,不占存储空间;

使用/J创建的连接类似于Linux下的硬连接,占用同源文档一样的存储空间;

Link和Target文档夹内容一模一样,如果你对其中任意一个文档夹里面的内容做修改,另一个也会相应的改变。

 

通过创建符号链接(symbolic)磁盘空间使用量没有改变哦,因为只是实现连接罢了,并不是将原文档复制以及同步。

使用连接目录时就像使用原目录一样,就像实实在在有这个目录一样,程序不会发现连接目录与普通目录有何不同,这是一般的文档夹快捷方式是不行的。

与快捷方式的相同与不同之处:

    快捷方式无论目标是文档还是目录,生成的都是新的有内容的 .lnk 文档,
    打开时是打开的源路径,直接编辑则是编辑 .lnk 文档的内容,源文档/目录不受影响。

    MKLINK 生成的文档和目录都是 0 字节,但访问时仍然是新文档/目录的路径,且编辑操作编辑的是源文档/目录;
    原理相当于网盘的同步,只不过不通过网络、不占用空间。

    删除两者生成的目标文档/目录都不会对源文档/目录产生影响。但删除源文档/目录后,新路径都不再可用。
https://www.pianshen.com/article/5071559095/

No comments: