linux內存文件系統之指南

https://www.bbsmax.com/A/A7zgEZAn54/

linux內存文件系統之指南

 午夜稻草人  2013-11-12  原文

內存文件系統使用及示例:ramdisk, ramfs, tmpfs 
第一部分
在Linux中可以將一部分內存mount爲分區來使用,通常稱之爲RamDisk。 
RamDisk有三種實現方式: 
第一種就是傳統意義上的,可以格式化,然後加載。 
這在Linux內核2.0/2.2就已經支持,其不足之處是大小固定,之後不能改變。 
爲了能夠使用Ramdisk,我們在編譯內核時須將block device中的Ramdisk支持選上,它下面還有兩個選項,一個是設定Ramdisk的大小,默認是4096k;另一個是initrd的支持。 
如果對Ramdisk的支持已經編譯進內核,我們就可以使用它了: 
查看一下可用的RamDisk,使用ls /dev/ram* 
首先創建一個目錄,比如test,運行mkdir /mnt/test; 
然後對/dev/ram0 創建文件系統,運行mke2fs /dev/ram0; 
最後掛載 /dev/ram0,運行mount /dev/ram /mnt/test,就可以象對普通硬盤一樣對它進行操作了。

更詳細的內容可以參考: http://www.linuxfocus.org/ChineseGB/November1999/article124.html                                                 http://www.vanemery.com/Linux/Ramdisk/ramdisk.html

另兩種則是內核2.4才支持的,通過Ramfs或者Tmpfs來實現: 
它們不需經過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。

Ramfs顧名思義是內存文件系統,它它處於虛擬文件系統(VFS)層,而不像ramdisk那樣基於虛擬在內存中的其他文件系統(ex2fs)。

因而,它無需格式化,可以創建多個,只要內存足夠,在創建時可以指定其最大能使用的內存大小。 
如果你的Linux已經將Ramfs編譯進內核,你就可以很容易地使用Ramfs了。創建一個目錄,加載Ramfs到該目錄即可: 
                  # mkdir  /testRam 
                  # mount -t ramfs none /testRAM 
缺省情況下,Ramfs被限制最多可使用內存大小的一半。可以通過maxsize(以kbyte爲單位)選項來改變。 
                  # mount -t ramfs none /testRAM -o maxsize=2000 (創建了一個限定最大使用內存爲2M的ramdisk)

Tmpfs是一個虛擬內存文件系統,它不同於傳統的用塊設備形式來實現的Ramdisk,也不同於針對物理內存的Ramfs。 
  Tmpfs可以使用物理內存,也可以使用交換分區。在Linux內核中,虛擬內存資源由物理內存(RAM)和交換分區組成,這些資源是由內核中的虛擬內存子系統來負責分配和管理。 
  Tmpfs向虛擬內存子系統請求頁來存儲文件,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在內存中還是在交換分區中。同Ramfs一樣,其大小也不是固定的,而是隨着所需要的空間而動態的增減。 
   使用tmpfs,首先你編譯內核時得選擇"虛擬內存文件系統支持(Virtual memory filesystem support)" 。 
  然後就可以加載tmpfs文件系統了: 
            # mkdir -p /mnt/tmpfs 
            # mount tmpfs /mnt/tmpfs -t tmpfs 
  同樣可以在加載時指定tmpfs文件系統大小的最大限制: 
           # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

使用df -aT命令可以看到有個/dev/shm目錄,該目錄的文件系統是tmpfs的,因此這個目錄下的文件訪問是非常快的,但是其大小可能不同機器都不一樣,而且每次重啓後文件也就丟失了。

第二部分
LINUX下我所接觸過的內存文件系統有三個:

(1)ramdisk,使用前需要先創建文件系統,並且調整文件系統大小比較麻煩,需要修改內核引導參數並重新啓動操作系統,在繁雜多變的應用與需要 7X24不間斷運行的系統來說,並不是一個可以接受的選擇.好處是自2.0版本起內核便支持(這也算好處?嗯,確實算,如果你手頭真有這樣的系統的話)

