Linux中的Ramdisk和Initrd

Ramdisk簡介
先簡單介紹一下ramdisk,Ramdisk是虛擬于RAM中的盤(Disk)。對于用戶來說,能把RAM disk和通常的硬盤分區(如/dev/hda1)同等對待來使用,例如:
redice # mkfs.ext2 /dev/ram0
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first.??Use tune2fs -c or -i to override.
redice # mount /dev/ram0 /mnt/rd
redice # ls /mnt/rd
lost+found
redice # mount
/dev/hda2 on / type ext3
proc on /proc type proc (rw)
/dev/ram0 on /tmp/xxx type ext2 (rw)
當然,Ramdisk和硬盤分區有其不同的地方,例如RAM disk不適合作為長期保存文件的介質,掉電后Ramdisk的內容會隨內存內容的消失而消失。Ramdisk的其中一個優勢是他的讀寫速度高,能被用作需要高速讀寫的文件。但在2.6版本后,Ramdisk的這一作用開始被tmpfs(Virtual memory file system support)取代。
回到上面的例子,我們格式化了一個ramdisk(/dev/ram0)并且將其mount到/mnt/rd目錄下,那么這個Ramdisk有多大呢?先看一下:
redice # df -h /dev/ram2
Filesystem????????????容量??已用 可用 已用% 掛載點
/dev/ram0?????????????7.8M??1.0K??7.4M???1% /mnt/rd
從上面的信息看出,ramdisk有大約7.8M的可用空間。我們再試一下另外的文件系統,重新格式化成minix分區并掛接試一下:
redice # umount /mnt/rd
redice # mkfs.minix /dev/ram0
2752 inodes
8192 blocks
Firstdatazone=90 (90)
Zonesize=1024
Maxsize=268966912
redice # mount /dev/ram0 /mnt/rd
redice # df -h /dev/ram0
Filesystem????????????容量??已用 可用 已用% 掛載點
/dev/ram0?????????????8.0M??1.0K??8.0M???1% /mnt/rd
目前看出來了,的確是8M(這同時說明,EXT2文件系統本身要占用一定的存儲空間,相比之下minix文件系統要少些),這個空間是在編譯核心時就確定下來了,在設置Ramdisk時,有一個叫?Default RAM disk size?的參數決定默認情況下Ramdisk的大小。能通過核心命令行參數(ramdisk_size)來改動這個值,例如要設置Ramdisk的大小為16M,在grub中能用:
# grub.conf -
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Redice Linux
????????root (hd0,0)
????????kernel /vmlinuz ro root=LABEL=/ hdc=ide-scsi ramdisk_size=16384
????????initrd /initrd
這樣,Ramdisk的大小就變成16M了。這個參數是Ramdisk直接編譯到核心時才能使用的,如果Ramdisk編譯為模塊,則應該使用模塊參數來設置Ramdisk的大小:
redice # insmod rd rd_size=16384


編譯到核心時,能通過下面的一些核心命令行參數來設置Ramdisk:


  • ramdisk_size - ramdisk的大小(Kbytes);

  • ramdisk - 和ramdisk_size的作用相同;

  • ramdisk_blocksize - ramdisk的塊大小,默認情況為1024;


當以模塊的形式譯時,模塊支持以下幾個加載參數:


  • rd_size - 同上面的ramdisk_size或ramdisk參數;

  • rd_blocksize - 同上面的ramdisk_blocksize;


initrd
上面已提到,Ramdisk需要先格式化然后理能使用。那么,如果核心希望使用ramdisk該怎么做呢?于是initrd產生了,initrd全稱是?initial RAM disk?,他提供一種讓核心能簡單使用Ramdisk的能力,簡單的說,這些能力包括:


  • 格式化一個 Ramdisk;

  • 加載文件系統內容到Ramdisk;

  • 將Ramdisk作為根文件系統;
    我們能將initrd形像的比作
    Norton Ghost
    備份的硬盤分區,而Linux啟動階段的Ramdisk相當于一個未格式化的硬盤分區,核心能直接將initrd的內容釋放到一個未初始化的Ramdisk里,這個過程和Ghost恢復一個分區的過程十分相似。于是,相應的內容被加載到相應的Ramdisk中,同時,這個Ramdisk也被格式化成某種由initrd格式所表達的分區格式。
    initrd和Ghost備份的分區有許多相似之處,例如,他有一定的大小,包含分區上的文件系統格式等。initrd支持的格式包括:

  • Ext2文件系統;

  • Romfs文件系統;

  • cramfs文件系統;

  • minix文件系統;


