编译步骤:

1. 建立存放busybox文件的目录。#mkdir /work/busybox -p

2. 建立编译文件存放目录。#mkdir /work/rootfs -p 

3. 解压busybox-1.23.2.tar.bz2

4. 配置busybox: 配置方式 #make menuconfig

1) 配置编译器

Busybox Settings  --->  

    Build Options  --->

   (arm-linux-) Cross Compiler prefix  

2) 编译方式为动态库

[ ] Build BusyBox as a static binary (no shared libs)  (默认为动态编译)

编译可执行文件的方式:ls , cd ,pwd。

动态编译:arm-linux-gcc  123.c  -o  app1

静态编译:arm-linux-gcc -static  123.c  -o app2

3) 配置安装路径

Busybox Settings  --->

Installation Options ("make install" behavior)  --->

  (/work/rootfs) BusyBox installation prefix

5. 编译源码

#make && make install  

l 查看文件的运行环境

命令用法:#file  <可执行文件名称或者库名称>

[root@xiaolong bin]# file busybox
busybox: ELF 32-bit LSB executable,ARM, version 1 (SYSV),dynamically linked (uses shared libs), stripped

 

完整根文件系统

怎么完善?PC-Linux文件系统进行完善。

l /work/rootfs

1. 完善目录:创建Linux常规目录

#mkdir lib dev etc/init.d home proc sys root opt tmp var  -p

2. 拷贝系统的依赖库

依赖库的位置?Busybox是由arm-linux-gcc编译。

库的路径在arm-linux-gcc的安装目录下:

(必须)路径:/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib

(不是必须)路径:/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib

进入到库的路径下敲命令:

#cp  ./*  /work/rootfs/lib  -fdv

将依赖库拷贝到根文件系统下的lib目录下。

拷贝过去以后,可以删除掉lib目录下以.a结尾的静态库。 比如:#rm  *.a -f

3. 创建设备节点

设备节点目录?dev目录下

手动创建设备节点的命令:mknod 

用法:mknod  <设备节点的名称>  <设备节点的类型>  [主设备号  次设备号]

     设备节点的类型:c -->字符设备>块设备

 

 

需要创建的设备节点:    

#mknod console c 5 1 
#mknod null c 1 3

echo“123456799”> /dev/null

4. 拷贝密码和用户组文件

在PC机的/etc目录下拷贝passwd、group文件到开发板的/etc目录下。

修改passwd文件里/bin/bash -> /bin/sh

5. 拷贝文件系统的配置文件

将PC机/etc/fstab文件拷贝开发板的/etc目录下。

6. 拷贝终端配置文件

路径:/work/busybox/busybox-1.23.2/examples/inittab

拷贝到开发板的/etc目录下。

7. 修改inittab文件

::sysinit:/etc/init.d/rcS
console:: askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

#console::respawn:-/bin/sh

askfirst表示:进入终端需要按下回车键。

respawn表示:不需要按回车键,直接进入终端。

 

 

解析:

::sysinit:/etc/init.d/rcS   :系统初始化配置文件(上电执行的文件)。

console:: askfirst:-/bin/sh:定义进入终端的模式和终端使用的脚本解析器。

::ctrlaltdel:/sbin/reboot:定义重启系统的命令

::shutdown:/bin/umount -a -r:关机之前执行的命令。mountmount是挂载命令。

8. 创建rcS文件

#gedit  etc/init.d/rcS

#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts  /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname  xyd

rcS:系统上电自动执行的文件。

mdev -s: 会根据内核的驱动自动生成对应的设备节点。

 

rcS文件需要修改权限:#chmod 777 rcS

 

9. 创建etc/profile文件

USER="`id-un`"
LOGNAME=$USER
PS1='[\u@\h \w]\# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH

 

 

1. 根文件系统的网络挂载

(1)配置NFS文件系统的共享路径 (PC机的路径)

# vim /etc/exports

填充共享的路径

/work/rootfs  *(rw,no_root_squash,sync)

生效共享文件的方法

#exportfs -r    //生效路径

#exportfs -v   //查看已经共享的路径

(2)配置PC机的挂载环境

l 关闭防火墙

图像化配置:setup

 

l 配置网卡的IP

查看网卡的IP地址:ifconfig

设置网卡的IP地址:ifconfig eth0  192.168.18.3  up

重新启动NFS服务器:service  nfs   restart   (执行两次)

l设置虚拟机网卡的挂载方式为桥接模式!

 

 

(3)设置UBOOT环境变量

setenv bootargs root=/dev/nfs nfsroot=192.168.18.3:/work/rootfs ip=192.168.18.123:192.168.18.3:192.168.18.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200

格式:

setenv  bootargs  root=/dev/nfs nfsroot=<服务器IP>:<根文件系统的路径>  ip=<开发板IP>:<服务器IP>:<网关>:<子网掩码>::eth0:off init=/linuxrc console=ttySAC0,115200

在UBOOT命令行设置环境变量后,需要保存!---> # saveenv

