热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ZYNQLinux为QSPIFlash配置UBIFS

操作系统:Ubuntu16.04工具版本:PetaLinux2018.2测试硬件:Zynq7010关于UBIFSUBIFS是一个新兴

操作系统:Ubuntu16.04

工具版本:PetaLinux 2018.2

测试硬件:Zynq7010


  •  关于UBIFS

UBIFS是一个新兴的应用于MTD上的有效的文件系统,是更加强壮的FLASH文件系统,在很多嵌入式系统都用到了UBIFS。它可以有效的组织flash的坏块和peb的负载平衡,同时提供访问速度,减小内存消耗,是JFFS2的后续增强版。

Xilinx PetaLinux 2018.2同时也支持UBIFS文件系统,只需要在Linux/Kernel里添加相应的配置选项,就可以在QSPI Flash创建UBIFS文件系统。


  • 为Linux Kernel添加UBIFS配置选项

$ cd

$ petalinux-config -c kernel


  • 进入内核配置界面,完成如下配置。

可以直接修改.config配置文件(/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/linux-xlnx/4.14-xilinx-v2018.2+gitAUTOINC+ad4cd988ba-r0/linux-plnx_zynq7-standard-build/.config)

CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
# CONFIG_MTD_UBI_FASTMAP is not set
# CONFIG_MTD_UBI_GLUEBI is not set
# CONFIG_MTD_UBI_BLOCK is not set
CONFIG_UBIFS_FS=y
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_ATIME_SUPPORT=y
# CONFIG_UBIFS_FS_ENCRYPTION is not set
CONFIG_UBIFS_FS_SECURITY=y
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_LZO=y
# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set

保存配置执行petalinux-build 编译工程。


  • 根据需要,定义FLASH分区大小

启动后,在Linux里通过命令cat /proc/mtd检查。

root@pkk:~# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "kernel"
mtd3: 00000000 00010000 "spare"

把mtd3分区挂载为UBIFS文件系统,需要先定义FLASH分区大小。

$ cd

$ petalinux-config

选择-*- Subsystem AUTO Hardware Settings  --->Flash Settings

调整spare size = 0x150000,保存退出。

编译完成后启动,重新通过cat /proc/mtd检查

dev:    size   erasesize  name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00930000 00010000 "kernel"
mtd3: 00150000 00010000 "spare


  • Linux下创建和挂载UBIFS分区

这里主要用到的ubi命令有:ubiformat、ubiattach、ubimkvol。用到的这些ubi工具位于mtd-utils中,要使用这些命令,需要配置使能mtd-utils。

$ cd

$ petalinux-config -c rootfs

依次选择Filesystem Packages  → base  → mtd-utils

保存配置并编译工程。

如果是第一次启动,在Linux里创建和挂载UBIFS分区,分别执行如下命令:

root@pkk:/# mkdir -p /qspi_fs
root@pkk:/# ubiformat /dev/mtd3
ubiformat: mtd3 (nor), size 1376256 bytes (1.3 MiB), 21 eraseblocks of 65536 bytes (64.0 KiB), min. I/O size 1 bytes
libscan: scanning eraseblock 20 -- 100 % complete  
ubiformat: 21 eraseblocks are supposedly empty
ubiformat: formatting eraseblock 20 -- 100 % complete 

root@pkk:/# ubiattach /dev/ubi_ctrl -m 3
ubi0: attaching mtd3
ubi0: scanning is finished
ubi0: attached mtd3 (name "spare", size 1 MiB)
ubi0: PEB size: 65536 bytes (64 KiB), LEB size: 65408 bytes
ubi0: min./max. I/O unit sizes: 1/256, sub-page size 1
ubi0: VID header offset: 64 (aligned 64), data offset: 128
ubi0: good PEBs: 21, bad PEBs: 0, corrupted PEBs: 0
ubi0: user volume: 0, internal volumes: 1, max. volumes count: 128
ubi0: max/mean erase counter: 0/0, WL threshold: 4096, image sequence number: 2111101756
ubi0: available PEBs: 17, total reserved PEBs: 4, PEBs reserved for bad PEB handling: 0
ubi0: background thread "ubi_bgt0d" started, PID 794
UBI device number 0, total 21 LEBs (1373568 bytes, 1.3 MiB), available 17 LEBs (1111936 bytes, 1.1 MiB), LEB size 65408 bytes (63.9 KiB)

