基于android的NFS根文件系统的制作

基于android的NFS根文件系统的制作  

http://shenhao0129.blog.163.com/blog/static/67192441201142505924606/

由于我们之前使用的是网络上已经制作好了的armv4版本的根文件系统,虽然能看到android的图形界面,但是功能还是不完善,并且都以及功能是固定好了的东西,触摸屏校正程序也不能加入进去,所以只能移植过来玩玩而已,最终的目的,肯定还是自己完全定制属于自己的根文件系统。

交叉编译器的版本:CodeSourcery Sourcery G++ Lite 2007q1-21
目标平台:GEC2410
busybox:1.15.0(原来使用的是1.18.4的,由于后面有问题,换回到了1.15.0,其实几乎是一样的设置)

1.下载并解压缩busybox的源代码(http://www.busybox.net/downloads/)

2.为制作根文件系统的的根目录,这里我就直接利用之前制作的android的那个文件系统的目录,这样省去了重新设置NFS服务器的部分,我的就是/home/shenhao/nfs,由于之前里面有了许多的android的根文件系统的文件,首先需要清空这个目录,切换到nfs目录,执行sudo rm -rf * 注意这里一定要切换到相应的目录,否则系统很可能直接挂掉了。也可以采取自己喜欢的办法,总之是建议一个可以使用的空目录,并且在你的NFS的服务器的配置上挂载此目录就可以了。

3.清空了这个目录之后,就可以开始手动创建必要的文件夹和子文件夹了。以下步骤都是在NFS文件夹中操作的,具体的步骤如下:(好多人似乎都是用脚本的,但是我不想切换到root账户,所以就手动来处理了)

(1)mkdir bin dev etc lib proc sbin sys usr
(2)mkdir usr/bin usr/lib usr/sbin lib/modules
(3)sudo mknod -m 600 dev/console c 5 1
(4)sudo mknod -m 666 dev/null c 1 3
(5)mkdir mnt tmp var
(6)mkdir mnt/etc mnt/data mnt/temp
(7)mkdir var/lib var/lock var/log var/run var/tmp
(8)chmod 1777 tmp
(9)chmod 1777 var/tmp
(10)mkdir home root boot

4.经过漫长的建立目录的过程后,切换到busybox解压后的目录,对busybox进行相关的配置,首先还是修改Makefile,配置交叉编译器,具体我的修改如下:

CROSS_COMPILE ?= arm-none-linux-gnueabi-

ARCH ?= arm

5.执行make menuconfig 配置相关的选项,这里我只是修改很小的一部分,具体的修改如下:

Busybox Settings->Installation Options ->确保选中Don't use /usr

Installation Opthions->BusyBox installation prefix 修改为/home/shenhao/nfs

也就是你的根文件系统所在的目录,一定要写正确,否则一不小心安装到了系统目录的话,可能就不好搞了(我原来有次手动构建交叉编译器gcc的时候,一不小心把系统的库替换了,导致只能重装系统,幸好当时是虚拟机)

Busybox Setttings->Busybox Libray Tuning->

(2)MD5:Trade Bytes for Speed
[*]Faster /proc scanning code (+100 bytes)
[*]Support for /etc/networks
[*]Use termios to manipulate the screen
[*]Command line editing
[*]vi-style line editing commands
[*]Histroy saving
[*]Tab completion
[*]Username completion
[*]Fancy shell prompts

其实全部选中都可以的。^_^

Busybox Settings -> Build Options ->(采用动态lib 连接库)
[]Build BusyBox as a static binary(no shard libs)   不选中

6.输入make 如果编译没有出错的花,在当前目录就能得到busybox等文件了。不过我这里在编译1.18.4版本的时候没有问题,在编译1.15.0版本的时候提示混合规则错误,这个错误我们之前编译内核源代码的时候遇到过,所以很轻松的解决了,修改下Makefile,把写在同一行的代码规则分开来写就好了,一共有两出,除此之外,没有其他的错误了。之前有看到网络上说这个只能用3.4.1的版本的交叉编译器来编译,看来估计是当时的版本不同吧,所以我选择busybox的版本的时候,尽量的选择高版本的Busybox来制作。

7.输入make install 安装busybox,如果不出现意外的话(之前的目录配置方面都没有问题),在你配置的目录下面的bin和sbin文件夹下就有了很多的链接文件,在我这里就是/home/shenhao/nfs/bin目录下。

8.因为前面我们采用的是动态加载库的方式编译的,所以需要拷贝相应的库到根文件系统的lib目录下,具体以来那些库,我们可以用readelf功能来察看链接的共享库,具体的操作为:

arm-none-linux-gnueabi-readelf -d busybox

可以看到

0x00000001(NEEDED)                       Shared library:[libm.so.6]
0x00000001(NEEDED)                       Shared library:[libc.so.6]

需要链接libm.so.6 和libc.so.6 这两个库文件,具体的在那拷贝,这个放到后面一起说,因为不仅仅需要这两个库文件。

9.添加和修改必要的配置文件,首先拷贝配置模版文件,具体的命令如下:

cp -a examples/bootfloppy/etc/* ~/nfs/etc/

修改刚才拷贝的配置文件,具体的修改操作为:

(1)vim ~/nfs/etc/profile 修改为如下内容:

# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo -n "Processing /etc/profile... "
# no-op
# Set search library path
echo "Set search library path in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib
# Set user path
echo "Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
# Set PS1
echo "Set PS1 in /etc/profile"
export PS1="\\e[05;32m[$USER@\\w\\a]\\$\\e[00;34m"
echo "Done"
echo

(2)修改~/nfs/etc/inittab文件如下:

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
#tty2::askfirst:-/bin/sh         //这个是我自己mark掉的,否则后面会报错找不到tty2
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

(3)修改~/nfs/etc/fstab文件如下:

proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0

(4) 修改~/nfs/etc/init.d/rcS文件如下:

#! /bin/sh
echo "----------mount all"
/bin/mount -a
echo "----------Starting mdev......"
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
echo "*********************************************************"
echo " gec2410 Rootfs(nfs)   2010.5 shenhao "
echo "********************************************************"

(5)为mdev创建mdev.conf文件,内容为空

(6)复制主机etc目录下的passwd,group,shadow文件到根文件系统的etc目录下并修改
如下:

vim passwd 只保留root:x:0:0:root:/root:/bin/ash 就可以了,其他的删除掉 (并修改为ash)
vim group 只保留root:x:0:root
vim shadow 只保留root:$1$Bc05zAXM$Ff8CpRNuYZgF/ScIrMJiS/:14877:::::(具体的内容可能不一样)

由于我这里拷贝shadow文件需要管理员权限,所以我额外的使用了

sudo chown shenhao shadow  
sudo chgrp users shadow

修改了一下shadow的文件所有者和所属的组(我也没尝试是不是一定要这么做)

10.NFS根文件系统到这里就制作好了,但由于我们之前的u-boot中的bootargs的参数为

bootargs=console=ttySAC0 root=nfs rw nfsroot=192.168.1.100:/home/shenhao/nfs,v3
ip=192.168.1.102:192.168.100:192.168.1.1:255.255.255.0:123:eth0:off  init=/init

最后的初始化当时是init文件,这里用的是linuxrc,所以需要修改,具体有两个修改办法:

(1) 直接用u-boot的命令setenv bootargs console=ttySAC0 root=nfs rw
nfsroot=192.168.1.100:/home/shenhao/nfs
ip=192.168.1.102:192.168.100:192.168.1.1:255.255.255.0:123:eth0:off  init=/linuxrc

(2)直接修改u-boot源代码中的include/configs/smdk2410.h中的BOOTARGS,这个需要重新编译u-boot

请根据自己的喜好来选择把。

不管用那种办法,修改好了bootargs之后,别忘记了启动主机的tftp服务和nfs服务(如果你
跟我一样不是开机自动启动这些服务的话)

11.如果以上的操作都没有问题,那么就可以启动系统了,但是令人遗憾的事情还是发生了,提
示错误如下:

VFS: Mounted root (nfs filesystem).
Freeing init memory: 132K
Failed to execute /linuxrc.  Attempting defaults...
Kernel panic - not syncing: No init found.  Try passing init= option to kernel.

虽然NFS文件系统挂载上了,但是居然提示说不能执行,找了一下,应该是共享库没有拷贝过去
于是拷贝了几个库过去,最后我的lib下的库文件是ld- linux.so.3  libc.so.6  
libgcc_s.so.1  libm.so.6 这四个,注意,这个要从安装的交叉编译器的下面来拷贝,
并且是armv4t文件夹下面的lib,具体到我这个路径是:

1. /usr/arm-none-linux-gnueabi/lib/armv4t/ 此路径下的libgcc_s.so.1文件

2. /usr/arm-none-linux-gnueabi/libc/armv4t/lib 此路径下的ld-linux.so.3 libc.so.6
libm.so.6 这三个文件

但是这次却是执行的到

VFS: Mounted root (nfs filesystem).
Freeing init memory: 132K

之后就没有了下文,看来任务还很艰巨啊!~~~(>_<)~~~

刚开始我以为是内核不能正确的执行初始化,经过层层的调试内核的init进程的执行,发现内核
中解析参数,设置好运行的环境这整个过程都完全没有问题,并且init的那个进程都不是返回原
来调用他的函数那个地方,而是直接接着执行busybox中的linuxrc,这完全没法继续追踪了。
通过上面的步骤,基本上排除了内核的问题,转而想打开busybox的调试选项,无奈也是不能显
示任何一条调试信息,然后google了一通,说是eabi的问题,可是我的内核早就打开了eabi
的选项了,无奈尝试关掉或者打开,均是一样的效果,然后又看到有人换编译器的版本或者
busybox的版本,我分别尝试了busybox 1.11 1.13 1.15 1.18这几个版本的,都是外甥
打灯笼--照旧,然后又更换编译器的版本,从2011到2010到2008的版本都不行,编译都不通过,
无奈只好继续装回 以前的版本编译器。

在装新的编译器的版本的时候,在那等侯下载编译器的时候顺便看了一下编译器的使用手册,想
找找eabi的资料,无奈也是没有什么收获,只是无意中看到那个2011的编译器默认编译出来的
是armv5的指令,如果要支持armv4t的话,需要加参数,当时也没放在心上,后来新的版本的编
译器都编译出错了,重新装回2007q1的那个版本。

再次尝试的busybox1.15的版本,因为有说这个版本是第一次支持eabi的,所以想尝试下,
可以结果还是不行,于是就想用readelf工具看看编译出来的busybox究竟有没有支持eabi的
选项,看了一下, 发现确实有支持eabi的选项打开了,正在失望之际,突然看到最后显示目标
CPU的架构为armv5te版,瞬间那个手册中的armv4t的提醒出现在我 头脑中,立刻明白了是什
么回事了,于是找到那个手册,重新看了一下相关的部分,在编译选项中加上对armv4t的支持,
顺利编译后,赶快用readelf 察看相关的选项,果然改正为armv4t了,惊喜,然后安装,启
动系统,发现终于出现了久违的继续往下走的初始化过程,虽然之前以为是配置文件有问题而不
停的修改配置文件导致配置文件有不少问题,导致继续初始化的过程提示很多的错误,但是却依
然在执行着初始化。

经过我一天的折腾,终于搞定这个折磨人的问题了,好像在网络上还很少有人说到这个问题,归
根到底,还是我的编译器相对来说新了点,默认的就是编译出来支持armv5te的指令的,之前在
内核的编译选项上也有看到过对armv4添加的编译参数,不过当时刷屏刷的太快,看不太清楚,
并且又没有问题,也就没仔细深究了。

之前正好也在看makfile的手册,看来今天正好派上用场了,呵呵!具体的修改makefile的
地方是修改Makefile.flags 这个文件,在看到类似的配置文件的地方,大概是70行那地方
添加如下内容

ifeq ($(ARCH),arm)
CFLAGS += $(call cc-option,-march=armv4t,)
endif

后来我在busybox的配置选项的地方看到了增加额外的编译选项,在那添加

CFLAGS += -march=armv4t

也是可以的。

最后上一张实际的运行效果图

基于android的linux2.6.25的GEC2410的移植之busybox1.15.0的NFS根文件系统的制作 - shenhao0129 - Camus
 

总结:编译ELF格式的文件的时候最好是用readelf这个工具来看看那个文件究竟是不是我们期
望的那些特征,否则,会多余走很多弯路的。

后记:之前由于这文章贴出来的源代码与此编辑器的兼容问题,导致排版中很多错误的地方,重
新弄了好久,最后终于找到问题的所在,修改了部分不需要东西就弄好了

本文主要参考
http://hi.baidu.com/operationsystem/blog/item/427ea01d6c37f78387d6b68f.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值