根文件系统制作一制作根文件系统树

时间:2022-12-02 14:44:47

完成了u-boot移植后就是内核移植然后是根文件系统制作,这次分为这几部分书写:根文件系统树、文件系统initramfs、jaffs2、ubifs

有必要了解一些存储系统和文件系统的知识

根文件系统制作一制作根文件系统树


NorflashNandflash的对比:

  

(1)闪存芯片读写的基本单位不同

   应用程序对NorFlash芯片操作以“字”为基本单位.为了方便对大容量NorFlash闪存的管理,通常将NOR闪存分成大小为128KB64KB的逻辑块,有时块内还分扇区.读写时需要同时指定逻辑块号和块内偏移.应用程序对NandFlash芯片操作是以“块”为基本单位.NAND闪存的块比较小,一般是8KB,然后每块又分成页,页大小一般是512字节.要修NandFlash芯片中一个字节,必须重写整个数据块.

(2)文件系统比较  

       Linux系统中采用MTD来管理不同类型的Flash芯片,包括NandFlashNorFlash.支持在Flash上运行的常用文件系统有cramfsjffsjffs2yaffsyaffs2.cramfs文件系统是只读文件系统.如果想在Flash上实现读写操作通常在NorFlash上我们会选取jffsjffs2文件系统,在NandFlash上选用yaffsyaffs2文件系.Yaffs2文件系统支持大页(大于512字节/)NandFlash存储器

其实还有很多不同,但我认为在制作过程中这两点不同值得注意。其他的请自行百度咯!!!


根文件系统制作一制作根文件系统树



基于RAM的文件系统

很多,只说initramfs,jaffs2,ubifs

 initramfs在编译内核的同时被编译并与内核生成一个映像文件,可以压缩也可以不压缩,但是目前只支持cpio包格式。它是根文件系统制作和制作的一种非常简单的方法,也可以通过执行这个文件系统中的程序引导真正的文件系统,这样加载根文件系统的工作就不是内核的工作,而是initramfs的工作。由于initramfs使用cpio包格式,所以很容易将一个单一的文件、目录、node编译链接到系统中去,这样很简单的系统中使用起来很方便,不需要另外挂接文件系统。

   JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2(Journalling Flash FileSystem v2日志闪存文件系统版本2 )RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所JFFS2也可以用在Linux, uCLinux中。它主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。Jffs2不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs2为维护日志节点所占用的内存空间迅速增大,另外,jffs2文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

  无排序区块图像文件系统(Unsorted Block Image File System, UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。真正开始开发于2007年,并于200810月第一次加入稳定版本于Linux核心2.6.27版。UBIFS最早在2006年由IBMNokia的工程师Thomas GleixnerArtem Bityutskiy所设计,专门为了解决MTDMemory Technology Device)设备所遇到的瓶颈。由于Nand Flash容量的暴涨,YAFFS等皆无法再去控制Nand Flash的空间。UBIFS通过子系统UBI处理与MTD device之间的动作。与JFFS2一样,UBIFS建构于MTD device之上,因而与一般的block device不兼容。

JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBI volume之上。


接下来开始制作根文件系统树(我喜欢将rootfs打成roofts,下面就不做解释了)

mkdir roofts

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}}}

根文件系统制作一制作根文件系统树

后面的rootfs-ubifs.bin,init,linuxrc都是自己做好了放到里面,这里只是展示执行了上面的命令后生成了哪些文件。

 Dev目录下创建设备文件

 sudo mknod -m666 dev/null c 1 3

 sudo mknod -m666 dev/console c 5 1

sudo mknod -m666 dev/ttyS0 c 4 6 64

sudo mknod dev/mtdblock0 b 31 0

sudo mknod dev/mtdblock1 b 31 1

sudo mknod dev/mtdblock2 b 31 2

sudo mknod dev/mtdblock3 b 31 3

sudo mknod dev/mtdblock4 b 31 4

sudo mknod dev/mtdblock5 b 31 5

sudo mknod dev/mtdblock6 b 31 6

sudo mknod dev/mtdblock7 b 31 7

sudo mknod dev/mtdblock8 b 31 8

sudo mknod dev/mtdblock9 b 31 9


根文件系统制作一制作根文件系统树

 Var 目录下创建符号链接文件

ln -s /tmp var/lock

ln -s /tmp var/log

ln -s /tmp var/run

ln -s /tmp var/tmp


根文件系统制作一制作根文件系统树


拷贝交叉编译器中的动态库到相应的目录下


这一步有坑,如果你之前的交叉编译器有问题那么有些库会缺少,注意路径

