Linux┊詳解Linux Initrd

來源:互聯網
上載者:User

 在Linux作業系統中,有一項特殊的功能——初始化記憶體盤INITRD(INITial Ram Disk)技術,而且核心支援壓縮的檔案系統映像。有了這兩項功能,我們可以讓Linux系統從小的初始化記憶體盤啟動,並把系統記憶體的一部分作為根檔案系統掛載。

  Ramdisk就是將記憶體的一部分分配為一個分區並作為硬碟來使用。對於系統運行時不斷使用的程式,將它們放在Ramdisk中將加快電腦的操作,如大資料量的網路伺服器、無盤工作站等。為了能夠使用Ramdisk,我們在編譯核心時須將block device中的Ramdisk支援選上,它下面還有兩個選項,一個是設定Ramdisk的大小,預設是4096k;另一個是設定預設個數。如果要使用initrd,還得選上的支援。它既可以直接編譯進核心,也可以編譯成模組,在需要的時候載入。我們由於在啟動時就用它,所以必須將它直接編譯進核心。

  下面是2.6核心對模組選擇路徑:

  Linux Kernel Configuration
      -> Device Drivers
        ->Block devices
          ->RAM block device support
            ->Default number of RAM disks  (設定Ramdisk的個數,預設是16)
            ->Default RAM disk size (kbytes) (設定Ramdisk的大小,預設是4096k)

  Linux Kernel Configuration
      ->General setup
        ->Inital RAM filesystem and RAM disk(initramfs/initrd) support

  如果對Ramdisk的支援已經編譯進核心,我們就可以使用它了。首先在/mnt目錄下建立目錄ram,運行mkdir /mnt/ram;然後對/dev/ram0建立檔案系統,運行mke2fs /dev/ram0;最後掛載上/dev/ram,運行mount /dev/ram0 /mnt/ram,就可以象對普通硬碟一樣對它進行操作了。值得注意的是,在建立檔案系統的時候,在螢幕上輸出1024 inodes ,4096 blocks,即ramdisk大小為4M=4096個塊,但是我們掛載上之後,用命令df –k
/dev/ram查看時,顯示出來ramdisk大小隻有3963K,這是由於檔案系統本身佔用了一些空間。(這個空間是在編譯核心時就由Default RAM disk size (kbytes)確定下來)

  我們能根據需要改變ramdisk的大小。如我們要把預設的4M增大到8M,當ramdisk是直接編譯進核心的情況下,可在grub設定檔 grub.conf中加入ramdisk=8192 ,運行grub後,重啟電腦後,ramdisk大小變為8M。

  例如要設定Ramdisk的大小為8M,在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=8192
        initrd /initrd

  這樣Ramdisk的大小就變成16M了。這個參數是Ramdisk直接編譯到核心時才能使用的,如果Ramdisk編譯為模組,則應該使用模組參數來設定Ramdisk的大小:

  a、在模組載入設定檔 /etc/modules.conf中加入一行:

  options rd rd_size=8192,

  b、在載入rd模組是在後面加上說明,即insmod rd rd_size=8192。

  # insmod rd rd_size=8192
 
  編譯到核心時,可以通過下面的一些核心命令列參數來配置Ramdisk:

  ramdisk_size – ramdisk的大小(Kbytes);
  ramdisk – 與ramdisk_size的作用相同;
  ramdisk_blocksize – ramdisk的塊大小,預設情況為1024;

  當以模組的形式譯時,模組支援以下幾個載入參數:

  rd_size – 同上面的ramdisk_size或ramdisk參數;
  rd_blocksize – 同上面的ramdisk_blocksize;
 
  或者在啟動是作為啟動行參數ramdisk=8192;

  建立initrd ramdisk 映像

  上面已經提到,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和cpio格式(這種格式的好處是核心原生不需要額外的檔案系統支援)

  製作initrd傳統的作法是通過磁碟片(顯然過時了,不介紹了)、ramdisk或loop裝置(/dev/loop)。通過ramdisk來製作的方法比較簡單(以ext2檔案系統為例):

  通過ramdisk

  # mkfs.ext2 /dev/ram0
  # mount /dev/ram0 /mnt/rd
  # cp _what_you_like_  /mnt/rd    # 把需要的檔案複製過去 
  # dd if=/dev/ram0 of=/tmp/initrd
  # gzip -9 /tmp/initrd

  這個過程也最能夠解釋initrd的本質,對於Linux來說,Ramdisk的一個塊裝置,而initrd是這個塊裝置上所有內容的“複製”(由命令dd來完成)而產生的檔案。核心中載入initrd相關的代碼則用於完成將相反的過程,即將這一個檔案恢複到Ramdisk中去。

  通過loop裝置來製作initrd的過程:

  dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 製作一個4M的空白檔案
  losetup /dev/loop0 /tmp/initrd                    # 映射到loop裝置上;
  mkfs.ext2 /dev/loop0                              # 建立檔案系統;
  mount /dev/loop0 /mnt/rd
  cp _what_you_like_ /mnt/rd                        # 複製需要的檔案;
  umount /mnt/rd
  losetup -d /dev/loop0
  gzip -9 /tmp/initrd

  通過cpio來製作initrd的過程:

  cd /path/to                    # 到需要複製的檔案的目錄
  find . |cpio -o -H newc |gzip -c > ../initrd.gz

  不過,現在已經有了一些更好的工具來完成這些工作,包括genromfs(uClinux裡常用的工具),genext2fs,mkcramfs、mkinitrd等。這些工具提供了一些方便開發的新特性,例如,不需要上面煩索的過程,只要將檔案複製到某個目錄中,將其作為根目錄,即可產生initrd;另一個重要的改進是,這些工具都可以以普通使用者的身份來產生initrd。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.