windows平臺xFsRedir目錄重定向程序2019年更新

                                                                           by fanxiushu 2019-08-12 轉載或引用請註明原始作者。


使用過xFsRedir程序的人大概都知道這個程序是做什麼用的。
它把各種服務端的文件夾也就是目錄,映射到本地某個文件夾中,而且操作這個被重定向的文件夾就跟本地文件系統一樣。
它支持FTP,SMB,  NFS,SFTP等10來種通用的文件傳輸協議,從而能把各種異構的文件夾平臺集中到一起來訪問。
xFsRedir核心部分就是從文件夾到文件夾的映射。
而本次的更新是讓xFsRedir支持更多的功能,支持從鏡像文件到磁盤的映射。

xFsRedir核心部分文件夾映射文件夾的原理介紹可從CSDN上的文中查閱。爲了方便本文再次羅列出相關鏈接:
https://blog.csdn.net/fanxiushu/article/details/43636575     (文件過濾驅動實現目錄重定向(一))
https://blog.csdn.net/fanxiushu/article/details/43845699     (文件過濾驅動實現目錄重定向 (二))
https://blog.csdn.net/fanxiushu/article/details/44737171     (文件過濾驅動實現目錄重定向 (三))
https://blog.csdn.net/fanxiushu/article/details/52681705     (linux平臺用VFS驅動實現目錄重定向(文件驅動實現目錄重定向 四))

其中第四部分是在linux平臺開發VFS驅動來實現目錄重定向,其他三篇則是在windows平臺的實現原理。
windows平臺利用文件過濾驅動實現目錄重定向是非常複雜的,
這可以從 文件過濾驅動實現目錄重定向 (三) 這篇文章中定義的最早期數據結構聲明可以看出,
聲明的數據結構挺複雜,更別說內部的實現了。因此也花費了我不少時間來開發這樣的驅動。

xFsRedir開發當初,只關注文件夾的重定向,並沒認真去考慮虛擬磁盤,
只是後來想到有人可能並不想在原有的分區盤符中對某個目錄做重定向,而是希望開闢一個新盤符,再對新盤符的某個文件夾做重定向。
因此這個時候就得開發對應的虛擬磁盤驅動。爲了省事本打算使用系統自帶的接口比如 subst命令來創建一個盤符,
但是這樣創建的盤符不是真正的分區卷,無法掛載文件過濾驅動。因此只能在驅動內部實現虛擬磁盤驅動。

xFsRedir項目,是我在研究底層的StorPort和ScSIPort模型的磁盤驅動之後,萌生的一個想法。
雖然當時玩storport虛擬磁盤驅動玩的很順,並且還從頭開發了各個程序,
比如實模式下的BOOT引導PXE程序,storport引導盤驅動等等,實現了無盤啓動的功能。
記得當初成功無盤啓動了winxp系統,只是隨着雲桌面的新起,
無盤啓動又牽涉到很多底層技術,而且侷限很大,限制也多,我想現在主要除了網吧,其他地方應該比較少使用無盤吧。
因此也沒再花更多的時間去研究,尤其是PXE引導,現在除了實模式引導,還包括EFI引導。iPXE開源項目集成了大部分這種功能。

折騰storport模型的虛擬磁盤驅動,都是從一個物理鏡像文件映射到虛擬磁盤,也就是都是從單一的文件映射成分區盤符。
而平時接觸到更多的是各種目錄,各種文件夾,包括各種平臺的,linux的,嵌入式openwrt的,windows的,macOS的等等。
當時很想把各種文件夾映射成本地文件系統。於是xFsRedir項目孕育而生。

當時需要在xFsRedir驅動中實現虛擬磁盤驅動功能的時候,
並沒把storport虛擬磁盤驅動框架集成到xFsRedir驅動中,主要是基於以下原因考慮,
storport框架或者自己實現ScSIDisk驅動,都是基於PNP即插即用的,需要INF安裝文件來安裝。
而文件過濾驅動是NT驅動,安裝卸載相當方便,若兩者集成到一起,雖然沒什麼問題,但是會顯得喧賓奪主,主次不分。
因此選擇了儘量簡單的虛擬磁盤驅動模式,也就是 filedisk。
這種框架簡單到何種程度呢?
只需要在需要的時候,IoCreateDevice創建一個 FILE_DEVICE_DISK類型的設備,
在 IRP_MJ_DEVICE_CONTROL 派遣函數中處理跟磁盤相關的一些參數和屬性。
然後 IRP_MJ_READ,IRP_MJ_WRITE派遣函數中就是直接讀寫扇區數據了。
在應用層調用 DefineDosDevice函數來掛載這個設備,就能生成一個新分區卷,
然後可以把新分區卷格式化爲NTFS文件系統,並可以在上面掛載文件過濾驅動。
有興趣可以參閱很早前寫的博客 (其中只有第一章簡單介紹了filedisk驅動):
https://blog.csdn.net/fanxiushu/article/details/9903123    (磁盤驅動與虛擬磁盤Miniport驅動一)
https://blog.csdn.net/fanxiushu/article/details/11713357  ; (磁盤驅動與虛擬磁盤Miniport驅動二)