(2)ramfs,使用前不需要去創建文件系統了,直接通過mount的方式即可掛載上來用,需要的時候可以使用"mount -o remount,maxsize=..."這種方式來調整大小.

(3)tmpfs,同ramfs在表面上基本上一樣啦,不同於ramfs針對"物理內存",tmpfs是在虛擬內存下分配空間的,也就是說tmpfs實例中存儲的文件既可能存在於物理內存中,也可能存在於交換分區中,具體存在哪裏,是由"虛擬內存子系統"來調度的.

純性能角度講,ramfs會在進程佔用內存使用較多的情況下會優於tmpfs,在沒有交換分區或進程佔用內存較小而不發生swap行爲的情況下,兩者性能不會有差異(這個結論沒有實測過,我"想當然"用猜的)

基本情況介紹完畢,下面介紹tmpfs的應用,(沒辦法,我手頭機器內存不是那麼寬裕...)

0,根據需要創建掛載目錄,例:

mkdir -p $DIR_TMP;

1,掛載

mount my_tmpfs $DIR_TMP -t tmpfs -o size=512m

my_tmpfs這個名字需要起,一個標識而已,會出現在df 的Filesytem一列,起個別致點的名字比較容易被自己寫的其它監控腳本找到,如果非要起個none或tmpfs之類的名字的話...反正系統默認掛載的tmpfs都比較喜歡用這兩個名字,好壞自己琢磨吧.

成功以後自己用df 看一下就知道了,寫監控腳本時可以用"df -t tmpfs|grep ^my_tmpfs"來找到這一行.

2,調整

應用中如果感覺不合適,隨時可以用mount命令調整

mount $DIR_TMP -o remount,size=1024m,nr_inodes=100k

nr_inodes爲最大節點數,如果你的$DIR_TMP使用df命令查看明明有空間,卻無法創建新文件(例如touch一個新文件),可能是文件節點用到上限了,可以用"df -i"命令來查看,如果是有空間但節點達到上限,就需要用nr_inodes來調整了.

其它可以調整的參數:
mode,uid,gid,
        uid和gid就不多說了,不知道的回家補基礎,mode也不多說了,取值是3個八進制數字,表示許可權限,不知道這個的也回家...
其它參數,參見mount命令的man page之OPTIONS一節中"-o"參數的說明.

3,卸載

umount $DIR_TMP

4,其它

mount 命令的man page中對tmpfs提及不多,詳細一些的文檔,請參閱內核文檔Documentation/filesystems/tmpfs.txt(內核源代碼目錄內)

當任何目錄有 mount, 然後有程序使用/掛在那個目錄上的話, 就沒有辦法 umount 掉,  umount 時會出現 Device is busy 的訊息,解決方法

fuser -m -v -i -k 目錄路徑 # 會問你是不是要把相關的進程kill掉, 選 y 就會 kill 掉

