ubifs文件系统构建

2024-04-21 13:48
文章标签 构建 文件系统 ubifs

本文主要是介绍ubifs文件系统构建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

=====================阶段一:创建根文件系统所需文件======================
一、构建busybox并make 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
mknod -m 660 ttySAC0 c 204 64
mknod -m 660 ttySAC1 c 204 65
mknod -m 660 ttySAC2 c 204 66
(这两个设备用来供init启动时调用)

看busybox依赖那些so库
/develop/crosstools/arm-dhole-linux-gnueabi/bin/arm-linux-readelf -a busybox  | grep Shared
显示结果
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 说明依赖libm.so.6和libc.so.6
把交叉编译器里的library拷贝到_install/lib目录下,
我做的交叉编译器lib库是在
/develop/crosstools/arm-dhole-linux-gnueabi/arm-dhole-linux-gnueabi/sysroot/lib/
目录下,鉴于以后的应用程序可能会用到除libm.so.6和libc.so.6外的这些库,因此全部拷过去,
在_install下执行如下命令:
cp /develop/crosstools/arm-dhole-linux-gnueabi/arm-dhole-linux-gnueabi/sysroot/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          0       0
 sysfs           /sys        sysfs   defaults          0       0
 #make sure /dev /tmp /var are tmpfs(tmpfs use ram as media) thus can be r/w  
 tmpfs           /tmp        tmpfs   defaults          0       0
 tmpfs           /dev        tmpfs   defaults          0       0
 tmpfs           /var        tmpfs   defaults          0       0
  #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:(mkdir init.d;cd init.d)
内容如下:
----------------------------------------------------------------->
#!/bin/sh

#add setting here for auto start program
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
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

=============阶段二:制作ubifs文件系统=======================================
1、制作mkfs.ubifs
yum install zlib-devel.i686
yum install lzo-devel.i686        compr_lzo.c:29:23: error: lzo/lzo1x.h: No such file or directory
yum install uuid-devel.i686
yum install uuid-dce-devel.i686
yum install libacl-devel.i686    sys/acl.h: No such file or directory
yum install libuuid-devel.i686    uuid/uuid.h: No such file or directory
make #编译pc上用的工具,我只要mkfs.ubifs

2、把_install做成ubifs文件系统:
根据下面的log
----------------------------------------------------------------->
mtd: Giving out device 2 to dhole rootfs
UBI: attaching mtd2 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI error: ubi_io_read: error -74 (ECC error) while reading 64 bytes from PEB 0:0, read 64 bytes
-----------------------------------------------------------------<
得出如下命令:
./mkfs.ubifs -r /develop/project/busybox-1.19.3/_install/ -m 2048 -e 129024 -c 2008 -o ubifs.img    #2008块*128KiB*2KiB
./ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
ubinize.cfg配置文件内容如下:
----------------------------------------------------------------->
[ubifs]
mode=ubi
image=ubifs.img
vol_id=0
vol_size=200MiB
vol_type=dynamic
vol_name=rootfs
vol_flags=autoresize
-----------------------------------------------------------------<
其中-m表示页面大小,-e表示逻辑擦除块大小,-c表示最大的逻辑擦除块数量,具体的可以通过barebox执行ubiattach的时候看到。

3、内核支持
    (1)、配置内核支持UBIFS
    Device Drivers   --->Memory Technology Device (MTD) support  --->UBI - Unsorted block  images  --->Enable UBI
    (2)、配置mtd支持UBI接口
    File  systems  --->Miscellaneous filesystems  --->UBIFS file system  support配置内核支持UBIFS文件系统

有关ubifs的详细介绍,请参考:
http://www.linux-mtd.infradead.org/doc/ubi.html
http://www.linux-mtd.infradead.org/doc/ubifs.html

=================阶段三=========================================================
///u-boot 烧写ubifs.img/
1、使用默认的分区对nand进行分区
mtdpart default

2、查看分区表
mtdpart
结果如下:
----------------------------------------------------------------->
device nand0 <nandflash0>, # parts = 3
 #: name                size            offset          mask_flags
 0: uboot               0x00100000      0x00000000      0
 1: kernel              0x00400000      0x00100000      0
 2: root                0x0fb00000      0x00500000      0

active partition: nand0,0 - (uboot) 0x00100000 @ 0x00000000

defaults:
mtdids  : nand0=nandflash0
mtdparts: mtdparts=nandflash0:1m(uboot),4m(kernel),-(root)
-----------------------------------------------------------------<

4、擦除uboot的root分区
nand erase.part root
结果如下:
----------------------------------------------------------------->

NAND erase.part: device 0 offset 0x500000, size 0xfb00000
Skipping bad block at  0x01a80000                                          
Skipping bad block at  0x03f40000                                          
Erasing at 0xffe0000 -- 100% complete.
OK
-----------------------------------------------------------------<

