首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

多种嵌入式文件系统移植集合 (2)

多种嵌入式文件系统移植集合 (2)

3.2. Linux根文件系统中一般有下面的几个目录:1.1.1.  /bin目录该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。
/bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。
1.1.2.  /sbin 目录该目录下存放系统命令,即只有系统管理员(俗称最高权限的root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。
/sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。
1.1.3. /dev目录该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。比较重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/lp*等。
1.1.4. /etc目录该目录下存放着系统主要的配置文件,例如人员的账号密码文件、各种服务的其实文件等。一般来说,此目录的各文件属性是可以让一般用户查阅的,但是只有root有权限修改。对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。
1.1.5. /lib目录该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。
1.1.6. home目录系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。
1.1.7. /root目录系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。
1.1.8. /usr目录/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。
1.1.9. /var目录与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。
1.1.10. /proc目录这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核
临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。
1.1.11. /mnt目录用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。
1.1.12. /tmp目录用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。
那我们利用Busybox制作根文件系统就是创建这上面的这些目录,和这些目录下面的各种文件。
对于嵌入式Linux系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以/home这个目录在一般嵌入式Linux中可能就很少用到,而/boot这个目录则取决于你所使用的BootLoader是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,而其他都是可选的。
根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征,它给 Linux带来了许多强大和灵活的功能,同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本结构,以及细心的选择所需要的系统库、内核模块和应用程序等,并配置好各种初始化脚本文件,以及选择合适的文件系统类型并把它放到实际的存储设备的合适位置。
对于嵌入式文件系统的制作和移植而言,它的根文件系统结构基本一样。因此,对同一个根文件系统,通过相应的工具和方法就能容易生成对应文件系统。下面介绍如何制作一个简洁的根文件系统。
3.3. 制作根文件系统制作根文件系统经常会用到根用户权限,所以需要倍加小心。
1.1.13. 根文件系统树制作[lingyun@localhost opt]$ pwd
/opt
[lingyun@localhost opt]$ mkdir rootfs
[lingyun@localhost opt]$ cd rootfs
[lingyun@localhost rootfs]$ ls
[lingyun@localhost rootfs]$ mkdir-p
{apps,bin,data,dev,info,proc,root,sbin,sys,tmp,var,etc/{,init.d,dropbear},mnt/{,usb,sdc,nfs,dev},usr/{,bin,sbin,lib,share},lib/{,modules/{,3.0.0}}}               
[lingyun@localhost rootfs]$ tree -L 3
.
|-- apps # 挂载Application所在分区用的目录
|-- bin  
|-- data # 挂载data分区所在的目录
|-- dev  
|-- etc
|   |-- dropbear #  dropbear ssh server依赖的文件
|   `-- init.d # 系统启动初始化脚本
|-- info # 挂载info分区所在的目录
|-- lib # 动态库所存放的目录
|   `-- modules #

insmod时,依赖/lib/modules/内核版本目录
|       `-- 3.0.0 # 我们将Linux驱动放到该目录下,目录名对应内核版本号
|-- mnt # 设备在运行时的一些挂载点
|   |-- dev # 保留备用
|   |-- nfs #  NFS挂载点
|   |-- sdc #  SD卡挂载点
|   `-- usb #  U盘挂载点
|-- proc #  proc文件挂载点
|-- root #  root用户目录
|-- sbin  
|-- sys #  sys文件系统挂载点
|-- tmp # tmpfs文件系统挂载点
|-- usr
|   |-- bin
|   |-- lib # 用户程序动态库放到这里
|   |-- sbin
|   `-- share
`-- var
27 directories, 0 files
上面的一些目录,可以先不用关系它的用途,今后对文件系统进行扩展时在介绍。
1.1.14. Dev目录下创建设备文件因为内核挂载完文件系统后,init进程需要用到/dev/console和/dev/null这两个设备文件来调用mdev构建dev,所以必须在制作文件系统时静态创建这两个设备文件,否则在系统启动时将提示
Waring:unable to open an initial console:
[lingyun@localhost rootfs]$ sudo mknod -m666 dev/null c 1 3
[lingyun@localhost rootfs]$ sudo mknod -m666 dev/console c 5 1
[lingyun@localhost rootfs]$ sudo mknod -m666 dev/ttyS0 c 4 64
[lingyun@localhost rootfs]$ sudo mknod -m666 dev/ttySAC0 c 4 64
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock0 b 31 0
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock1 b 31 1
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock2 b 31 2
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock3 b 31 3
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock4 b 31 4
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock5 b 31 5
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock6 b 31 6
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock7 b 31 7
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock8 b 31 8
[lingyun@localhost rootfs]$ sudo mknod dev/mtdblock9 b 31 9
[lingyun@localhost rootfs]$ ls -l dev/
total 0
crw-rw-rw- 1 root root  5,  1 Apr 25 20:43 console
brw-r--r-- 1 root root 31,  0 Apr 25 20:49 mtdblock0
brw-r--r-- 1 root root 31,  1 Apr 25 20:49 mtdblock1
brw-r--r-- 1 root root 31,  2 Apr 25 20:49 mtdblock2
brw-r--r-- 1 root root 31,  3 Apr 25 20:49 mtdblock3
brw-r--r-- 1 root root 31,  4 Apr 25 20:49 mtdblock4
brw-r--r-- 1 root root 31,  5 Apr 25 20:49 mtdblock5
brw-r--r-- 1 root root 31,  6 Apr 25 20:50 mtdblock6
brw-r--r-- 1 root root 31,  7 Apr 25 20:50 mtdblock7
brw-r--r-- 1 root root 31,  8 Apr 25 20:51 mtdblock8
brw-r--r-- 1 root root 31,  9 Apr 25 20:51 mtdblock9
crw-rw-rw- 1 root root  1,  3 Apr 25 20:43 null
crw-rw-rw- 1 root root  4, 64 Apr 25 20:44 ttyS0
crw-rw-rw- 1 root root  4, 64 Apr 25 20:44 ttySAC0
[lingyun@localhost rootfs]$
1.1.15. Var 目录下创建符号链接文件[lingyun@localhost rootfs]$ ln -s /tmp var/lock
[lingyun@localhost rootfs]$ ln -s /tmp var/log
[lingyun@localhost rootfs]$ ln -s /tmp var/run
[lingyun@localhost rootfs]$ ln -s /tmp var/tmp
[lingyun@localhost rootfs]$ ls -l var/
total 0
lrwxrwxrwx 1 lingyun trainning 4 Apr 25 20:57 lock -> /tmp
lrwxrwxrwx 1 lingyun trainning 4 Apr 25 20:57 log -> /tmp
lrwxrwxrwx 1 lingyun trainning 4 Apr 25 20:57 run -> /tmp
lrwxrwxrwx 1 lingyun trainning 4 Apr 25 20:57 tmp -> /tmp
[lingyun@localhost rootfs]$
1.1.16. 拷贝交叉编译器中的动态库到相应的目录下[lingyun@localhost  rootfs]$cp -af /opt/buildroot-2011.02/arm920t/usr/arm-linux/sysroot/lib/*so*  lib/
[lingyun@localhost rootfs]$ cp -af /opt/buildroot-2011.02/arm920t/usr/arm-linux/lib/*so*
lib/    
同时也可以用下面的一个安全的脚本来执行这个工作
[lingyun@localhost tools]$ vim install_shared_library.sh                                                                                                        
#!/bin/bash
if [ $# != 1 ] ; then
    echo "Usage: $0 [rootfs_path]"
    exit;
fi
INST_PATH=$1
if [ ! -d $INST_PATH -o $INST_PATH == "/" ] ; then
    echo "$INST_PATH is not exist or it's root path,exit now"
    exit;
fi
if [ ! -d $INST_PATH/data ] ; then
    echo "It's not an embedded root file system tree"
    exit;
fi
CROSSTOOL_PATH=/opt/buildroot-2012.08/arm920t/usr/
CMD_PREFIX=sudo
set -ev
LIB_PATH=$INST_PATH/lib
USR_LIB_PATH=$INST_PATH/usr/lib
$CMD_PREFIX rm -rf $LIB_PATH/*.so*
$CMD_PREFIX rm -rf $USR_LIB_PATH/*
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/lib/*.so* $LIB_PATH
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/lib/*.so* $LIB_PATH
$CMD_PREFIX cp -af $CROSSTOOL_PATH/lib/*.so* $LIB_PATH
#$CMD_PREFIX sudo rm -rf $LIB_PATH/libmudflap*
$CMD_PREFIX sudo rm -rf $LIB_PATH/libstdc++.so.6.0.14-gdb.py
mkdir -p lib
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/usr/lib/*.so* lib
#$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/usr/lib/engines lib
$CMD_PREFIX sudo rm -rf lib/libstdc++.so*
$CMD_PREFIX mv lib/* $USR_LIB_PATH
rm -rf lib
#执行shell脚本
[lingyun@localhost tools]$ sh install_shared_library.sh /opt/rootfs
LIB_PATH=$INST_PATH/lib
USR_LIB_PATH=$INST_PATH/usr/lib
$CMD_PREFIX rm -rf $LIB_PATH/*.so*
$CMD_PREFIX rm -rf $USR_LIB_PATH/*
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/lib/*.so* $LIB_PATH
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/lib/*.so* $LIB_PATH
$CMD_PREFIX cp -af $CROSSTOOL_PATH/lib/*.so* $LIB_PATH
#$CMD_PREFIX sudo rm -rf $LIB_PATH/libmudflap*
$CMD_PREFIX sudo rm -rf $LIB_PATH/libstdc++.so.6.0.14-gdb.py
mkdir -p lib
$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/usr/lib/*.so* lib
#$CMD_PREFIX cp -af $CROSSTOOL_PATH/arm-unknown-linux-uclibcgnueabi/sysroot/usr/lib/engines lib
$CMD_PREFIX sudo rm -rf lib/libstdc++.so*
$CMD_PREFIX mv lib/* $USR_LIB_PATH
rm -rf lib
[lingyun@localhost rootfs]$ ls lib/
ld-uClibc-0.9.33.2.so  libgcc_s.so.1     libmpc.so         libmudflap.so.0         libpthread.so.0        libuClibc-0.9.33.2.so
ld-uClibc.so.0         libgmp.so         libmpc.so.2       libmudflap.so.0.0.0     libresolv-0.9.33.2.so  libutil-0.9.33.2.so
libcrypt-0.9.33.2.so   libgmp.so.10      libmpc.so.2.0.0   libmudflapth.so         libresolv.so.0         libutil.so.0
libcrypt.so.0          libgmp.so.10.0.5  libmpfr.so        libmudflapth.so.0       librt-0.9.33.2.so      modules
libc.so.0              libltdl.so        libmpfr.so.4      libmudflapth.so.0.0.0   librt.so.0
libdl-0.9.33.2.so      libltdl.so.7      libmpfr.so.4.1.1  libnsl-0.9.33.2.so      libstdc++.so
libdl.so.0             libltdl.so.7.2.2  libm.so.0         libnsl.so.0             libstdc++.so.6
libgcc_s.so            libm-0.9.33.2.so  libmudflap.so     libpthread-0.9.33.2.so  libstdc++.so.6.0.14
1.1.17. Etc 目录下创建一些文件1.1.17.1. 创建inittab文件[lingyun@localhost rootfs]$ cd etc/
[lingyun@localhost etc]$ ls
dropbear  init.d
[lingyun@localhost etc]$ vim inittab
# /etc/inittab                                                                                                                     
#
# Copyright (C) 2011 fulinux <fulinux@gmail.com>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console.
#              If specified, then /dev/$id device must exist
# runlevels == ignored, busybox doesn't support it
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run
# Startup the system
# mount all the file systems specified in /etc/fstab
::sysinit:/bin/mount -a
#Use mdev as hotplug to auto mount USB storage or SD card
::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
#Use mdev to auto generate the device node in /dev path
::sysinit:/sbin/mdev -s
#make shm, pts support
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mkdir -p /dev/shm
::sysinit:/bin/mount -t devpts devpts /dev/pts
#Mount our apps/info partition
null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock6 /apps
null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock7 /info
#Set hostname
null::sysinit:/bin/hostname -F /etc/hostname
#Enable console logon
null::respawn:/sbin/getty -L ttyS0 115200 vt100
# now run any rc scripts
null::wait:/etc/init.d/rcS
# system daemon
null::respawn:/sbin/syslogd -n
null::respawn:/sbin/klogd -n
# Stuff to do before rebooting
null::shutdown:/bin/umount /apps
null::shutdown:/bin/umount /info
null::shutdown:/bin/killall klogd
null::shutdown:/bin/killall syslogd
null::shutdown:/bin/umount -a -r
#null::shutdown:/sbin/swapoff -a
[lingyun@localhost etc]$
1.1.17.2. 创建/etc/init.d/rcS脚本[lingyun@localhost etc]$ vim init.d/rcS                                                                                                                          
#!/bin/sh
# Copyright (C) 2011 fulinux <fulinux@gmail.com>
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#                           
for i in /etc/init.d/S??* ; do
            $i
done
1.1.17.3. 配置网卡的启动脚本[lingyun@localhost etc]$ vim init.d/S01_network                                                                                                               
#!/bin/sh
ifconfig eth0 192.168.1.111 netmask 255.255.255.0 up
1.1.17.4. 创建支持/apps/etc目录下的启动脚本[lingyun@localhost etc]$ vim init.d/S99_rcsApp                                                                                                                  
#!/bin/sh
# Copyright (C) 2011 fulinux <fulinux@gmail.com>
#
# Start all init scripts in /apps/etc/init.d
# executing them in numerical order.
#
if (test -d /apps/etc/init.d)
    then
    for i in /apps/etc/init.d/S??* ; do
    $i
    done
fi
1.1.17.5. 修改init.d目录下的文件权限[lingyun@localhost etc]$ chmod 777 init.d/*
[lingyun@localhost etc]$ ll init.d/
total 12
-rwxrwxrwx 1 lingyun trainning  222 Apr 26 13:27 rcS
-rwxrwxrwx 1 lingyun trainning   64 Apr 26 13:33 S01_network
-rwxrwxrwx 1 lingyun trainning  248 Apr 26 13:37 S99_rcsApp
[lingyun@localhost etc]$
1.1.17.6. 创建fstab文件[lingyun@localhost etc]$ vim fstab                                                                                                                        
# /etc/fstab: static file system information.
# Copyright (C) 2011 fulinux <fulinux@gmail.com>
#
#<File system> <mount pt>     <type>   <options>         <dump> <pass>
#devpts          /dev/pts       devpts   defaults          0      0
#/dev/root       /              ext2     rw,noauto         0      1
proc            /proc          proc     defaults          0      0
tmpfs           /tmp          tmpfs    defaults          0      0
tmpfs           /dev          tmpfs    defaults          0      0
sysfs           /sys           sysfs    defaults          0      0
1.1.17.7. 创建hostname,hosts,TZ文件[lingyun@localhost etc]$ echo "root" > hostname   
[lingyun@localhost etc]$ echo "127.0.0.1      localhost" >> hosts
[lingyun@localhost etc]$ echo "MST7MDT" >> TZ
[lingyun@localhost etc]$ echo "Copyright (C) 2011 fulinux<fulinux@gmail.com>" >> issue# 系统登录时的提示信息
1.1.17.8. 创建profile文件[lingyun@localhost etc]$ vim profile                                                                                                                    
# /etc/profile: system-wide .profile file for the Bourne shells.
export PATH=\
/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/local/bin:\
/apps/bin:\
/apps/tools:\
/apps/tslib/bin\
# If running interactively, then:
if [ "$PS1" ]; then
    if [ "$BASH" ]; then
        export PS1="[\u@\h \W]\\$ "
        alias ll='/bin/ls --color=tty -laFh'
        alias ls='/bin/ls --color=tty -F'
        export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01r=40;31;01:ex=01;
32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=0
1;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35
:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.d
l=01;35:*.xcf=01;35:*.xwd=01;35:';
    else
      if [ "`id -u`" -eq 0 ]; then
        export PS1='>: '
      else
        export PS1='>: '
      fi
    fi
# System Setting
    set -o vi
    alias  ll='ls -l'
    export USER=`id -un`
    export LOGNAME=$USER
    export HOSTNAME=`/bin/hostname`
    export HISTSIZE=1000
    export HISTFILESIZE=1000
    export PAGER='/bin/more '
    export EDITOR='/bin/vi'
    export INPUTRC=/etc/inputrc
    export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile
    export VAR1=
    export VAR2=
    export VAR3=
    export VAR4=
    export VAR5=
    export LD_LIBRARY_PATH=/lib:/usr/lib/
# QT Extendded 4.4.3 Setting
    export QTDIR=/apps/qt-extended-4.4.3
    export QWS_MOUSE_PROTO='TSLIB:/dev/event0'
    export QWS_DISPLAY='LinuxFB:/dev/fb0'
    export QWS_DISPLAY='LinuxFB:mmWidth240:mmHeight320:0'
    export QWS_SIZE='240x320'
    export QT_PLUGIN_PATH=$QTDIR/plugins/
    export QT_QWS_FONTDIR=$QTDIR/lib/fonts
    export PATH=$QTDIR/binPATH
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATHQTDIR/lib
# Touch Scree tslib Setting
    export TSLIB_ROOT=/apps/tslib
    export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
    export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
    export TSLIB_TSDEVICE=/dev/event0
    export TSLIB_CONSOLEDEVICE=none
    export TSLIB_FBDEVICE=/dev/fb0
fi;
返回列表