ARM根文件系统制作
1. 制作文件系统的内容
#tar -xvf busybox-1.17.3.tar.bz2
#cd busybox-1.17.3
#make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
[ ] Force NOMMU build
[ ] Build with Large File Support (for accessing files > 2 GB)
(arm-cortex_a8-linux-gnueabi-) Cross Compiler prefix //注意 一定要指定交叉编译工具,此处使用的是arm-cortex_a8-linux-gnueabi-,根据自己情况指定
() Additional CFLAGS
#make
#file busybox //确认编译生成的是 ARM 平台的
busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.35, stripped
#make install
#cd _install
# ls
bin linuxrc sbin usr
#mkdir dev etc mnt proc var tmp sys root
#cp arm-cortex_a8/arm-cortex_a8-linux-gnueabi/lib/ ./ -a 原来的lib 少了 /
#rm lib/*.a
#arm-cortex_a8-linux-gnueabi-strip lib/* 裁剪掉库里的调试信息
arm-cortex_a8-linux-gnueabi-strip:lib/libgcc_s.so: File format not recognized 有些库是不能strip的 忽略
arm-cortex_a8-linux-gnueabi-strip:lib/libsupc++.la: File format not recognized */
#rm lib/libstdc++* //删除不需要的库,确保所有库大小不超过4M
#arm-cortex_a8-linux-gnueabi-strip lib/*.so //去掉库中的调试信息,裁剪库大小
#du -mh lib
2.5M lib
#添加启动文件
在etc下添加文件inittab,内容如下: /*内核/init/main.c 中执行系统的启动进程 if (execute_command) {
run_init_process(execute_command);( 它是有u-boot参数传入的 linuxrc
它由busybox源码的/init/init.c 生成, 它会对 /etc/inittab 解析执行*/
#this is run first except when booting in single-user mode.
:: sysinit:/etc/init.d/rcS //指定系统初始化脚本是rcS 也可指定别的名字,但习惯用rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh //指定初始的控制台(启动后进入# 状态) 如果启动进不了#,可以看看是不是sh不存在,或改为指向别的
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
创建init.d目录,在init.d下创建rcS文件,为rcS添加可执行权限:# chmod +x init.d/rcS rcS文件内容为:
#!/bin/sh
# This is the first script called by init process
/bin/mount -a // mount all stuff from /etc/fstab
/etc/init.d/rc.local //扩展子脚本
echo /sbin/mdev > /proc/sys/kernel/hotplug //设置系统的hotplug程序为mdev
/sbin/mdev -s /* mdev 系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,
在文件系统中的/dev目录下的设备节点都是由mdev创建的 加-s 扫描/sys/信息自动生成
解决使用mdev时“cannot create /proc/sys/kernel/hotplug:nonexistent directory”错误
原因一: 内核应支持 CONFIG_HOTPLUG=y CONFIG_NET=y
原因二: BusyBox中要支持 Linux System Utilities ---> [*] mdev */
./app.exe //让脚本自动运行你的程序
在etc下添加文件fstab,文件内容如下: /* fstab 指定启动后自动挂载的文件系统 介质,挂载点等 ,如挂载失败会报错*/
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0 //如果报挂载错误,可能是内核不支持, 选上 Pseudo filesystems -> Tmpfs
在etc下添加profile文件,文件内容为: /*linux中环境变量的设置 */
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# " //终端前的提示符
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
#sudo mknod dev/console c 5 1 /*根文件系统中有一个设备节点是必须的,在dev下创建console节点 c表字符设备 5 主设备号(见include/linux/major.h) 子设备好1*/
2. 测试文件系统内容正确性
#cd /nfs
#mkdir rootfs
#cp _install/* rootfs –a */
#chmod 777 /nfs/rootfs/ //挂载后不能在里面创建文件。 原因是权限问题
NFS测试通过后表示文件系统 在内容上问题不大
3. 制作需要的文件系统格式
//--------------RAMDISK 占较少的flash 适用较大RAM资源的
#cd ~
#dd if=/dev/zero of=initrd.img bs=1k count=8192
#mkfs.ext2 -F initrd.img
#mount -t ext2 -o loop initrd.img /mnt/initrd
#cp /nfs/rootfs/* /mnt/initrd/ -a */
#umount /mnt/initrd
#gzip --best -c initrd.img > initrd.img.gz
#cp initrd.img.gz /tftpboot
//注意验证根文件系统时,使用的是第一天共享的完全OK的内核
#setenv bootcmd tftp 20008000 zImage \; tftp 20800000 initrd.img.gz \; go 20008000
#setenv bootargs root=/dev/ram rw init=/linuxrc initrd=0x20800000,8M console=ttySAC0,115200
#saveenv
#reset
//---------------CRAMFS 只读, 占较少的RAM,当希望系统稳定,文件系统内容不被修改时候,用到
#mkfs.cramfs /nfs/rootfs rootfs.cramfs
#cp rootfs.cramfs /tftpboot
#tftp 20008000 rootfs.cramfs
#nand erase 400000 400000
#nand write 20008000 400000 400000
#setenv bootcmd tftp 20008000 zImage \; go 20008000
#setenv bootargs root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
#saveenv
#reset //重启如果报错,可能是mkfs.cramfs rootfs rootfs.cramfs 时出了问题, 重新制作一次就可以了
//------------------JFFS2 垃圾回收,掉电保护功能
#cp ~/e/pkg/zlib-1.2.3.tar.bz2 .
#tar -xvf zlib-1.2.3.tar.bz2
#cd zlib-1.2.3
#./configure
#make
#make install
#tar -xvf mtd-snapshot-20050519.tar.bz2
#cd mtd/util
#make
#make install //这样我们的系统里就有了mkfs.jffs2这个工具了
#mkfs.jffs2 -r /nfs/rootfs -o rootfs.jffs2 -e 0x20000 --pad=0x400000 -n
#cp rootfs.jffs2 /tftpboot
# tftp 20008000 rootfs.jffs2
# nand erase 400000 400000
# nand write 20008000 400000 400000
#setenv bootcmd tftp 20008000 zImage\; go 20008000
#setenv bootargs root=/dev/mtdblock2 rootfstype=jffs2 rw init=/linuxrc console=ttySAC0,115200
#saveenv
#reset