现在的位置: 首页 > 综合 > 正文

文件系统制作总结(cramfs)

2013年12月05日 ⁄ 综合 ⁄ 共 5349字 ⁄ 字号 评论关闭

1构造目标板的根目录及文件系统

1.1 建立一个目标板的空根目录

我们将在这里构建构建根文件系统,创建基础目录结构. 存放交叉编译后生成的目标应用程序(BUSYBOX,TINYLOGIN),存放库文件等。

[arm@localhost root]# mkdir dir

[arm@localhost root]# pwd

/root/dir

[arm@localhost root]# cd dir

1.2 在my_rootfs中建立Linux目录树

bin:包含基本的用户命令

Sbin:

Boot:

Etc:

Lib:

Usr:

Home:

Root:

Dev:

Opt:

Mnt:

Var:

Proc:

Tmp:

[arm@localhost dir]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr

[arm@localhost dir]#mkdir mnt/etc

[arm@localhost dir]#mkdir usr/bin usr/lib usr/sbin

[arm@localhost dir]#touch linuxrc

[arm@localhost dir]#tree

|bin

|dev

|etc

|home

|lib

|linuxrc

/* 此文件为启动脚本,是一shell脚本文件。本文后面有专门介绍 */

|mnt

| `etc

|proc

|sbin

|sys

|tmp

|root

`usr

|bin

|lib

