根文件系统树制作

我的开发环境

———————————————————————————————————————

机操作系统:Centos 6.7
交叉编译器环境:arm-linux-gcc-4.5.4 
交叉编译器:buildroot-2012.08
开发板平台: FL2440 
Linux内核版本: linux-3.0 
调试终端:SECURE-CRT
Bootloader:U-boot-2010.09
邮箱:hongfuhaocomon@163.com

———————————————————————————————————————


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,内核,文件系统的层次结构:


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

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

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

1.根文件系统树制作

[hongfuhao@vboxcentos6 fl2440]$ ls
3rdparty  bootloader  driver  kernel  program  rootfs
[hongfuhao@vboxcentos6 fl2440]$ cd rootfs/
[hongfuhao@vboxcentos6 rootfs]$ ls

[hongfuhao@vboxcentos6 rootfs]$ mkdir  rootfs 
[hongfuhao@vboxcentos6 rootfs]$ ls
rootfs
[hongfuhao@vboxcentos6 rootfs]$ cd rootfs/
[hongfuhao@vboxcentos6 rootfs]$ ls
[hongfuhao@vboxcentos6 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.3.3}}}
[hongfuhao@vboxcentos6 rootfs]$ tree -L 3
.
├── apps
├── bin
├── data
├── dev
├── etc
│?? ├── dropbear
│?? └── init.d
├── info
├── lib
│?? └── modules
│??     └── 3.3.3
├── mnt
│?? ├── dev
│?? ├── nfs
│?? ├── sdc
│?? └── usb
├── proc
├── root
├── sbin
├── sys
├── tmp
├── usr
│?? ├── bin
│?? ├── lib
│?? ├── sbin
│?? └── share
└── var


27 directories, 0 files
1.1.1dev目录下创建设备文件
因为内核挂在文件系统后,init进程需要用到/dev/console和/dev/null着两个设备文件来调用mdev构建dev,所以必须在制作文件系统时静态创建这两个
设备文件,否则在系统启动时将提示:
Waring:unable to open an initial console:
[hongfuhao@vboxcentos6 rootfs]$ ls
apps  bin  data  dev  etc  info  lib  mnt  proc  root  sbin  sys  tmp  usr  var
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod -m666 dev/null c 1 3
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod -m666 dev/console c 5 1
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod -m666 dev/ttyS0 c 4 64
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod -m666 dev/ttySAC0 c 4 64 
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock0 b 31 0
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock1 b 31 1
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock2 b 31 2
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock3 b 31 3
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock4 b 31 4
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock5 b 31 5
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock6 b 31 6
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock7 b 31 7
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock8 b 31 8
[hongfuhao@vboxcentos6 rootfs]$ sudo mknod dev/mtdblock9 b 31 9
[hongfuhao@vboxcentos6 rootfs]$ ls -l dev/
总用量 0
crw-rw-rw-. 1 root root  5,  1 9月  21 14:49 console
brw-r--r--. 1 root root 31,  0 9月  21 14:52 mtdblock0
brw-r--r--. 1 root root 31,  1 9月  21 14:53 mtdblock1
brw-r--r--. 1 root root 31,  2 9月  22 02:57 mtdblock2
brw-r--r--. 1 root root 31,  3 9月  22 02:57 mtdblock3
brw-r--r--. 1 root root 31,  4 9月  22 02:58 mtdblock4
brw-r--r--. 1 root root 31,  5 9月  22 03:01 mtdblock5
brw-r--r--. 1 root root 31,  6 9月  22 03:01 mtdblock6
brw-r--r--. 1 root root 31,  7 9月  22 03:01 mtdblock7
brw-r--r--. 1 root root 31,  8 9月  22 03:01 mtdblock8
brw-r--r--. 1 root root 31,  9 9月  22 03:01 mtdblock9
crw-rw-rw-. 1 root root  1,  3 9月  21 14:48 null
crw-rw-rw-. 1 root root  4, 64 9月  21 14:50 ttyS0
crw-rw-rw-. 1 root root  4, 64 9月  21 14:51 ttySAC0

[hongfuhao@vboxcentos6 rootfs]$ 

