換了新本本之后,不安于Windows Server 2003 R2了,之前也嘗試過Windows Vista / Windows 7 / Windows Server 2008,但最后都由于各種不爽的原因而放棄,主要還是電腦配置太差,這次終于有機(jī)會(huì)升級(jí)系統(tǒng)了,于是裝了Windows Server 2008 R2,用了兩個(gè)月感覺還不錯(cuò),各方面表現(xiàn)還算湊和,基本上還算爽。
發(fā)現(xiàn)2008R2的用戶目錄結(jié)構(gòu)有了點(diǎn)變化(Win7好像也相同),不再是以前那種 SYS:\Documents and Settings\xxx 了,改成了 SYS:\Users\xxx,即使是使用dir /a查看,有個(gè)隱藏的Documents and Settings也是指向[SYS:\Users]的JUNCTION。而且SYS:\User\xxx\之下的目錄結(jié)構(gòu)也有了大變化,之前Windows版本中的很多目錄都被移到了SYS:\User\xxx\AppData之下,SYS:\User\xxx\之下的目錄大都是一些用戶文件存放的目錄,以前都在“我的文檔”中,現(xiàn)在都被放到了用戶目錄中,一大堆“我的xx”目錄。
這樣問題就來了,以前我都是直接把“我的文檔”通過“移動(dòng)”操作挪到D:盤,現(xiàn)在要挪一大堆目錄,而且有的還不能挪動(dòng)。Google之,找到很多相關(guān)文章,修改注冊(cè)表的方法本人不太喜歡,相比之下覺得這個(gè)老外的“How to Move your Windows User Profile to another Drive” 寫的很不錯(cuò),很好很強(qiáng)大!原來NTFS早就支持JUNCTION了,只是我一直不知道,寒自己一個(gè)!也可能是本人使用Linux的緣故吧,對(duì)使用符號(hào)鏈接尤為鐘情。很輕松的就把我的用戶目錄挪到了D:盤,mklink還真是很強(qiáng)大。這幾天又把我的OpenSSHServer的git庫目錄挪到了我的Workspace目錄,OpenSSHServer里只放了一個(gè)JUNCTION,然后又把經(jīng)常和移動(dòng)硬盤同步的幾個(gè)目錄都mklink到一個(gè)目錄里,這樣以后就只要同步一個(gè)目錄就OK了,實(shí)在是太方便了!
今天心血來潮突然想試試mklink在XP下的表現(xiàn),反正是NTFS都是支持JUNCTION的。在2008R2的整個(gè)系統(tǒng)盤中搜索mklink.exe居然沒搜到,Google一下才知道,原來mklink是一個(gè)DOS的內(nèi)部命令!暈了,再Google“mklink XP”,搜到兩個(gè)工具junction.exe和linkd.exe,都可以實(shí)現(xiàn)目錄的JUNCTION,果然很好用!可惜自己卻一直都不知道,在這一點(diǎn)上看來是本人對(duì)Windows有偏見了,總覺得它太差。
關(guān)于目錄聯(lián)接<JUNCTION>和目錄符號(hào)鏈接<SYMLINKD>之本人體會(huì):
mklink /j 創(chuàng)建目錄聯(lián)接<JUNCTION>,類似于硬鏈接,但又不是硬鏈接,它使用絕對(duì)路徑,創(chuàng)建的鏈接可移動(dòng)到任意位置使用;
mklink /d 創(chuàng)建目錄符號(hào)鏈接<SYMLINKD>,它可以使用相對(duì)路徑,使用相對(duì)路徑創(chuàng)建的鏈接,移動(dòng)位置后不能工作。
另,mklink /j 只用于創(chuàng)建目錄聯(lián)接<JUNCTION>,而符號(hào)鏈接可以創(chuàng)建文件的或目錄的均可。
最后,轉(zhuǎn)載一些關(guān)于mklink的文字,由于已經(jīng)搞不清最終的原作者了,在此原作者表示無上的敬意!
---------------------------------------------- 無敵分割線 ---------------------------------------------------------
一、何為 mklink
mklink 是何方神圣,值得專門作文講述?
如果用過 Linux ,那想必也看到過符號(hào)鏈接(這是一種特殊的文件),也用過 “ ln ” 這個(gè)鏈接命令,mklink 和 ln 的功能幾乎一樣。
mklink 便是用來創(chuàng)建符號(hào)鏈接的,這個(gè)命令并不知名,使用的人也不多。
自從 Vista 以后,微軟便在 widows中 偷偷地用起了這個(gè)工具 。在用戶目錄下,可以看到很多很像快捷方式的文件,當(dāng)然這是隱藏的,但卻不能打開,其實(shí)這便是符號(hào)鏈接。
>dir C:\Users\wclu /a
驅(qū)動(dòng)器 C 中的卷是 win7
卷的序列號(hào)是 8CD0-A743
C:\Users\wclu 的目錄
2009/06/11 11:42 <DIR> .
2009/06/11 11:42 <DIR> ..
2009/06/11 00:04 <DIR> AppData
2009/06/11 00:04 <JUNCTION> Application Data [C:\Users\wclu\AppData\Roaming]
2009/06/11 00:04 <DIR> Contacts
2009/06/11 00:04 <JUNCTION> Cookies [C:\Users\wclu\AppData\Roaming\Microsoft\Windows\Cookies]
2009/06/11 10:05 <DIR> Desktop
2009/06/11 00:04 <DIR> Documents
2009/06/11 02:44 <DIR> Downloads
2009/06/11 00:04 <DIR> Favorites
2009/06/11 00:04 <DIR> Links
2009/06/11 00:04 <JUNCTION> Local Settings [C:\Users\wclu\AppData\Local]
2009/06/11 00:04 <DIR> Music
2009/06/11 00:04 <JUNCTION> My Documents [C:\Users\wclu\Documents]
上述標(biāo)紅色的文件,便是符號(hào)鏈接了(上述文件并非C:\Users\wclu目錄下全部文件) 。
Vista/Windows 7使用這些符號(hào)鏈接,是為了兼容XP等系統(tǒng)。
二、mklink 用法
mklink 只能在命令提示符 “CMD” 中使用。
>mklink /?
創(chuàng)建符號(hào)鏈接。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 創(chuàng)建目錄符號(hào)鏈接。黙認(rèn)為文件
符號(hào)鏈接。
/H 創(chuàng)建硬鏈接,而不是符號(hào)鏈接。
/J 創(chuàng)建目錄聯(lián)接。
Link 指定新的符號(hào)鏈接名稱。
Target 指定新鏈接引用的路徑
(相對(duì)或絕對(duì))。
注:上述的符號(hào)鏈接等同于Linux中的軟鏈接。
為了試驗(yàn) mklink 的功能,我在 C分區(qū)中創(chuàng)建目錄 a ,并在目錄中存放文件 1.txt。
創(chuàng)建文件鏈接
E:\>mklink c:\1 c:\a\1.txt拒絕訪問。
E:\>mklink c:\2.txt c:\a\1.txt
為 c:\2.txt <<===>> c:\a\1.txt 創(chuàng)建的符號(hào)鏈接
可見為文件創(chuàng)建鏈接時(shí),符號(hào)鏈接文件的擴(kuò)展名要和原文件保持一致。
E:\>mklink c:\a\1.txt d:\3.txt
當(dāng)文件已存在時(shí),無法創(chuàng)建該文件。
E:\>mklink d:\3.txt c:\a\1.txt
為 d:\3.txt <<===>> c:\a\1.txt 創(chuàng)建的符號(hào)鏈接
可見為文件創(chuàng)建鏈接時(shí),必須是 “mklink 符號(hào)鏈接文件名 原文件名”的格式。
創(chuàng)建目錄鏈接
E:\>mklink /d c:\b d:\a
為 c:\b <<===>> d:\a 創(chuàng)建的符號(hào)鏈接
雖然d:\a 目錄不存在,但依然可以創(chuàng)建鏈接,很好很強(qiáng)大。但打開鏈接時(shí),提示錯(cuò)誤。
E:\>mklink /d d:\a c:\a
為 d:\a <<===>> c:\a 創(chuàng)建的符號(hào)鏈接
E:\>dir d: /a
驅(qū)動(dòng)器 D 中的卷是 soft
卷的序列號(hào)是 BE86-8884
D:\ 的目錄
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:08 <SYMLINK> 3.txt [c:\a\1.txt]
2009/06/11 13:18 <SYMLINKD> a [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 個(gè)文件 0 字節(jié)
4 個(gè)目錄 31,089,442,816 可用字節(jié)
當(dāng)把D分區(qū)中的鏈接文件刪除時(shí),C分區(qū)中的文件和文件夾不受任何影響。
三、mklink /d 與 makelink /j 的異同
從 mklink 的幫助中可以看到,兩者皆可以創(chuàng)建目錄鏈接。
細(xì)心的同學(xué)可以發(fā)現(xiàn),前者是創(chuàng)建目錄鏈接,而后者是創(chuàng)建目錄聯(lián)接。
一字之差,有何分別?
下面分別用這兩種方式為同一目錄創(chuàng)建鏈接:
E:\>mklink /j d:\a c:\a
為 d:\a <<===>> c:\a 創(chuàng)建的聯(lián)接
E:\>mklink /d d:\b c:\a
為 d:\b <<===>> c:\a 創(chuàng)建的符號(hào)鏈接
下面顯示D分區(qū)中的文件及目錄列表:
E:\>dir d: /a
驅(qū)動(dòng)器 D 中的卷是 soft
卷的序列號(hào)是 BE86-8884
D:\ 的目錄
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <JUNCTION> a [c:\a]
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 12:54 <DIR> Program Files
2009/06/11 09:58 <DIR> System Volume Information
1 個(gè)文件 0 字節(jié)
5 個(gè)目錄 31,089,442,816 可用字節(jié)
mklink 不加參數(shù)或加參數(shù) /d 時(shí),創(chuàng)建的鏈接文件為<SYMLINK>型(<SYMLINKD>代表鏈接到目錄)。
當(dāng)加參數(shù) /j 時(shí),只能為目錄創(chuàng)建聯(lián)接,并且創(chuàng)建的聯(lián)接文件為<JUNCTION>型,兩種類型的鏈接文件有顯著區(qū)別:
從最開始的 “ >dir C:\Users\wclu /a ” 可以看出,微軟自家使用的都是<JUNCTION>型,至于為何,留待考證。
四、鏈接文件的特性
剛剛講述了如何用 mklink 創(chuàng)建鏈接文件,那么接下來重點(diǎn)講述如何鏈接文件的特性,既然是特性,那就是與眾不同了。
符號(hào)鏈接文件自身不能被 “復(fù)制”(只能通過特殊方法才能復(fù)制)
當(dāng)復(fù)制符號(hào)鏈接文件時(shí),會(huì)將符號(hào)鏈接所鏈接的目標(biāo)文件或目錄進(jìn)行復(fù)制,并非是復(fù)制符號(hào)鏈接文件本身。
如何實(shí)現(xiàn)符號(hào)鏈接文件的復(fù)制呢?
>copy /?
/L 如果源是符號(hào)鏈接,請(qǐng)將鏈接復(fù)制
到目標(biāo)而不是源鏈接指向的實(shí)際文件。
>xcopy /? /B 對(duì)照鏈接目標(biāo)復(fù)制符號(hào)鏈接本身
/* d:\1.txt 為<SYMLINK>型符號(hào)鏈接 */
E:\>xcopy d:\1.txt e:\1.txt /b
目標(biāo) E:\1.txt 是文件名
還是目錄名
(F = 文件,D = 目錄)? F
D:\1.txt
復(fù)制了 1 個(gè)文件
/* d:\a 為<JUNCTION>型符號(hào)鏈接 */
E:\>xcopy d:\a e:\a /B
目標(biāo) E:\a 是文件名
還是目錄名
(F = 文件,D = 目錄)? D
復(fù)制了 0 個(gè)文件
/* d:\b 為<SYMLINKD>型符號(hào)鏈接 */
E:\>xcopy d:\b e:\b /B
目標(biāo) E:\b 是文件名
還是目錄名
(F = 文件,D = 目錄)? D
復(fù)制了 0 個(gè)文件
E:\>dir e: /a
驅(qū)動(dòng)器 E 中的卷是 data
卷的序列號(hào)是 FEEE-FB51
E:\ 的目錄
2009/06/11 10:00 <DIR> $RECYCLE.BIN
2009/06/11 13:33 <SYMLINK> 1.txt [c:\a\1.txt]
2009/06/11 13:34 <DIR> a
2009/06/11 13:35 <SYMLINKD> b [c:\a]
2009/06/11 09:58 <DIR> System Volume Information
1 個(gè)文件 0 字節(jié)
4 個(gè)目錄 31,362,203,648 可用字節(jié)
可見采用xcopy命令并上參數(shù) /B ,可以成功復(fù)制 <SYMLINK> 型的符號(hào)鏈接文件,而<JUNCTION>型鏈接卻不能被復(fù)制。
符號(hào)鏈接文件的透明性
符號(hào)鏈接的操作是透明的:對(duì)符號(hào)鏈接文件進(jìn)行讀寫的程序會(huì)表現(xiàn)得直接對(duì)目標(biāo)文件進(jìn)行操作。
普通的文件操作命令(如cp、rm等)都能直接作用于符號(hào)鏈接。用于讀寫文件內(nèi)容的命令將會(huì)直接訪問目標(biāo)文件。
在 Linux 使用的 ext2 等文件系統(tǒng)里,都有 hard link 與 symbolic link 的功能,這個(gè)功能簡單的說就是讓我們可以用多個(gè)路徑去訪問同一個(gè)文件或者目錄。比如說讓 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一個(gè)文件。但 hard link 和 symbolic link 還是有區(qū)別的(廢話)。
Hard link 表示,它和原文件名指向的是存儲(chǔ)設(shè)備上同一個(gè)文件內(nèi)容。就好像這個(gè)文件內(nèi)容有多個(gè)文件名一樣,每個(gè)文件名有相等地位。刪除其中任何一個(gè)之后,事實(shí)上文件內(nèi)容并不會(huì)被刪除掉,仍然可以用其他的名稱來訪問這個(gè)文件。只有當(dāng)最后一個(gè)指向這個(gè)文件內(nèi)容的文件名被刪除掉之后,文件內(nèi)容才被刪除。也就是說,一個(gè)文件的 hard link 跟此文件本來的名稱并沒有任何本質(zhì)上的區(qū)別。需要注意的是,因?yàn)槊總€(gè)分區(qū)(partition)上都可能有相同的存儲(chǔ)位置地址,所以 hard link 必須跟被 link 的文件在同一個(gè)分區(qū)上。另外,目錄不支持 hard link。Symbolic link 也稱 soft link,它類似于 Windows 里的快捷方式 .lnk 文件。它本身是一個(gè)單獨(dú)的文件,而這個(gè)文件的內(nèi)容是它所指向的文件的路徑。一般的程序存取 symbolic link 時(shí)存取的并不是它本身的內(nèi)容,而是它所指向的文件的內(nèi)容。當(dāng)某個(gè)文件被刪除掉后,它的 symbolic link 就無法存取到這個(gè)文件了,因?yàn)槲募旧硪呀?jīng)被刪除了。也就是說,一個(gè)文件的 symbolic link 跟此文件的文件名或者內(nèi)容都是完全不同的兩個(gè)東西。Symbolic link 可以鏈接任何本地可以訪問到的文件或者目錄路徑。
以上這些是我對(duì) hard link 和 symbolic link 的理解,我試圖用跟文件系統(tǒng)無關(guān)和盡量通俗易懂的語言來解釋這兩個(gè)概念。但如果你是一個(gè)軟件開發(fā)者或者系統(tǒng)管理員或者僅僅是想知道更詳細(xì)的東西,強(qiáng)烈建議你去看看這個(gè)帖子。
OK,概念解釋清楚了。那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事實(shí)上是支持 hard link 和 symbolic link 的,雖然 Windows 里沒有比較容易使用的相關(guān)工具,而且 Explorer 對(duì)待 symbolic link 也有很奇怪的行為。
在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 這個(gè)復(fù)雜的命令來創(chuàng)建一個(gè) hard link,用法倒是很簡單:
fsutil hardlink create <新文件名> <現(xiàn)有文件名>
也可以使用 GNU utilities for Win32 中的 ln 來創(chuàng)建 hard link。這是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以創(chuàng)建 hard link 也可以創(chuàng)建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。
當(dāng)然,如果你想在自己的程序里創(chuàng)建 hard link,那也是很容易的,只需要一個(gè)很簡單的 API 函數(shù):
BOOL CreateHardLink( LPCTSTR lpFileName, LPCTSTR lpExistingFileName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
前兩個(gè)參數(shù)的意思就不用解釋了,最后一個(gè)參數(shù)的用途暫時(shí)保留,必須為 NULL。
對(duì)于 symbolic link,NTFS 只支持對(duì)目錄的 symbolic link,微軟把它稱作 junction。但是對(duì)于文件的 symbolic link,微軟也有提供解決方案,那就是快捷方式(Shortcut,.lnk 文件)。不過 symbolic link 和快捷方式不是一個(gè)層次上的東西,前者是底層文件系統(tǒng)的功能,后者是應(yīng)用層的功能。
在“管理工具”中的“計(jì)算機(jī)管理”里的“磁盤管理”里我們可以將一個(gè)卷裝載到一個(gè) NTFS 卷上的某個(gè)空目錄里,這實(shí)際上就是為被裝載卷的根目錄建立一個(gè)以該空目錄名為名的 symbolic link。也可以用命令行工具 MOUNTVOL 來完成這項(xiàng)工作。
遺憾的是 Windows 并沒有提供對(duì) NTFS 的 symbolic link 完整支持的工具。“計(jì)算機(jī)管理”或者 MOUNTVOL 只能對(duì)某個(gè)卷的根目錄創(chuàng)建 symbolic link,而不是對(duì)任意目錄。幸運(yùn)的是我們可以使用 Sysinternals 提供的帶有源代碼的免費(fèi)命令行工具 junction.exe 來全功能的完成對(duì) NTFS symbolic link 的管理。當(dāng)然,微軟也還不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一個(gè)命令行工具 linkd.exe 來完成這件事。不過它的查看 symbolic link 信息的功能不如 junction,因?yàn)椴恢С滞ㄅ浞妥幽夸洅呙琛?/p>
需要注意的是,Explorer 對(duì)待 symbolic link 有一個(gè)很奇怪的行為。那就是,在 Explorer 里一個(gè) symbolic link 跟被它 link 的目錄沒有區(qū)別,刪除這個(gè) symbolic link 將會(huì)刪除被 link 的目錄下的所有文件!而著名的強(qiáng)大的方便的擴(kuò)展性強(qiáng)的(原諒我在這里用了這么多修飾詞,我確實(shí)太喜歡 TC 了。)文件管理工具 Total Commander 則沒有這個(gè)問題。
文中的某些基本概念和知識(shí)來源于以下兩個(gè)頁面:
http://answers.google.com/answers/threadview?id=341355
http://phorum.study-area.org/viewtopic.php?t=12235
Windows 2000 and higher supports directory symbolic links, where a directory serves as a symbolic link to another directory on the computer. For example, if the directory D:\SYMLINK specified C:\WINNT\SYSTEM32 as its target, then an application accessing D:\SYMLINK\DRIVERS would in reality be accessing C:\WINNT\SYSTEM32\DRIVERS. Directory symbolic links are known as NTFS junctions in Windows. Unfortunately, Windows comes with no tools for creating junctions—you have to purchase the Win2K Resource Kit, which comes with the linkd program for creating junctions. I therefore decided to write my own junction-creating tool:Junction. Junction not only allows you to create NTFS junctions, it allows you to see if files or directories are actually reparse points. Reparse points are the mechanism on which NTFS junctions are based, and they are used by Windows' Remote Storage Service (RSS), as well as volume mount points.
Please read this Microsoft KB article for tips on using junctions.
Notethat Windows does not support junctions to directories on remote shares.
If you want to view reparse information, the usage forJunction is the following:
Use junction to list junctions:
Usage: [-s]
-s Recurse subdirectories
Examples:
To determine if a file is a junction, specify the file name:
junction c:\test
To list junctions beneath a directory, include the –s switch:
junction -s c:\
To create a junction c:\Program-Files for "c:\Program Files":
C:\>md Program-Files
C:\>junction c:\Program-Files "c:\Program Files"
To delete a junction, use the –d switch:
junction -d c:\Program-Files
聯(lián)系客服