转: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

 #
# /etc/fstab: static file system information.
#
#
#
# file system mount type options dump pass
 
#for mdev
proc /proc proc defaults
sysfs /sys sysfs defaults #make sure /dev /tmp /var are tmpfs(tmpfs use ram as media) thus can be r/w
tmpfs /tmp tmpfs defaults
tmpfs /dev tmpfs defaults
tmpfs /var tmpfs defaults  #usbfs /proc/bus/usb usbfs defaults 0 0

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

inittab

 # see busybox/examples/inittab
 
 # Boot-time system configuration/initialization script.
# This is run first except when booting in single-user mode.
 ::sysinit:/etc/init.d/rcS  #Start an "askfirst" shell on the console (whatever that may be)
#use respawn instead askfirst to make sure console always active
 ::respawn:-bin/sh  # Stuff to do when restarting the init process
 ::restart:/sbin/init # Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

inittab会被init执行

init.d/rcS

 #!/bin/sh

 #add setting here for auto start program
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask
export PATH runlevel prevlevel #See docs/mdev.txt
#mount all fs in fstab,proc and sysfs are must for mdev
mount -a #create device nodes
echo /sbin/mdev >/proc/sys/kernel/hotplug #seed all device nodes
mdev -s #create pts directory for remote login such as SSH and telnet
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts if [ -f/etc/hostname ]; then
/bin/hostname -F/etc/hostname
fi if [ -e /sys/class/net/eth0 ]; then
ifconfig eth0 192.168.1.15
fi echo "etc init.d rcS done"

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

更改rcS和inittab的权限为777:

chmod 777 init.d/rcS

chmod 777 inittab

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

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

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

profile

 #id -un = whoami
export USER="id -un"
export LOGNAME=$USER
export PATH=$PATH #a colorful prompt begin with "\e[" end with "m"
export PS1='\e[;32m\u@\e[;31m\h#\e[0m'

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

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

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

代码

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

现在除了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

linux之rootfs (UBIFS)的更多相关文章

  1. Linux系统在嵌入式硬件上的移植

    =========================        基本常识       ========================= 一. Linux系统的基本构成: 1. loader 2.  ...

  2. UBIFS

    转:http://www.armadeus.com/wiki/index.php?title=UBIFS This is a preliminary page dealing with the ins ...

  3. 文件系统的挂载(2)---挂载rootfs文件系统

    一.目的 本文主要讲述linux内核rootfs文件系统的挂载过程,内核版本为3.10. rootfs是基于内存的文件系统,没有实际的存储设备,所有操作都在内存中完成.为了保证linux内核的精简性, ...

  4. 使用ubifs格式的根文件系统

    配置内核,使其支持ubifs文件系统 1)Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Uns ...

  5. 使用ubifs格式的根文件系统---过程记录

    配置内核,使其支持ubifs文件系统 1)Device Drivers  --->Memory Technology Device (MTD) support  --->UBI - Uns ...

  6. EASYARM-IMX283 制作ubifs文件系统

    ubifs主页:http://www.linux-mtd.infradead.org/doc/ubifs.html nandflash上常用的文件系统有jffs2.yaffs和ubifs,其中ubif ...

  7. Linux操作系统-CentOS6启动流程和服务管理

    Linux操作系统-CentOS6启动流程和服务管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux组成 1>.Linux: kernel+rootfs ker ...

  8. learning docker steps(9) ----- arm linux docker 安装

    参考:https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1 想要在arm linux上安装docker ...

  9. linux基础—课堂随笔010_系统启动和内核管理

    系统启动和内核管理 Linux: kernel+rootfs kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs:程序和glibc 库:函数集合, functio ...

随机推荐

  1. tcp 在调用connect失败后要不要重新socket

    tcp 在调用connect失败后要不要重新socket http://blog.csdn.net/occupy8/article/details/48253251

  2. python按比例随机切分数据

    在机器学习或者深度学习中,我们常常碰到一个问题是数据集的切分.比如在一个比赛中,举办方给我们的只是一个带标注的训练集和不带标注的测试集.其中训练集是用于训练,而测试集用于已训练模型上跑出一个结果,然后 ...

  3. Winform利用委托进行窗体间的传值

    在form1.cs中 1.委托的定义 //定义一个委托 public delegate void AddUsrEventHandler(object sender, AddUsrEventHandle ...

  4. JavaScript中对象的属性类型

    JavaScript中,对象的属性有两种:数据属性和访问器属性. 数据属性 特性: 数据属性包括一个数据值的位置.在这个位置可以读取和写入值.数据属性有4个特性. [[configurable]]:可 ...

  5. U43597 积木

    题目背景 小 XX 感到很无聊,从柜里翻出了小时候玩的积木. 题目描述 这套积木里共有 \(n\) 块,每块积木都是一个长方体. 小 X 想知道这些积木拼成一个积木塔(不必每一块 积木都使用). 所谓 ...

  6. 《java并发编程实战》读书笔记6--取消与关闭

    第7章 取消与关闭 这章的主要内容是关于如何使任务和线程安全,快速,可靠的停止下来. 7.1 任务取消 在Java中没有一种安全的抢占方式来停止线程,但是可以使用一些协作机制,比如: 让素数生成器运行 ...

  7. AC日记——[SDOI2009]HH的项链 洛谷 P1972

    [SDOI2009]HH的项链 思路: 莫队: 代码: #include <bits/stdc++.h> #define maxn 100005 #define maxm 400005 # ...

  8. 关于在C#中对函数重载理解

    函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是 ...

  9. 四十六 常用内建模块 itertools

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个“无限”迭代器: >>> import itertools ...

  10. Centos7安装和配置Jira7.3.6

    (1)安装jdk 1.下载jdk 链接:https://pan.baidu.com/s/1umdV-Cmm1wi1RP5clIJXmg 密码:zevc 2.安装jdk rpm -ivh jdk-8u1 ...