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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM