文件系统制作步骤
1,配置busybox
1)下载源码
2)进入busybox,make menuconfig 选配
2,制作根文件基本目录(make进行编译,Make install 把它编译成工程文件,方便我们使用将所有相关文件都放到_install目录下)
3,创建其他需要的目录(mkdir dev etc mnt proc var tmp sys root)
4,库目录设置(拷贝交叉编译工具连中的库目录,如果对库大小有要求可以进行裁剪)
5,添加系统启动文件(配置etc目录)
1)/etc/inittab
2)/etc/init.d/rcS
3)/etc/fstab
4)/etc/prifile
6,创建串口设备节点(初始化/dev目录)
7,测试根目录内容正确性
8,制作需要的rootfs类型的格式
------------------------------------------------------------------------------------------详细如下
一、配置busybox
下载解压源码
进入busybox目录下make menuconfig选配
选配交叉编译工具链
Busybox Settings —>
Build Options —>
() Cross Compiler prefix (NEW)
填写none-linux-gnueabi-
(arm-none-linux-gnueabi-) Cross Compiler prefix
·选配静态库
二、制作根文件基本目录
1.Make 进行编译
2.Make install 把它编译成工程文件,方便我们使用
将所有相关文件都放到_install目录下
这就是我们板子上的根文件基本目录
三、创建其他需要的目录
mkdir dev etc mnt proc var tmp sys root
四、库目录设置
拷贝交叉工具链中的库目录
$ cp ~/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/ . -a 注意是lib/
$ du -mh lib 查看lib库的大小
裁剪库到库的大小小于8m
如果库的大小已经满足8M以下的要求,就少裁剪
删除静态库和共享库文件中的符号表
$ rm lib/*.a
裁剪掉调试信息 not recognized
$ arm-none-linux-gnueabi-strip lib/*
有些库是不能strip的 忽略掉
删除不需要的库,确保所有库大小不超过4M
$ sudo rm lib/libstdc++*
$ du -mh lib 查看lib库的大小 可能 显示3.4M lib (这里确保小于 8M)
五、添加系统启动文件
文件 /etc/inittab
拷贝已有的文件,在修改。也可以自己手动添加
$ cp /nfs/rootfs/etc -rf . 拷入成熟的参考配置
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 指定初始的控制台(启动后进入# 状态)
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
文件 /etc/init.d/rcS(启动脚本)
在这个脚本中可以自己添加信息,如加载驱动等,这样板子运行时会自动加载
#!/bin/sh
This is the first script called by init process
/bin/mount -a
挂载一切能够挂载的根文件系统, /etc/fstab中指定了挂载的根文件系统
Mount -t devpts devpts /dev/pts 板子启动后的提示符
/etc/init.d/rc.local 扩展子脚本
echo /sbin/mdev > /proc/sys/kernel/hotplug
设置系统的hotplug程序为mdev,允许热插拔,插入设备后自动生成设备节点
/sbin/mdev -s
./app.exe //让脚本自动运行你的程序
可以添加:
insmod led.ko
mknod /dev/led c 501 0
./fs4412_led_app
文件 /etc/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
文件 /etc/profile
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[USER@USER@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 必须要有 console设备节点
测试rootfs内容正确性
$ cd /nfs
$ mkdir rootfs
$ cp _install/* rootfs –a
$ chmod 777 /nfs/rootfs/
或
$ sudo cp -rf _install/ /nfs/rootfs
$ sudo chmod 777 /nfs/rootfs
NFS能挂载成功表示根文件系统 内容基本正确
制作需要的rootfs类型的格式
列:不同格式
行:不同属性
Nfs rootffs:和电脑nfs目录同步,传文件快速。
适用于开发调试。
EXT2 over RAM disk:把内存虚拟成磁盘,掉电后所有更改内容消失
正对内存比较大而flash比较小的场合
CRAMFS:只读的,安全性高,不容易出错。
适用于安全性要求比较高的,不希望用户更改的
JFFS2:日志文件系统,可以随时掉电。
适用于小型嵌入式产品
YAFFS2:手机用的最多的,主要就是用nand flash
适用于手机,需要存储大量信息的
EXT2/3:用的介质是硬盘,主要是我们普通电脑
实际应用中是混合使用的,如果有写文件需要保护,就采用CRAMFS格式。根文件系统下可以挂在不同的文件系统,所以可以混合着用。
制作RAMDISK
制作大小为8M的ramdisk镜像文件
制作镜像
$ cd /nfs/
$ dd if=/dev/zero of=ramdisk bs=1k count=16384 (8m)
dd命令是用于制作镜像的
if 作为输入的文件
of 作为输出的文件
bs 单元大小
count 数量
即:将zero(内容为0的设备文件)拷贝到ramdisk中,形成一个大小为8m,内容为0的镜像文件
格式化这个镜像文件为ext2
$ mkfs.ext2 -F ramdisk
在mount下面创建initrd目录作为挂载点
$ sudo mkdir /mnt/initrd
$ sudo mount -t ext2 ramdisk /mnt/initrd
将原来的根目录拷贝到initrd目录
(如果rootfs的大小超过8m,就删除库缩减)
$ sudo cp -a /nfs/rootfs/* /mnt/initrd
卸载挂载的initrd目录
$ sudo umount /mnt/initrd
压缩ramdisk为ramdisk.gz
$ gzip --best -c ramdisk > ramdisk.gz
格式化为uboot识别的格式,并拷贝到tftpboot下
$ mkimage -n “ramdisk” -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
拷贝制作好的镜像文件到TFTP服务器指定的目录。
$ sudo cp ramdisk.img /tftpboot/
重新配置内核,选择ramdisk的支持并指定大小。
File systems —>
<> Second extended fs support
Device Drivers
SCSI device support —>
<> SCSI disk support
Block devices —>
<>RAM block device support
(16)Default number of RAM disks
(16384) Default RAM disk size (kbytes)
General setup —>
[] Initial RAM filesystem and RAM disk (initramfs/initrd) support
上面的配置项多数都已配置,主要是修改了ramdisk的大小为16384,这个值必须要和ramdisk镜像文件的大小保持一致。保存配置后,重新编译内核,再将uImage文件拷贝到tftp服务器指定的目录下。
启动开发板重新设置环境变量
开发板上电,在U-Boot中设置bootcmd环境变量如下。
FS4412 # setenv bootcmd tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;tftp 43000000 ramdisk.img;bootm 41000000 43000000 42000000
FS4412 # setenv bootargs
FS4412 # saveenv
最后使用boot命令启动内核并挂载根文件系统,挂载成功后将提示输入用户名和密码(其中用户名为root,密码为空),验证通过后,成功登录系统。输出信息如下:
……
[ 2.250000] VFS: Mounted root (ext2 filesystem) on device 1:0.
Please press Enter to activate this console.
fs4412 login: root
Password:
login[1214]: root login on ‘console’
[root@fs4412 ~]#