周家勁,謝俊峰,胡曉勤,謝卓偉
(1.四川大學(xué)網(wǎng)絡(luò)空間安全學(xué)院,成都 610200;2.成都云祺科技有限公司,成都 610041)
傳統(tǒng)的文件系統(tǒng)如NTFS、Ext4實(shí)現(xiàn)在內(nèi)核態(tài),以物理磁盤作為存儲介質(zhì);在內(nèi)核開發(fā)新的文件系統(tǒng)技術(shù)門檻較高,設(shè)計(jì)較為困難。FUSE(file system in userspace)提供一種面向類Unix操作系統(tǒng)的軟件接口,內(nèi)核組件與VFS(virtual file system)交互,使得用戶無需編輯內(nèi)核代碼即可創(chuàng)建自己的文件系統(tǒng),在類Unix操作系統(tǒng)端已有成熟的應(yīng)用,比較知名的有GlusterFS(gluster file system)、ZFS(zettabyte file system)、SSHFS等,其他一些出于研究目的搭建的文件系統(tǒng)也使用了FUSE。由于Windows平臺的非開源環(huán)境,開發(fā)文件系統(tǒng)的難度更高,用戶空間文件系統(tǒng)的發(fā)展緩慢,F(xiàn)USE底層設(shè)計(jì)面向VFS接口,Windows平臺下無法使用FUSE開發(fā)易于維護(hù)的用戶空間文件系統(tǒng)。
Dokan與WinFsp兩個(gè)開源項(xiàng)目搭建類似FUSE的框架,可以無需編寫設(shè)備驅(qū)動程序在Windows上創(chuàng)建除FAT或NTFS以外的新文件系統(tǒng)。NFS-win、sshfs-win基 于WinFsp,winSshFs基于Dokan,SftpDrive可利用ssh或nfs將遠(yuǎn)端文件系統(tǒng)掛載到本地網(wǎng)絡(luò)驅(qū)動器,像訪問本地文件一樣訪問遠(yuǎn)端文件系統(tǒng)。
本文提供了一種開發(fā)文件系統(tǒng)且不需要掛載新卷的詳細(xì)設(shè)計(jì)方案,在此基礎(chǔ)上設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于文件過濾驅(qū)動的跨平臺網(wǎng)絡(luò)文件系統(tǒng)-CPNFS(cross-platform network file system)。CPNFS無需新建卷分配盤符,在原有卷子目錄下即可虛擬一個(gè)文件系統(tǒng)。如圖1所示,通過文件過濾驅(qū)動,監(jiān)視、攔截I/O管理器下發(fā)的I/O請求包IRP(I/Orequest packet)。請求包沿設(shè)備棧向下傳遞,發(fā)送到卷設(shè)備的文件請求先經(jīng)過文件過濾驅(qū)動。用戶層遵循客戶端/服務(wù)器架構(gòu),采用TCP協(xié)議進(jìn)行通信。服務(wù)端可以是任意平臺,客戶端用戶層使用內(nèi)核提供的接口獲取請求發(fā)送到服務(wù)端處理,實(shí)現(xiàn)文件請求的重定向。對比測試了CPNFS與其他遠(yuǎn)端共享文件系統(tǒng)在讀寫上的效率以及系統(tǒng)的兼容性,實(shí)驗(yàn)結(jié)果表明,CPNFS在性能與兼容性上均有優(yōu)秀的表現(xiàn)。
圖1 分層驅(qū)動
如圖2所示,CPNFS采用客戶端/服務(wù)器端架構(gòu),客戶端由用戶層客戶端進(jìn)程CPNFS-user與內(nèi)核層過濾驅(qū)動CPNFS-kernel組成。
圖2 CPNFS系統(tǒng)框架
內(nèi)核層CPNFS-kernel主體為文件系統(tǒng)過濾驅(qū)動,由過濾模塊、控制模塊與隊(duì)列管理模塊組成。過濾模塊綁定文件系統(tǒng)卷,監(jiān)視攔截用戶層始發(fā)進(jìn)程通過環(huán)境子系統(tǒng)下發(fā)的文件請求,將需要處理的I/O請求傳遞到隊(duì)列管理模塊。隊(duì)列管理模塊負(fù)責(zé)請求的出入隊(duì)以及超時(shí)處理,I/O隊(duì)列類型分為待處理隊(duì)列、處理隊(duì)列兩種??刂颇K通過IRP_MJ_DEVICE_CONTROL例程暴露給用戶層接口,用戶層利用此接口訪問內(nèi)核數(shù)據(jù)。
客戶端用戶層進(jìn)程分為通信模塊client、請求處理模塊、過濾管理模塊以及統(tǒng)一接口層。通信模塊與服務(wù)端建立連接,發(fā)送請求報(bào)文到服務(wù)端,從服務(wù)端接收完成報(bào)文,完成報(bào)文傳遞給請求處理模塊。請求處理模塊對請求進(jìn)行預(yù)處理,需要傳遞到遠(yuǎn)端處理的請求轉(zhuǎn)換成請求報(bào)文傳遞給通信模塊,接收完成結(jié)果后利用統(tǒng)一接口層將數(shù)據(jù)傳遞到內(nèi)核。過濾管理模塊維護(hù)過濾路徑表,將過濾路徑與遠(yuǎn)端文件系統(tǒng)一一對應(yīng)。
服務(wù)端由通信模塊server、文件管理模塊以及響應(yīng)模塊reactor組成。通信模塊維護(hù)客戶端的連接,為每一個(gè)連接的客戶端建立子進(jìn)程收發(fā)報(bào)文,并將請求報(bào)文傳遞給響應(yīng)模塊。響應(yīng)模塊接收請求報(bào)文,使用用戶層API對VFS層發(fā)起IO操作,將完成結(jié)果轉(zhuǎn)化為完成報(bào)文傳遞給通信模塊。文件管理模塊建立客戶端文件對象與本地文件描述符的映射,并保存文件的客戶端獨(dú)有屬性。
表1 請求處理統(tǒng)一接口
用戶層進(jìn)程打開文件獲得句柄,通過句柄對文件或文件夾進(jìn)行操作,內(nèi)核層則會創(chuàng)建文件對象,文件對象包含名稱、安全描述符、偏移位置和引用計(jì)數(shù)等信息,句柄與文件對象一一對應(yīng),通過文件對象指針可以控制訪問一個(gè)文件的打開實(shí)例。文件對象由內(nèi)核組件對象管理器創(chuàng)建,從內(nèi)核空間分配內(nèi)存地址,因不同進(jìn)程共享內(nèi)核空間,指向文件對象的指針在不同進(jìn)程上下文中可唯一指定一個(gè)文件對象。因此,重定向進(jìn)程管理文件對象時(shí),以文件對象指針數(shù)值作為鍵建立哈希表。
CPNFS采用了如圖3所示的數(shù)據(jù)結(jié)構(gòu)來管理文件對象,客戶端建立以文件對象指針為鍵的文件哈希表,緩存文件的屬性信息如文件名、安全描述符以及目錄的打開狀態(tài)。服務(wù)端對每一個(gè)客戶端建立以文件對象指針為鍵的文件映射哈希表,完成客戶端文件對象與服務(wù)端文件描述符的映射,同時(shí)儲存文件名、文件屬性stat、inode等信息,Linux下inode可以唯一標(biāo)識一個(gè)文件。同時(shí)建立以inode為鍵的屬性哈希表,緩存客戶端設(shè)置的一些NTFS獨(dú)有屬性file_attri,所有進(jìn)程共享同一個(gè)屬性哈希表,此表駐留在服務(wù)端。
圖3 文件對象存儲方式
CPNFS請求處理流程如圖4所示,客戶端進(jìn)程與服務(wù)器端建立連接,設(shè)置過濾目錄與服務(wù)器端目錄建立映射,完成后客戶端進(jìn)程進(jìn)入休眠。新的文件請求到達(dá)過濾驅(qū)動時(shí),截獲需要重定向處理的IRP,將該IRP掛起并插入待處理隊(duì)列,返回PENDING狀態(tài)表示請求后續(xù)異步完成。新請求入隊(duì)時(shí)客戶端進(jìn)程喚醒,通過CTL_GET_REQUEST接口從內(nèi)核隊(duì)列獲取請求內(nèi)容,然后發(fā)送請求報(bào)文到服務(wù)端,服務(wù)端處理完成后發(fā)送完成報(bào)文到客戶端,客戶端通過CTL_RESPONSE_COMPLETION通知內(nèi)核請求已完成并以內(nèi)存映射的方式將數(shù)據(jù)傳遞到內(nèi)核。
圖4 一次IO處理流程
(1)打開操作。當(dāng)用戶進(jìn)程使用fopen、CreateFile等系統(tǒng)調(diào)用打開文件時(shí),客戶端進(jìn)程發(fā)送文件名以及打開標(biāo)記到服務(wù)端。服務(wù)端打開文件,建立本地文件對象與服務(wù)端文件描述符的映射,并建立文件打開列表保存已打開的文件,返回到客戶端時(shí)內(nèi)核完成請求,IO管理器返回句柄。
(2)讀操作。當(dāng)用戶進(jìn)程使用fread、Read-File等系統(tǒng)調(diào)用通過文件句柄讀取文件時(shí),客戶端進(jìn)程發(fā)送文件對象鍵值、偏移量以及讀取長度到服務(wù)端,服務(wù)端通過查找文件打開列表獲得文件描述符,使用服務(wù)端系統(tǒng)調(diào)用如pread讀取文件,獲得數(shù)據(jù)后返回到客戶端。
(3)寫操作。當(dāng)用戶進(jìn)程使用fwrite、Write-File等系統(tǒng)調(diào)用通過文件句柄寫文件時(shí),客戶端進(jìn)程請求參數(shù)以及數(shù)據(jù)報(bào)文到服務(wù)端,服務(wù)端使用服務(wù)端系統(tǒng)調(diào)用如pwrite將數(shù)據(jù)寫入文件。
(4)查詢文件屬性。當(dāng)用戶進(jìn)程使用Get-FileInformationByHandle等系統(tǒng)調(diào)用查詢文件屬性時(shí),客戶端進(jìn)程轉(zhuǎn)換請求為符合服務(wù)端的請求類型,將請求發(fā)送到服務(wù)端,服務(wù)端查詢文件屬性后返回到客戶端,客戶端轉(zhuǎn)換屬性結(jié)構(gòu)返回到內(nèi)核。
(5)目錄遍歷。當(dāng)資源管理器獲取目錄下的子目錄或文件時(shí),客戶端進(jìn)程發(fā)送目錄遍歷請求到服務(wù)端,服務(wù)端遍歷目錄返回到客戶端,客戶端轉(zhuǎn)換格式將目錄內(nèi)容返回到內(nèi)核。
According to above all, we can draw the calculated value of X axial force of support plates as follows:
(6)關(guān)閉操作。當(dāng)用戶進(jìn)程調(diào)用fclose、CloseHandle等系統(tǒng)調(diào)用關(guān)閉句柄時(shí),IO管理器會檢查對象的引用計(jì)數(shù)是否為0,引用計(jì)數(shù)為0時(shí)表明沒有用戶進(jìn)程或內(nèi)核組件訪問該文件??蛻舳诉M(jìn)程發(fā)送文件對象鍵值到服務(wù)端,服務(wù)端關(guān)閉文件并刪除文件映射表中對應(yīng)項(xiàng)。
所有的實(shí)驗(yàn)在Vmware ESXI管理的虛擬化環(huán)境下所開啟的兩臺虛擬機(jī)上運(yùn)行,其中一臺作為CPNFS的服務(wù)器,另外一臺作為CPNFS的客戶端。服務(wù)器端系統(tǒng)為CentOS 7,內(nèi)核版本為Linux 3.10.0,預(yù)留2GB內(nèi)存;客戶端版本為Windows server 2012,內(nèi)部版本為6.2.9200,預(yù)留8 GB內(nèi)存。使用iperf3測試客戶端到服務(wù)端的上行帶寬約150MB/s,下行帶寬約100MB/s。表2為測試環(huán)境的具體參數(shù)。
表2 實(shí)驗(yàn)環(huán)境配置
本節(jié)使用標(biāo)準(zhǔn)測試工具FIO(Flexible I/Otester)測 試CPNFS、WinFsp+NFS-win、WinFsp+SshFs-win、Dokan+WinSshFs與SftpDriver在8 KB隨機(jī)讀寫吞吐、8 KB混合隨機(jī)讀寫吞吐以及4 MB順序讀寫吞吐性能。
2.2.1 隨機(jī)訪問性能
測量了CPNFS與其他幾種網(wǎng)絡(luò)文件系統(tǒng)的8KB隨機(jī)讀寫以及讀占70%、寫占30%的混合隨機(jī)讀寫兩個(gè)項(xiàng)目。從結(jié)果上看,CPNFS的隨機(jī)讀性能與WinFsp+sshfs-win接近,相對于WinFsp+NFS-win約提升40%,接近Dokan+winSshFs的2倍,是SftpDriver的2.5倍以上。CPNFS的隨機(jī)寫性能接近Dokan+winSshFs,是WinFsp+NFS-win的7倍以上,WinFsp+sshfs-win的4倍以上,SftpDriver的1.5倍以上,見圖5。
圖5 CPNFS與其他關(guān)于8 KB隨機(jī)讀寫的性能比較
從8 KB上讀占70%、寫占30%的混合隨機(jī)讀寫的結(jié)果上可以看到CPNFS的讀寫同時(shí)進(jìn)行場景的性能均比其他四個(gè)優(yōu)秀,分別約提升180%、100%、70%、30%,見圖6。
圖6 CPNFS與其他關(guān)于8KB混合隨機(jī)讀寫的性能比較
2.2.2 順序訪問性能
在4 MB的順序讀上,CPNFS與WinFsp+NFS-win的性能接近,遠(yuǎn)遠(yuǎn)超過WinFsp+sshfswin與SftpDriver,是WinFsp+sshfs-win的3倍以上、SftpDriver的35倍以上,其中Dokan+win SshFs不支持大文件的順序讀。在4 MB的順序?qū)懮?,CPNFS的性能相對于WinFsp+NFS-win約提升了50%,與其他三者相比分別提升了500%、850%、1660%,見圖7。
圖7 CPNFS與其他關(guān)于4 MB順序訪問的吞吐性能比較
表3總結(jié)了CPNFS與WinFsp+NFS-win在幾個(gè)測試場景的性能對比,可以發(fā)現(xiàn),除順序讀以外,其他場景下CPNFS的性能都比較優(yōu)秀。
表3 CPNFS與WinFsp+NFS-win綜合比較
本文提出了一種基于文件過濾驅(qū)動的文件系統(tǒng)設(shè)計(jì)方法,實(shí)現(xiàn)無需掛載盤符的用戶文件系統(tǒng)開發(fā)。該設(shè)計(jì)在內(nèi)核層截獲所有文件IO,保存需要處理的IO并提供統(tǒng)一接口供用戶層實(shí)現(xiàn),可在原來文件系統(tǒng)卷目錄下虛擬文件系統(tǒng)?;谠撛O(shè)計(jì),在Windows下設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)跨平臺的網(wǎng)絡(luò)文件系統(tǒng)-CPNFS,無需新建新卷即可如訪問本地文件系統(tǒng)一樣訪問遠(yuǎn)端文件系統(tǒng)。實(shí)驗(yàn)測試結(jié)果表明,CPNFS在隨機(jī)讀寫與順序?qū)懮?,相較于其他共享文件系統(tǒng)方法都具有十分明顯的優(yōu)勢。