分类: LINUX
2010-05-25 14:28:05
一、根文件系统预备知识
嵌入式Linux中都需要构建根文件系统,构建根文件系统的规则在FHS(Filesystem Hierarchy Standard)文档中,下面是根文件系统顶层目录: bin:存放所有用户都可以使用的、基本的命令。 sbin:存放的是基本的系统命令,它们用于启动系统、修复系统等。 usr:里面存放的是共享、只读的程序和数据。 proc:这是个空目录,常作为proc文件系统的挂载点。 dev:该目录存放设备文件和其它特殊文件。 etc:存放系统配置文件,包括启动文件。 lib:存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。 boot:引导加载程序使用的静态文件 home:用户主目录,包括供服务账号锁使用的主目录,如FTP mnt:用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。 opt:给主机额外安装软件所摆放的目录。 root:root用户的主目录 tmp:存放临时文件,通常是空目录。 var:存放可变的数据。 二、建立根文件系统目录 有一些工作目录可以省略,如/home、/mnt、/opt、/root。/boot目录在一些情况下可以省略。 为建立根文件系统,先进入我们先前建立的文件夹: $cd ${PRJROOT}/rootfs $mkdir bin dev etc lib proc sbin tmp usr var $chmod 1777 tmp 这里修改了tmp目录的权限,确保在tmp目录下建立的文件,只有建立它的用户有权删除。 接着建立/usr的目录结构: $mkdir usr/sbin usr/bin usr/lib 最后建立/var的目录结构: $mkdir var/lib var/lock var/run var/tmp var/log $chmod 1777 var/tmp 三、建立链接库 在前面制作交叉编译工具的时候,我们已经制作了glibc的链接库,在${TARGET_PREFIX}/lib目录中。将目录中的这些链接库复制到我们将要制作的根文件系统的lib目录中。 $ cd ${TARGET_PREFIX}/lib $ cp *-*.so ${PRJROOT}/rootfs/lib $ cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib $ cp libSegFault.so libmemusage.so libpcprocfile.so ${PRJROOT}/rootfs/lib 四、创建/dev目录下的文件 为各种设备创建好挂载点: $cd ${PRJROOT}/rootfs/dev $su -m #mknod -m 600 mem c 1 1 #mknod -m 666 null c 1 3 #mknod -m 666 zero c 1 5 #mknod -m 644 random c 1 8 #mknod -m 600 tty0 c 4 0 #mknod -m 600 tty1 c 4 1 #mknod -m 600 ttyS0 c 4 64 #mknod -m 666 tty c 5 0 #mknod -m 600 console c 5 1 五、交叉编译Bosybox Bosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox可以自动生成根文件系统所需的bin、sbin、usr目录和linuxrc文件。 1、下载busybox 下载busybox-1.10.2,并放到${PRJROOT}/sysapps/目录中,解压。 2、配置busybox 输入make menuconfig进行配置 (1)、Busybox Settings---> General Configuration---> [*] Show verbose applet usage messages [*] Store applet usage messages in compressed form [*] Support –install [-s] to install applet links at runtime [*] Enable locale support(system needs locale for this to work) [*] Support for –long-options [*] Use the devpts filesystem for unix98 PTYs [*] Support writing pidfiles [*] Runtime SUID/SGID configuration via /etc/busybox.config [*] Suppress warning message if /etc/busybox.conf is not readable Build Options---> [*] Build BusyBox as a static binary(no shared libs) [*] Build with Large File Support(for accessing files>2GB) Installation Options-> []Don’t use /usr Applets links (as soft-links) ---> (./_install) BusyBox installation prefix Busybox Library Tuning ---> (6)Minimum password legth (2)MD5:Trade Bytes for Speed [*]Fsater /proc scanning code(+100bytes) [*]Command line editing (1024)Maximum length of input [*] vi-style line editing commands (15) History size [*] History saving [*] Tab completion [*]Fancy shell prompts (4) Copy buffer size ,in kilobytes [*]Use ioctl names rather than hex values in error messages [*]Support infiniband HW (2)、Linux Module Utilities---> (/lib/modules)Default directory containing modules (modules.dep)Default name of modules.dep [*] insmod [*] rmmod [*] lsmod [*] modprobe -----options common to multiple modutils [ ] support version 2.2/2.4 Linux kernels [*]Support tainted module checking with new kernels [*]Support for module .aliases file [*] support for modules.symbols file (3)Linux System Utilities ---> [*]Support /etc/mdev.conf [*]Support command execution at device addition/removal 3、编译busybox $ make TARGET_ARCH=ppc CROSS=powerpc-603-linux-gnu- PREFIX=${PRJROOT}/rootfs all install 在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。 六、建立etc目录下的配置文件 1、etc/profile文件: 可以使用etc/profile文件为所有的shell用户定义全局变量。 文件内容: #Ash profile #vim:syntax=sh #No core file by defaults #ulimit -S -c 0>/dev/null 2>&1 USER="id -un" LOGNAME=$USER PS1='[\u@\h=W]#' PATH=$PATH HOSTNAME='/bin/hostname' export USER LOGNAME PS1 PATH 2、拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。 3、内核最后一个初始化动作就是启动init程序,它在/sbin目录下,是/bin/busybox的符号链接,所以busybox是目标板系统上执行的第一个应用程序。 欲使用安装在目标板上根文件系统上的init,需要加入适当的/etc/inittab文件,以及在/etc/rc.d目录中填入适当的文件。 /etc/inittab将会为系统定义运行级别,/etc/rc.d目录中的文件则是用来定义每个运行级别将会执行哪些服务。 4、etc/inittab文件: #etc/inittab ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a –r 5、etc/init.d/rcS文件: #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S prevlevel=N umask 022 export PATH runlevel prevlevel echo "----------munt all----------------" mount -a echo /sbin/mdev>/proc/sys/kernel/hotplug mdev -s #安装/proc文件系统 mount /proc #启动网络端口 /sbin/ifconfig eth0 192.168.172.10 6、etc/fstab文件 上面这个初始化命令行要能够正常执行,目标板的根文件系统中必须存在etc/fstab文件。 #device mount-point type option dump fsck proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 mdev /dev ramfs defaults 0 0 |