分类: LINUX
2015-05-26 15:52:43
工作记录 initrd initramfs
1. 编译内核
确认内核中包含了initrd的宏定义 大约是CONFIG_BLK_DEV_INITRD ,CONFIG_BLK_DEV_RAM。具体的跟不同的内核版本和处理器架构相关。在内核代码中,主要对应于 init 文件夹下的文档。
编译内核时,可以使用make menuconfig,make xconfig 进行配置,推荐使用make menuconfig进行配置。最后生成的配置保存于.config 文件中。
同时,如果存在已经配置好的config文件,可以拷贝成.config文件,然后再使用make menuconfig 进行之前基础上的修改。也可以直接修改.config文件中的对应项,然后使用make oldconfig 进行对应项的具体参数设定。
最后,执行make ,或者 make zImage ,make uImage(存在uboot的tools:mkimage,并设定全局变量)。在arch/boot/下会生成zImage ,在arch/boot/compress/下生成vvmlinuz
此时内核具有了initrd支持。
2. uboot
uboot 常用命令
a. tftp 用法 tftp addr name,例子 tftp 0x200000 kernel.img
tftp 命令与环境变量 serverip 和 ipaddr 密切相关
b. 环境变量 serverip 定义了tftp 的server端ip地址,通常也是nfs 的rootfs的网络地址
c. 环境变量 ipaddr 定义了本机的虚拟地址
d. 环境变量bootargs 启动linux内核时的默认命令行,包含了linux内核的启动参数
e. 环境变量bootcmd uboot 启动时无人工中断时,自动运行的命令序列
f. Run 运行环境变量中定义的 命令序列
g. Bootm 运行指定地址的 内核和initrd 例子 bootm 0x200000(内核地址) 0x10000000(initrd地址)
h. Cp 数据拷贝
Uboot 中常用的tools 是mkimage,mkimage 是 host端程序。可以将内核和initrd 转换成uboot 识别的文件格式。否则uboot引导时,提示bad magic number。
数据拷贝时注意文件的大小,和起始地址,以及空间分布,否则容易超出范围,造成莫名错误
Nfs 启动的bootargs :console=/dev/ttyS0,115200n8 root=/dev/nfs rw nfsroot=192.168.0.10:/nfsroot ip=192.168.0.11
Ubi (flash)启动的bootargs:console=/dev/ttyS0,115200n8 root=ubi0:rootfs
3. nfs搭建
默认的Ubuntu没有nfs服务,需要自己安装添加。主要软件包为xient,nfs-kernel
搭建完毕可以在本机进行mount测试,以确认nfs成功启动。
4. tftp 搭建
使用apt-get install 进行安装
5. initrd 构建
a. busybox 编译
设置busybox的交叉编译环境,以及install 中的don’t use 。
以及其他在initrd中需要使用的utils,(switch_root,等等)
Make clean,make ,make install
在_install目录下生成bin sbin 文件夹其中包含所选择的utils程序
b. 创建ramdisk目录,拷贝bin sbin 到其中,同时 创建proc sys mnt 目录
c. 在busybox中的examples中的bootfloopy目录下有生成rootfs的shell脚本。使用该脚本生成ramfs的其他文件夹dev,etc 。将生成的目录拷贝到ramdisk下
d. 在目录etc下,有默认的fs挂载配置文件,环境变量配置文件,以及默认进程配置文件。在etc/init.d下有rcS文件为busybox的自动运行文件。但busybox最先运行de是/init文件
e. 编写/init文件。参考pc架构上的Ubuntu 上的initrd,将其解压解包,可以看到其中的/init/文件。新的/init文件已该文件为基础进行修改。其中有许多没有用的过程,和不适合的过程,需要删除。同时将其中需要的其他脚本,拷贝到ramdisk目录下。
f. 在新的/init中可以添加自己的shell命令,如果所用的命令不存在,就需要重新编译busybox,增加所需utils。
g. /init中不仅要添加自己的shell命令,同时还负责mount最终的rootfs。对脚本进行修改,最后通过switch_root将执行权转移到新的rootfs中去。
注:switch_root必须在init进程中调用,否则出错:no such file or dictionary
h. 生成initrd。命令:cd ramdisk;find . | cpio –o –H newc > ../initrd;cd ..;gzip initrd;mkimage –A arm –O linux –T ramdisk –C none –a 0x20000 –e 0x20000 –n ramdisk –d initrd.gz ramdisk.img
i. 最后可以通过uboot 的 tftp 命令将initrd 下载到指定内存位置,使用bootm 启动
6. mtd-tool 编译
a. mtd-tool 源码下载。Mtd-tool依赖于zlib,所以要交叉编译mtd-tool ,首选要交叉编译zlib。
b. 下载zlib源码。使用命令./configure –shared; make CC=“交叉编译器”。。。等进行编译
c. 将生成的libz.so.* 和相关头文件拷贝到交叉编译器的lib和include文件夹。最后在
Mtd-tool目录下配置交叉编译器,执行make,生成相关的utils。
7. 将lib/modules/2.6.22.18 下的两个ko 拷贝到initrd,因为在initrd中需要插入这两个ko。 从而获取flash的分布图。Ko的插入必须在rootfs为ubi时才可以操作,因为nfs没有使用flash。在nfs,rootfs下,插入ko会提示错误。同时,在/sys/devices/platform/mv-spi/下也没有spi-cs项。无法进行后续操作。
8. 将mtd-tool拷入u盘中。配合initrd中的/init, 就可以将新的内核烧写到flash。U盘推荐使用ext2格式。