Linux tmpfs的使用問題解析

2021-07-04 08:02:29 字數 1377 閱讀 1577

linux tmpfs的使用問題解析

在不同的版本系統檢視tmpfs分割槽的情況,有的可以查詢到,有的則不行且不報錯。如df命令,對於正常的結果如下:

tmpfs 15360 96 15264 1% /var

異常情況,則不會有該條目。

嘗試編譯測試程式利用statfs獲取掛載點的空間使用情況,在異常的情況下空間資料為0。

測試程式過程為:

1)stat獲取掛載點檔案型別

if ((s.st_mode & s_

ifmt) == s_ifblk)

mountdevice = s.st_rdev;

else

mountdevice = s.st_dev;

2)通過setmntent、getmntent、endmntent組合函式從/proc/mounts下找尋匹配的mntent節點,確定掛載點是在合法範圍的

3)statfs通過掛載點路徑,獲取掛載分割槽的屬性資料

測試程式本身應該沒有問題,在正常版本下可以獲取正確的資料。跟蹤statfs的呼叫流程:

syscall_define2(statfs, const char __user *, pathname, struct statfs__

user *, buf)->

static int vfs_statfs_

native(struct dentry *dentry, struct statfs *buf)->

int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)->

retval = dentry->d_sb->s_

op->statfs(dentry, buf);

從這裡,有理由懷疑異常版本的tmpfs實現有問題,實現在shmem.c中,開啟會發現其中有很多巨集,有些實現是按巨集區分為2份,比如與本問題相關的shmem_ops,

``` c

1)static const struct super_operations shmem_ops;/*只是1個定義未初始化*/

2)/*statfs被實現且被config_tmpfs管理*/

static const struct super_operations shmem_ops = ;

```

找到另外1個相關的巨集config_shmem,並開啟,重新編譯版本,驗證ok。

shmem.c是被預設編入核心的,但其具體功能可能會由於控制巨集開關的不同而表現不同。比如:

在config_shmem和config_

tmpfs均關閉的情況下,我們是可以使用tmpfs進行記憶體分割槽掛載的,但即使我們制定其掛載大小,對掛載分割槽的使用也是不會受限,會一致消耗記憶體直至無記憶體可用。

linux tmpfs 的使用說明

總的來說tmpfs是一種虛擬記憶體檔案系統 正如這個定義它最大的特點就是它的儲存空間在vm裡面,這裡提一下vm virtual memory vm是由linux核心裡面的vm子系統管理的東東,現在大多數作業系統都採用了虛擬記憶體 管理機制?更詳細的說明請參考 linux下面vm的大小由rm real...

使用遇到的問題 Mac Pro使用遇到問題

mac os x無法休眠?教你用pmset找出原因。如何重置 mac 上的系統管理控制器 smc mac retina 合蓋後開啟突然黑屏,長按開機鍵無反應?應該是有一次修改了系統設定,解決如下 mac os x中顯示 不顯示隱藏檔案方法 命令列 mac不能複製拷貝寫入檔案到行動硬碟,u盤怎麼辦 n...

SqlBulkCopy的使用問題

在企業資訊化的過程中,使用了分層,資料庫介質使用sqlserver,開發平台使用.net,idevs2008。建立了乙個資料庫訪問層的類dal,其中有乙個功能,就是將乙個dataset儲存到資料庫中,這裡面就用到了sqlbulkcopy這個類。開始對使用sqlbulkcopy有些認識不清,特別是其事...