• Initramfs/initrd与uboot的bootargs启动参数的瓜葛【转】


    转自:http://blog.chinaunix.net/uid-29616823-id-4405454.html

    原文地址:http://blog.csdn.net/laohuang1122/article/details/8240451

    initramfs概述
    initramfs与initrd类似,也是初始化好了且存在于ram中的,可以压缩也可以不压缩。但是目前initramfs只支持cpio包格式,它会被populate_rootfs->unpack_to_rootfs(&__initramfs_start, &__initramfs_end - &__initramfs_start, 0)函数(解压缩、)解析、安装。

    initramfs与initrd区别
    (1) Linux内核只认cpio格式的initramfs文件包(因为unpack_to_rootfs只能解析cpio格式文件),非cpio格式的 initramfs文件包将被系统抛弃,而initrd可以是cpio包也可以是传统的镜像(image)文件,实际使用中initrd都是传统镜像文件。

    (2) initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被 bootloader加载到ram中,而initrd是另外单独编译生成的,是一个独立的文件,它由bootloader单独加载到ram中内核空间外的地址,比如加载的地址为addr(是物理地址而非虚拟地址),大小为8MB,那么只要在命令行加入"initrd=addr,8M"命令,系统就可以找到 initrd(当然通过适当修改Linux的目录结构,makefile文件和相关代码,以上两种情况都是可以相通的)。

    (3) initramfs被解析处理后原始的cpio包(压缩或非压缩)所占的空间(&__initramfs_start - &__initramfs_end)是作为系统的一部分直接保留在系统中,不会被释放掉,而对于initrd镜像文件,如果没有在命令行中设置"keepinitd"命令,那么initrd镜像文件被处理后其原始文件所占的空间(initrd_end - initrd_start)将被释放掉。

    (4) initramfs可以独立ram disk单独存在,而要支持initrd必须要先支持ram disk,即要配置CONFIG_BLK_DEV_INITRD选项 -- 支持initrd,必须先要配置CONFIG_BLK_DEV_RAM -- 支持ram disk ,因为initrd image实际就是初始化好了的ramdisk镜像文件,最后都要解析、写入到ram disk设备/dev/ram或/dev/ram0中。
    注: 使用initramfs,命令行参数将不需要"initrd="和"root="命令? YES



    initramfs利弊:
    ------------------------------------------------------
    由于initramfs使用cpio包格式,所以很容易将一个单一的文件、目录、node编译链接到系统中去,这样很简单的系统中使用起来很方便,不需要另外挂接文件系统。
    但是因为cpio包实际是文件、目录、节点的描述语言包,为了描述一个文件、目录、节点,要增加很多额外的描述文字开销,特别是对于目录和节点,本身很小额外添加的描述文字却很多,这样使得cpio包比相应的image文件大很多。




    使用initramfs的内核配置(使用initramfs做根文件系统):
    ------------------------------------------------------
    General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
    (/rootfs_dir) Initramfs source file(s)   //输入根文件系统的所在目录 

    使用initramfs的内核启动参数
    不需要"initrd="和"root="参数,但是必须在initramfs中创建/init文件或者修改内核启动最后代码(init文件是软连接,指向什么? init -> bin/busybox,否则内核启动将会失败)

    链接入内核的initramfs文件在linux-2.6.24/usr/initramfs_data.cpio.gz


    使用initrd的内核配置(使用网口将根文件系统下载到RAM -- tftp addr ramdisk.gz):
    ------------------------------------------------------
    1. 配置initrd
    General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
    () Initramfs source file(s)   //清空根文件系统的目录配置 

    2. 配置ramdisk
    Device Drivers  --->   
    Block devices  --->
    <*> RAM disk support
    (16)  Default number of RAM disks   // 内核在/dev/目录下生成16个ram设备节点
    (4096) Default RAM disk size (kbytes)
    (1024) Default RAM disk block size (bytes)

    使用 initrd的内 核启动参数:
    initrd=addr,0x400000 root=/dev/ram rw
    注:
    (1) addr是根文件系统的下载地址;
    (2) 0x400000是根文件系统的大小,该大小需要和内核配置的ramdisk size 4096 kbytes相一致;
    (3) /dev/ram是ramdisk的设备节点,rw表示根文件系统可读、可写;



    根文件系统存放在FLASH分区:
    ------------------------------------------------------
    1. 内核启动参数不需要"initrd="(也可以写成"noinitrd");
    root=/dev/mtdblock2 (/dev/mtdblock2 -- 根文件系统所烧写的FLASH分区)

    2. 内核配置不需要ram disk;也不需要配置initramfs或者initrd
    [ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support 

    注: boot的FLASH分区要和kernel的FLASH分区匹配(而非一致),需要进一步解释。








    TCP reno registered 停在这里
    ---------------------------------------------
    rootfs太大,检测发现rootfs下有垃圾(里面有包含了一份rootfs)


    下面这个大小启动成功了
    ---------------------------------------------
    root@zengxiaolong:/home/zengxiaolong/soft/s3c2410/rootfs# du -h
    4.0K    ./dev
    4.0K    ./tmp
    8.0K    ./etc/init.d
    40K    ./etc
    4.0K    ./usr
    4.0K    ./var
    4.0K    ./sbin
    2.1M    ./bin
    4.0K    ./sys
    116K    ./lib/modules
    2.8M    ./lib
    4.0K    ./proc
    4.9M    .


    initrd and initramfs
    http://blog.sina.com.cn/s/blog_622013d90100fr04.html
    ---------------------------------------------
    #
    # General setup
    #
    ...
    CONFIG_BLK_DEV_INITRD=y
    CONFIG_INITRAMFS_SOURCE="<path_to>/target_fs>"
    ...
    #
    # UBI - Unsorted block images
    #
    ...
    CONFIG_BLK_DEV_RAM=y
    CONFIG_BLK_DEV_RAM_COUNT=1
    CONFIG_BLK_DEV_RAM_SIZE=8192
    CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024


    Installation initramfs

    No special installation like with initrd is necessary. The initramfs is already in the kernel. If you start the kernel, the initramfs is already there. Therefore, there is no root=/dev/ram0 rw initrd=0x87000000,8M bootargs option necessary. Remove this if you still have it!

    http://blog.chinaunix.net/uid-488742-id-2113871.html

     
    【作者】张昺华
    【大饼教你学系列】https://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    二级目录下的SESSION共享问题
    [Leetcode 65] 120 Triangle
    JMeter学习(一)工具简单介绍
    pycham破解方法——Mac上亲测成功
    jmeter目前发现一丢丢强大的功能(未完待续,需优化)
    jmeter实现请求返回参数利用到下一个请求中
    通用化case,拿走不谢——测试之路
    mac 下pip安装python三方库的时候提示 Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate:......
    sudo pip install MySQLdb找不到该资源的原因
    软件质量管理实践总结
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13737319.html
Copyright © 2020-2023  润新知