`sbin

权限参照你的linux工作站即可,基础目录介绍参见本文参考资料(未尾)。

需要说明的一点就是etc目录存放配置文件,这个目录通常是需要修改的,所以在linuxrc脚本当中将etc目录

挂载为ramfs文件系统,然后将mnt/etc目录中的所有配置文件拷贝到etc目录当中,这在下一节的linuxrc脚本

文件当中会有体现。

1.3 创建linuxrc文件

1. 创建linuxrc,加入如下内容:

[arm@localhost dir]#vi linuxrc

#!/bin/sh

#挂载/etc为ramfs, 并从/mnt/etc下拷贝文件到/etc目录当中

echo "mount /etc as ramfs"

/bin/mount -n -t ramfs ramfs /etc

/bin/cp -a /mnt/etc/* /etc

echo "recreate the /etc/mtab entries"

# recreate the /etc/mtab entries

/bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/2 /

#mount some file system

echo "mount /dev/shm as tmpfs"

/bin/mount -n -t tmpfs tmpfs /dev/shm

#挂载/proc为proc文件系统

echo "mount /proc as proc"

/bin/mount -n -t proc none /proc

#挂载/sys为sysfs文件系统

echo "mount /sys as sysfs"

/bin/mount -n -t sysfs none /sys

exec /sbin/init

2. 修改权限

[arm@localhost dir]#chmod 775 linuxrc

[arm@localhost dir]#ls linuxrc -al

rwxrwxrx

1 root root 533 Jun 4 11:19 linuxrc

当编译内核时,指定命令行参数如下

Boot options >

Default kernel command string: 我的命令行参数如下

noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200

其中的init指明kernel执行后要加载的第一个应用程序,缺省为/sbin/init,此处指定为/linuxrc

2 移植Busybox

BusyBox:BusyBox 是一个多调用的二进制文件,它提供了 POSIX 式的命令和专用函数的最小子集。它适合于非常小的嵌入式系统,比如引导磁盘等等。特别用于 Debian 拯救/安装系统(它激发了对最初的 BusyBox 的开发)、Linux Routeur 方案、LEM、lineo 及其它地方。Busybox 是由 Erik Andersen 维护的。

2.1 下载busybox

从http://www.busybox.net/downloads/busybox1.1.3.tar.gz/下载busybox1.1.3到/root目录当中,并解压.

2.2 进入解压后的目录,配置Busybox

首先将配置菜单中的所有选项全部选中,方便下一步配置:

[arm@localhost busybox1.1.3]$make defconfig

进入配置菜单进行选项配置:

[arm@localhost busybox1.1.3]$make menuconfig

在这里说明一下几个重要的配置:

Busybox Settings >

General Configuration >

[*] Support for devfs

Build Options >

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

/* 将busybox编译为静态连接,少了启动时找动态库的麻烦 */

[*] Do you want to build BusyBox with a Cross Compiler?

(/usr/local/arm/3.3.2/bin/arm-linux-)

Cross Compiler prefix

/* 指定交叉编译工具路径 */

Init Utilities >

[*] init

[*] Support reading an inittab file

/* 支持init读取/etc/inittab配置文件,一定要选上 */

Shells >

Choose your default shell (ash) >

/* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件

* 看看我们前头的linuxrc脚本的头一句:

* #!/bin/sh 是由bin/sh来解释执行的

*/

[*]ash

Linux System Utilities >

[*] mount

[*] umount

[*] Support loopback mounts

[*] Support for the old /etc/mtab file

Networking Utilities >

[*] inetd

/*

* 支持inetd超级服务器

* inetd的配置文件为/etc/inetd.conf文件,

* "在该部分的4: 相关配置文件的创建"一节会有说明

*/

2.3 编译并安装Busybox

[arm@localhost busybox1.1.3]$make TARGET_ARCH=arm CROSS=arm-linux-/

PREFIX=/root/dir/ all install

PREFIX指明安装路径:就是我们根文件系统所在路径。

*这里需要注意一点的是,只要install busybox,我们根文件系统下先前建好的linuxrc就会被覆盖为一同名二进制文件。其实使用busybox自动生成的linuxrc即可。

说明:

(1)经过实践,编译1.1.3版的busybox时,最好使用3.3.2版本的交叉编译器,没有为什么,经验告诉我的。

(2)编译时如果出现类似错误:找不到e2fsprogs等信息,这个不是自己的错误,是busybox本身的一个小BUG,改正即可,具体做法是:

进入e2fsprogs目录,打开Makefile.in文件,找到大概51行到55行,将 ”|“符号去掉即可。

3 移植TinyLogin

TinyLogin:TinyLogin 是一套 tiny UNIX 实用程序,它用于登录嵌入式系统、接受其验证身份、为其修改密码,并能维护其用户和用户组。为了增强系统安全性它还支持影子口令。正如它的名字所暗示的,TinyLogin 非常小,对嵌入式系统上的 BusyBox 是极好的补充。

3.1 下载

从http://tinylogin.busybox.net/downloads/tinylogin1.4.tar.bz2 下载tinylogin1.4到任意目录当中,并解压.

3.2 修改tinyLogin的Makefile

[arm@localhost tinylogin1.4]$vi Makefile

修改记录如下:

指明静态编译,不连接动态库

DOSTATIC = true

指明tinyLogin使用自己的算法来处理用户密码

USE_SYSTEM_PWD_GRP = false

USE_SYSTEM_SHADOW = false

3.3 编译并安装

[root@localhost tinylogin1.4]#

make CROSS=armlinuxPREFIX=/root/dir all install

PREFIX指明根文件路径

4 相关配置文件的创建

进入mnt/etc中, 这里是我们存放配置文件的路径

[arm@localhost my_rootfs]$ cd mnt/etc

4.1 创建帐号,启动文件及密码文件

[arm@localhost etc]$ cp /etc/passwd .

[arm@localhost etc]$ cp /etc/shadow .

[arm@localhost etc]$ cp /etc/group .

这3个文件是从你工作站当中拷贝过来的,删除其中绝大部分不需要的用户,经过删减后的上述3个文件如下。

那么现在root的登陆密码

和你工作站上的登陆口令一致了,这可能透露你工作站的信息

[arm@localhost etc]$ cat passwd

root:x:0:0:root:/root:/bin/sh /* 改为/bin/sh */

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[arm@localhost etc]$ cat shadow

root:$1$2LG20u89$UCEEUzBhElYpKMNZQPU.e1:13303:0:99999:7:::

bin:*:13283:0:99999:7:::

daemon:*:13283:0:99999:7:::

[arm@localhost etc]$ cat group

root:x:0:root

bin:x:1:root,bin,daemon

daemon:x:2:root,bin,daemon

4.2 创建profile文件

[arm@localhost etc]$ vi profile

# Set search library path

# 这条语句设置动态库的搜索路径,极其重要!!!

echo "Set search library path int /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

4.4 创建fstab文件

[arm@localhost etc]$ vi fstab

none /proc proc defaults 0 0

none /dev/pts devpts mode=0622 0 0

tmpfs /dev/shm tmpfs defaults 0 0

4.5创建inittab文件

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

::respawn:-/bin/login

tty2::askfirst:-/bin/sh

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

6 添加常用的库

我们以一个简单的hello world程序为例。可以有一个笨方法,在不知道需要什么的库的前提下,在开发板中运行经过交叉编译过的程序,看看提示需要什么库,然后再将相应的库文件考到文件系统的/lib下即可。Hello.c这个程序需要的库文件有libc.so.6和ld-linux.so.2,但是这两个库只是一个链接文件,需要连同真正的库一起拷贝过来,所以需要使用ll命令查看他们的真是文件。

#cp /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6  libc-2.3.2.so  /root/dir/lib

#cp /usr/local/arm/3.4.1/arm-linux/lib/ld-linux.so.2  ld-2.3.2.so  /root/dir/lib

抱歉!评论已关闭.