openwrt initramfs配置
2015-12-09 19:11
507 查看
配置
make menuconfig1、选择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)) |
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 等等。 |
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() |
相关文章推荐
- 使用延迟处理闪光灯的亮灭,关于looper的使用
- tornado.ioloop.IOLoop相关文章
- Linux服务之ansible自动化
- Could not find Developer Disk Image
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
- Linux cmake入门使用
- Shell Script demo_01
- Linux常用到的命令
- 这样查看告警邮件要慢一点……
- linux下安装node出现的node命令找不到,express命令找不到的问题,解决方法。
- 监控内存溢出lib
- MQTT学习1——CentOS下安装Mosquitto
- Linux下mysql数据库的自动备份与还原
- errno.h linux errno
- 自己用过的linux命令
- Android sensor架构(二)SystemSensorManager以及JNI、sensorService(and5.1)
- shell获取指定日期前(后)N天日期
- linux基础(八)----linux命令系统学习----其它命令
- linux基础(八)----linux命令系统学习----其它命令