0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何配置只读属性的文件系统(Colibri iMX7为例)

星星科技指导员 来源:Toradex胡珊逢 作者:Toradex胡珊逢 2023-12-07 09:31 次阅读

By Toradex胡珊逢

在先前的文章我们已经介绍在使用eMMC的模块上配置只读属性的文件系统,以及利用squashfs和overlayfs挂载可写分区。Toradex的产品除了使用eMMC存储外,还有部分是采用Nand Flash,例如Colibri iMX7和Colibri iMX6ULL。下面将以Colibri iMX7为例介绍如何配置只读属性的文件系统。

由于存储介质不同,Nand Flash上通常采用如jffs2、UBI等格式文件系统。Toradex的Linux系统使用UBI文件系统。

在Colibri iMX7的Nand Flash上会采用以下规划。Nand Flash总体上划分为两个部分。最前面的raw部分不采用任何文件系统,直接存储模块硬件信息bcb,u-boot和u-boot环境变量。第二部分则使用UBI,创建5个volume,用于存储内核文件(kernel)、设备树文件(dtb)、M4的固件(m4-fw)、Linux文件系统(rootfs)、用户文件(userdata)。其中rootfs将设置成自读属性,而userdata则可以写入数据。

1657097520324326.png

Toradex Easy Installer可以通过image.json文件方便地修改分区,从而避免使用命令工具。首先从这里下载用于Colibri iMX7S的Linux BSP v5.x安装文件。解压后在image.json中添加userdata的相关配置。

-----------------------------------

{

"name": "rootfs",

"content": {

"filesystem_type": "ubifs",

"filename": "Reference-Minimal-Image-colibri-imx7.tar.xz",

"uncompressed_size": 108.1171875

},

"size_kib": 102400

},

{

"name": "userdata",

"content": {

"filesystem_type": "ubifs",

"filename": "app.tar.xz",

"uncompressed_size": 0.1171875

}

}

-----------------------------------

这里name指定ubi volume的名字,filesystem_type用于指定ubifs文件格式,filename里包含了需要烧录到userdatavolume的文件,这些是用户应用和配置等,uncompressed_size是指app.tar.xz未压缩的大小,用于显示Toradex Easy Installer的安装进度条。更多关于image.json配置说明请参考这里。

使用Toradex Easy Installer将上面修改的镜像烧录到Colibri iMX7S即可。启动后进入u-boot,使用下面名可以看到所创建的volume。

-----------------------------------

Colibri iMX7 # ubi part ubi

Colibri iMX7 # ubi info layout

Volume information dump:

vol_id 0

......

name kernel

Volume information dump:

vol_id 1

......

skip_check 0

name dtb

Volume information dump:

vol_id 2

......

skip_check 0

name m4firmware

Volume information dump:

vol_id 3

......

skip_check 0

name rootfs

Volume information dump:

vol_id 4

......

skip_check 0

name userdata

-----------------------------------

启动进入Linux后,userdata并不会被自动挂载,需要将下面内容添加到/etc/fstab文件中。现在rootfs根目录还没有设置成只读属性,可以创建/home/root/userdata目录用于挂载userdata卷。

-----------------------------------

ubi:userdata /home/root/userdata ubifs defaults,noatime,rw 1 1

-----------------------------------

于此同时,还可以进行系统配置。例如添加一个开机启动应用。该应用write_to_file在运行时会往/home/root/userdata写入一个文件。在/etc/systemd/system/目录下创建user-demo.service。

user-demo.service

-----------------------------------

[Unit]

Description=launch user's demo on dedicated partition

ConditionFileIsExecutable=/home/root/userdata/write_to_file

After=multi-user.target

[Service]

WorkingDirectory=/home/root/userdata

Type=simple

ExecStart=/home/root/userdata/write_to_file

[Install]

WantedBy=multi-user.target

-----------------------------------

运行下面命令使user-demo.service开机运行。然后重启系统。

-----------------------------------

~# systemctl enable user-demo.service

~#reboot

-----------------------------------

此时,使用mount命令查看所挂载的卷,其中有ubi:userdata。

-----------------------------------

~# mount -l

tmpfs on /var/volatile type tmpfs (rw,relatime)

ubi:userdata on /home/root/userdata type ubifs (rw,noatime,assert=read-only,ubi=0,vol=4)

-----------------------------------

在/home/root/userdata目录下也可以看到write_to_file写入的文件file.txt。

-----------------------------------

~/userdata# ls

file.txt write_to_file

~/userdata# cat file.txt

This is a writing file test

~/userdata# systemctl status user-demo.service

* user-demo.service - launch user's demo on dedicated partition

Loaded: loaded (/etc/systemd/system/user-demo.service; enabled; vendor preset: disabled)

Active: inactive (dead) since Wed 2022-07-06 06:09:44 UTC; 14min ago

Process: 316 ExecStart=/home/root/userdata/write_to_file (code=exited, status=0/SUCCESS)

Main PID: 316 (code=exited, status=0/SUCCESS)

Jul 06 06:09:44 colibri-imx7-02873356 systemd[1]: Started launch user's demo on dedicated partition.

Jul 06 06:09:44 colibri-imx7-02873356 systemd[1]: user-demo.service: Succeeded.

-----------------------------------

最后需要再次修改/etc/fstab将rootfs根目录设置为只读属性,noatime后面添加ro。

-----------------------------------

/dev/root / auto noatime,ro 1 1

-----------------------------------

重启系统,进入u-boot命令模式,配置下参数

-----------------------------------

setenv ubiargs "ubi.mtd=ubi root=ubi0:rootfs ro rootfstype=ubifs ubi.fm_autoconvert=1"

saveenv

reset

-----------------------------------

