Linux 内核移植——根文件系统制作

时间:2022-05-04 00:32:27


日期:

2013.6.5

平台:

Arm9-fl2440

作者:

杨正

QQ

1209758756<yz2012ww@gmail.com>

版本:

1.0

 

 

 

首先要明白的是“什么是文件系统”,文件系统是对一个存储设备上的数据和元数据进行组织的机制。这种机制有利于用户和操作系统的交互。在一篇oracle的技术文章中看到这样一句话“尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件”,这句话我是这样理解的,在Linux没有文件系统的话,用户和操作系统的交互也就断开了,例如我们使用最多的交互shell,包括其它的一些用户程序,都没有办法运行。在这里可以看到文件系统相对于Linux操作系统的重要性。下面是Linux文件系统组件的体系结构。

   用户空间包含一些应用程序(例如,文件系统的使用者)和GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当端点。

VFS 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和dentry)。它们缓存最近使用过的文件系统对象。

每个文件系统实现(比如ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。例如,对底层设备驱动程序的读写请求会通过缓冲区缓存来传递。这就允许在其中缓存请求,减少访问物理设备的次数,加快访问速度。以最近使用(LRU)列表的形式管理缓冲区缓存。注意,可以使用 sync 命令将缓冲区缓存中的请求发送到存储媒体(迫使所有未写的数据发送到设备驱动程序,进而发送到存储设备)。

当我们在Windows下,提到文件系统时,你的第一反应是想到的是什么?是不是Windows下的一些Fat32、NTFS等的文件系统的类型。而在Linux中,你可能会想到Ext2、Ext3,但你还必须要有一个根文件系统的概念。根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/linuxrc.等其执行完后。切换根目录,再挂载具体的根文件系统.根文件系统执行完之后,也就是到了Start_kernel()函数的最后,执行init的进程,也就第一个用户进程。对系统进行各种初始化的操作。如果要能明白这里的过程的话,可要好好的看看Linux内核源码了。下图展示了VFS,内核,文件系统的层次结构:

Linux 内核移植——根文件系统制作

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。根文件系统包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在 Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。成功之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

在 Linux 中将一个文件系统与一个存储设备关联起来的过程称为挂载(mount)。使用 mount 命令将一个文件系统附着到当前文件系统层次结构中(根)。在执行挂装时,要提供文件系统类型、文件系统和一个挂装点。根文件系统被挂载到根目录下“/”上后,在根目录下就有根文件系统的各个目录,文件:/bin /sbin /mnt等,再将其他分区挂接到/mnt目录上,/mnt目录下就有这个分区的各个目录,文件。

 

/bin目录

该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。

/bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。

 /sbin目录

该目录下存放系统命令,即只有系统管理员(俗称最高权限的root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。

/sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。

/dev目录

该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。比较重要的文件有/dev/null, /dev/zero, /dev/tty,/dev/lp*等。

 

 

 

 

 

/etc目录

该目录下存放着系统主要的配置文件,例如人员的账号密码文件、各种服务的其实文件等。一般来说,此目录的各文件属性是可以让一般用户查阅的,但是只有root有权限修改。对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。

/lib目录

该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。

/home目录

系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。

/root目录

系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。

/usr目录

/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。

/var目录

与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。

 

 

 

/proc目录

这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核

临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。

/mnt目录

用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。

/tmp目录

用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

那我们利用Busybox制作根文件系统就是创建这上面的这些目录,和这些目录下面的各种文件。

对于嵌入式Linux系统的根文件系统来说,一般可能没有上面所列出的那么复杂,比如嵌入式系统通常都不是针对多用户的,所以/home这个目录在一般嵌入式Linux中可能就很少用到,而/boot这个目录则取决于你所使用的BootLoader是否能够重新获得内核映象从你的根文件系统在内核启动之前。一般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,而其他都是可选的。

根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分,也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征,它给 Linux带来了许多强大和灵活的功能,同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本结构,以及细心的选择所需要的系统库、内核模块和应用程序等,并配置好各种初始化脚本文件,以及选择合适的文件系统类型并把它放到实际的存储设备的合适位置。

对于嵌入式文件系统的制作和移植而言,它的根文件系统结构基本一样。因此,对同一个根文件系统,通过相应的工具和方法就能容易生成对应文件系统。下面介绍如何制作一个简洁的根文件系统。

 

 

1.1、       目录树的建立


[lingyun@localhost yangzheng]$ mkdir rootfs
[lingyun@localhost yangzheng]$ ls

busybox-1.20.2.tar.bz2  linux-3.0.tar.bz2  mkimage rootfs

[lingyun@localhostyangzheng]$ cd rootfs/
[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]$ ls

apps  bin data  dev  etc info  lib  mnt proc  root  sbin sys  tmp  usr var

[lingyun@localhostrootfs]$ tree

.

|-- apps

|-- bin

|-- data

|-- dev

|-- etc

|   |-- dropbear

|   `-- init.d

|-- info

|-- lib

|   `-- modules

|       `-- 3.0.0

|-- mnt

|   |-- dev

|   |-- nfs

|   |-- sdc

|   `-- usb

|-- proc

|-- root

|-- sbin

|-- sys

|-- tmp

|-- usr

|   |-- bin

|   |-- lib

|   |-- sbin

|   `-- share

`-- var

 

27directories, 0 filesDev目录下创建设备文件

 

1.1 在dev目录下创建设备文件
因为内核挂载完文件系统后,init进程需要用到/dev/console和/dev/null这两个设备文件来调用mdev构建dev,所以必须在制作文件系统时静态创建这两个设备文件,否则在系统启动时将提示

Waring:unable to open an initial console:

 

[lingyun@localhostrootfs]$ sudo mknod -m666 dev/console c 5 1

[lingyun@localhostrootfs]$ sudo mknod -m666 dev/ttyS0 c4 64

[lingyun@localhostrootfs]$ sudo mknod -m666 dev/ttySAC0 c4 64

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock0 b 31 0

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock1 b 31 1

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock2 b 31 2

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock3 b 31 3

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock4 b 31 4

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock5 b 31 5 

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock6 b 31 6 

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock7 b 31 7 

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock8 b 31 8 

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock9 b 31 9 

[lingyun@localhostrootfs]$ sudo mknod dev/mtdblock10 b 31 10  

[lingyun@localhostrootfs]$ ls -l dev

total 0

crw-rw-rw-1 root root  5,  1 Jun 3 10:56 console

brw-r--r--1 root root 31,  0 Jun  3 10:56 mtdblock0

brw-r--r--1 root root 31,  1 Jun  3 10:56 mtdblock1

brw-r--r--1 root root 31, 10 Jun  3 10:58mtdblock10

brw-r--r--1 root root 31,  2 Jun  3 10:56 mtdblock2

brw-r--r--1 root root 31,  3 Jun  3 10:57 mtdblock3

brw-r--r--1 root root 31,  4 Jun  3 10:57 mtdblock4

brw-r--r--1 root root 31,  5 Jun  3 10:57 mtdblock5

brw-r--r--1 root root 31,  6 Jun  3 10:57 mtdblock6

brw-r--r--1 root root 31,  7 Jun  3 10:57 mtdblock7

brw-r--r--1 root root 31,  8 Jun  3 10:58 mtdblock8

brw-r--r--1 root root 31,  9 Jun  3 10:58 mtdblock9

crw-rw-rw-1 root root  1,  3 Jun 3 10:55 null

crw-rw-rw-1 root root  4, 64 Jun  3 10:56 ttyS0

crw-rw-rw-1 root root  4, 64 Jun  3 10:56 ttySAC0

1.3 在var目录下创建符号链接文件

[lingyun@localhostrootfs]$ ln -s /tmp var/lock

[lingyun@localhostrootfs]$  ln -s /tmp var/log

[lingyun@localhostrootfs]$ ln -s /tmp var/run

[lingyun@localhostrootfs]$ ln -s /tmp var/tmp

[lingyun@localhostrootfs]$ ls -l var

total 0

lrwxrwxrwx1 lingyun trainning 4 Jun  3 11:00 lock-> /tmp

lrwxrwxrwx1 lingyun trainning 4 Jun  3 11:01 log-> /tmp

lrwxrwxrwx1 lingyun trainning 4 Jun  3 11:01 run-> /tmp

lrwxrwxrwx1 lingyun trainning 4 Jun  3 11:01 tmp-> /tmp

 

 

1.4 拷贝相应的动态库

[lingyun@localhostrootfs]$ cp -af /opt/buildroot-2011.11/arm920t/usr/arm-linux/sysroot/lib/*so*lib/
[lingyun@localhost rootfs]$ cp -af/opt/buildroot-2011.11/arm920t/usr/arm-linux/lib/*so* lib/
[lingyun@localhost rootfs]$ ls lib/

ld-uClibc-0.9.32.so  libdl.so.0      libmudflap.so.0        libnsl.so.0           librt.so.0           libutil.so.0

ld-uClibc.so.0       libgcc_s.so     libmudflap.so.0.0.0    libpthread-0.9.32.so  libstdc++.so         modules

libcrypt-0.9.32.so   libgcc_s.so.1   libmudflapth.so        libpthread.so.0       libstdc++.so.6

libcrypt.so.0        libm-0.9.32.so  libmudflapth.so.0      libresolv-0.9.32.so   libstdc++.so.6.0.10

libc.so.0            libm.so.0       libmudflapth.so.0.0.0  libresolv.so.0        libuClibc-0.9.32.so

libdl-0.9.32.so      libmudflap.so   libnsl-0.9.32.so       librt-0.9.32.so       libutil-0.9.32.so

 

1.5 在etc目录下创建一些配置文件

1.5.1 创建inittab 文件

[lingyun@localhostetc]$ 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.

#

# Formatfor each entry: <id>:<runlevels>:<action>:<process>

#

# id        == tty to run on, or empty for/dev/console.

#              If specified, then /dev/$iddevice must exist

#runlevels == ignored, busybox doesn't support it

 + inittab                                                                                                                          

#/etc/inittab                                                                                                                    

#

# Copyright(C) 2013 yangzheng <yz2012ww@gmail.com>

#

# Note:BusyBox init doesn't support runlevels. The runlevels field is

#completely ignored by BusyBox init. If you want runlevels, use sysvinit.

#

# Formatfor each entry: <id>:<runlevels>:<action>:<process>

#

# id        == tty to run on, or empty for/dev/console.

#              If specified, then /dev/$iddevice must exist

#runlevels == ignored, busybox doesn't support it

#action    == one of sysinit, respawn,askfirst, wait, and once

#process   == program to run

 

# Startupthe system

# mountall the file systems specified in /etc/fstab

::sysinit:/bin/mount-a

 

#Use mdevas hotplug to auto mount USB storage or SD card

::sysinit:/bin/echo/sbin/mdev > /proc/sys/kernel/hotplug

 

#Use mdevto auto generate the device node in /dev path

::sysinit:/sbin/mdev-s

 

#makeshm, pts support

::sysinit:/bin/mkdir-p /dev/pts

::sysinit:/bin/mkdir-p /dev/shm

::sysinit:/bin/mount-t devpts devpts /dev/pts

 

#Mountour 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

 

#Sethostname

null::sysinit:/bin/hostname-F /etc/hostname

 

#Enableconsole logon

null::respawn:/sbin/getty-L ttyS0 115200 vt100

 

# now runany rc scripts

null::wait:/etc/init.d/rcS

 

1.5.2 创建init.d/rcS

 

[lingyun@localhostetc]$ vim init.d/rcS

 

for i in/etc/init.d/S??* ; do

    $i

    $i            

 + i/rcS                                                                                                                           

#!/bin/sh

 

#Copyright (C) 2013 yangzheng <yz2012ww@gmail.com>

# Startall init scripts in /etc/init.d

#executing them in numerical order.

#

 

for i in/etc/init.d/S??* ; do

    $i

Done

 

1.5.3 网卡的启动脚本

[lingyun@localhostetc]$  vim init.d/S01_network

#!/bin/sh

#

#ifconfigeth0 192.168.1.122 netmask 255.255.255.0 up

 

1.5.4 创建支持/apps/etc/目录下的启动脚本

 

[lingyun@localhostetc]$ vim init.d/S99_rcsApp

#!/bin/sh

 

#Copyright (C) 2013 yangzheng <yz2012ww@gmail.com>

#

# Startall 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.5.5 修改init.d的权限

[lingyun@localhostetc]$ chmod 777 init.d/*

[lingyun@localhostetc]$ ll init.d/

total 12

-rwxrwxrwx1 lingyun trainning 214 Jun  3 11:13 rcS

-rwxrwxrwx1 lingyun trainning  68 Jun  3 11:20 S01_network

-rwxrwxrwx1 lingyun trainning 256 Jun  3 11:22S99_rcsApp

 

1.5.6 创建fstab文件

[lingyun@localhostetc]$  vim fstab

+ fstab                                                                                                                           

#/etc/fstab: static file system information.

#Copyright (C) 2013 yangzheng <yz2012ww@gmail.com>

#

#<Filesystem> <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.5.7 创建hostname,hosts,TZ文件

[lingyun@localhostetc]$ echo "root" > hostname  

[lingyun@localhostetc]$ echo "127.0.0.1     localhost" >> hosts

[lingyun@localhostetc]$ echo "MST7MDT" >> TZ

[lingyun@localhostetc]$ echo "Copyright (C) 2013 yangzheng <yz2012ww@gmail.com>">> issue

 

1.5.8 创建profile文件

[lingyun@localhostetc]$ vim profile

#/etc/profile: system-wide .profile file for the Bourne shells.

 

exportPATH=\

/bin:\

/sbin:\

/usr/bin:\

/usr/sbin:\

/usr/local/bin:\

/apps/bin:\

/apps/tools:\

/apps/tslib/bin\

 

# Ifrunning 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;01:or=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'

    exportINPUTRC=/etc/inputrc

    exportDMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile

    export VAR1=

    export VAR2=

    export VAR3=

    export VAR4=

    export VAR5=

    exportLD_LIBRARY_PATH=/lib:/usr/lib/

# QT Extendded 4.4.3 Setting

    exportQTDIR=/apps/qt-extended-4.4.3

    exportQWS_MOUSE_PROTO='TSLIB:/dev/event0'

    exportQWS_DISPLAY='LinuxFB:/dev/fb0'

    exportQWS_DISPLAY='LinuxFB:mmWidth240:mmHeight320:0'

    export QWS_SIZE='240x320'

    exportQT_PLUGIN_PATH=$QTDIR/plugins/

    exportQT_QWS_FONTDIR=$QTDIR/lib/fonts

    exportPATH=$QTDIR/bin:$PATH

    exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib

# Touch Scree tslib Setting                    

    exportTSLIB_ROOT=/apps/tslib

    exportTSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

    exportTSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal

    exportTSLIB_TSDEVICE=/dev/event0

    exportTSLIB_CONSOLEDEVICE=none

    exportTSLIB_FBDEVICE=/dev/fb0

    fi;

 

1.5.9 创建 protocols

[lingyun@localhostetc]$  vim protocols

# /etc/protocols:

# $Id:protocols,v 1.1.1.1 2001/09/12 19:03:24andersee Exp $

#

#Internet (IP) protocols

#

#       from: @(#)protocols     5.1 (Berkeley)4/17/89

#

# Updatedfor NetBSD based on RFC 1340, Assigned Numbers (July 1992).

 

ip      0      IP              # internet protocol, pseudo protocolnumber

icmp    1      ICMP            # internet controlmessage protocol

igmp    2      IGMP            # Internet GroupManagement

ggp     3      GGP             # gateway-gatewayprotocol

ipencap4       IP-ENCAP        # IP encapsulated in IP (officially``IP'')

st      5      ST              # ST datagram mode

tcp     6      TCP             # transmissioncontrol protocol

egp     8      EGP             # exterior gatewayprotocol

pup     12     PUP             # PARC universal packet protocol

udp     17     UDP             # user datagramprotocol

hmp     20     HMP             # host monitoringprotocol

xns-idp22      XNS-IDP         # Xerox NS IDP

rdp     27     RDP             # "reliabledatagram" protocol

iso-tp429      ISO-TP4         # ISO Transport Protocol class 4

xtp     36     XTP             # Xpress TranferProtocol

ddp     37     DDP             # DatagramDelivery Protocol

idpr-cmtp       39     IDPR-CMTP       # IDPR ControlMessage Transport

rspf    73     RSPF            #Radio ShortestPath First.

vmtp    81     VMTP            # VersatileMessage Transport

ospf    89     OSPFIGP         # Open ShortestPath First IGP

ipip    94     IPIP            # Yet Another IPencapsulation

encap   98     ENCAP           # Yet Another IPencapsulation

 

1.5.10 创建mdev.conf文件

mdev会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,会提示找不到mdev.conf,这时我们可以建一个空的mdev.conf文件解决这个问题。下面创建使用mdev自动挂载u盘和SD卡的配置/etc/mdev.conf

 

[lingyun@localhostetc]$ vim mdev.conf

sd[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)

sd[a-z]           0:0 0777        $(umount /mnt/usb)

ub[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)

ub[a-z]           0:0 0777        $(umount /mnt/usb)

mmcblk[0-9]p[0-9]0:0 0777        @(mount /dev/$MDEV/mnt/sdc)

mmcblk[0-9]       0:0 0777        $(umount /mnt/sdc)

 

1.5.11 创建用户组group文件

[lingyun@localhostetc]$ vim group

root:x:0:root

它的格式如下:

 

groupname:password:gid:members

 

第一个字段为用户组名称

第二个字段为用户组密码,当为x时密码是映射到/etc/gshadow中的,是非逆的

第三个字段为GID,及组号,为正整数或0,0被付于了root用户组;系统通常会预留一些较靠前的GID给系统虚拟用户之用,每个系统预留的GID都不同,Fedora预留了500个,所以我们添加新用户组时是从500开始的。GID的范围由/etc/login.defs中的GID_MIN和GID_MAX决定

第四个字段为用户列表,每个用户间用逗号分隔

 

这里的password代表组口令,很少用到。它可使原先不在这个群组中的用户可以通过newgrp命令暂时继承该组的权限,使用 newgrp命令时会新开一个shell。口令的加密方式和passwd文件中的口令一样,所以如果需设置组口令,要用passwd程序虚设一个用户,再把该用户password节中的加密口令拷贝到/etc/group文件中。members列代表组成员,我们可把需加入该组的用户以逗号分隔添加到这里即可。同一组的成员可继承该组所拥有的权限。

 

1.5.12 创建用户passwd文件

[lingyun@localhostetc]$ vim passwd

root:x:0:0:root:/:/bin/sh

 

它的格式如下:

username:password:uid:gid:gecos:homedir:shell

 

第一个字段为登录名

第二个字段为口令,一般被映射到shadow文件中

第三个字段为UID

第四个字段为GID

第五个字段为用户名全称,gecos是通用电子计算机操作系统的缩写,是Bell实验室中的一台大型主机。

第六个字段为用户根目录

第七个字段为用户所用SHELL的类型

 

Unix系统最初是用明文保存密码的,后来由于安全的考虑,采用crypt()算法加密密码并存放在/etc/passwd文件。现在,由于计算机处理能力的提高,使密码破解变得越来越容易。/etc/passwd文件是所有合法用户都可访问的,大家都可互相看到密码的加密字符串,这给系统带来很大的安全威胁。现代的Unix系统使用影子密码系统,它把密码从/etc/pa sswd文件中分离出来,真正的密码保存在/etc/shadow文件中,shadow文件只能由超级用户访问。这样入侵者就不能获得加密密码串,用于破解。使用shadow密码文件后,/etc/passwd文件中所有帐户的password域的内容为"x",如果password域的内容为"*",则该帐号被停用。使用passwd这个程序可修改用户的密。

 

1.5.13 创建密码映射shadow文件

 

[lingyun@localhostetc]$ vim shadow

root::0:0:99999:7:::

这里不使用密码,所以第二字段为空。

格式如下:

username:password:last_change:min_change:max_change:warm:failed_expire:expiration:reserved

第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;

第二字段:密码(已被加密),这个字段是非空的;

第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;

第四字段:两次修改口令间隔最少的天数;如果这个字段的值为空,帐号永久可用;

 

第五字段:两次修改口令间隔最多的天数;如果这个字段的值为空,帐号永久可用;

 

第六字段:提前多少天警告用户口令将过期;如果这个字段的值为空,帐号永久可用;

 

第七字段:在口令过期之后多少天禁用此用户;如果这个字段的值为空,帐号永久可用;

 

第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;

第九字段:保留字段,目前为空,以备将来发展之用;


1.6 在文件系统中安装busybox

 

1.6.1 解压busybox-1.20.2.tar.bz2并在顶层Makefile中加入交叉编译器

[lingyun@localhostyangzheng]$ tar -jxf busybox-1.20.2.tar.bz2

[lingyun@localhostyangzheng]$ ls

busybox-1.20.2  busybox-1.20.2.tar.bz2  linux-3.0 linux-3.0.tar.bz2  mkimage  rootfs

[lingyun@localhostyangzheng]$ cd busybox-1.20.2

[lingyun@localhostbusybox-1.20.2]$ vim Makefile

…………

CROSS_COMPILE?= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-

…………

1.6.2 配置makemenuconfig

[lingyun@localhostbusybox-1.20.2]$ vt100

[lingyun@localhostbusybox-1.20.2]$ make menuconfig

BusyboxSettings  --->

General Configuration  --->

       [*] Don't use /usr

       Installation Options ("makeinstall" behavior)  --->

              (../rootfs) BusyBox installation prefix//加入根文件系统rootfs的路径

 

[lingyun@localhostbusybox-1.20.2]$ sudo make

 

1.6.3 安装busybox

[lingyun@localhostbusybox-1.20.2]$ sudo make install