您的位置:首页 > 运维架构

openwrt initramfs配置

2015-12-09 19:11 507 查看

配置

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: