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

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目录下,这个目录是可读可写的,也是掉电非易失的。

时间: 2025-01-24 02:57:43

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

手把手教你移植u-boot(目标平台S3C2410)

U-Boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的BootLoader程序,它可以运行于PowerPC.ARM.MIPS等多种嵌入式开发板上. u-boot目录的源码结构如下: board:开发板相关目录. common:通用的命令函数. cpu:特定CPU架构相关目录,如arm920t. doc:uboot的开发.使用文档. drivers:uboot支持的设备驱动程序,比如串口,nandflash,网卡. fs: 支持的文件系统,Uboo

手把手教你交叉编译tslib1.4(目标平台S3C2410)

首先进入 tslib-1.4.tar.bz2压缩包所在目录解压,执行命令: #tar xjvf tslib-1.4.tar.bz2 进入解压后的目录:cd  tslib-1.4  修改脚本: #gedit build.sh 文件内容修改为: #/bin/sh export CC=arm-linux-gcc ./autogen.sh echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache  ./configure --host

手把手教你移植linux内核(目标平台S3C2410)

Linux内核的最初版本由Linus Torvalds在1991年发布,后来内核版本不断更新: Linux1.0   1994年3月    仅支持386 Linux1.2   1995年3月    多平台支持 Linux2.0   1996年6月    支持SMP Linux2.2   1999年1月    支持更多的硬件 Linux2.4   2001年1月    支持桌面系统和USB Linux2.6   2003年12月   支持更多平台,使用新的调度器,内核可被抢占,模块子系统和文件系统

手把手教你烧写烧写u-boot、kernel、rootfs(目标平台S3C2410)

内核分区空间: Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x00000000-0x00080000 : "Bootloader" 0x00080000-0x00280000 : "Linux Kernel" 0x00280000-0x00680000 : "Root File System" 0x00680000-0x04000000 : "User

手把手教你交叉编译QT/E(目标平台S3C2410)

首先进入压缩包所在目录,执行命令解压: #tar xzvf qt-everywhere-opensource-src-4.6.3.tar.gz 进入解压后的目录: #cd qt-everywhere-opensource-src-4.6.3 修改错误文件: #gedit src/3rdparty/freetype/include/freetype/config/ftconfig.h 将第330 行修改为:"orr    %0, %0,%2, lsl #16\n\t"  /* %0 |=

TI Davinci DM6446开发攻略——根文件系统的裁剪和移植

一.补充文件系统知识 Linux根文件系统是存放tool软件.lib文件.script(脚本).配置文件.其他特殊文件.自己开发的应用程序的地方.嵌入式linux的根文件系统rootfs就像windows操作系统的C.D盘这种概念机制,FLASH对应硬盘.但linux是挂载点的概念,根文件系统是一个整体,组织到一个树状的目录结构中.这种文件组织遵守文件系统科学分类标准FHS,一种国际标准.运行.维护系统所必须的各种 在开发.测试阶段,基本上都是使用NFS(网络文件系统),NFS文件系统是在你的开

u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统

http://www.linuxidc.com/Linux/2012-09/70510.htm  来源:Linux社区  作者:赵春江  uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该功能,并组成一个最简单的系统,这不仅要移植uboot,还要移植linux内核及创建一个根文件系统. 首先我们对nandflash进行分区,规划好每个文件存放在nandflash的位置.下面是nandflash的分区: 第0分区:0x000000000000-0x000000080000为uboot

嵌入式移植-嵌入式2.6.32内核挂载根文件系统root.cramfs失败

问题描述 嵌入式2.6.32内核挂载根文件系统root.cramfs失败 Copy linux kernel from 0x00030000 to 0x30008000 size = 0x00300000 ... donezImage magic = 0x016f2818Setup linux parameters at 0x30000100linux command line is: ""noinitrd root=/dev/mtdblock3 init=/linuxrcconsol

完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

转载自 PiggyXP(小猪) 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三 手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                              ----- By PiggyXP(小猪) 前 言         本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中