cp -af /opt/buildroot-2012.08/arm920t/usr/arm-linux/sysroot/lib/*so*  lib/

cp -af /opt/buildroot-2012.08/arm920t/usr/arm-linux/lib/*so* lib/   

根文件系统制作一制作根文件系统树


 在etc/创建inittab文件

cd etc

vim inittab


# /etc/inittab                                                                                                                     

#


#

# 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


etc/创建/etc/init.d/rcS脚本


vim init.d/rcS  

#!/bin/sh

 


# Start all init scripts in /etc/init.d

# executing them in numerical order.

#                           

 

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

            $i

done

etc/ 配置网卡的启动脚本

vim init.d/S01_network 

#!/bin/sh

ifconfig eth0 192.168.1.111 netmask 255.255.255.0 up


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

 vim init.d/S99_rcsApp 

#!/bin/sh

 


#

# 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


etc/修改init.d目录下的文件权限

 chmod 777 init.d/*


etc/创建fstab文件

 vim fstab 

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


etc/创建hostname,hosts,TZ文件

 echo "root" > hostname

 echo "127.0.0.1      localhost" >> hosts

 echo "MST7MDT" >> TZ

echo "Copyright (C) 2017fanmaolin" >> issue


 etc/创建profile文件

cofile 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;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'

    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/bin:$PATH

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/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;


 etc/创建指定一些协议所使用的端口号文件protocols

vim protocols 

# /etc/protocols:

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

#

# Internet (IP) protocols

#

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

#

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

 

ip      0       IP              # internet protocol, pseudo protocol number

icmp    1       ICMP            # internet control message protocol

igmp    2       IGMP            # Internet Group Management

ggp     3       GGP             # gateway-gateway protocol

ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')

st      5       ST              # ST datagram mode

tcp     6       TCP             # transmission control protocol

egp     8       EGP             # exterior gateway protocol

pup     12      PUP             # PARC universal packet protocol

udp     17      UDP             # user datagram protocol

hmp     20      HMP             # host monitoring protocol

xns-idp 22      XNS-IDP         # Xerox NS IDP

rdp     27      RDP             # "reliable datagram" protocol

iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4

xtp     36      XTP             # Xpress Tranfer Protocol

ddp     37      DDP             # Datagram Delivery Protocol

idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport

rspf    73      RSPF            #Radio Shortest Path First.

vmtp    81      VMTP            # Versatile Message Transport

ospf    89      OSPFIGP         # Open Shortest Path First IGP

ipip    94      IPIP            # Yet Another IP encapsulation

encap   98      ENCAP           # Yet Another IP encapsulation


etc/创建mdev.conf文件


mdev会在/etc目录下找mdev的配置文件: mdev.conf. 如果该文件不存在,那么在执行mdev –s这个命令时,

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

 

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)


etc/ 创建用户组group文件

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列代表组成员,我们可把需加入该组的用户以逗号分隔添加到这里即可。同一组的成员可继承该组所拥有的权限。


etc/创建用户passwd文件

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这个程序可修改用户的密。

 

etc/创建密码映射shadow文件

vim shadow 

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

(设置密码为0)

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

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


在文件系统中安装busybox

sudo tar xjf ~/fanmaolin/systools/busybox-1.20.2.tar.bz2

cd busybox-1.20.2/

vim Makefile

#修改CROSS_COMPILER为:

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

(交叉编译器)

sudo 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)  --->

             (/home/fanmaolin/fl2440/roofts/roofts) BusyBox installation prefix(注意路径

sudo make

sudo make install

....

  /home/fanmaolin/fl2440/roofts/roofts/sbin/udhcpc -> ../bin/busybox

 /home/fanmaolin/fl2440/roofts/roofts/sbin/udhcpd -> ../bin/busybox

/home/fanmaolin/fl2440/roofts/roofts/sbin/vconfig -> ../bin/busybox

/home/fanmaolin/fl2440/roofts/roofts/sbin/zcip -> ../bin/busybox


生成linuxrc 


编译生成PC版的 dropbear

下载:

wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.53.1.tar.bz2

tar -xjf dropbear-0.53.1.tar.bz2 

cd dropbear-0.53.1

./configure && make


 生成的文件:

    dropbear: ssh2 server

    dropbearkey: 密钥生成器

    dropbearconvert: 可以转换openssh的密钥

    dbclient: ssh2 client 


 ./dropbearkey -t rsa -f /home/fanmaolin/fl2440/roofts/roofts/etc/dropbear/dropbear_rsa_host_key

./dropbearkey -t dss -f /home/fanmaolin/fl2440/roofts/roofts/etc/dropbear/dropbear_dss_host_key

chmod 666/home/fanmaolin/fl2440/roofts/roofts/etc/dropbear/dropbear_*


编译ARM版本的dropbear

make distclean

./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --build=i686 --host=arm-linux --disable-zlib

make

mv dbclient ssh

arm-linux-strip dropbear

arm-linux-strip ssh

cp dropbear ssh /home/fanmaolin/fl2440/roofts/roofts/usr/sbin/

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

vim etc/init.d/S04_dropbear

#!/bin/sh

/usr/sbin/dropbear


chmod 777 etc/init.d/S04_dropbear 


到此完成了根文件系统树的制作。接下来制作简单的initramfs。



问题总结


无法显示Linuxrc,并且在busybox里无法进行删除操作
删除操作:ctrl+Backspace
路径有错误:
绝对路径:cd /home/fanmaolin/fl2440/roofts/roofts 相对路径:cd ../../home/fanmaolin/fl2440/roofts/roofts/

dropbear无法创建文件,没有换成自己的路径
错误:./dropbearkey -t rsa -f /opt/rootfs/etc/dropbear/dropbear_rsa_host_key  正确:./dropbearkey -t rsa -f /home/fanmaolin/fl2440/roofts/roofts/etc/dropbear/ 下面的路径都需要更改