手把手教你移植根文件系统(目标平台S3C2410)

时间:2022-12-01 19:12:24
Linux内核在系统启动期间进行的最后操作之一就是安装根文件系统,根文件系统一直是所有类UNIX系统不可或缺的组件。

bin      必要的用户命令(二进制文件)

*boot     引导加载程序使用的静态文件

dev      设备文件及其他特殊文件

etc      系统配置文件

*home  用户主目录

lib       必要的链接库,例如:C链接库、内核模块

mnt       临时挂载的文件系统的挂载点

*opt     附加软件的安装目录

proc    提供内核和进程信息的proc文件系统

*root     root用户主目录

sbin    必要的系统管理员命令

tmp     临时文件目录

usr     大多数用户使用的应用程序和文件目录

var     监控程序和工具程序存放的可变数据

带“*”的目录在嵌入式Linux上为可选的。

在一个基本的Linux根文件系统中,应包括如下的文件:

Ø        链接库

Ø        设备文件

Ø        系统应用程序

Ø        系统初始化文件

下面介绍以下根文件系统的具体移植步骤:

1、获取所需的源码包

具体包括:busybox-1.12.2.tar.bz2、cramfs-1.1.tar.gz(用来生成cramfs格式的文件系统映像)、yaffs2.tar.gz(用来生成yaffs2格式的文件系统映像)。

2、解压源码包生成映像工具

依次解压三个源码包,然后进入cramfs-1.1目录,执行以下命令:

#make

执行完成后就生成了mkcramfs工具,用来生成cramfs映像。

再进入yaffs2目录,执行以下命令:

#make

执行完成之后就在yaffs2目录下的utils目录生成了mkyaffsimage(最大支持512B页)和mkyaffs2image(最大支持2KB页,并向前兼容)两个工具,这两个工具用来生成yaffs映像。

4、配置busybox

进入busybox解压后的目录,执行以下命令:

#gedit Makefile

找到并修改下面两行:

CROSS_COMPILE ?= arm-linux-

...

ARCH ?= arm

然后执行以下命令:

#make menuconfig

配置修改如下:

Busybox Settings --->

    Build Options --->

        [*] Build BusyBox as a static binary (no shared libs)

        //编译成静态库。

        Cross Compiler prefix

        //这里和Makefile里保持一致,写一处就行。

    Installation Options --->

        [ ] Don't use /usr

        //使用usr目录

Busybox Library Tuning  --->  

[*]   Fancy shell prompts  

//一定要选上,否则很多转意字符无法识别。

Shells --->

    Choose your default shell (ash) --->

    //这里选择shell为ash,应该是默认选中的。

        --- ash

        //把ash这档的选项全部选上。

Miscellaneous Utilities  --->

[ ] inotifyd

配置完成,保存退出。

5、编译busybox

执行以下命令:

#make

#make install

以上命令执行完成之后就在_install目录下生成了根文件系统所必须的目录、文件、二进制工具。

6、建立根文件系统的目录结构

首先新建一个脚本,执行以下命令:

#gedit creat_fs.sh

然后在打开的文件中添加以下内容:

#!/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 #8 dirs

mkdir usr/bin usr/lib usr/sbin lib/modules

 

#Don't use mknod, unless you run this Script as

mknod -m 600 dev/console c 5 1

mknod -m 666 dev/null c 1 3

 

echo "making dir: mnt tmp var"

mkdir mnt tmp var

chmod 1777 tmp

mkdir mnt/etc mnt/jiffs2 mnt/yaffs mnt/data mnt/temp

mkdir var/lib var/lock var/log var/run var/tmp

chmod 1777 var/tmp

 

echo "making dir: home root boot"

mkdir home root boot

echo "done"

保存,退出。

在想要创建根文件系统目录的地方执行这个脚本,就会生成一个rootfs目录,这个目录里面包括一个完整的根文件系统的目录结构。

7、复制配置文件到etc目录下

执行以下命令:

#cd rootfs/etc

#cp /home/root/busybox-1.12.2/examples/bootfloppy/etc/* .

8、依次修改配置文件

执行以下操作:

#gedit 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

#gedit inittab

将打开的文件修改为:

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::restart:/sbin/init

 

tty2::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff –a

#gedit profile

将打开的文件修改为:

# /etc/profile: system-wide .profile file for the Bourne shells

 

echo "Processing /etc/profile"

# no-op

 

# Set search library path

