• openwrt initramfs配置【转】


    转自:https://blog.csdn.net/zxygww/article/details/50240189

    配置

    make menuconfig

    1、选择Target Images

    OpenWrt Configuration->TargetImages  --->[*] ramdisk  --->

    Compression(gzip)  --->

    ()   Use external cpio

    make kernel_menuconfig

    1、配置RAM block devicesupport

    Device Drivers  ---> [*] Block devices  --->

    做以下配置:

    <*>  RAM block device support

    (16)   Default number of RAM disks

    (4096) Default RAM disk size (kbytes)


    2、    General setup  --->

    Generalsetup  --->

    [*] Initial RAMfilesystem and RAM disk (initramfs/initrd) support

    ()    Initramfs source file(s)

    [*]   Support initial ramdisks compressed usinggzip

    [ ]   Support initial ramdisks compressed usingbzip2

    [ ]   Support initial ramdisks compressed usingLZMA 

    [ ]   Support initial ramdisks compressed usingLZO 

     

    需要在kernel CONFIG_CMD_LINE中配置rdinit=参数,指向特定的启动脚本。

    生成image过程:

    压缩initramfs:

    执行initramfs工作的Makefile:linux-src-code/usr/Makefile

    压缩rootfs:

    à调用scripts/gen_initramfs_list.sh将rootfs目录压缩成指定格式(gz,lzma),由以下几个宏定义(但无法选择,通常同内核压缩类型)。

    CONFIG_INITRAMFS_COMPRESSION_GZIP

    CONFIG_INITRAMFS_COMPRESSION_BZIP2

    CONFIG_INITRAMFS_COMPRESSION_LZMA

    CONFIG_INITRAMFS_COMPRESSION_LZO

    调用usr/Makefile:

    指定压缩类型

    # Lzma
    
    suffix_$(CONFIG_INITRAMFS_COMPRESSION_LZMA)   = .lzma

    指定shell脚本

    initramfs   := $(CONFIG_SHELL) $(srctree)/scripts/gen_initramfs_list.sh

    指定待压缩打包的文件及目录

    ramfs-input := $(if $(filter-out "",$(CONFIG_INITRAMFS_SOURCE)), 
    
                 $(shell echo $(CONFIG_INITRAMFS_SOURCE)),-d)

    .config定义

    CONFIG_INITRAMFS_SOURCE="PROJECT_DIR/build_dir/target-arm-openwrt-linux-uclibcgnueabi/root-broadcom PROJECT_DIR/target/linux/generic/image/initramfs-base-files.txt"

    执行initramfs压缩打包操作

    $(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
    
    $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d
    
    $(call if_changed,initfs)

    生成压缩包

    initramfs_data.cpio.lzma

    压缩内核:

    在arch/arm/boot/compressed目录下按照指定格式压缩kernel。

    在General setupàKernel compression mode (LZMA)à

    注意:需要在General setupà 页面下选择initramfs的压缩类型支持。

     

    arch/arm/boot/compressed/Makefile执行如下脚本(假设suffix_y=lzma)

    118 $(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
    
    119     $(call if_changed,$(suffix_y))

    则通过调用scripts/Kbuild.include中的if_changed来执行cmd_lzma命令

     

    204 if_changed = $(if $(strip $(any-prereq) $(arg-check)),                             
    
    205     @set -e;                                                                       
    
    206     $(echo-cmd) $(cmd_$(1));                                                       
    
    207     echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)           

                        

    脚本说明:
     
     
     
    $(if $(strip $(any-prereq) $(arg-check)), @set -e; $(echo-cmd) $(cmd_$(1));
    
    该脚本的意思是:当发现依赖的目标有更新,或者对应目标的命令行参数有变化,则执行后面的命令;@set -e表示执行有错误则退出,$(echo-cmd) 表示打印命令;$(cmd_$(1))执行cmd_lzma命令。
    
     
    
    # Find any prerequisites that is newer than target or that does not exist.
    
    # PHONY targets skipped in both cases.
    
    any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
    
    $? 表示所有比目标还要新的依赖文件;$^ 表示所有的依赖文件。
    
    # Check if both arguments has same arguments. Result is empty string if equal.
    
    arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) 
    
                        $(filter-out $(cmd_$@),   $(cmd_$(1))) )
    
    $(1) 表示arg-check后面跟的第 1 个参数;
    
    $@ 表示目标文件,这里对应piggy.lzma;
    最后 echo 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd 将上面执行的命令写入一个叫 $(dot-target).cmd 的文件中,该文件为隐藏文件,在编译后的内核源码目录及其子目录下随处可见,比如在 init/ 下可以看到 .initramfs.o.cmd, .version.o.cmd 等等。

    cmd_lzma命令在scripts/Makefile.lib文件中定义:

    239 quiet_cmd_lzma = LZMA    $@
    
    240 cmd_lzma = (cat $(filter-out FORCE,$^) | 
    
    241     lzma e -d20 -lc1 -lp2 -pb2 -eos -si -so && $(call size_append, $(filter-out FORCE,$^))) > $@ || 
    
    242     (rm -f $@ ; false)

    生成image文件

    linux-src-code/../vmlinux文件是包含了kernel和initramfs的可执行文件,可以直接在CFE中用boot命令加载到内存中执行。

    linux启动initramfs过程分析:

    按照lib/preinit/下文件名称的先后顺序执行脚本,最后跳到/sbin/preinit,或者/sbin/init

    内核函数调用顺序:

    Files

    Function

    initramfs.c

    rootfs_initcall(populate_rootfs);

    populate_rootfs()

    unpack_to_rootfs()

  • 相关阅读:
    List集合中的对象按照某个字段去重实现
    菜单--微信提醒
    fastTime从后台传过来显示格式的处理
    彻底卸载Oracle
    关于这次安装Oracle
    关于下拉选择删选最基本一例(分享内容)
    马拉松参赛人员显示(瞬逝版)
    马拉松参赛人员旧版本最终版(私藏版)
    win 10 初始环境变量
    AngularJS输出helloworld
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13804536.html
Copyright © 2020-2023  润新知