5、用ubi格式格式化root分区
ubi part root    设置root(u-boot)分区为当前分区,后面所有的命令ubi都基于root分区操作
结果如下:
----------------------------------------------------------------->
Creating 1 MTD partitions on "nand0":
0x000000500000-0x000010000000 : "mtd=2"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size:   131072 bytes (128 KiB)
UBI: logical eraseblock size:    129024 bytes
UBI: smallest flash I/O unit:    2048
UBI: sub-page size:              512
UBI: VID header offset:          512 (aligned 512)
UBI: data offset:                2048
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name:            "mtd=2"
UBI: MTD device size:            251 MiB
UBI: number of good PEBs:        2006
UBI: number of bad PEBs:         2
UBI: max. allowed volumes:       128
UBI: wear-leveling threshold:    4096
UBI: number of internal volumes: 1
UBI: number of user volumes:     0
UBI: available PEBs:             1982
UBI: total number of reserved PEBs: 24
UBI: number of PEBs reserved for bad PEB handling: 20
UBI: max/mean erase counter: 1/0
-----------------------------------------------------------------<

6、创建linux用的rootfs分区,"rootfs"这个名字必须和内核中的名字一样
ubi create rootfs
结果如下:
----------------------------------------------------------------->
No size specified -> Using max size (255725568)
Creating dynamic volume root of size 255725568
-----------------------------------------------------------------<

7、把ubifs.img烧写到flash中
tftp 0x31000000 ubifs.img
ubi write 0x31000000 rootfs 0x607800    #注意命令执行顺序,否则没用rootfs为linux中用的的分区名字

11、修复错误"ubi_io_write: error -5 while writing 512 bytes to PEB 5:512"
make menuconfig
#去除选项,此处有问题的描述http://www.linux-mtd.infradead.org/faq/ubi.html#L_subpage_verify_fail
Device Drivers  ---> Memory Technology Device (MTD) support  ---> NAND Device Support  ---> Verify NAND page writes
由于我移植的u-boot还没有实现硬件校验,而软件校验和硬件校验的结果不同,造成linux驱动读写ubifs文件系统失败,所以暂时先屏蔽nand 硬件校验
Device Drivers  ---> Memory Technology Device (MTD) support  ---> NAND Device Support  ---> Samsung S3C NAND Hardware ECC
这样内核就可以顺利的启动到下面的log处,但还是没有成功引导进入shell
----------------------------------------------------------------->
......
UBIFS: mounted UBI device 0, volume 0, name "rootfs"
UBIFS: file system size:   254306304 bytes (248346 KiB, 242 MiB, 1971 LEBs)
UBIFS: journal size:       9033728 bytes (8822 KiB, 8 MiB, 71 LEBs)
UBIFS: media format:       w4/r0 (latest is w4/r0)
UBIFS: default compressor: lzo
UBIFS: reserved for root:  0 bytes (0 KiB)
VFS: Mounted root (ubifs filesystem) on device 0:13.
Freeing init memory: 136K
Kernel panic - not syncing: Attempted to kill init!
[<c000d344>] (unwind_backtrace+0x0/0xf0) from [<c0344258>] (panic+0x58/0x188)
[<c0344258>] (panic+0x58/0x188) from [<c001d480>] (do_exit+0x5dc/0x6c4)
[<c001d480>] (do_exit+0x5dc/0x6c4) from [<c001d7e8>] (do_group_exit+0x3c/0xbc)
[<c001d7e8>] (do_group_exit+0x3c/0xbc) from [<c0027dfc>] (get_signal_to_deliver+0x1bc/0x490)
[<c0027dfc>] (get_signal_to_deliver+0x1bc/0x490) from [<c000add0>] (do_signal+0x90/0x4e8)
[<c000add0>] (do_signal+0x90/0x4e8) from [<c000b718>] (do_notify_resume+0x60/0x6c)
[<c000b718>] (do_notify_resume+0x60/0x6c) from [<c0008ff4>] (work_pending+0x24/0x28)
在此处死了
-----------------------------------------------------------------<
而上面的错误是由于交叉编译器的错误,导致编译出来的busybox执行失败,一般是交叉编译器生出了cpu不支持的指令。
解决方案重做交叉编译器
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(1500) | 评论(0) | 转发(0) |
0

上一篇:用crosstool-ng建立Linux 交叉编译环境

下一篇:LINUX下GDB调试(转)

相关热门文章
  • 三亚兰海度假酒店公寓三亚家庭...
  • 安全全面可靠
  • 【公报摘录】
  •   中新网11月15日电 中共十...
  • 家住呼和浩特市武川县的王先生...
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • 修改默认端口为222,centos自...
  • 用PHP做一个ftp登录页面...
  • Toad for Oracle工具,为什么在...
  • 本地win7安装vmw9系统winserv...
  • powermt config是所什么用的...
给主人留下些什么吧!~~
评论热议

这篇关于ubifs文件系统构建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923233

相关文章

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python FastMCP构建MCP服务端与客户端的详细步骤

《PythonFastMCP构建MCP服务端与客户端的详细步骤》MCP(Multi-ClientProtocol)是一种用于构建可扩展服务的通信协议框架,本文将使用FastMCP搭建一个支持St... 目录简介环境准备服务端实现(server.py)客户端实现(client.py)运行效果扩展方向常见问题结

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加