设置完成后重启开发板,如果正常的话,就挂挂载电脑上的文件系统

 

挂载失败问题分析:

1./lib目录下的依赖库拷贝错误!(路径:arm-linux-gcc的目录下)

2./etc/inittab文件的内容编写错误。 (4句代码)

3.Linux NFS服务器(PC)与开发板IP不在同一个网段!

4.没有启动NFS服务器(每次挂载不上,先运行一次启动NFS服务器脚本)。

5.NFS服务器的共享路径设置错误或者没有设置(共享路径设置文件: /etc/exports)。

重新设置了共享路径,需要执行exportfs -r。或者重启启动NFS服务器。

6.UBOOT环境变量设置错误。(NFS挂载:需要设置UBOOT环境变量为NFS挂载)。

虚拟机的上网方式需要设置位桥接,桥接到以太网卡(有线网卡)。

命令行格式不显示:(PS1环境变量)

1.profile文件格式错误。(路径:/etc/profile)

/etc/init.d/rcS文件代码编写错误或者没有可执行权限

 

2. 根文件系统的SD卡挂载

根文件系统挂载方式:2种。

本地挂载:从哪里读取文件系统?D卡或者EMMC。

本地挂载:将文件系统拷贝到SD卡或者EMMC的分区!

SD卡挂载文件系统步骤:

1.对SD卡或者EMMC进行分区。

在UBOOT命令行使用fdisk命令进行分区。

命令:

TINY4412 # fdisk -c 0 2000 300 300

2.格式化

fatformat:FAT格式

ext3format:linux下格式

ext2format:linux下格式

命令:

# fatformat mmc 0:1

# ext3format mmc 0:2

 

3.挂载网络文件系统

设置UBOOT环境变量:

Setenv  Bootargs  root=/dev/nfs  nfsroot=192.168.18.18:  /work/rootfs
ip=192.168.18.123:192.168.18.18:192.168.18.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 lcd=S702

设置完记得保存:saveenv

4. 打包根文件系统

进入到PC机上进行打包。

命令:

# tar cvf rootfs.tar /work/rootfs/

rootfs.tar:表示新的压缩包名称。

将rootfs.tar文件拷贝到/work/rootfs/文件中,方便开发板访问!

5.挂载SD卡分区

挂载命令:

mount  用法:mount  <需要挂载的设备>  <挂载设备的目录>

取消挂载命令:

umount  用法:umount  <挂载设备的目录>

开发板的SD卡和EMMC设备命名:/dev/mmcblk0p1

表示设备编号,1表示设备的分区编号。

挂载SD卡的第2个分区到/mnt目录下:

命令:

mount /dev/mmcblk0p2 /mnt/

怎么判断成功?在挂载的目录下会生成一个lost+found。

6. 解压文件系统到SD卡挂载的目录

到挂载目录下敲解压命令:

# tar xvf /rootfs.tar

解压之后,需要将根文件系统文件目录移动到分区的顶层目录(/mnt目录)。

7.取消挂载

命令:# umount /mnt/

注意:不能在挂载目录敲取消挂载命令。

 

8.设置环境变量从本地(SD卡)挂载

setenv bootargsroot=/dev/mmcblk0p2 rootfstype=ext3 init=/linuxrc console=ttySAC0 lcd=S702

9.挂载成功的效果:拔掉网线,也可以进入命令行。

 

3. Uboot、内核、文件系统移植进入EMMC启动

EMMC挂载文件系统步骤:

1. 烧写内核和UBOOT。(当前开发板必须从SD卡启动)

movi r f 0 40008000;emmc open 1;movi w z f 1 40008000;emmc close 1;
movi r b 0 40008000;emmc open 1;movi w z b 1 40008000;emmc close 1;
movi r u 0 40008000;emmc open 1;movi w z u 1 40008000;emmc close 1;
movi r t 0 40008000;emmc open 1;movi w z t 1 40008000;emmc close 1;
movi r k 0 40008000;movi w k 1 40008000;

2. 给EMMC分区(当前开发板从EMMC启动,拔掉SD卡)

TINY4412 # fdisk -c 0 2000 500 500
TINY4412 # ext3format mmc 0:2
TINY4412 # ext3format mmc 0:3
TINY4412 # ext3format mmc 0:4

 

3. 修改UBOOT环境变量(当前开发板从EMMC启动,拔掉SD卡)

修改环境变量从NFS网络文件系统启动:

set bootargs root=/dev/nfs nfsroot=192.168.18.18:/work/rootfs ip=192.168.18.123:192.168.18.18:192.168.18.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200


自动生成设备节点文件的命令:mdev -s

查看分区和文件的大小:df、du

 

4. 挂载EMMC分区

# mount /dev/mmcblk0p2 /mnt/

 

5. 解压文件系统

# tar xvf /rootfs.tar

 

6. 设置uboot环境变量

set bootargs root=/dev/mmcblk0p2 rootfstype=ext3 init=/linuxrc console=ttySAC0,115200