• linux之rootfs (UBIFS)


    转:http://www.360doc.com/content/11/1208/15/3700464_170655736.shtml

    大大小小事情一堆,好久不更新了,这次记录下移植ubifs文件系统步骤。

    虽然通常是先kernel后rootfs,但是kernel要不停改,rootfs却必须得先存在,所以先搞定rootfs,rootfs采用据说是nand flash上最先进的ubifs。

     

    http://www.busybox.net/下载busybox源代码,目前最新的稳定版本为1.18.1,解压至Workspaces。

     

    以下切换到root用户进行操作(在其他用户模式下编译出来的rootfs登录时不是以root登录,好像是比较麻烦,简单起见先)

     

    修改Makefile:

    CROSS_COMPILE = /opt/arm-2010q1/bin/arm-none-linux-gnueabi-

    ARCH = arm

    保存退出后:

    make menuconfig

    1.18.1已经把make install目录默认改成./_install了。而且也不打算改成静态库,所以没啥好改的,看一看保存退出后:

    make (生成busybox)

    make install (生成文件到_install目录)

     

    然后修改_install/bin/busybox权限:

    chmod 4755 _install/bin/busybox

    (给予busybox任何人可读可执行,所有者可读可写可执行,4读,2写,1执行,7=4+2+1,5=4+1,三者分别是所有者,所有者组,其他组。最前面的4表示其他用户执行该文件时,权限同所有者)

     

    进入到_install目录创建linux需要的一些目录:

    mkdir -p dev etc home lib mnt proc root sys tmp usr var/lib/misc var/lock var/log var/run var/tmp
    并修改权限:

    chmod 1777 tmp
    chmod 1777 var/tmp

    (最前面1防止被其他用户删除)

    在dev下创建console和null设备:
    mknod -m 660 console c 5 1
    mknod -m 660 null c 1 3     

    (这两个设备用来供init启动时调用)

     

    现在来看一下busybox需要哪些动态链接库,返回到busybox目录后输入:

    /opt/arm-2010q1/bin/arm-none-linux-gnueabi-readelf -a busybox  | grep Shared

    显示需要libm.so.6和libc.so.6

    把交叉编译器里的library拷贝到_install/lib目录下,codesourcery的arm-2010q1,默认是armv5te,在目录
    /opt /arm-2010q1/arm-none-linux-gnueabi/libc下的lib中(对应ARMv4T在在armv4t中,对应armv7- a thumb2在thumb2中),鉴于以后的应用程序可能会用到除libm.so.6和libc.so.6外的这些库,因此全部拷过去,在 _install下执行:

    cp /opt/arm-2010q1/arm-none-linux-gnueabi/libc/lib/*.so*  lib -a

     

    然后在_install/etc下创建一些配置文件:

    fstab
    1 #
    2 # /etc/fstab: static file system information.
    3 #
    4 #
    5 #
    6 # file system mount type options dump pass
    7  
    8 #for mdev
    9 proc /proc proc defaults 00
    10 sysfs /sys sysfs defaults 00
    11
    12 #make sure /dev /tmp /var are tmpfs(tmpfs use ram as media) thus can be r/w
    13 tmpfs /tmp tmpfs defaults 00
    14 tmpfs /dev tmpfs defaults 00
    15 tmpfs /var tmpfs defaults 00
    16
    17  #usbfs /proc/bus/usb usbfs defaults 0 0

    fstab中的文件系统会被mount -a挂载。

     

    inittab
    1 # see busybox/examples/inittab
    2  
    3  # Boot-time system configuration/initialization script.
    4 # This is run first except when booting in single-user mode.
    5  ::sysinit:/etc/init.d/rcS
    6
    7  #Start an "askfirst" shell on the console (whatever that may be)
    8 #use respawn instead askfirst to make sure console always active
    9  ::respawn:-bin/sh
    10
    11  # Stuff to do when restarting the init process
    12  ::restart:/sbin/init
    13
    14 # Stuff to do before rebooting
    15 ::ctrlaltdel:/sbin/reboot
    16 ::shutdown:/bin/umount -a -r
    17 ::shutdown:/sbin/swapoff -a
    18
    19

    inittab会被init执行

     

    init.d/rcS
    1 #!/bin/sh
    2
    3 #add setting here for auto start program
    4 PATH=/sbin:/bin:/usr/sbin:/usr/bin
    5 runlevel=S
    6 prevlevel=N
    7 umask 022
    8 export PATH runlevel prevlevel
    9
    10 #See docs/mdev.txt
    11 #mount all fs in fstab,proc and sysfs are must for mdev
    12 mount -a
    13
    14 #create device nodes
    15 echo /sbin/mdev >/proc/sys/kernel/hotplug
    16
    17 #seed all device nodes
    18 mdev -s
    19
    20 #create pts directory for remote login such as SSH and telnet
    21 mkdir -p /dev/pts
    22 mount -t devpts devpts /dev/pts
    23
    24
    25
    26 if [ -f/etc/hostname ]; then
    27 /bin/hostname -F/etc/hostname
    28 fi
    29
    30 if [ -e /sys/class/net/eth0 ]; then
    31 ifconfig eth0 192.168.1.15
    32 fi
    33
    34 echo "etc init.d rcS done"
    35

    init.d/rcS会在开机时自动执行。

     

    更改rcS和inittab的权限为777:

    chmod 777 init.d/rcS

    chmod 777 inittab

     

    另外还有几个文件和目录:

    rc.d目录,可以存放自启动的一些脚本

    mdev.conf(内容可为空,也可参考busybox docs/mdev.txt)

    profile

    1 #id -un = whoami
    2 export USER="id -un"
    3 export LOGNAME=$USER
    4 export PATH=$PATH
    5
    6 #a colorful prompt begin with "e[" end with "m"
    7 export PS1='e[1;32mu@e[1;31mh#e[0m'

     

    resolve.conf (是标注dns服务器的,就一句 nameserver 202.96.134.133)

    hostname  (供init.d/rcS读取,就一个hostname名称,如mx27)

    passwd,group,shadow用户/组/密码,可以用PC机上的替代,这里是一些说明:

    代码
    1 passwd一共由7个字段组成,6个冒号将其隔开。它们的含义分别为:
    2 1 用户名
    3 2 是否有加密口令,x表示有,不填表示无,采用MD5、DES加密。
    4 3 用户ID
    5 4 组ID
    6 5 注释字段
    7 6 登录目录
    8 7 所使用的shell程序
    9
    10 Group一共由4个字段组成,3个冒号将其隔开,它们的含义分别为:
    11 1 组名
    12 2 是否有加密口令,同passwd
    13 3 组ID
    14 4 指向各用户名指针的数组
    15
    16 shadow一共由9个字段组成,8个冒号将其隔开,它们的含义分别为:
    17 1 用户名
    18 2 加密后的口令,若为空,表示该用户不需要口令即可登陆,若为*号,表示该账号被禁用。 上面的表示的是123456加密后的口令。
    19 3 从1970年1月1日至口令最近一次被修改的天数
    20 4 口令在多少天内不能被用户修改
    21 5 口令在多少天后必须被修改(0为没有修改过)
    22 6 口令过期多少天后用户账号被禁止
    23 7 口令在到期多少天内给用户发出警告
    24 8 口令自1970年1月1日被禁止的天数
    25 9 保留域

     

     

    现在除了lib/modules/`uname -r`/kernel下的文件(`uname -r`为开发板linux版本,可以输入echo `uname -r`查看),这个rootfs基本完成了。在www.infradead.org的FAQ里找到mkfs的git地址(汗,不好找):

    git clone git://git.infradead.org/mtd-utils.git

    cd mtd-utils

    git describe master  (版本号是v1.3.1-138-gf0cc488)

    进入mkfs.ubifs编译出错,在FAQ中看到需要3个库,安装之:

    sudo apt-get install zlib1g-dev

    sudo apt-get install liblzo2-dev

    sudo apt-get install uuid-dev

    make 成功产生mkfs.ubifs

     

    接着把_install做成ubifs文件系统:

    ./mkfs.ubifs -r <path>/_install -m 512 -e 15360 -c 3897 -o ubifs.img

    其中-m表示页面大小,-e表示逻辑擦除块大小,-c表示最大的逻辑擦除块数量,具体的可以通过barebox执行ubiattach的时候看到。

     

    上电进入barebox:

    erase /dev/nand0.root

    ubiattach /dev/nand0.root

    ubimkvol /dev/ubi0 root 0 (注意这里的名字必须跟bootargs匹配,默认为ubi0.root)

    dhcp

    tftp ubifs.img /dev/ubi0.root

  • 相关阅读:
    Delphi单元文件之-防止程序重复执行
    cxGrid使用汇总2
    Delphi数组复制
    cxGrid使用汇总1
    Delphi XE5 android 获取网络状态
    xe5 android sample 中的 SimpleList 是怎样绑定的
    XE5 Android 开发数据访问手机端 解决乱码的办法
    设计模式之代理模式
    设计模式之单例模式及原型模式
    设计模式之工厂模式
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3328912.html
Copyright © 2020-2023  润新知