1. 程式人生 > >使用 FUSE 開發自己的檔案系統

使用 FUSE 開發自己的檔案系統

檔案系統是一種用來儲存和組織計算機檔案、目錄及其包含的資料的方法,它使檔案、目錄以及資料的查詢和訪問得到簡化。如果您正在使用一臺計算機,很可能使用了多個檔案系統。檔案系統能提供豐富的擴充套件能力。它可以編寫成底層檔案系統的一個封裝程式,從而對其中的資料進行管理,並提供一個增強的、具有豐富特性的檔案系統(例如 cvsfs-fuse,它為 CVS 提供了一個檔案系統的介面;或 Wayback 檔案系統,它提供了一種用於保留原始資料檔案的檔案備份機制)。

在使用者空間的檔案系統出現之前,檔案系統的開發曾是核心開發人員的工作。建立檔案系統需要了解核心程式設計和核心技術(例如 vfs)方面的知識。除錯則需要 C 和 C++ 方面的專業技能。但是其他開發人員需要熟練地操作檔案系統以添加個性化特性(例如新增歷史記錄或轉發快取)及對其改進。

FUSE 簡介

使用 FUSE 您可以開發功能完備的檔案系統:其具有簡單的 API 庫,可以被非特權使用者訪問,並可以安全的實施。更重要的是,FUSE 以往的表現充分證明了其穩定性。

使用 FUSE,您可以像可執行二進位制檔案一樣來開發檔案系統,它們需要連結到 FUSE 庫上 —— 換言之,這個檔案系統框架並不需要您瞭解檔案系統的內幕和核心模組程式設計的知識。

就檔案系統來說,使用者空間的檔案系統就不再是新奇的設計了。使用者空間檔案系統的商業實現與學術實現的例項包括:

  • LUFS 是一個混合使用者空間的檔案系統框架,它對用於任何應用程式無數的檔案系統提供透明支援。大部分LUFS 包括一個核心模組和一個使用者空間的守護程序。從根本上來說,它將大部分 VFS 呼叫都委託給一個專用的守護程序來處理。
  • UserFS 讓使用者程序可以像普通的檔案系統一樣進行載入。這種概念性的原型提供了 ftpfs,這可以使用檔案系統介面提供匿名 FTP 訪問。
  • Ufo Project 是為 Solaris 提供的一個全域性檔案系統,它允許使用者將遠端檔案真正當作本地檔案一樣對待。
  • OpenAFS 是 Andrew FileSystem 的一個開源版本。
  • CIFS 是 Common Internet FileSystem 的簡稱。

與這些商業實現和學術實現不同,FUSE 將這種檔案系統的設計能力帶到了 Linux 中來。由於 FUSE 使用的是可執行程式(而不像 LUFS 一樣使用的是共享物件),因此可以簡化程式的除錯和開發。FUSE 可以在 2.4.x 和 2.6.x 的核心上使用,現在可以支援 Java™ 繫結,因此您可以不必限定於使用 C 和 C++ 來編寫檔案系統了。(有關更多使用 FUSE 的使用者層的檔案系統的內容,請參閱 

參考資料。)

要在 FUSE 中建立一個檔案系統,您需要安裝一個 FUSE 核心模組,然後使用 FUSE 庫和 API 來建立自己的檔案系統。

展開 FUSE

要開發一個檔案系統,首先請下載 FUSE 的原始碼(請參閱 參考資料)並展開這個包:tar -zxvf fuse-2.2.tar.gz。這會建立一個 FUSE 目錄,其中儲存的是原始碼。fuse-2.2 目錄的內容如下:

  • ./doc 包含了與 FUSE 有關的文件。現在,這隻有一個檔案 how-fuse-works。
  • ./kernel 包含了 FUSE 核心模組的原始碼(對於使用 FUSE 開發檔案系統來說,您當然不用懂得這些程式碼的機制)。
  • ./include 包含了 FUSE API 頭,您需要這些檔案來建立檔案系統。您現在唯一需要的就是 fuse.h。
  • ./lib 中存放的是建立 FUSE 庫的原始碼,您需要將它們與您的二進位制檔案連結在一起來建立檔案系統。
  • ./util 中存放的是 FUSE 工具庫的原始碼。
  • ./example 當然包含的是一些供您參考的例子,例如 fusexmp.null 和 hello 檔案系統。

