本文专属tiny6410吐槽系列~如有得罪,请多包涵~在此也留个联系方式[email protected],欢迎大家一起交流吐槽心得~
上次好像我们讲到了自己配的内核到挂在完nfs就挂掉了,提示是找不到init是吧~记得好像是,所以今天我们来解决掉这个问题,从新开始制作一个根目录文件系统。
这里不得不下载的就是busybox啦~这是木有办法的啦,谁叫这是神奇呢~又截止到我码下这些文字的时刻,2013/12/05晚上23:10分,busybox官网发布的最新版本是29 June 2013 -- BusyBox 1.21.1 (stable)
所以到busybox官网把busybox1.21.1下载下来
http://www.busybox.net/
然后tar解压出来~再再然后直接make menuconfig进入配置菜单
1.Busybox Settings --->Build Options --->
如下配置,编译成静态库,这样会省去一点麻烦,以后我们再编译成动态库的形式~
然后指定交叉编译器arm-linux-
2.Busybox Settings --->Installation Options --->
这里是编译busybox后的安装位置,这里最好不要选择默认的,我们把busybox的安装路径设置成nfs共享文件系统根目录的,比如说我是这样的设置:
3.其他暂时先保持默认~exit出来后就可以make -j2啦~
4.在make install busybox之前,首先创建根目录文件夹和根目录下系统常备的文件夹~您可以看一下您linux发行版的根目录下都有哪些文件夹~类似的,我也在根目录也创建这些文件夹~但是这里由于时间关系和不浪费您宝贵的时间,我直接贴出脚本来。
Creat file脚本文件,脚本不要用sudo去执行,后面你会知道错的
#!/bin/sh echo "---------- Create rootfs directons start... ----------" mkdir rootfs cd rootfs echo "---------- Create root,dev.... ----------" mkdir root dev etc boot tmp var sys proc lib mnt home usr opt mkdir etc/init.d etc/rc.d etc/sysconfig mkdir usr/sbin usr/bin usr/lib usr/modules mkdir lib/modules mkdir lib/modules/3.2.53 echo "make node in dev/console dev/null" mknod -m 660 dev/console c 5 1 mknod -m 660 dev/null c 1 3 mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp mkdir var/lib var/lock var/run var/tmp chmod 777 tmp chmod 777 var/tmp echo "---------- Creat some necessary files ----------" touch etc/init.d/rcS etc/sysconfig/HOSTNAME etc/inittab etc/fstab etc/profile cp /etc/passwd rootfs/etc cp /etc/group rootfs/etc cp /etc/shadow rootfs/etc echo "---------- make direction done ----------"
然后执行完脚本之后用管理员身份创建和复制几个文件
如果上面的脚本不能执行的话,就手动复制那些necessary files
touch etc/init.d/rcS etc/sysconfig/HOSTNAME etc/inittab etc/fstab etc/profile cp /etc/passwd rootfs/etc cp /etc/group rootfs/etc cp /etc/shadow rootfs/etc
然后,比如我建立的根目录是/home/chanfai/workspace/rootfs,那么busybox编译后的安装路径也是这个~
所以,现在可以切入busybox目录下make install,然后逐个逐个修改根目录的文件
1.etc/inittab,系统init进程配置文件,参考busybox源码example/inittab文件说明
Inittab配置
::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh #没有这就不行,就不能打开console控制台。 ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff –a
2.etc/init.d/rcS,系统启动加载项文件
rcS配置
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts #用于telnet登录时使用 echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s mkdir -p /var/lock /bin/hostname -F /etc/sysconfig/HOSTNAME
3.etc/fstab 系统挂载文件系统列表文件,
Fstab配置
#device mount-point type option dump fsck order proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 mdev /dev ramfs defaults 0 0 none /var ramfs defaults 0 0 none /tmp ramfs defaults 0 0
4.etc/profile用户环境配置文件
Profile配置
# Ash profile # vim: syntax= sh # No core file by defaults # ulimit - S - c 0> / dev/ null 2> & 1 USER="id -un" LOGNAME=$USER PS1="[\u@\h \w]#" #\w 目录将显示全路径 PATH=$PATH HOSTNAME= '/bin/hostname' alias cls="clear" export USER LOGNAME PS1 PATH
5.etc/sysconfig/HOSTNAME,填入自己的用户名字,我这里是chanfai
6.还有一点,为了必须某些bug,rootfs/lib目录要求某些动态库~其实就是交叉编译器里面的一些动态库,说明这个很费时间的,这里我是比较懒,从友善编译好的文件系统中直接抽出lib目录部分~
cp过去就行,记得带上-a参数保持软连接状态
好,文件系统暂时就这样先定,最后来一张图结束这一次的吐槽~
下节移植lcd驱动和tslib,然后在文件系统中加入QT库,再然后就真正进入各个驱动的移植,然后顺带在应用层写QT界面去控制各个外设,这样可以达到交叉学习的效果