這樣的磁盤驅動也是有限制的:
1,首先,操作系統並沒把他當成真正的磁盤,不會出現在磁盤管理器中,它只能以單個分區卷方式掛載。
2,它不能作爲系統啓動盤來遠程啓動系統,也就是無法作爲無盤工作站的啓動盤。當然要實現一個無盤啓動,需牽涉到很多底層技術。
然而,只要我們不關心繫統啓動部分,只在系統正常運行中使用此類虛擬磁盤。這樣的情況下,依然能勝任絕大部分需求。

在最早的xFsRedir驅動中就已經集成了這樣的虛擬磁盤,但是當時無暇考慮過多,
只簡單實現了用稀釋文件方式創建了一個鏡像文件來生成一個新分區卷,然後在新分區卷掛載文件過濾驅動,實現目錄重定向的功能。
然後到了2018年,改進了虛擬磁盤的鏡像文件的存儲方式,並且創建了內存磁盤來給內存目錄提供基礎。
修改日誌可查閱:
https://blog.csdn.net/fanxiushu/article/details/80289261
2018年的修改依然只是把虛擬磁盤功能作爲一個隱身部分。

而這次的升級,則是把虛擬磁盤功能從幕後變身到前臺,擴大了實際使用的功能。
這其實得益於CSDN上一位網友的提醒:想要httpdisk功能,也就是通過HTTP協議傳輸iso鏡像文件來模擬光驅。
於是查閱了filedisk,httpdisk,imdisk,winvblock等等這些磁盤提供的大致功能,把他們的功能集中到xFsRedir來實現,
並且提供了多種訪問鏡像的方式,不單單是HTTP,還包括HTTPS,FTP,SMB,NFS,SFTP等等,還提供了整個物理磁盤分區的遠程映射。
就是xFsRedir的目錄重定向的文件傳輸協議也提供給了虛擬磁盤的鏡像文件傳輸。

要支持這麼多的傳輸協議,如果只是在驅動內部處理數據傳輸,對某些協議是非常艱難的,比如HTTPS,SFTP等。
因爲這樣的話,需要在驅動裏要實現SSL加密代碼。
做這種吃力不討好的事,還不如直接把驅動的數據讀寫請求轉發到應用層來,
然後在應用層有一大堆的現成的各種支持HTTPS,SFTP等傳輸協議的開源庫可以使用。
這也是xFsRedir的目錄重定向這個核心功能實現的基本準則,文件過濾驅動的對文件的各種請求,都是轉發到應用層來處理。
這樣的處理方式,纔會讓xFsRedir很輕鬆的支持各種網絡文件傳輸協議。
當然這樣會讓性能有些耗損,並且瘋狂傳輸文件的時候,可能會讓CPU佔有率有些高。

具體點,對於虛擬磁盤驅動來說,其實真正要處理的讀寫請求,就是IRP_MJ_READ,IRP_MJ_WRITE,且只是讀寫扇區數據。
比起非常複雜的文件過濾驅動要處理各種請求類型,處理虛擬磁盤驅動的讀寫請求簡直是太輕鬆了。
當然,爲了給這種輕鬆增加點複雜度,又把它分成兩種情況來處理。
如果是對本地鏡像文件或者對 \\Server\ 共享文件的讀寫,直接在驅動裏以打開文件方式來傳輸數據。
當然內存磁盤肯定也是在驅動內部處理數據的傳輸。
其他傳輸協議的磁盤,則是把IRP_MJ_READ/WRITE 讀寫請求轉發到應用層,然後應用層利用現成的開源庫,直接連接到服務器讀寫數據。
當然,PRIVATE私有協議除外,這個只有我自己的實現的代碼,同時本次更新中,PRIVATE協議的服務端增加了映射物理分區的功能。

如下圖,展現了最新版本的xFsRedir的虛擬磁盤效果圖:


圖中的A部分展示了目前支持的所有文件傳輸協議,其中 private://server/$:D ,這樣的URL意思是把服務端的整個物理D盤分區映射過來。
映射物理分區只支持私有協議。其他協議均指定一個鏡像文件,這個鏡像文件可以是磁盤分區鏡像文件,也可以是光驅ISO文件。
如果設置的是磁盤分區鏡像文件,在非只讀情況下,並且鏡像文件不存在,
程序會根據設置的虛擬磁盤大小新創建一個鏡像文件,並且自動格式化爲NTFS系統。
圖中C部分表示創建的虛擬磁盤類型,通常分爲兩類,一個是普通鏡像磁盤,也就是通過文件傳輸協議實時的與遠程鏡像文件交換數據。
另一個是內存磁盤,可以創建一個空白內存磁盤,也可以預先從本地鏡像文件加載到內存磁盤中。
圖中,除了 C,D,E是我電腦真實的物理磁盤分區,其他的H,K,L,M,O 五個全是xFsRedir創建的虛擬磁盤分區。
其中M分區是直接映射的另一臺機器的物理分區,足有4T大小的分區。H分區也是映射的另一臺機器的物理分區。
如果覺得映射整個物理分區還不過癮,還可以在M分區內的某些文件夾設置重定向,
比如圖中的B部分,把 CentOS 目錄重定向到linux系統的文件夾下面。
挺熱鬧吧,至此,xFsRedir 已經成爲了一個大雜燴。

如果有興趣,可關注GITHUB上的最新版本,稍後會把更新了的xFsRedir發佈上去。
https://github.com/fanxiushu/xFsRedir
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章