您的位置:首页 > 运维架构 > Linux

linux文件系统制作(一)

2013-05-01 15:12 435 查看
文件制作4步骤

一、准备制作(创建系统目录)

二、编译busybox(制作文件系统的必备工具)

三、制作文件系统(添加必备的文件,制作镜像)

四、完善文件系统(根据需要,移植更多的应用程序)

step1:准备制作

创建根文件系统目录,主要包括以下目录:

/bin,/etc,/dev,/home,/lib,/mnt,/opt,/proc,/root./sbin,/sys,/tmp,/usr,/var.

建一个名为root_2.6.31的文件

#mkdir root_2.6.31

在该文件夹下创建以上目录

#mkdir bin etc dev ...

step2:编译busybox

获取busybox-1.15.2源码,在http://www.busybox.net/downloads/找到busy-1.15.2.tar.gz这个压缩包,下载,解压:

#tar xjvf busybox-1.15.2

进入源码目录,修改Makefile

第164行,CROSS_COMPILE=arm-linux-

第194行,ARCH=arm

执行#make menuconfig进行配置busybox

配置选项大部分是保持默认的,只需要注意选择一下这几个选项,其他的选项都不动:

Busybox Setting --->

Build Options --->

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

[*]Build with Large File Support (for accessing files > 2GB)

Installation Options --->

(./_install) Busybox installation prefix

进入这个选项,输入busybox的安装路径,如../rootfs

Busybox Library Tuning --->

[*]vi-style line editing commands

[*]Fancy shell prompts

要选择这个选项:“Fancy shell prompts”,否则挂起文件系统后,无法正常显示命令提示符:“[\u@\h \W]#”

配置完成后,执行#make

(注:如果出现找不到crypt m库的错误提示Trying libraries: crypt m Library crypt is needed, can't exclude it (yet) Library m is needed, can't exclude it (yet) Final link with: crypt m,可以不必理会,直接make install,然后在../rootfs下可以找到bin sbin
usr三个目录以及linuxrc。)

make install

然后就会在上一级目录下生成rootfs文件夹,里面包含几个文件夹/bin/sbin/usr/linuxrc,把这些文件全部都复制到刚建好的root_2.6.31目录下,#cp -rf * ../root_2.6.31

setp3:制作文件系统

在系统启动后至少要用到这两个设备文件。

在dev目录中,创建两个设备节点:

#mknod console c 5 1 //console指控制台,也就是串口,这条命令意思是创建一个名为console的设备文件,c指字符类型设备,5是主设备号,1是从设备号

#mknod null c 1 3

进入etc目录,添加文件:

拷贝Busybox-1.15.2/examples/bootfloopy/etc/* 到当前目录下。

#cp -r ../../busybox-1.15.2/examples/bootfloopy/etc/* ./

包括文件:fstab init.d inittab profile

拷贝/etc/passwd,/etc/group,/etc/shadow到当前目录下

#cp /etc/passwd ./

#cp /etc/group ./

#cp /etc/shadow ./

把passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成/bin/ash.因为文件系统的bin目录下没有bash这个命令,而是用ash代替bash,所以在用用户名密码登录时候(如telnet),会出现“cannot run /bin/bash: No such file or directory”的错误。

内核启动过程:内核完成初始化后就会启动系统的第一个进程init,它的进程ID号为1,我们可以使用命令ps -e查看系统所有进程。可以看到第一就是init进程,他的作用就是根据配置文件决定启动哪些程序。而嵌入式linux中它的执行程序就是sbin中的init,busybox中init程序的代码在busybox-1.15.2/init/init.c,它主要是解析/etc/inittab这个文件

inittab文件中每个条目都用来定义一个子进程并确定它的启动方法

::sysinit:/etc/init.d/rcS /*sysinit系统启动后最先执行的,也就是/etc/init.d/rcS

文件*/

::respawn:-/bin/sh /*respawn当发现子进程退出时,重启命令解析器-/bin/sh*/

tty2::askfirst:-/bin/sh /*askfirst当文件系统挂载后按回车才进入-/bin/sh命令解析器*/

::ctrlaltdel:/bin/umount -a -r /*ctrlaltdel按下这三个组合键后所执行的程序/bin/umount -a -r */

修改inittab文件:

内容如下:

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

ttyS0::respawn:-/bin/sh

s3c2410_serial0::askfirst:-/bin/sh

::once:/usr/sbin/telnetd -l /bin/login

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

