zoukankan      html  css  js  c++  java
  • initrd和initramfs的区别

     


    Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一个临时的根文件系统,而init进程就是在initrd.img里的,然后init进程会挂载真正的根文件系统,然后umount initrd.img。但Linux2.6内核的实现方式却不太一样,虽然完成的功能是一样的。Linux2.6采用initramfs。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统,制作的方法有两个,一个是http://blog.csdn.net/htttw/article/details/7215858介绍的,但这样做出来的initramfs是和内核vmlinuz分开的,因此我们需要在grub里写上initramfs的路径。而另一种方法是把内核和initramfs制作在一起成为一个文件,方法是在linux源码make menuconfig,然后General setup-->选择Initial RAM filesystem and RAM disk (initramfs/initrd) support,然后在Initramfs source file(s)里输入我们的initramfs目录,然后make bzImage。这种方法做出来的内核就只有一个文件,不需要指定initramfs了。


    grub4dos 是根据grub-legacy 制作的,所以是没有那些功能的

    论坛中有介绍怎么制作 grub2 for dos 的,你可以找找


    1. menuentry "Ubuntu 14.04 (LTS) Live Desktop amd64" {
    2. set isofile="/boot/ubuntu-14.04-desktop-amd64.iso"
    3. loopback loop (hd0,1)$isofile
    4. linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash
    5. initrd (loop)/casper/initrd.lz
    6. }



    将rootfs打包为cpio的压缩文件,并且告诉内核它的起始和大小,当内核启动后在也不需要单独将rootfs做为一个块设备挂载了(因为这样需要内核单独为此种方式写一种驱动来支持)。
    b.与老的initrd方式的几点不同
    老的initrd image方式加载步骤。
    1.boot把Kernel以及initrd文件加载到内存/或者写入Nanflash的特定位置。
    2.Kernel判断initrd的文件格式,如果不是cpio格式,将其作为文件image处理。
    3.Kernel将initrd的内容保存在rootfs下的/initrd.image文件中。
    4.Kernel将/initrd.image的内容读入/dev/ram0设备(虚拟内存盘)中。
    5.Kernel以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
    6.如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
    7.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动,以及加载根文件系统。
    8./linuxrc执行完毕,常规根文件系统被挂载。
    9.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存在,/dev/ram0将被卸载。
    10.在常规根文件系统上进行正常启动过程 ,执行/sbin/init。

    * 问题 *

    /dev/initrd block device 建立的时候有空闲限制,維護繁瑣運作於 initrd 階段,镜像操作实际上是不断將 /dev/initrd 对应到可存取镜像系統的位置,做了不必要的資源消耗。
    initramfs 的加载步骤
    1.boot 把内核以及 rootfs.cpio.gz 文件加载到内存的位置。
    2.Kernel判断文件是否存在,如果存在,解压缩。并且内容释放到rootfs中。
    3.默认执行/init,在执行/sbin/init 启动1号进程,进入文件系统。

  • 相关阅读:
    Oracle根据两点经纬度计算距离(转载)
    TCP小见解
    git describe功能实现
    UE中基本图形的原始大小是多大
    SQL多行合并与HTML组装,不转义特殊字符
    磁盘空间不足引起ftp报"553 Could not create file"
    一键安装包安装lnmp
    宝塔面板(Linux版)安装与使用
    Redhat7-yum本地源安装配置
    Oracle数据库多个表空间使用情况查询
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/8377350.html
Copyright © 2011-2022 走看看