編譯並安裝 FUSE

  1. 在 fuse-2.2 目錄中執行 configure 指令碼: ./configure。這會建立所需要的 makefile 等內容。
  2. 執行 ./make 來編譯庫、二進位制檔案和核心模組。檢視 kernel 目錄中的檔案 ./kernel/fuse.ko —— 這是核心模組檔案。還要檢視 lib 目錄中的 fuse.o、mount.o 和 helper.o。
  3. 執行 ./make install 完成 FUSE 的安裝。 

    另外一種選擇:如果您希望使用 insmod 自己將這個模組安裝到核心中,就可以跳過這個步驟。例如:/usr/local/sbin/insmod ./kernel/fuse.ko 或 /sbin/insmod ./kernel/fuse.ko。記住要使用 root 特權才能安裝所需要的模組。

如果希望,只在一個步驟中就可以完成上面的步驟。在 fuse-2.2 目錄中,執行 ./configure; make; make install;。 

重要提示:在編譯 FUSE 時,系統中需要有核心標頭檔案或原始碼。為了簡單起見,請確保將核心原始碼放到 /usr/src/ 目錄中。

定製檔案系統

現在讓我們來建立一個檔案系統,這樣就可以使用一個較舊的 Linux 核心來訪問一個具有最新核心的 Linux 系統上的 AFS 空間了。您需要兩個程序:一個是在較舊的 Linux 核心上執行的伺服器程序,另外一個是在具有最新核心的 Linux 系統上執行的一個 FUSE 客戶機程序。不論何時請求到達您的 FUSE 客戶機程序上時,它都會與遠端伺服器程序進行聯絡。為了進行通訊,這個檔案系統使用了 RX RPC 程式碼,這是 AFS 的一部分,因此您需要編譯 OpenAFS。(圖 1 給出了對這個 AFS 檔案系統的概述。)

圖 1. AFS-FUSE 檔案系統概述
AFS-FUSE 檔案系統概述

編譯 OpenAFS

  1. 下載 OpenAFS Linux 原始碼並展開原始碼。

    在展開原始碼的目錄中,執行 ./make ./configure --enable-transarc-paths。如果 ./configure 無法理解編譯使用的 sysname,就請使用 --with-afs-sysname 選項提供正確的 sysname。

    要在 Linux 2.4 核心上編譯,請使用下面的命令:./configure --enable-transarc-paths --with-afs-sysname=i386_linux24

  2. 執行 ./make,然後執行 ./make dest。檢查在編譯過程中出現的錯誤。

    如果編譯過程一切順利,那麼 AFS 原始碼樹就可以使用了。現在,您需要準備一個開發目錄 afsfuse。在這個目錄中,建立另外兩個目錄:

    • include 目錄包括 OpenAFS 和 FUSE 的 include 目錄的標頭檔案。
    • lib 目錄包含 OpenAFS 和 FUSE 的庫檔案。
  3. 拷貝標頭檔案和庫檔案。

    首先從 OpenAFS 目錄中拷貝 AFS 的標頭檔案,方法是將 dest\i386_linux24\include 中的目錄和檔案全部拷貝到 include 目錄中。然後將 fuse-2.2 目錄中的 FUSE 的 include 目錄拷貝到這個目錄中。對庫檔案也重複相同的步驟,將它們全部拷貝到 lib 目錄中。

  4. 建立應用程式的結構。

    對於這兩組程序,您需要使用兩組檔案。使用命名規則 afsfuse_client.* 來命名客戶機程序的檔案;使用命名規則 afsfuse_server.* 來命名伺服器程序的檔案。

    這樣您就有了一個 afsfuse_client.c 檔案,其中包含了 FUSE 程序的程式碼;一個 afsfuse_server.c 檔案,其中包含了在遠端機器上執行的程序使用的伺服器程式碼;一個 makefile;一個 rxgen 檔案,用來建立 RPC 標頭檔案(例如 afsfuse.xg)。

    afsfuse_client.c 檔案可以建立 afsfuse_client 程序程式碼, FUSE 檔案系統呼叫它來建立檔案系統(使用 fuse-2.2/example/fusexmp.c 來建立這個檔案)。

