接着前面一篇:在OK2440/FL2440上移植linux-2.6.35.4 来完成制作一个根文件系统,并用前面制作好的uboot和内核通过NFS服务来挂载。
制作一个根文件系统,主要分为两步:
1.创建根文件系统下的各级目录,包括安装内核驱动模块。
2.用busybox来生成此根文件系统的各种命令,将各级目录关联起来。
首先下载busybox1.13.3和根文件系统用到的etc目录:点击下载
在虚拟机根目录下创建一个工作目录/forlinx/s3c2440,接下来所有工作都在这个目录里完成;
执行命令进入该目录:cd /forlinx/s3c2440
把下载解压后最终得到两个文件夹 busybox1.13.3 和etc ,把这两个文件夹拷贝到工作目录 /forlinx/s3c2440/中;
到这里准备工作已完成;
进到工作目录 /forlinx/s3c2440/下,开始制作根文件系统:
1.新建一个文件mkrootfs,文件内容如下:
#!/bin/sh
echo "makeing rootdir"
mkdir rootfs
cd rootfs
echo "makeing dir: bin dev etc lib proc sbin sys usr"
mkdir bin dev etc lib proc sbin sys usr
mkdir usr/bin usr/lib usr/sbin lib/modules
sudo mknod -m 600 dev/console c 5 1
sudo mknod -m 666 dev/null c 1 3
echo "making dir: home root boot"
mkdir home root boot
echo "makeing dir:jacob"
mkdir home/jacob
echo "done"
保存这个文件后退出。这是一个脚本文件,我们通过运行这个脚本文件自动创建根文件系统的各级目录;
执行下面两条命令:
chmod 777 mkrootfs
sh mkrootfs
第一条是修改文件权限的,第二条是运行脚本文件的,在当前目录下你会看到新增一个rootfs文件夹,进去后会看到bin dev etc lib proc sbin sys usr等目录,到此就完成了第一步创建各级目录;
2.把解压出来的etc拷到rootfs目录中,替换掉rootfs目录中已有的etc文件夹;
3..进入linux-2.6.35.4源码包目录,编译内核模块,编译的命令是:
- make modules ARCH=arm CROSS_COMPILE=arm-linux-
- makemodules_install ARCH=arm INSTALL_MOD_PATH=/forlinx/s3c2440/rootfs
5.配置busybox,进入busybox1.13.3目录下;执行命令:make menuconfig
进行如下配置:
- Busybox Settings--->
- General Configuration --->
- Buffer allocation policy (Allocatewith Malloc) --->
- [*] Show verbose applet usage messages
- [*] Support --install [-s] to installapplet links at runtime
- [*] Enable locale support (system needslocale for this to work)
- [*] Support for devfs
- [*] Use the devpts filesystem forUnix98 PTYs
- [*] Runtime SUID/SGID configuration via/etc/busybox.conf
- [*] Suppress warning message if/etc/busybox.conf is not readable
- (/proc/self/exe) Path to BusyBox executable
- Build Options --->
- [*] Build BusyBox as a static binary(no shared libs) //选中"Build busybox as a static binary",静态链接
- [*] Build with Large File Support (foraccessing files > 2 GB)
- [*]Do you want to build BusyBoxwith a Cross Compiler?
- (arm-linux-) cross Compiler prefix // 填写交叉编译前缀
- Installation Options --->
- [ *] Don't use /usr //选中“Don'tuse /usr”,选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统
- Applets links (as soft-links)--->
- (/xxxx/rootfs) BusyBox installationprefix //填写你的安装路径,我这里是填:/forlinx/s3c2440/rootfs/
- Busybox Library Tuning --->
- (2) MD5: Trade Bytes for Speed
- Linux ModuleUtilities --->
- (/lib/modules) Default directory containingmodules
- (modules.dep) Default name of modules.dep
- [*] insmod
- [*] rmmod
- [*] lsmod
- [*]lsmodpretty output for 2.6.x Linux kernels
- [*] modprobe
- [*] Multipleoptions parsing
- --- Options common to multiple modutils
- [*] Support tainted module checking withnew kernels
- [*] Support version 2.6.x Linux kernels
6.编译,安装busybox,执行命令:
make arch=ARM CROSS_COMPILE=arm-linux-
make install
进入目录/forlinx/s3c2440/rootfs/sbin中看init检查busybox安装成功与否
至此根文件系统制作完成。
接着就是在虚拟机上安装NFS服务器(安装步骤我写在另外的一篇文章里:在ubuntu上安装tftp服务器与nfs服务器)。
由于前面的uboot中设置的bootargs参数里设置的路径正好也是:/forlinx/s3c2440/rootfs;所以此时启动内核后就可以挂载上面制作完成的根文件系统rootfs.
如下图所示:
附:上图中[ok2440v3@luo] 是通过修改/forlinux/s3c2440/rootfs/etc/profile文件的,你可自定义,profile文件内容如下:
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
export PS1="[ok2440v3@luo]# "
echo "Done"
echo
注意:本根文件系统移植是busybox中是用静态链接生成,所以在交叉编译文件时要加上 -static 参数,形如:arm-linux-gcc -static hello.c -o hello; 然后再在板子上运行./hello;
接下来要解决的问题的:要用动态链接库制作一个最小的yaffs2根文件系统,下载到板子上。因为这里的tftp 下载有个问题就是文件过大(大于60M)会下载不成功。如有大牛知道这个问题的解决方法,还望赐教。
感谢网上的各位大牛,本博文主要参考:
- http://blog.csdn.net/eastmoon502136/article/details/7905960
- http://blog.csdn.net/jacobywu/article/details/6844794