root@pkk:/# ubimkvol /dev/ubi0 -N qspi_ubi0 -m
Set volume size to 1111936
Volume ID 0, size 17 LEBs (1111936 bytes, 1.1 MiB), LEB size 65408 bytes (63.9 KiB), dynamic, name "qspi_ubi0", alignment 1
root@pkk:/# mount -t ubifs /dev/ubi0_0 /qspi_fs
UBIFS (ubi0:0): default file-system created
UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 797
UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "qspi_ubi0"
UBIFS (ubi0:0): LEB size: 65408 bytes (63 KiB), min./max. I/O unit sizes: 8 bytes/256 bytes
UBIFS (ubi0:0): FS size: 588672 bytes (0 MiB, 9 LEBs), journal size 457857 bytes (0 MiB, 5 LEBs)
UBIFS (ubi0:0): reserved for root: 27803 bytes (27 KiB)
UBIFS (ubi0:0): media format: w5/r0 (latest is w5/r0), UUID E5EA7B3D-BAAF-4E43-A9E3-6FBAD021CE48, small LPT model

如果不是第一次启动,直接在Linux里挂载UBIFS分区。

$ ubiattach /dev/ubi_ctrl -m 3
$ mount -t ubifs /dev/ubi0_0 /qspi_fs

进一步验证UBIFS文件系统存储功能:

$ cd /qspi_fs

$ touch ubifs.txt

创建一个ubifs.txt文件,重启系统,按照上述步骤重新挂载UBIFS,进入到qspi_fs文件夹,查看ubifs.txt文件存在。

ok,到这里配置UBIFS文件系统基本就完成了。

接下来需要写个脚本文件实现开机自动挂载UBIFS的功能,我把这些步骤添加到程序自启动脚本中,基本实现了自动挂载功能。

#!/bin/sh

DAEMON=/usr/bin/pkk
UBI0=/dev/ubi0_0

start ()
{
#------------------------------------------------------
    mkdir -p /qspi_fs
    ubiattach /dev/ubi_ctrl -m 3
    sleep 1
    if [-e $UBI0 ]; then
        mount -t ubifs $UBI0 /qspi_fs
    else
        ubiformat /dev/mtd3
        ubiattach /dev/ubi_ctrl -m 3
        ubimkvol /dev/ubi0 -N qspi_ubi0 -m
        mount -t ubifs $UBI0 /qspi_fs
    fi
#------------------------------------------------------
    echo " Starting pkk"
    start-stop-daemon -S -o --background -x $DAEMON
}
stop ()
{
    echo " Stoping pkk"
    start-stop-daemon -K -x $DAEMON
}
restart()
{
    stop
    start
}
[ -e $DAEMON ] || exit 1
    case "$1" in
        start)
            start; ;;
        stop)
            stop; ;;
        restart)
            restart; ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
exit $?

总结一下自己在配置过程中遇到最大的坑就是ubi命令工具找不到,刚开始参照Xilinx社区论坛里面的帖子:http://xilinx.eetrend.com/content/2019/100042628.html

按照上面的步骤一步步的进行配置,最终倒在了第二步,在u-boot里面添加ubifs配置上面,可能编译环境的差异或者还有其他一些关键配置选项没有使能,在编译过程中始终报错。接下来两天在网上各种搜索错误原因,期望解决编译错误,最后都已经放弃了,无意中在配置rootfs时发现mtd-utils选项,里面包括mtd-utils-ubifs配置选项,看到这个的一瞬间感觉希望来了,迫不及待的试了一下,果然成功了,致不期而遇的美好。

 

 

 

 

 

 

 

 

 


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
author-avatar
手机用户2502926901
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有