<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    linux中的rootfs/initrd/ramfs/initramfs

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    什么是ramfs?
    ramfs是空間規模動態變化的RAM文件系統。它非常簡單,是用來實現Linux緩存機制(緩存page cache and dentry cache)的文件系統
    通常情況下,Linux的所有文件在內存中都有緩存。需要讀取的數據頁從支撐存儲設備(block device)中讀取后,緩存于內存。在支撐存儲設備中的數據頁執行marked as clean操作。當虛擬文件系統需要支撐存儲設備中的數據頁內存時,可以釋放。基于同樣的機制,支撐存儲設備的寫入操作(寫入文件然后寫回支撐存儲設備,marked as clean)后,也可以釋放占用的數據頁內存。對于文件目錄占用的緩存(dentry: directory entry),也存在同樣的機制。
    但是,ramfs中不需要支撐存儲設備(沒有支撐緩存,但是有緩存)。也就是說,寫入ramfs的文件可以正常的分配page cache and dentry cache,但是不能寫入支撐存儲設備。這些page cache and dentry cache不能被VM釋放、回收。
    由于ramfs可以基于現有的Linux的文件系統結構,用于實現ramfs的代碼很小。一般而言,支撐存儲設備的緩存被安裝為一個文件系統。所以,ramfs不能通過menuconfig選擇,是必然進入內核的。
    在ramfs的下面可以一直寫入數據,直到寫滿內存為止。由于VM(Vitual Memory)認為文件應該被寫回支撐存儲設備,而不是交換空間(swap space),所以VM不能釋放ramfs分配的內存。從而,只有root用戶(or trusted user)才能進行ramfs寫操作。
    -------------------------------------------------------------------------------
    什么是ram disk?
    "ram disk"是一種實現文件系統的支撐存儲(塊設備)的、過時的機制(2.6不用了),就是在RAM上面開辟的綜合塊設備(synthetic block device)。ram disk的大小是固定的,安裝的文件系統大小(不是ramfs)也是固定的。ram disk的使用需要從這個假的塊設備到page cache之間拷貝內存,生成和銷毀dentry,而且需要文件系統的驅動格式化和解釋上面的數據,所以ram disk的機制不再使用。
    與ramfs相比,ram disk浪費了內存,也浪費了內存總線的帶寬。同時,ram disk還為CPU加重了不必要的負擔,污染了CPU的cache(盡管有避免污染的方法,但是非常耗費資源)。ramfs機制非常自然,因為文件訪問可以通過page cache and dentry cache。ram disk被棄用的另外一個原因是環回設備(loopback)引入。環回設備提供了一種更加靈活、方便的從文件而不是從內存塊中創建綜合塊設備的方法。
    -------------------------------------------------------------------------------
    什么是tmpfs?
    tmpfs是ramfs的衍生物,用來限制緩存大小、向swap空間寫入數據。它是用來保存VM所有文件的文件系統。tmpfs中緩存的內容全部是臨時的。一旦卸載,所有的內容都會遺失。它把所有的緩存置于內核,它的規模隨著文件的規模同步變化。但是它規模有大小限制,可以修改。它可以把當前不再需要的頁寫入到swap空間。
    -------------------------------------------------------------------------------
    什么是rootfs?
    rootfs是ramfs的特殊實例,在2.6的內核中必然存在。rootfs不能被卸載(與其添加特殊代碼用來維護空的鏈表,不如把rootfs節點始終加入,因此便于kernel維護:簡單、精煉。rootfs是ramfs的一個空實例,占用空間極小)。大部分其他的文件系統安裝于rootfs之上
    -------------------------------------------------------------------------------
    什么是initramfs?
    2.6的Linux內核包含有gzip壓縮的cpio格式的文檔,可以在內核引導的時候解壓縮為rootfs。在解壓縮后,kernel將檢查rootfs中是否包含init文件。如果init文件存在,內核就會執行這個文件,并且賦予PID=1的進程號。這個init程序將整個系統引導起來,包括定位并且安裝真正的root設備。如果在cpio文檔解壓縮后的rootfs中沒有init程序(init文件),內核執行舊的代碼,定位并且安裝root分區,執行/sbin/init程序。
    -------------------------------------------------------------------------------
    initramfs與initrd的區別
    1. initrd是一個單獨的文件;initramfs和Linux內核鏈接在一起(/usr目錄下的程序負責生成initramfs文檔)。
    2. initrd是一個壓縮的文件系統映像(可以是ext2等,需要內核的驅動);initramfs是類似tar的cpio壓縮文檔。內核中的cpio解壓縮代碼很小,而且init數據在boot后可以丟棄。
    3. initrd運行的程序(initd,不是init)進行部分setup后返回內核;initramfs執行的init程序不返回內核(如果/init需要向內核傳遞控制權,可以再次安裝在/目錄下一個新的root設備并且啟動一個新的init程序)。
    4. 切換到另一個root設備時,initrd執行pivot_root后,卸載ramdisk;initramfs是rootfs,既不能pivot_root,也不能卸載。
    initramfs會刪掉rootfs的所有內容(find -xdev / -exec rm '{}' ';'),再次安裝root到rootfs(cd /newmount; mount --move . /; chroot .),把stdin/sdout/stderr掛在新的/dev/console上,重新執行init。由于這是一個相當困難的實現過程(包括在使用一個命令之前把它刪除),所以klibc工具包引入一個幫助程序/utils/run_init.c來執行上述過程。其他大部分工具包(包括busybox)把這個命令稱為"switch_root"。
    -------------------------------------------------------------------------------

    initial RAM disk

      Linux初始 RAM磁盤(initrd)是在系統引導過程中掛載的一個臨時根文件系統,用來支持兩階段的引導過程。initrd文件中包含了各種可執行程序和驅動程序,它們可以用來掛載實際的根文件系統,然后再將這個 initrd RAM 磁盤卸載,并釋放內存。在很多嵌入式Linux 系統中,initrd 就是最終的根文件系統。

    -------------------------------------------------------------------------------
    Populating initramfs
    2.6的內核缺省情況下總是生成一個gzipped的cpio文檔,并且和內核鏈接在一起。這個文檔缺省是空的,在X86環境下的大小是134字節。
    CONFIG_INITRAMFS_SOURCE配制參數指定initramfs文檔的源,并且自動的嵌入到二進制文件中。這個參數可以指向一個gzipped的cpio文檔,一個包含文件的目錄,或者文件描述的文本文件。例如文本文件:
       dir /dev 755 0 0
       nod /dev/console 644 0 0 c 5 1
       nod /dev/loop0 644 0 0 b 7 0
       dir /bin 755 1000 1000
       slink /bin/sh busybox 777 0 0
       file /bin/busybox initramfs/busybox 755 0 0
       dir /proc 755 0 0
       dir /sys 755 0 0
       dir /mnt 755 0 0
       file /init initramfs/init.sh 755 0 0
    在內核編譯完成后,可以執行/usr/gen_init_cpio命令獲得cpio文檔。配置文件的一個優勢是不需要root權限,也不需要在新的文檔中生成設備節點。在上述文檔中的兩個file命令用來發現initramfs目錄下面的init.sh文件和busybox文件。內核不需要外部的cpio工具實現initramfs的cpio文檔。如果在配置時指定了一個目錄而不是一個描述文件,內核編譯時將從這個目錄生成一個描述文件(作為/usr/gen_init_cpio.c的輸入)。內核編譯時cpio生成代碼和內核渾然一體,boot時解壓縮程序也和內核渾然一體。
    如果不使用配置文件或者配置目錄,而使用定制的cpio文檔時,需要外部的cpio工具。例如下面的命令可以從cpio映像文件抽取包含的文件、壓縮cpio映像文件:
        cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames   
    下面的shell腳本可以生成一個定制的cpio.gz文檔,可以用來代替配置文件生成的cpio文檔:
       #!/bin/sh
       if [ $# -ne 2 ]
       then
         echo "usage: mkinitramfs directory imagename.cpio.gz"
         exit 1
       fi
       if [ -d "$1" ]
       then
         echo "creating $2 from $1"
         (cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
       else
         echo "First argument must be a directory"
         exit 1
       fi

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全