定義需要的函式

要使用 FUSE 來建立一個檔案系統,您需要宣告一個 fuse_operations 型別的結構變數,並將其傳遞給 fuse_main 函式。fuse_operations 結構中有一個指標,指向在執行適當操作時需要呼叫的函式。清單 1 給出了 fuse_operations 結構。

清單 1. fuse_operation 結構中需要的函式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 struct fuse_operations { int (*getattr) (const char *, struct stat *); int (*readlink) (const char *, char *, size_t); int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); int (*mknod) (const char *, mode_t, dev_t); int (*mkdir) (const char *, mode_t); int (*unlink) (const char *); int (*rmdir) (const char *); int (*symlink) (const char *, const char *); int (*rename) (const char *, const char *); int (*link) (const char *, const char *); int (*chmod) (const char *, mode_t); int (*chown) (const char *, uid_t, gid_t); int (*truncate) (const char *, off_t);

相關推薦

使用 FUSE 開發自己檔案系統

檔案系統是一種用來儲存和組織計算機檔案、目錄及其包含的資料的方法,它使檔案、目錄以及資料的查詢和訪問得到簡化。如果您正在使用一臺計算機,很可能使用了多個檔案系統。檔案系統能提供豐富的擴充套件能力。它可以編寫成底層檔案系統的一個封裝程式,從而對其中的資料進行管理,並提供

【windows核心驅動開發檔案系統微過濾驅動Minifilter——繫結指定的卷(磁碟分割槽)

【我的】檔案系統微過濾驅動Minifilter——繫結指定的卷(磁碟分割槽) 作者:zcr214 時間:2016/4/21 在編寫檔案系統微過濾驅動minifilter的時候,很有可能我們只對某一個特定的磁碟分割槽感興趣,而其他的如系統盤的很多IRP對於我們要編寫的驅動可

【windows核心驅動開發檔案系統微過濾驅動Minifilter——獲取程序資訊

【我的】檔案系統微過濾驅動Minifilter——獲取程序資訊 作者:zcr214 時間:2016/4/22 在編寫檔案系統微過濾驅動minifilter的時候,除了繫結指定的磁碟分卷,對於指定的檔案很可能還會有指定的應用程式,例如txt檔案可以有很多編輯器可以使用,如w

iOS開發:發出系統的聲音!發出自己的聲音!

這個連結非常詳盡地列舉了IOS7裡面所有的系統聲音,聲音的ID,聲音的存放位置 儘管現在已經是ios8的時代,但是系統聲音這個東東不會因此過時,畢竟聲音就那幾十種,不會一下子有太大變化。 https://github.com/TUNER88/iOSSystemSou

springMVC-spring-Hibernate 開發學生管理系統簡單案例-jsp檔案說明(五)

五、jsp檔案說明 原始檔:https://download.csdn.net/download/flyingshadower/10628472 (1)jsp檔案如圖: (2)addPage.jsp <%@ page contentType="text/html;char

springMVC-spring-Hibernate 開發學生管理系統簡單案例-配置檔案說明(三)

三、配置檔案說明 原始檔:https://download.csdn.net/download/flyingshadower/10628472 (1)在pom.xml寫入需要的各類依賴,自動下載依賴包。 <?xml version="1.0" encoding="UTF-8"?&g

springMVC-spring-Hibernate 開發學生管理系統簡單案例-java各檔案編寫(四)

四、java各檔案編寫 原始檔:https://download.csdn.net/download/flyingshadower/10628472 (1)工程目錄: (2)StudentEntity 利用Hibernate自動生成實體類 package com.student

嵌入式Linux開發——(十五)移植YAFFS檔案系統

一、移植YAFFS檔案系統 1)YAFFS檔案系統的介紹     ①YAFFS(yet another flash file system)是一種類似於JFFS / JFFS2,專門為NAND Flash設計的嵌入式檔案系統,適用於大     &nbs

QEMU模擬Mini2440開發板執行環境(二):NFS掛載根檔案系統

