關於linux檔案系統監控(2)

2021-06-05 17:39:04 字數 1762 閱讀 8687

目標:監控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系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...