如果核心選擇了Gzip支持(通常這是默認的,在init/do_mounts_rd.c中定義的BUILD_CRAMDISK宏)還能使用Gzip壓縮的initrd。相關的代碼能在核心源碼?drivers/block/rd.c:identify_ramdisk_image?中找到。
制作initrd
制作initrd傳統的作法是通過軟盤(顯然過時了,不介紹了)、ramdisk或loop設備(/dev/loop)。通過ramdisk來制作的方法比較簡單(以ext2文件系統為例):
redice # mkfs.ext2 /dev/ram0
redice # mount /dev/ram0 /mnt/rd
redice # cp _what_you_like_??/mnt/rd????# 把需要的文件復制過去
redice # dd if=/dev/ram0 of=/tmp/initrd
redice # gzip -9 /tmp/initrd
這個過程也最能夠解釋initrd的本質,對于Linux來說,Ramdisk的一個塊設備,而initrd是這個塊設備上所有內容的“克隆”(由命令dd來完成)而生成的文件。核心中加載initrd相關的代碼則用于完成將相反的過程,即將這一個文件恢復到Ramdisk中去。
通過loop設備來制作initrd的過程:
redice # dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一個4M的空白文件
redice # losetup /dev/loop0 /tmp/initrd????????????????????# 映射到loop設備上;
redice # mkfs.ext2 /dev/loop0??????????????????????????????# 創建文件系統;
redice # mount /dev/loop0 /mnt/rd
redice # cp _what_you_like_ /mnt/rd????????????????????????# 復制需要的文件;
redice # umount /mnt/rd
redice # losetup -d /dev/loop0
redice # gzip -9 /tmp/initrd
不過,目前已有了一些更好的工具來完成這些工作,包括genromfs(uClinux里常用的工具),genext2fs,mkcramfs等。這些工具提供了一些方便研發的新特性,例如,不必上面煩索的過程,只要將文件復制到某個目錄中,將其作為根目錄,即可生成initrd;另一個重要的改進是,這些工具都能以普通用戶的身份來生成initrd。
未完,待續…(補充有關怎么加載|ARM中怎么使用initrd作為根文件系統等)
鏈接和參考文件
文件

?

原文:http://czdj2000.yo2.cn/articles/linux%E4%B8%AD%E7%9A%84ramdisk%E4%B8%8Einitrd.html

轉載于:https://www.cnblogs.com/hicjiajia/archive/2012/07/10/2582634.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379530.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

slab下kmalloc內核函數實現

文章目錄kmalloc的整體實現獲取高速緩存高速緩存獲取index總結https://blog.csdn.net/qq_41683305/article/details/124554490,在這篇文章中,我們介紹了伙伴算法、slab機制和常見的內存管理函數,接下來,我們看看kmalloc內核函數的…

PHP array_merge_recursive()函數與示例

PHP array_merge_recursive()函數 (PHP array_merge_recursive() function) array_merge_recursive() function is used to merge two or more arrays, it returns a new array with merged elements. The only difference between array_merge() and array_merge_recursive() …

標題:三羊獻瑞

標題:觀察下面的加法算式: 其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。 請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多余內容。 思路分析: 首先…

hdu 1069

地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1069 題意&#xff1a;給定若干個木塊長寬高&#xff0c;長寬高可以自己調整&#xff0c;求堆積起來最高的高度。 mark&#xff1a;枚舉所有木塊長寬高可能情況&#xff0c;簡單dp。 代碼&#xff1a; #include <…

簡明 Python 編程規范

簡明 Python 編程規范編碼 所有的 Python 腳本文件都應在文件頭標上 # -*- coding:utf-8 -*- 。設置編輯器&#xff0c;默認保存為 utf-8 格式。注釋 業界普遍認同 Python 的注釋分為兩種的概念&#xff0c;一種是由 # 開頭的“真正的”注釋&#xff0c;另一種是 docstri…

進程虛擬地址管理

文章目錄1 地址分布實際使用中的內存區域2 進程的虛擬地址描述用戶空間mmap線程之間共享內存地址的實現機制1 地址分布 現在采用虛擬內存的操作系統通常都使用平坦地址空間&#xff0c;平坦地址空間是指地址空間范圍是一個獨立的連續空間&#xff08;比如&#xff0c;地址從0擴…

java兩個文件夾比較路徑_比較Java中兩個文件的路徑

java兩個文件夾比較路徑Given the paths of the two files and we have two compare the paths of the files in Java. 給定兩個文件的路徑&#xff0c;我們有兩個比較Java中文件的路徑。 Comparing paths of two files 比較兩個文件的路徑 To compare the paths of two file…

標題:加法變乘法

標題&#xff1a;我們都知道&#xff1a;123 … 49 1225 現在要求你把其中兩個不相鄰的加號變成乘號&#xff0c;使得結果為2015 比如&#xff1a; 123…10*1112…27*2829…49 2015 就是符合要求的答案。 請你尋找另外一個可能的答案&#xff0c;并把位置靠前的那個乘號左…