echo " Set search library path"

export LD_LIBRARY_PATH=/lib:/usr/lib

 

# Set user path

echo " Set user path"

PATH=/bin:/sbin:/usr/bin:/usr/sbin

export PATH

 

# Set PS1

echo " Set PS1"

HOSTNAME=`/bin/hostname`

# 此处让shell提示符显示host名称的。是`,不是’,要注意

# 会在进入根系统后显示Jacky

 

export PS1="\\e[32m[$USER@$HOSTNAME \\w\\a]\\$\\e[00;37m "

# 此处\\e[32m是让后面的“[$USER@$HOSTNAME \\w\\a]”显示为绿色

# \\e[00是关闭效果

# \\e[05是闪烁

# 37m是让后面的显示为白色

# 多个命令可以;号隔开

 

echo "All done!"

echo

#gedit init.d/rcS

将打开的文件修改为:

#! /bin/sh

echo "Processing etc/init.d/rc.S"

 

#hostname ${HOSTNAME}

hostname song

echo " Mount all"

/bin/mount -a

 

echo " Start mdev...."

/bin/echo /sbin/mdev > proc/sys/kernel/hotplug

mdev -s

 

echo "mount yaffs to /mnt/yaffs"

/bin/mount -t yaffs /dev/mtdblock3 /mnt/yaffs

 

echo "start eth0....."

ifconfig lo 127.0.0.1

route add -net 127.0.0.0 netmask 255.0.0.0 lo

portmap

 

ifconfig eth0 192.168.0.121  mtu 500

 

route add default gw 192.168.0.254 netmask 0.0.0.0

inetd

echo "****************************************************"

echo "          s3c2410               "

echo " Created by sjs @ 20011.09.24"

echo " Good Luck"

echo "http://blog.csdn.net/songjinshi"

echo "****************************************************"

echo

9、创建一个空mdev.conf

这个文件在挂载文件系统时会用到,执行以下命令:

#touch mdev.conf

10、从本机拷贝passwd、shadow、group三个文件

执行以下命令:

#cp /etc/passwd .

#cp /etc/shadow .

#cp /etc/group .

然后修改passwd文件,把最后一行的bash修改成ash。

11、拷贝busybox安装目录下的所有文件到根文件系统目录

把busybox默认安装目录中的文件全部复制到这里的rootfs中。会发现多了linuxrc -> bin/busybox文件,这是挂载文件系统需要执行的。具体命令为:

#cp –rfv /home/root/busybox-1.12.2/_install/* /home/root/rootfs

在这里需要说明一点:如果你是选择的动态编译busybox,需要拷贝相关的glibc库到文件系统的lib目录中。具体方法:

先看看busybox/_install/bin/busybox使用了哪些lib,然后从glibc复制相应的lib到

root@bin]# /usr/local/arm/3.4.6/arm-linux-gnu-readelf -d busybox

 

Dynamic section at offset 0xb8014 contains 22 entries:
Tag        Type                         Name/Value
0x00000001 (NEEDED)                     Shared library:[libcrypt.so.1]
0x00000001 (NEEDED)                     Shared library: [libm.so.6]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]
0x0000000c (INIT)                       0xc04c
0x0000000d (FINI)                       0xa26f0
0x00000004 (HASH)                        0x80e8
0x00000005 (STRTAB)                     0xa384
0x00000006 (SYMTAB)                     0x8b24
……
……

……

复制lib 文件到lib目录下:
[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/ld* .
[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libc-2.3.2.so .
[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libc.so.6 .
[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libm * .

[root@lib]cp /usr/local/arm/3.4.6/arm-linux/lib/libcrypt* .

 

12、生成cramfs映像

使用上面生成的mkcramfs工具将rootfs根文件系统目录生成一个cramfs映像,具体命令为:

#./mkcramfs rootfs rootfs.cramfs

执行完上述命令,生成的rootfs.cramfs就是我们的根文件系统映像,这个映像就是我们要下载到开发板上的根文件系统映像。

在这里说明一下,这个cramfs文件系统是只读的,而yaffs文件系统是针对nand flash闪存设备专门制作的一个可读可写文件系统,在我们的启动脚本中将nand flash的第四个分区,也就是用户分区/dev/mtdblock3挂载到了/mnt/yaffs下面,大家可以将自己的应用程序或者其他文件下载到开发板的/mnt/yaffs目录下,这个目录是可读可写的,也是掉电非易失的。