2010-02-03 68 views
7

作爲一個大學項目,我需要從一個文件中實現一個基本的文件系統。那麼我該怎麼做呢?我需要知道哪些事情?這些要求包括在後臺進行守護進程。同時使用該系統的應用程序需要使用Unix域套接字實現基本文件系統

文件系統應具有以下功能連接到服務器:與它們的大小一起存儲

  1. 列表文件。
  2. 創建文件
  3. 允許更改文件
  4. 刪除文件
+0

我們可以在這裏做一些假設: 我們並沒有創建一個真正的文件系統:也就是說,我們並不期望使用正常的ls或dir命令來查看事情。相反,我們正在實現一種通過套接字通過自定義接口公開文件的服務。我們正在編寫服務器和客戶端庫。服務器的數據存儲在一個文件中。 這是正確的嗎? – 2010-02-03 13:16:30

+0

類似稍微更通用的問題:http://stackoverflow.com/questions/4714056/how-to-implement-a-very-simple-filesystem – 2015-05-08 07:57:08

回答

0

最簡單的方法是建立一個模板來存儲數據,並將文件解析到內存中,當然這並不是最有效的。

喜歡的東西...

SOME /位置/文件名>>>文件 內容這裏,等等等等 < < < SOME /其它/位置/ File2Name >>> 的另一個內容文件在這裏 < < <

然後列出一個目錄,使用正則表達式查找>>>結尾的所有行,然後解析到第X個斜槓(基於搜索的文件夾斜線的數量),並做基於您是否希望這是區分大小寫的敏感搜索。當然,正如我提到的將它加載到內存中,你可以搜索一個key-> value的hashmap,這可能會簡單得多。

1

文件系統基本上是一個文件數據庫。您需要的主要功能是用於存儲字節偏移量和文件長度的查找表。文件名也可以存儲在表中,或者可以存儲在每個偏移量的前幾個字節中。如果您將文件系統設置爲固定大小,這對您來說會容易得多。

這與FAT文件系統的工作原理類似。

您還可以查看http://en.wikipedia.org/wiki/Database_storage_structures,因爲在最低級別文件系統和數據庫非常相似。

3

這是一個非常非常基本的FUSE實現的an example,它由一個榮耀的共享內存段(xenstore)支持。它是我維護的原始xenstore FUSE文件系統的一個分支。

您還可以找到一些代碼來向您展示如何使Valgrind在調試FUSE實現時更加有用。

你寫的打開/創建/讀/寫/截斷功能/ GETATTR /等,並通過他們融合(行號從鏈接的例子):

343 static struct fuse_operations const xsfs_ops = { 
    344 .getattr = xsfs_getattr, 
    345 .mknod = xsfs_mknod, 
    346 .mkdir = xsfs_mkdir, 
    347 .unlink = xsfs_rm, 
    348 .rmdir = xsfs_rmdir, 
    349 .truncate = xsfs_truncate, 
    350 .open = xsfs_open, 
    351 .read = xsfs_read, 
    352 .write = xsfs_write, 
    353 .readdir = xsfs_readdir, 
    354 .create = xsfs_create, 
    355 .destroy = xsfs_destroy, 
    356 .utime = xsfs_utime, 
    357 .symlink = xsfs_symlink, 
    358 .init = (void *)xsfs_init 
    359 }; 

正如你所看到的,它極自我解釋。稍加搜索會導致發現很多FUSE實現的基本文件支持示例。

我強烈建議完全在用戶空間中完成,除非您有足夠的時間熟悉內核。