C# winform對話框用法大全收藏

對話框中我們常用了以下幾種&#xff1a; 1、文件對話框(FileDialog) 它又常用到兩個&#xff1a; 打開文件對話框(OpenFileDialog) 保存文件對話(SaveFileDialog) 2、字體對話框(FontDialog) 3、顏色對話框(&#xff23;olorDialog) 4、打印預瀏對話框(PrintPreviewDialog) 5、…

【翻譯】eXpressAppFramework QuickStart 業務模型設計(四)—— 實現自定義業務類...

這一講&#xff0c;你將學到如何從頭開始實現業務類。為此&#xff0c;將要實現Department和Position業務類。這些類將被應用到之前實現的Contact類中。你將學到引用對象自動生成用戶界面的基本要素。 在此之前&#xff0c;我建議你去閱讀一下 【翻譯】eXpressAppFramework Qui…

內存重映射

文章目錄1 kmap2 映射內核內存到用戶空間使用remap_pfn_range使用io_remap_pfn_rangemmap文件操作建立VMA和實際物理地址的映射mmap 之前分配 一次性映射mmap 之前分配 Page FaultPage Fault 中分配 映射內核內存有時需要重新映射&#xff0c;無論是從內核到用戶空間還是從內…

math.sqrt 有問題_JavaScript中帶有示例的Math.sqrt()方法

math.sqrt 有問題JavaScript | Math.sqrt()方法 (JavaScript | Math.sqrt() Method) The Math.sqrt() method is inbuilt in JavaScript to find the square root of a number. In this tutorial, we will learn about the sqrt() method with examples. JavaScript中內置了Mat…

標題:移動距離

標題&#xff1a;移動距離 X星球居民小區的樓房全是一樣的&#xff0c;并且按矩陣樣式排列。其樓房的編號為1,2,3… 當排滿一行時&#xff0c;從下一行相鄰的樓往反方向排號。 比如&#xff1a;當小區排號寬度為6時&#xff0c;開始情形如下&#xff1a; 1 2 3 4 5 6 12 11 1…

ISAPI Rewrite 實現簡單url重寫、二級域名重寫

實現步驟&#xff1a; 第一步&#xff1a;下載ISAPI_Rewrite.rar&#xff0c;將Rewrite文件夾和httpd.ini直接放在項目根目錄下面。 第二步&#xff1a;IIS配置&#xff0c;篩選Rewrite文件夾里面的Rewrite.dll文件&#xff0c;如圖&#xff1a; 第三步&#xff1a;在httpd.ini…

用戶登錄

用戶登錄 代碼namespace 用戶登錄 {public partial class Form1 : Form{public Form1(){InitializeComponent();}bool b1, b2, b3, b4, b5, b6;private void button1_Click(object sender, EventArgs e){try{if (b1 && b2 && b3 && b4 && b5 &…

進程上下文和中斷上下文

文章目錄進程的preempt_count變量thread_infopreempt_counthardirq相關softirq相關上下文原文鏈接&#xff1a; https://zhuanlan.zhihu.com/p/88883239進程的preempt_count變量 thread_info 在內核中&#xff0c;上下文的設置和判斷接口可以參考 include/linux/preempt.h 文…

標題:湊算式

標題&#xff1a;湊算式 這個算式中AI代表19的數字&#xff0c;不同的字母代表不同的數字。 比如&#xff1a; 68/3952/714 就是一種解法&#xff0c; 53/1972/486 是另一種解法。 這個算式一共有多少種解法&#xff1f; 注意&#xff1a;你提交應該是個整數&#xff0c;不要…

匯編中imul_JavaScript中帶有示例的Math.imul()方法

匯編中imulJavaScript | Math.imul()方法 (JavaScript | Math.imul() Method) Math.imul() is a function in math library of JavaScript that is used to the 32-bit multiplication of the two values passed to it. It uses C-like semantics to find the multiplication. …

AFTER觸發器與INSTEAD OF觸發器的區別

INSTEAD OF 觸發器用來代替通常的觸發動作&#xff0c;即當對表進行INSERT、UPDATE 或 DELETE 操作時&#xff0c;系統不是直接對表執行這些操作&#xff0c;而是把操作內容交給觸發器&#xff0c;讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此&#xff0c;…

Linux內存地址管理

文章目錄系統內存布局內核地址的低端和高端內存概念低端內存高端內存地址轉換和MMULinux中的四級分頁模型虛擬地址字段頁表處理將虛擬地址轉換物理地址Linux系統中的每個內存地址都是虛擬的&#xff0c;它們不直接指向任何物理內存地址。每當訪問內存位置時&#xff0c;可以執行…