前言 原創文章歡迎轉載,請保留出處。 若有任何疑問建議,歡迎回復。 郵箱:[email protected] 緊接著第一篇(http://blog.csdn.net/maxwell_nc/article/details/44279553),我們使用網路檔案系統NFS掛載根檔案

怎樣從網路上核心和根檔案系統啟動開發

首先在ubuntu虛擬機器上要有nfs伺服器 1.啟動開發板uboot,輸入 下面的命令 set bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.19:/work/nfs_root/tmp/fs_mini

微信小遊戲開發(11)-檔案系統

檔案系統 檔案系統是小程式提供的一套以小程式和使用者維度隔離的儲存以及一套響應的管理介面。通過wx.getFilesSystemManager()可以獲取到全域性唯一的檔案管理器,所有檔案管理操作通過FileSystemManager來呼叫。 ··· var fs = wx.getF

Linux:一步一步製作自己的根檔案系統

一步一步製作自己的根檔案系統 在這裡,實驗過程使用的是九鼎提供的S5PV210開發板,實驗核心同樣來自其官方資料盤中Linux資料包中的的QT4.8中的相關原始碼,實驗的NFS檔案系統在虛擬中的Ubuntu14.04中建立. 建立檔案系統根目錄 root

ZCU106開發詳解之PS側SD卡FAT32檔案系統(高階外設,大神之路)

感謝大家的等待!! 本週將四連發,我們團隊也將盡自己能力為大家答疑解惑!!! 如果有朋友想了解更多相關資訊請加QQ群836535064。我們會將相關資料釋出於QQ群中。 歡迎有需求的朋友深度合作。本團隊專注於高速視訊編解碼,高速訊號採集處理,高速異構平臺,高速儲存方案提

檔案系統過濾驅動開發(一)—Win32底層開發小組

    宣告:本文無太多新意,只是介紹下學習經驗,大神級人物(如總監大人)請略過,謝謝合作>_<     吐槽一下:學驅動算起來也是從上學期9月份開始吧,之前在家買了<Windows驅動開發技術詳解>這本書,搭了個環境之後,其實也沒碰很多,編了個經典的Hello,World!之後就無

移植好uboot和基於initramfs根檔案系統Linux核心的開發板的啟動過程

我們移植好uboot和Linux核心之後,當我們重啟之後,開發板首先做的事情就是將nandflash前4K的內容複製到SRAM中去,由於SRAM只有4K大小,所以我們必須將初始化CPU、記憶體、中斷、關閉開門狗以及nandflash中uboot拷貝到SDRAM中的的程式都放

ARM開發板與PC機Ubuntu系統建立連線,採用NFS(網路檔案系統)掛載

        Linux中最常用的方法就是採用NFS來執行各種程式,這樣可以不必花費很多時間下載程式,如果應用程式變的越來越大,就會發現NFS執行的方便所在。 首先要搭建NFS伺服器,步驟如下: (1)安裝nfs伺服器和客戶端           #sudo apt-ge

以太坊開發DApp實戰教程——用區塊鏈、星際檔案系統(IPFS)、Node.js和MongoDB來構建電商平臺

第一節 簡介 歡迎和我們一起來用以太坊實戰開發構建一個去中心化電商DApp!我們將會構建一個類似淘寶的線上電子商務應用,我將使用區塊鏈、星際檔案系統(IPFS)、Node.js和MongoDB來構建電商平臺,賣家可以自由地出售商品,買家可以自由地購物: 去中心化:

linux驅動開發-檔案系統與裝置檔案

目錄 1.Linux檔案系統操作 Linux檔案建立,開啟,關閉函式 #檔案許可權最終由mode&umask決定 int creat (const char *filename,mode_t mod

開發板通過網路載入核心、裝置樹、根檔案系統

開發板要通過網路載入核心、裝置樹、檔案系統,首先要搭建好tftp和nfs服務1.搭建tftp伺服器tftp服務安裝//----虛擬機器上安裝tftp服務$ sudo dpkg   -s   tftpd-hpa   //檢查是否安裝tftp server$ sudo apt-g

Django開發自己的部落格系統

好久之前就想做一下自己的部落格系統了,但是在網上查了查好像是需要會一些Node.js的相關知識,而且還要安裝辣麼多的庫什麼的,就不想碰了。但是我遇到了Django這麼一款神器,沒想到我的部落格系統就這麼建立起來了。雖然是最基礎的型別。但是也算是成功了,這篇部落格