重启进入Linux系统。根目录/已经是只读状态,无法创建文件。而/home/root/userdata目录下的应用仍可以正常执行并写入文件。

-----------------------------------

:~# mount -l

ubi0:rootfs on / type ubifs (ro,noatime,assert=read-only,ubi=0,vol=3)

~# mkdir test

mkdir: can't create directory 'test': Read-only file system

-----------------------------------

总结

通过将Linux的系统文件设置为只读状态,可以降低因文件系统损坏导致无法启动的概率。对于更高要求的应用,甚至可以使用外部存储作为备份,用于恢复文件。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • Nand flash
    +关注

    关注

    6

    文章

    232

    浏览量

    39499
  • emmc
    +关注

    关注

    6

    文章

    180

    浏览量

    52017
  • UBI
    UBI
    +关注

    关注

    0

    文章

    9

    浏览量

    4090
  • rootfs
    +关注

    关注

    0

    文章

    19

    浏览量

    4634
收藏 人收藏

    评论

    相关推荐

    嵌入式文件系统构建

    的,都是采用目录树的结构。在嵌入式系统中常见的文件系统有cramfs、romfs、jffs、yaffs等,这里就以制作cramfs文件系统
    发表于 09-02 14:25

    适用于iMX7处理器的的小巧高效完整电源解决方案

    描述适用于 NXP™ IMX7 系列应用处理器的高效灵活的小尺寸电源参考设计展示了适用于 iMX7 处理器的完整电源解决方案。这个简单的解决方案仅使用 5 个直流/直流转换器和一个序列发生器 IC
    发表于 12-28 11:50

    一文搞懂定制Ubuntu文件系统-基于迅imx6开发板

    启动。2.编译Ubuntu文件系统。3.TF卡烧写。实验环境开发环境:Ubuntu14开发板:迅imx6q工业级(迅imx6系列开发板均
    发表于 06-28 15:52

    基于iMX7示例了双路以太网的设计和配置思路

    接口,本文就基于Toradex基于NXP iMX7 Dual SoC的ARM核心板模块Colibri iMX7D示例扩展两路以太网。
    发表于 12-28 06:45

    基于iMX7 M4 SPI Slave模式的驱动供参考

    的arm平台同样来自于Toradex 基于NXP iMX7 ARM处理器的Colibri iMX7 ARM嵌入式平台。
    发表于 01-05 07:52

    基于NXP iMX7 arm处理器展示锂电池的应用方案

    本文将使用基于NXP iMX7 arm处理器的来自Toradex Colibri iMX7的低功耗演示板来展示锂电池的应用方案。
    发表于 01-13 07:24

    请问imx8mm如何构建自己的文件系统

    imx8mm,默认的文件系统有rootfs.sdcard: 3305MB,3个多G。每次烧录都要花费很长的时间,我现在只想调试驱动,用buildroot构建出来的文件系统,make后rootfs.sdcard还是那么大。请版主指
    发表于 12-31 06:16

    移植的openharmony系统烧录到开发板文件系统只读

    可以正常敲命令,但文件系统只读,求助各位大佬
    发表于 04-27 16:16

    imx8qxp-mek将文件推送到“/vendor/etc”目录时出现只读文件系统错误是怎么回事?

    “/vendor/lib64/hw”和“/vendor/etc”目录。由于默认文件系统只读的,因此我通过以下链接重新安装文件系统。我可以推送 gps.default.so 文件,但在
    发表于 04-11 08:17

    uClinux 下JFFS2 文件系统的实现

    uClinu x默认的根文件系统ROMFS是一个只读文件系统, 不支持动态擦写保存。虽然对于需要系统动态保存的数据可以采用虚拟RAM盘的方法,但系统
    发表于 05-16 13:21 9次下载

    嵌入式Linux上JFFS文件系统的实现方法

    我们使用的uClinux系统采用ROMFS作为根文件系统,它相对于一般的EXT2文件系统,具有节约空间的优势。但是ROMFS是一种只读文件系统
    发表于 05-14 10:35 1190次阅读
    嵌入式Linux上JFFS<b class='flag-5'>文件系统</b>的实现方法

    基于Cramfs的根文件系统配置

    文件系统是构建一个Linux 嵌入式系统的重要组成部分,目前嵌入式系统可以选择的根文件系统有:Romfs、Cramfs、Ramfs、Jffs2、Ext2 等,而目前广泛使用的Cram
    发表于 05-25 17:07 23次下载

    Linux嵌入式文件系统如何构建

    的,都是采用目录树的结构。在嵌入式系统中常见的文件系统有cramfs、romfs、jffs、yaffs等,这里就以制作cramfs文件系统为例进行讲解。cramfs文件系统是一种经过压
    发表于 06-18 09:23 876次阅读

    只读压缩文件系统EROFS的设计与实现

    EROFS是一个针对移动设备的只读压缩文件系统。作者观察到,当前手机配备的存储空间不大,而安卓系统系统分区、各种app占用的空间越来越大。导致用户的实际可支配空间越来越小。如图所示,
    的头像 发表于 08-31 15:09 1224次阅读
    <b class='flag-5'>只读</b>压缩<b class='flag-5'>文件系统</b>EROFS的设计与实现

    如何使用squashfs只读文件系统制作Linux系统文件

    Colibri iMX6 的 eMMC 上我们将使用以下分区规划。BootFS 为 FAT32 格式,该分区上包含 Linux 内核文件,device tree 等启动文件,如果是
    发表于 01-09 11:43 547次阅读
    如何使用squashfs<b class='flag-5'>只读</b><b class='flag-5'>文件系统</b>制作Linux<b class='flag-5'>系统</b><b class='flag-5'>文件</b>