目標:監控linux檔案系統指定目錄內的檔案變化,並記錄或提交到相應的介面。
該指定目錄用於儲存客戶提交的檔案。
提交方式可能是 ftp 或者 mount
方式一:
使用inotify機制。
相關的開發工具可以使用 inotify-tools,或者在其基礎上進行再封裝。
優點:開放方便,維護簡單,執行穩定。
弱點:1.事後獲知,對於unlink event,無法獲知被刪除檔案的資訊,如:想知道刪除的檔案是否是softlink
2.海量檔案或者目錄的情況下,維護inode_list需要大量的記憶體空間,同時,在程式啟動載入inode資訊時耗時巨大。
方式二:
使用fuse——file system user space。
可以參考 有乙個簡要介紹
實現自己的檔案系統
註冊自定義的檔案操作方法:
inotefs_oper.readlink = inotefs_readlink;
inotefs_oper.readdir = inotefs_readdir;
inotefs_oper.mknod = inotefs_mknod;
inotefs_oper.mkdir = inotefs_mkdir;
inotefs_oper.symlink = inotefs_symlink;
實現對應方法,摘自本人的乙個實現:
static int inotefs_rmdir(const char *path)
可以看到,
1,只是簡單的執行系統動作rm
res = rmdir(path);
2,在rm動作前後均可以進行攔截和處理,上例僅在刪除後攔截事件並記錄日誌
inotefs_log(apath, "rmdir", res,"rmdir %s", apath);
此方式優點:靈活,高效,開發不算複雜,自由度很高,特別是解決了inotify 方式的 記憶體占用和啟動準備時間上的弊病。
應用場景多樣,特別是在某些大量依託檔案系統的事務中,可以通過自定義的檔案系統將底層邏輯做乙個透明遮斷,如:檔案映象/遠端同步等。
方式三:
使用 strace ltrace 等系統工具。
這些工具可以監控程序的 system call 等。
因此,若使用者使用ftp上傳,可以監控 ftp server 的pid, 獲得 ftp 的 system call
例如 unlink("******************x" ...)
由此,即可獲得檔案變動資訊。
此方式無法處理mount 寫檔案的情況, 但是在某些快速開發場合可以使用, stick 乙個pid的成本也相當低。
方式四:
切入核心,攔截system call。
優點當然是極致效能
不過對於開發技巧以及確保系統的穩定性上要求也很高。
具體開發可以參考github的部分開源專案。
如果選擇此方式,可以使用乙個折衷的開發方法,避免侵入核心**,產生不可控的錯誤——
使用linux的 ld_preload 引數,通過chroot等方式, 自己替換掉底層模組 如 glibc 的 read unlink 等, 並進行攔截。
82 2 監控檔案系統
誰開啟了該檔案?顯示開啟檔案filename的程序 lsof filename列出某個目錄下被開啟的檔案 lsof tmp command pid user fd type device size off node name seahorse 4158 neo cwd dir 8,2 53248 1...
Linux檔案系統作業 2
題目如下 v1.建立新檔案,該檔案具有使用者讀寫許可權。v2.採用dup dup2 fcntl複製乙個新的檔案描述符,通過新檔案描述符向檔案寫入 class name 字串 v3.通過原有的檔案描述符讀取檔案中的內容,並且列印顯示 下面是 include include include includ...
linux 檔案系統 Linux 檔案系統結構介紹
ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...