當前位置:
首頁 > 最新 > 微軟為macOS開發大型Git倉庫虛擬文件系統

微軟為macOS開發大型Git倉庫虛擬文件系統

編輯|張嬋

微軟首要項目負責人Saeed Noursalehi於 3 月 15 日發博客稱微軟在開發 macOS適用的大型Git倉庫虛擬文件系統(GVFS) 上取得了不錯的進展。

背景

1. 什麼是GVFS

GVFS (全稱Git Virtual File System,即Git虛擬文件系統)是微軟開發的開源系統,能使Git在企業級別運行,用於使用和管理大型Git倉庫。

2. GVFS如何工作

GVFS將Git倉庫下的文件系統虛擬化,這樣即使文件實際並不存在於磁碟上,Git工具也能看到正常顯示的存儲庫。GVFS只根據需要在第一次打開文件時進行下載。

GVFS還管理Git的內部狀態,只考慮被訪問的文件,而不必檢查倉庫中的所有文件,這樣就能確保status和checkout等命令的速度。

3. 為什麼要用GVFS

Git在企業級存儲庫中運行有點吃力。當存儲庫中有數以百萬的文件時,克隆等操作就會慢得像蝸牛一樣,甚至像獲取存儲庫狀態這樣簡單的操作都需要等待。

GVFS由微軟的Visual Studio Team Services團隊創建,專門用於處理微軟自己代碼庫的規模問題。

藉助GVFS,Git和Visual Studio Team Services的開發人員即使在使用300 GB(350 萬個文件)儲量的Windows操作系統時也能保持高效工作。

使用GVFS,微軟團隊能夠在比現存任何倉庫都要大幾個數量級的Git倉庫中工作。

GVFS目前僅支持Window 10版本。現在,微軟正在探索如何將GVFS搭建在其他平台上,並且已經在macOS適用的GVFS原型設計上取得了不錯的進展。

Windows版GVFS主要由三大塊組成:

Git補丁,使GVFS能在虛擬文件系統上高效運行 ;

文件系統過濾驅動,能攔截一些文件系統操作,並詢問一個用戶態進程如何響應目錄枚舉和文件內容;

用戶態進程,知道如何翻譯Git倉庫的狀態來響應文件系統查詢,以及如何響應文件系統事件來修改Git倉庫狀態。

感興趣的話可以通過以下鏈接獲取更多相關信息以及代碼內容:

https://www.visualstudio.com/learn/gvfs-architecture/

https://github.com/Microsoft/GVFS

其中第一項和第三項並不固有地綁定在任何操作系統上,但是第二項和特定操作系統、文件系統以及驅動模型緊密相關。這一項需要為每個操作系統重寫,現在微軟就在考慮為macOS做開發。

設計方法

Windows系統有一個文件系統過濾驅動的概念,它能堆疊到現存文件系統驅動上並修改系統的行為。MacOS不支持以這種方式堆疊驅動,所以微軟探索了別的方法,最終確定採用Kauth內核擴展機制來達到相似的效果。

當應用程序訪問文件或目錄時,內核需要判斷當前用戶是否有許可權訪問該對象。Kauth允許一個自定義內核擴展(kext) 來註冊這些授權請求,並且能決定用戶的許可權,這樣就提供了如下的一些功能:

阻止應用程序枚舉目錄,這樣就能為目錄子類填入佔位符文件/目錄。這能實現按需動態枚舉文件系統結構;

阻止要讀取文件的應用程序,從而填入其內容。這能實現按需下載文件內容;

發現用戶修改文件的行為,從而通知Git這些文件可能是「臟」的;

拒絕一些特定操作,例如刪除特殊文件或來自文件系統爬行器的請求(如果不拒絕可能會下載整個虛擬文件系統,打斷按需載入的嘗試)。

要使所有這些都能工作,微軟建立了佔位符目錄 (placeholder directories)和佔位符文件(placeholder files)的概念。通過在目錄或文件上設置文件標誌,使其成為佔位符,kext就能快速檢查虛擬節點(vnode)是否為需要擔心的虛擬項。如果不是,kext迅速返回,以避免給系統IO帶來不必要的開銷。

在建立一個新的虛擬化root的時候,先創建一個空的佔位符目錄,磁碟中沒有子類。kext (GvKext)首次接到授權枚舉該目錄的請求時,會阻止這個枚舉請求,並通過埠給用戶態進程(GVFS)發送一個消息,要求它在磁碟上給該目錄的子類寫出佔位符條目。一旦這些子佔位符被寫下,GVFS就會向 GvKext發送消息,告知它可以取消阻止枚舉的請求。然後應用程序完成枚舉,不會注意到該目錄有什麼特殊之處,除了稍微有點延遲。

類似地,只要GvKext收到授權讀取文件的請求,都會檢查文件是否仍為空,阻止IO,並要求GVFS填寫文件的內容。一旦內容可用,GVFS會向GvKext發送消息,GvKext便不再阻止讀取。

原型結果

目前的原型GVFS實際上並沒有對Git倉庫做任何事情。它現在所做的只是鏡像磁碟上現有的物理文件夾,將其作為虛擬文件夾進行投影。這個簡單的步驟能夠驗證通過構建Kauth kext來虛擬化文件系統的方法,並實現兩個關鍵目標:

應用程序兼容,尤其是對構建工具

Hydrated files的訪問性能(hydrated files是微軟使用的概念:雲文件不佔據磁碟空間,只有在訪問的時候被下載。hydrated files指已經下載的文件。)

為了驗證這些目標,微軟克隆了一些龐大而複雜的Mac代碼庫,然後創建了它們的虛擬投影,並在虛擬投影之上構建代碼庫。這幫助他們找到並修復了一些有趣的bug,但是現在他們已經可以在虛擬文件夾之上可靠地傳遞構建了。

另外,微軟團隊已經能夠證明第二個完全構建耗時僅為非虛擬化文件夾上一個完整構建的10%。這個時間仍需努力縮短,但對於非優化的原型實現來說,數據在10%以內已經非常鼓舞人心了。

這裡提供一個參考數據:使用基於FUSE的原型,對水合文件的訪問開銷從未低於150%。

敬請期待……

目前微軟剛剛構建了kext的原型版本。接下來還有很多工作要做,以使其功能全面且強大,性能卓越,可以診斷並且生產準備就緒。微軟還計劃在GVFS用戶態代碼庫中進行清理和重構,以允許使用.NET Core在Mac上運行相同的代碼。這些工作將在未來幾個月內開展,一些勇敢的早期使用者即將開始使用並向微軟發送反饋。

微軟團隊計劃在公開庫中發布macOS適用的GVFS的所有代碼,還計劃將開發流程改為公開編寫代碼,而非偶爾在公開庫中增加代碼。更多信息將很快提供。

活動推薦

隨著 AI、Big Data、Cloud的逐漸成熟,FAAS、CAAS等技術的興起,以及被運維業務的多樣化和複雜化,很多傳統的運維技術和解決方案已經不能滿足當前運維所需,AIOps智能運維、大數據運維、ChatOps、SRE、Chaos Engineering、微服務與容器運維等新技術和方嚮應運而生,它們一方面把最前沿的技術結合到運維中來,一方面在人員角色、領域範圍、文化等方面又有了很多擴展,讓傳統運維有了翻天覆地的變化。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高效開發運維 的精彩文章:

TAG:高效開發運維 |