1.2Var目录下创建符号链接文件
[hongfuhao@vboxcentos6 rootfs]$ ln -s /tmp var/lock
[hongfuhao@vboxcentos6 rootfs]$ ln -s /tmp var/log
[hongfuhao@vboxcentos6 rootfs]$ ln -s /tmp var/run
[hongfuhao@vboxcentos6 rootfs]$ ln -s /tmp var/tmp
[hongfuhao@vboxcentos6 rootfs]$ ls -l var/

总用量 0
lrwxrwxrwx. 1 hongfuhao hongfuhao 4 9月  22 03:04 lock -> /tmp
lrwxrwxrwx. 1 hongfuhao hongfuhao 4 9月  22 03:04 log -> /tmp
lrwxrwxrwx. 1 hongfuhao hongfuhao 4 9月  22 03:04 run -> /tmp
lrwxrwxrwx. 1 hongfuhao hongfuhao 4 9月  22 03:05 tmp -> /tmp

[hongfuhao@vboxcentos6 rootfs]$ 
1.3拷贝交叉编译器中的动态库到相应的目录下
[hongfuhao@vboxcentos6 rootfs]$ cp -af /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/*so* lib/
[hongfuhao@vboxcentos6 rootfs]$ cp -af /opt/buildroot-2012.08/arm920t/usr/arm-unknown-linux-uclibcgnueabi/lib/*so* lib/
[hongfuhao@vboxcentos6 rootfs]$ ls

apps  bin  data  dev  etc  info  lib  mnt  proc  root  sbin  sys  tmp  usr  var
[hongfuhao@vboxcentos6 rootfs]$ ls lib/
ld-uClibc-0.9.33.2.so  libgcc_s.so          libmudflapth.so         libresolv-0.9.33.2.so  libstdc++.so.6.0.14-gdb.py
ld-uClibc.so.0         libgcc_s.so.1        libmudflapth.so.0       libresolv.so.0         libuClibc-0.9.33.2.so
libcrypt-0.9.33.2.so   libm-0.9.33.2.so     libmudflapth.so.0.0.0   librt-0.9.33.2.so      libutil-0.9.33.2.so
libcrypt.so.0          libm.so.0            libnsl-0.9.33.2.so      librt.so.0             libutil.so.0
libc.so.0              libmudflap.so        libnsl.so.0             libstdc++.so           modules
libdl-0.9.33.2.so      libmudflap.so.0      libpthread-0.9.33.2.so  libstdc++.so.6
libdl.so.0             libmudflap.so.0.0.0  libpthread.so.0         libstdc++.so.6.0.14

1.4Etc目录下创建文件
[hongfuhao@vboxcentos6 rootfs]$ cd etc/
[hongfuhao@vboxcentos6 etc]$ ls
dropbear  init.d
[hongfuhao@vboxcentos6 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

1.5创建etc/init.d/rcS脚本
[hongfuhao@vboxcentos6 etc]$ vim init.d/rcS


 + i/rcS                                                                                                                            
  1 #!/bin/sh
  2 
  3 # Copyright (C) 2011 fulinux <fulinux@gmail.com>
  4 # Start all init scripts in /etc/init.d

  5 # executing them in numerical order.
  6 #
  7 
  8 for i in /etc/init.d/S??* ; do
  9             $i
 10             done
~                      

1.7配置网卡启动脚本
[hongfuhao@vboxcentos6 etc]$ vim init.d/S01_network
"init.d/S01_network" [新文件]


 + i/S01_network                                                                                                                    
  1 #!bin/sh
  2 
  3 ifconfig eth0 192.168.1.111 netmask 255.255.255.0 up
~
1.8创建支持/apps/etc目录下的启动脚本 
[hongfuhao@vboxcentos6 etc]$ vim init.d/S99_rcsApp
 + i/S99_rcsApp                                                                                                                     
  1 #!/bin/sh
  2 
  3 #Copyright (C) 2011 fulinux <fulinux@gmail.com>
  4 #
  5 #Start all init scripts in /apps/etc/init.d
  6 # executing them in numerical order.
  7 #
  8 if (test -d /apps/etc/init.d)
  9     then
 10     for i in /apps/etc/init.d/S??* ; do
 11     $i
 12     done            
 13     fi  
                                                      
1.8修改init.d目录下的文件权限
[hongfuhao@vboxcentos6 etc]$ chmod 777 init.d/*
[hongfuhao@vboxcentos6 etc]$ ll init.d/
总用量 12
-rwxrwxrwx. 1 hongfuhao hongfuhao 230 9月  22 03:19 rcS
-rwxrwxrwx. 1 hongfuhao hongfuhao  63 9月  22 03:25 S01_network
-rwxrwxrwx. 1 hongfuhao hongfuhao 246 9月  22 03:43 S99_rcsApp

1.9创建fstab文件


[hongfuhao@vboxcentos6 etc]$ vim fstab


  + fstab                                                                                                                            
  1 # /etc/fstab: static file system information.
  2 # Copyright (C) 2011 fulinux <fulinux@gmail.com>
  3 #
  4 #<File system> <mount pt>     <type>   <options>         <dump> <pass>
  5 #devpts          /dev/pts       devpts   defaults          0      0
  6 #/dev/root       /              ext2     rw,noauto         0      1
  7 proc            /proc          proc     defaults          0      0
  8 tmpfs           /tmp          tmpfs    defaults          0      0
  9 tmpfs           /dev          tmpfs    defaults          0      0
 10 sysfs           /sys           sysfs    defaults          0      0

 1.10创建hostname,hosts,TZ文件
[hongfuhao@vboxcentos6 etc]$ echo "root" > hostname
[hongfuhao@vboxcentos6 etc]$ echo "127.0.0.1 localhost" >> hosts
[hongfuhao@vboxcentos6 etc]$ echo "MST7MDT" >>TZ
[hongfuhao@vboxcentos6 etc]$ echo "Copyright (C) 2011 fulinux<fulinux@gmail.com>" >> issue  #系统登录时的提示信息
1.11创建profile文件
[hongfuhao@vboxcentos6 etc]$ vim profile
profile                                                                                                                            
  1 # /etc/profile: system-wide .profile file for the Bourne shells.
  2 
  3 export PATH=\
  4     /bin:\
  5     /sbin:\
  6     /usr/bin:\
  7     /usr/sbin:\
  8     /usr/local/bin:\
  9     /apps/bin:\
 10     /apps/tools:\
 11     /apps/tslib/bin\
 12 
 13     # If running interactively, then:
 14 if [ "$PS1" ]; then
 15 
 16     if [ "$BASH" ]; then
 17         export PS1="[\u@\h \W]\\$ "
 18         alias ll='/bin/ls --color=tty -laFh'
 19         alias ls='/bin/ls --color=tty -F'
 20         export 
 21         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;
 22         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
 23         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
 24         :*.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
 25         l=01;35:*.xcf=01;35:*.xwd=01;35:';
 26     else
 27         if [ "`id -u`" -eq 0 ]; then
 28             export PS1='>: '
 29         else
 30             export PS1='>: '
 31         fi
 32     fi
 33     # System Setting
34     set -o vi
 35     alias  ll='ls -l'
 36     export USER=`id -un`
 37     export LOGNAME=$USER
 38     export HOSTNAME=`/bin/hostname`
 39     export HISTSIZE=1000
 40     export HISTFILESIZE=1000
 41     export PAGER='/bin/more '
 42     export EDITOR='/bin/vi'
 43     export INPUTRC=/etc/inputrc
 44     export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile
 45     export VAR1=
 46     export VAR2=
 47     export VAR3=
 48     export VAR4=
 49     export VAR5=
 50     export LD_LIBRARY_PATH=/lib:/usr/lib/
 51     # QT Extendded 4.4.3 Setting
 52     export QTDIR=/apps/qt-extended-4.4.3
 53     export QWS_MOUSE_PROTO='TSLIB:/dev/event0'
 54     export QWS_DISPLAY='LinuxFB:/dev/fb0'
 55     export QWS_DISPLAY='LinuxFB:mmWidth240:mmHeight320:0'
 56     export QWS_SIZE='240x320'
 57     export QT_PLUGIN_PATH=$QTDIR/plugins/
 58     export QT_QWS_FONTDIR=$QTDIR/lib/fonts
 59     export PATH=$QTDIR/bin:$PATH
 60     export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
 61     # Touch Scree tslib Setting
 62     export TSLIB_ROOT=/apps/tslib
 63     export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
 64     export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
 65     export TSLIB_TSDEVICE=/dev/event0
 66     export TSLIB_CONSOLEDEVICE=none
 67     export TSLIB_FBDEVICE=/dev/fb0
 68 fi;

1.12创建指定一些协议所使用的端口号文件protocols
[hongfuhao@vboxcentos6 etc]$ vim protocols
 + protocols                                                                                                                        
  1 # /etc/protocols:
  2 # # $Id: protocols,v 1.1.1.1 2001/09/12 19:03:24 andersee Exp $
  3 # #
  4 # # Internet (IP) protocols
  5 # #
  6 # #       from: @(#)protocols     5.1 (Berkeley) 4/17/89
  7 # #
  8 # # Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).
  9 #
 10  ip      0       IP              # internet protocol, pseudo protocol number
 11  icmp    1       ICMP            # internet control message protocol
 12  igmp    2       IGMP            # Internet Group Management
 13  ggp     3       GGP             # gateway-gateway protocol
 14  ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')
 15  st      5       ST              # ST datagram mode
 16  tcp     6       TCP             # transmission control protocol
 17  egp     8       EGP             # exterior gateway protocol
 18  pup     12      PUP             # PARC universal packet protocol
 19  udp     17      UDP             # user datagram protocol
 20  hmp     20      HMP             # host monitoring protocol
 21  xns-idp 22      XNS-IDP         # Xerox NS IDP
 22  rdp     27      RDP             # "reliable datagram" protocol
 23  iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4
 24  xtp     36      XTP             # Xpress Tranfer Protocol
 25  ddp     37      DDP             # Datagram Delivery Protocol
 26  idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
 27  rspf    73      RSPF            #Radio Shortest Path First.
 28  vmtp    81      VMTP            # Versatile Message Transport
 29  ospf    89      OSPFIGP         # Open Shortest Path First IGP
 30  ipip    94      IPIP            # Yet Another IP encapsulation
 31  encap   98      ENCAP           # Yet Another IP encapsulation
~
1.13创建mdev.conf文件
mdev会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,

会提示找不到mdev.conf,这时我们可以建一个空的mdev.conf文件解决这个问题。下面创建使用mdev自动挂载u盘和SD卡的配置/etc/mdev.conf

[hongfuhao@vboxcentos6 etc]$ vim mdev.conf
+ mdev.conf                                                                                                                        
  1 sd[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)
  2     sd[a-z]           0:0 0777        $(umount /mnt/usb)
  3     ub[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)
  4     ub[a-z]           0:0 0777        $(umount /mnt/usb)
  5     mmcblk[0-9]p[0-9] 0:0 0777        @(mount /dev/$MDEV /mnt/sdc)
  6 mmcblk[0-9]       0:0 0777        $(umount /mnt/sdc)
~              
                                         
1.14创建用户组group文件
[hongfuhao@vboxcentos6 etc]$ vim group


 + group                                                                                                                            
  1 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.15创建用户passwd文件

[hongfuhao@vboxcentos6 etc]$ vim passwd


 + passwd                                                                                                                           
  1 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.16创建密码映射shadow文件

[hongfuhao@vboxcentos6 etc]$ vim shadow

+ shadow                                                                                                                           
  1 root:($jGZIHmtT$y8ZXoPllK12/wl51kMw4e/:0:0:99999:7:::)
~  
                                                       

该文件我们可以在Linux系统上使用passwd命令修改root口令来获取

[hongfuhao@localhost ~]$ passwd root

Changing password for user root.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[hongfuhao@localhost ~]$ cat /etc/shadow | grep root

root:$1$jGZIHmtT$y8ZXoPllK12/wl51kMw4e/:0:0:99999:7:::

当然,在设置为嵌入式平台上的root口令后,最好把系统上的root命令恢复到原始密码。

 

他的格式如下:

 

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日开始的天数),如果这个字段的值为空,帐号永久可用;

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

这里我们设置为不用密码登陆,将password格式的内容清空:

[hongfuhao@vboxcentos6 rootfs]$ vim etc/shadow 

+ e/shadow                                                                                                                         
  1 root::0:0:99999:7:::

1.17在文件系统中安装busybox

[hongfuhao@vboxcentos6 busybox-1.20.2]$tar -xjf  busybox-1.20.2.tar.bz2

[hongfuhao@vboxcentos6 busybox-1.20.2]$cd busybox-1.20.2

[hongfuhao@vboxcentos6 busybox-1.20.2]$vim Makefile

#修改CROSS_COMPILER为:

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

[hongfuhao@vboxcentos6 busybox-1.20.2]$make menuconfig

#选择:

  Busybox Settings  --->

       General Configuration  --->

             [*] Don't use /usr

       Installation Options ("make install" behavior)  --->

             What kind of applet links to install (as soft-links)  --->

             (../rootfs) BusyBox installation prefix

[hongfuhao@vboxcentos6 busybox-1.20.2]$make

[hongfuhao@vboxcentos6 busybox-1.20.2]$ file busybox

busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

[hongfuhao@vboxcentos6 busybox-1.20.2]$ make install
  ./_install//bin/[ -> busybox
  ./_install//bin/[[ -> busybox
  ./_install//bin/add-shell -> busybox
  ./_install//bin/addgroup -> busybox
  ./_install//bin/adduser -> busybox
  ./_install//bin/arping -> busybox
  ./_install//bin/ash -> busybox
  ./_install//bin/awk -> busybox
  ./_install//bin/base64 -> busybox
  ./_install//bin/basename -> busybox
  ./_install//bin/beep -> busybox
  ./_install//bin/bunzip2 -> busybox

.........

  ./_install//sbin/ubiupdatevol -> ../bin/busybox
  ./_install//sbin/udhcpc -> ../bin/busybox
  ./_install//sbin/udhcpd -> ../bin/busybox
  ./_install//sbin/vconfig -> ../bin/busybox
  ./_install//sbin/watchdog -> ../bin/busybox
  ./_install//sbin/zcip -> ../bin/busybox




--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------



[hongfuhao@vboxcentos6 busybox-1.20.2]$ ls ../../rootfs/
apps  bin  data  dev  etc  info  lib  mnt  proc  root  sbin  sys  tmp  usr  var

1.18移植dropbear

(1)首先编译生成PC 版的,在制作秘钥时用到

hongfuhao@vboxcentos6 dropbear-0.53.1]$ wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.53.1.tar.bz2

?[hongfuhao@vboxcentos6 ~]$ tar -xjf dropbear-0.53.1.tar.bz2     

hongfuhao@vboxcentos6 dropbear-0.53.1]$ ./configure && make                     

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ ./dropbearkey -t rsa -f  /home/hongfuhao/fl2440/rootfs/etc/dropbear/dropbear_rsa_host_key
Will output 1024 bit rsa secret key to '/home/hongfuhao/fl2440/rootfs/etc/dropbear/dropbear_rsa_host_key'
Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCMiU+YCw3lnS/UAL/QYT5tpz8LEo5DBwCeowEYNidVFBU2KSscJ0WAkjPFlJHnTdgMaUzpNJebshktMisBzhm6KUYf2sGQXQRCLiLa83R1JAbdCWxozyMdEXNyFK2avgZ1JLjIJgF0d1Dw3zRqgIzNOJnoZArcwmhH/6vhVlWXhm53 hongfuhao@vboxcentos6.localdomain
Fingerprint: md5 ec:93:d0:dc:60:4c:7d:c9:59:7f:e3:61:86:c0:49:bc

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ chmod 666 /home/hongfuhao/fl2440/rootfs/etc/dropbear/dropbear_*

1.19编译ARM版本

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ make distclean

[hongfuhao@vboxcentos6 dropbear-0.53.1]$./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --build=i686 --host=arm-linux --disable-zlib   #指定交叉编译器路径

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ file dropbear
dropbear: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped               

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ file dbclient
dbclient: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip dropbear
[hongfuhao@vboxcentos6 dropbear-0.53.1]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip ssh

[hongfuhao@vboxcentos6 dropbear-0.53.1]$ cp ssh dropbear /home/hongfuhao/fl2440/rootfs/usr/sbin/

1.20在文件系统中创建启动脚本

[hongfuhao@vboxcentos6 rootfs]$ vim etc/init.d/S04_dropbear

+ e/i/S04_dropbear                                                                                                                 
  1 #!/bin/sh
  2 /usr/sbin/dropbear
~

至此 目录树建立完毕

                      

                  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

煮雨小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值