linux內存文件系統之指南的更多相關文章

  1. 淺談Linux內存管理機制

    經常遇到一些剛接觸Linux的新手會問內存佔用怎麼那麼多?在Linux中經常發現空閒內存很少,似乎所有的內存都被系統佔用了,表面感覺是內存不夠用了,其實不然.這是Linux內存管理的一個優秀特性,在這 ...

  2. linux內存管理

    一.Linux 進程在內存中的數據結構 一個可執行程序在存儲(沒有調入內存)時分爲代碼段,數據段,未初始化數據段三部分:    1) 代碼段:存放CPU執行的機器指令.通常代碼區是共享的,即其它執行程 ...

  3. Spark入門實戰系列--10.分佈式內存文件系統Tachyon介紹及安裝部署

    [注]該系列文章以及使用到安裝包/測試數據 可以在<傾情大奉送--Spark入門實戰系列>獲取 .Tachyon介紹 1.1 Tachyon簡介 隨着實時計算的需求日益增多,分佈式內存計算 ...

  4. Linux及文件系統基本介紹

    Linux及文件系統基本介紹 1   互聯網行業現狀 在服務器端市場: 超級計算機 2014年11月的數據顯示前500系統中的485個系統都在運行着 Linux 的發佈系統,而僅僅只有一臺運行着 Wi ...

  5. Linux內存管理原理

    本文以32位機器爲準,串講一些內存管理的知識點. 1. 虛擬地址.物理地址.邏輯地址.線性地址 虛擬地址又叫線性地址.linux沒有采用分段機制,所以邏輯地址和虛擬地址(線性地址)(在用戶態,內核態邏 ...

  6. linux內存分配

    在linux的內存分配機制中,優先使用物理內存,當物理內存還有空閒時(還夠用),不會釋放其佔用內存,就算佔用內存的程序已經被關閉了,該程序所佔用的內存用來做緩存使用,對於開啓過的程序.或是讀取剛存取過 ...

  7. [20150925]Linux之文件系統與SHELL

    Linux之文件系統與SHELL 文件系統介紹 ext2/ext3/ext4 Ext2是GNU/Linux系統中標準的文件系統.這是Linux中使用最多的一種文件系統,它是專門爲Linux設計的,擁有 ...

  8. 文件系統管理 之 Linux 創建文件系統及掛載文件系統流程詳解

    閱讀此文,必須具備知識點:<Linux 查看磁盤分區.文件系統.使用情況的命令和相關工具介紹><實例解說 fdisk 使用方法><合理規劃您的硬盤分區><Fe ...

  9. 瞭解linux內存管理機制(轉)

    今天瞭解了下linux內存管理機制,在這裏記錄下,原文在這裏http://ixdba.blog.51cto.com/2895551/541355 根據自己的理解畫了張圖: 下面是轉載的內容: 一 物理 ...

隨機推薦

  1. stm32新建工程詳細步驟

    記得好早以前爲了建一個keil的工程折騰了好久,在這裏寫寫基本的Keil工程創建方法,以防自己以後再忘記: 新建工程 保存工程 選擇器件 在這邊新建文件夾,然後就是添加程序代碼到裏面去了.其中一些文件 ...

  2. IDEA中maven搭建Spring+SpringMVC+mybatis項目

    一.介紹 使用IDEA搭建maven web項目,整合框架Spring+SpringMVC+mybatis 項目結構圖:

  3. java web工程 數據庫操作報驅動類找不到的錯誤

    這幾天在進行數據庫的操作,寫好數據庫操作類後,用測試類測試成功通過,但是部署到tomcat後,從頁面訪問就會報異常. 最後終於發現是tomcat使用了連接池的數據連接方式. 解決方法是把jdbc ja ...

  4. CodeForces 450B 矩陣

    A - Jzzhu and Sequences Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  5. python中獲取當前所有的logger

    獲得當前所有logger的列表的程序如下: import logging for name in logging.Logger.manager.loggerDict.keys(): logger = ...

  6. &lt;一道題&gt;abc+cba=1333,求滿足條件的abc的值,隱含條件a!=0,c!=0

    這類東西,無非就是窮舉法.見下面代碼: #include <stdio.h> #include <stdlib.h> /* *abc + cba = 1333 * *a = ? ...

  7. 《如何將windows上的軟件包或文件上傳到linux服務上》

    昨天晚上朋友讓我幫他簡單的搭建個環境,他公司讓他做款軟件測試溫度的,他自己搞的是嵌入式,在公司擔任的是軟件工程師,應屆畢業生.也可能他們搞嵌入式的對這個linux系統不太熟,不會把windows上的軟 ...

  8. LR_問題_控制器不能使用定義的負載生成器

    問題描述 在controller 中設置了面向目標的方案後 執行提示 The target you defined cannot be reached.the LoadRunner Controlle ...

  9. MySQL CURDATE() 函數

    定義和用法 CURDATE() 函數返回當前的日期. 語法 CURDATE() 實例 例子 1 下面是 SELECT 語句: SELECT NOW(),CURDATE(),CURTIME() 結果類似 ...

  10. 轉(NLP必讀)

    如果你剛接觸自然語言處理並對她感興趣,最好讀幾本這方面的書籍,除了能讓你知道自然語言處理各個領域是幹什麼的外,還能培養一下NLP的感覺.以下四本書是我讀研期間閱讀和接觸過的,如果您還有好書推薦,歡迎補 ...


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章