fstab中是存放系统中文件系统的信息,这些信息是用来控制mount命令的行为

proc /proc proc defaults 0 0

要挂载的设备 挂载点 文件系统的类型 挂载参数 dump(备份程序) fsckorder(检查磁盘程序)

修改fstab文件,内容如下:

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

var /dev tmpfs defaults 0 0

修改init.d/rcS文件(系统最先执行的,也可称为初始化脚本)

内容如下:

#!/bin/sh

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

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

mount -a

mkdir /dev/pts /*dev/pts用来支持外部网络连接(telnet)的虚拟终端*/

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug /*设置内核,当有设备插拔时调用/sbin/mdev程序*/

mdev -s /*在/dev目录下生成内核支持所有设备的结点*/

mkdir -p /var/lock

/bin/hostname -F /etc/sysconfig/HOSTNAME

修改profile文件(也是个脚本文件,不过是我们按下回车后才执行的)

内容如下:

#Ash profile

#vim: syntax=sh

#NO core files by default

#ulimit -S -c 0 > /dev/null 2>&1

USER="'id-un'" /*双引号,单引号-单引号,双引号*/

LOGNAME=$USER

PS1='[\u@\h \W]#'

PATH=$PATH

HOSTNAME='/bin/hostname'

echo "Processing /etc/profile..."

echo "Done"

export USER LOGNAME PS1 PATH

其中HOSTNAME 即为 命令提示符前面所显示的名字[root@localhost etc]中的root。而在init.d/rcS脚本中

/bin/hostname -F /etc/sysconfig/HOSTNAME

指定到/etc/sysconfig/HOSTNAME中找这个名称。

故,在/etc下新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:TX2440

拷贝库文件:(因为程序运行时需要依赖动态库文件,就是lib目录下的文件)

进入lib目录,拷贝交叉编译器的库文件到lib目录下。

这里需要注意:我们不能使用当前系统下的lib目录中的文件,必须是用哪个交叉编译器编译编译的busybox就使用哪个交叉编译器下的lib文件

#cp -f -a

/opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib/*.so.* ./

由于交叉编译器的库文件比较多,体积较大,所以需要裁减一下库文件,只保留常用的库文件,具体的裁减方法可以参考我们提供的文件体统的源码。

到这里,文件系统的框架已经做好了,我们需要把文件系统制作成可以烧写进Nandflash中的yaffs2镜像文件。

使用mkyaffs2image工具,制作yaffs2镜像,这个工具是在yaffs2源码包中utils目录下的mkyaffs2image.c文件编译得到的,如果使用的是大页NAND,需要修改源码。

可以使用我们提供的编译好的mkyaffs2image工具(位置:光盘资料/linux平台工具/mkyaffs2image.tar.gz)

把解压出来的可执行文件复制到/usr/bin目录下

#cp mkyaffs2iamge /usr/bin

制作文件系镜像:

#mkyaffs2image root_2.6.31 root_2.6.31.bin

root_2.6.31.bin就是yaffs2文件系统镜像,要先修改它的权限,否则该文件无法被复制:

#chmod 777 root_2.6.31.bin

把root_2.6.31.bin下载到nandflash中的文件系统分区中,如果文件系统能正常挂载,终端会打印出:

Please press Enter to activate this consoole(按回车)

Processing /etc/profile

Done

[root@TX2440A /]#

step4:完善文件系统

在/mnt目录下创建件一下文件夹,用来挂起NFS,SD卡和U盘

nfs sd udisk1 udisk2 udisk3 udisk4

设置开发板IP地址:

方法一、ifconfig eth0 10.28.42.111(开发板的ip)

方法二、在init.d/rcS文件中加入:

ifconfig lo 127.0.0.1

ifconfig eth0 10.28.42.111 netmask 255.0.0.0 up

route add default gw 10.28.42.1

这样在开机时,就自己设置了IP地址为:10.28.42.111

在/etc/profile中加入

alias ll='ls -l'

alias mntnfs ='mount -t nfs -o nolock'

alias mntud1 ='mount /dev/sda1 /mnt/udisk1'

alias umntud1='umount /mnt/udisk1'

alias命令的作用是给一个命令取个别名,可以根据自己的需要在这里天剑

也可以像想上述的方法一,在命令行中输入,但是那只是临时的

nfs出现挂载出现mount: RPC: Unable to send; errno = Network is unreachable解决办法:重新设置开发板ip地址,并与虚拟机、主机在同一网段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: