zoukankan      html  css  js  c++  java
  • 关于initrd和initramfs【转】

    转自:https://abcamus.github.io/2017/01/06/%E5%85%B3%E4%BA%8Einitrd%E5%92%8Cinitramfs/

    一、initrd

    ram disk中的file system叫做initrd,全名叫做initial ramdisk。

    注意: 当下用initrams多

    如何创建initial ramisk

    host > dd if=/dev/zero of=/dev/ram0 bs=1k count=<count>
    host > mke2fs -vm0 /dev/ram0 <count>
    host > tune2fs -c 0 /dev/ram0
    host > dd if=/dev/ram0 bs=1k count=<count> | gzip -v9 > ramdisk.gz
    

    这段代码就创建了大小为count的ramdisk

    创建完之后还要添加哪些东西

    还要添加一些必要的文件让他工作,可能是库,应用程序等。例如busybox。

    host $ mkdir mnt
    host $ gunzip ramdisk.gz
    host $ mount -o loop ramdisk mnt/
    host $ ... copy stuff you want to have in ramdisk to mnt...
    host $ umount mnt
    host $ gzip -v9 ramdisk
    

    内核如何支持initial ramdisk

    #
    # General setup
    #
    ...
    CONFIG_BLK_DEV_INITRD=y
    CONFIG_INITRAMFS_SOURCE=""
    ...
    
    #
    # 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
    ...
    

    告诉uboot怎么找到她

    UBOOT # tftp 0x87000000 ramdisk.gz
    UBOOT # erase 0x2200000 +0x<filesize>
    UBOOT # cp.b 0x87000000 0x2200000 0x<filesize>
    
    UBOOT # setenv bootargs ... root=/dev/ram0 rw initrd=0x87000000,8M
    UBOOT # setenv bootcmd cp.b 0x2200000 0x87000000 0x<filesize>; bootm
    UBOOT # saveenv
    

    注意: ramdisk 中要有ram0节点

    brw-rw---- 1 root disk 1, 0 Sep 11 1999 /dev/ram0
    

    最后启动内核

    二、initramfs

    initramfs相当于把initrd放进了内核,通过cpio(这是一个文件处理工具)实现。

    如何创建

    比initrd简单多了

    host > mkdir target_fs
    host > ... copy stuff you want to have in initramfs to target_fs...
    

    注意:

    1. initramfs中的cpio系统不能处理hard link,用soft link
    2. 顶层必须有个init程序,这是kernel要用的,可以这么做
    /init -> /bin/busybox
    

    接着

    host > cd target_fs
    host > find . | cpio -H newc -o > ../target_fs.cpio
    

    内核支持

    #
    # 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
    

    然后执行make uImage的时候就被包含到kernel中了。

    uboot支持

    因为已经在kernel中了,不需要像initrd一样通过参数 root=/xxx rw initrd=xxx来告诉uboot了

    三、比较

    1. initrd方式中kernel和initial file system为独立的部分,互不影响,下载的时候镜像也小。
    2. 创建修改initramfs比initrd容易。
    3. 在烧写的时候,显然一个镜像更容易管理。

    参考文献

    Initrd Wiki

    【作者】张昺华
    【大饼教你学系列】https://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    如何结合后台数据库 启动vue项目
    nodejs卸载安装
    mysql安装过程
    VUE-cli脚手架
    css伪类
    element中遇到的表格问题总结
    小程序折叠面板的功能
    vue学习中遇到的onchange、push、splice、forEach方法使用
    vscode好用的扩展及常用的快捷键
    Flutter之SliverAppBar
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13737350.html
Copyright © 2011-2022 走看看