主机平台:Linux CentOS 6.5
arm平台:粤嵌GEC210开发板(S5PV210)
1.建立根文件按系统相关目录和文件
(1)首先创建一个目录作为根文件系统的根目录,这里假设为rootfs
#mkdir rootfs
(2)在rootfs下,创建下面目录:bin dev etc lib mnt proc sbin sys tmp usr var;然后在usr目录下创建目录:bin sbin lib
#cd rootfs
#mkdir bin dev etc lib mnt proc sbin sys tmp usr var
#mkdir /usr/bin /usr/sbin /usr/lib
(3)建立dev下的设备文件
进入dev目录
执行:
#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
(4)建立etc下的配置文件:
/etc/inittab文件:
#/etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
/etc/fstab文件:
#/etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
/etc/init.d/rcS
#! /bin/sh
PATH=/sbin:/bin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
(1)下载busybox(下载地址:www.busybox.net)
(2)解压后,进入目录,修改Makefile文件:
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
(3)执行make menuconfig,修改配置
配置主要有两个部分:
第一部分是Busybox Setting,主要是busybox设置选项,修改:
General Configuration ---> Don't use /usr 选中此项,如果不选这项,默认安装在当前系统的/usr目录下的
Build Options ---> Build BusyBox as Aa static binary (no share libs):选择此项,编译时静态链接C库
Build Options --->(arm-linux-) Cross Compiler prefix 这里也修改成你的交叉编译器的前缀
Installation Options ---> What kind of applet links to install 这里选择各命令链接到busybox的方式,这里选择默认的soft-links
Installation Options ---> ()BusyBox installoation prefix:此项选择busybox的安装位置,即rootfs的路径,如:/tmp/rootfs
第二部分是Applets,就是各种命令了,根据情况选择安装,这里就保持默认配置。
(4)编译、安装
执行 make && make install
安装后,会建议你将busybox加上SUID权限
#cd rootfs
chmod u+s bin/busybox
3.制作ramdisk
有两种方法:
第一种:用genext2fs工具
(1)下载genext2fs,下载地址:http://genext2fs.sourceforge.net
(2)编译,并将genext2fs文件放到 /bin 或者 /sbin下
(3)进入rootfs的上级目录
(4)执行genext2fs生成randisk文件
#genext2fs -b 4096 -d rootfs ramdisk
参数:
- b:指要制作的根文件系统的大小,单位为KB
-d:这你将要制作成ramdisk的根文件系统目录
最后为你要生成的ramdisk的文件名
(5)制作压缩档
#gzip -9f ramdisk
第二种:
(1)创建4096K字节的空白映像文件
# dd if=/dev/zero of=/tmp/ramdisk bs=1k count=4096
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 0.0276143 s, 152 MB/s
(2)格式化该映像文件
# mke2fs -F -v -m 0 /tmp/ramdisk
mke2fs 1.41.12 (17-May-2010)
fs_types for mke2fs.conf resolution: 'ext2', 'small'
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=4194304
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
#mkdir /mnt/loop
(4)挂载映像文件
#mount -o loop /tmp/ramdisk /mnt/loop/
#cp -arf rootfs/* /tmp/loop
#umount /mnt/loop
#gzip -9f ramdisk
4.配置内核
(1)System Type ---> Initial RAM filesystem and RAM disk (initramfs/initrd) support 选中此项,添加对ramdisk的支持
(2)Device Drivers ---> Block devices --->(4096) Default RAM disk size (kbytes) 这里的数值最好与你的ramdisk大小相同
(3)File systems ---> Second extended fs support 选中此项,添加对ext2文件系统的支持
(4)保存,编译
6.将ramdisk烧写到开发板的flash或者SD卡里
7.设置uboot环境变量bootargs(这里假设从ram里启动ramdisk,若从其它设备启动,根据实际情况改变参数)
setenv bootargs ‘initrd=0x31000000,0x400000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
一般需要修改的只有initrd这个参数,第一个数为ramdisk在内存中的地址,第二个数为ramdisk的长度
执行:
#saveenv
保存环境变量到启动设备
好了,到这里所有工作基本上就做完了,复位开发板,看一下能不能挂载,本人就挂载不成功,出现
kernel panic - not syncing:Attempted to kill init
调试发现,文件系统是挂载成功的,但执行busybox的命令时出错
首先说一下网上的解决办法:
在内核配置中添加EABI的支持,选中下面两项(具体原因与EABI这个东西相关,因为本人不太了解,这里不赘述,网上可以找到相关资料)
Kernel Features ---> Use the ARM EABI to compile the kernel
Kernel Features ---> Allow old ABI binaries to run with this kernel (EXPERIMENTAL)
但依然会出现上面的错误。
之后用了各种方法,居然在换了编译器后成功了。后面通过file命令看了下文件类型:
用 arm-cortex_a8-linux-gnueabi-4.7.3编译的busybox:
setuid ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped
用 arm-none-linux-gnueabi-4.5.1编译的busybox:
setuid ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 3.10.xx, stripped
而我用的内核是 2.6.35.9,难道是因为这个原因?编译出来的程序适用的内核版本与交叉编译器有关?上网搜了下没有找到相关的资料,这里就以后再研究了。
好了,这次就写到这里吧。