OpenWrt之U盘SD卡挂载overlay

2023-11-09

官方参考

挂载扩展存储脚本:
#!/bin/sh 
# 一键脚本挂载rootfs到SD卡,u盘则改mmcblk0p1为sda1
umount /dev/mmcblk0p1
mkfs.ext4 /dev/mmcblk0p1 -F
mount /dev/mmcblk0p1 /mnt
tar -C /overlay -cvf - . | tar -C /mnt -xf - 
umount /mnt
block detect > /etc/config/fstab
sed -i s/option$'\t'enabled$'\t'\'0\'/option$'\t'enabled$'\t'\'1\'/ /etc/config/fstab
sed -i s#/mnt/mmcblk0p1#/overlay# /etc/config/fstab
cat /etc/config/fstab

制作exroot 需要的前提条件:

首先要使用USB或者 Micro SD 卡槽,需要安装必须的模块内核模块:

SD:opkg install kmod-sdhci kmod-sdhci-mt7620,在 /dev 会看到 mmcblk0 文件,就是 Micro SD。

U盘:kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-usb-storage kmod-usb-storage-extras kmod-usb2 kmod-usb3 kmod-fs-ext4 kmod-fs-vfat kmod-scsi-core,并不是全部必须。

然后再安装一些文件系统相关的软件包。

block-mount kmod-fs-ext4 e2fsprogs fdisk

脚本解读(SD为例)

首先是把 SD 卡格式化成 ext4 格式。:mkfs.ext4 /dev/mmcblk0p1

然后把现有的文件拷贝到SD卡中。/overlay 目录的意义的可以看后面。

mount /dev/mmcblk0p1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt

创建 mmcblk0p1 的挂载配置,将配置信息(SD卡的UUID,block info也可查看)重定向到fstab 文件中并把/mnt/mmcblk0p1改为voerlay,0改为1。实现自动挂载。

block detect > /etc/config/fstab;\
sed -i s/option$'\t'enabled$'\t'\'0\'/option$'\t'enabled$'\t'\'1\'/ /etc/config/fstab; \
sed -i s#/mnt/mmcblk0p1#/overlay# /etc/config/fstab; \
cat /etc/config/fstab;

mount /dev/mmcblk0p1 /overlay

现在可以看到,/overlay 的空间已经增加了。但是这个是时候overlay与文件系统中的内容并不关联,重启之后无论修改那哪个下面的文件,对应的都会发生改变。

df -h可以查看是否成功

#执行block detect得到以下信息重定向到fstab并修改target与enable
#默认配置
config 'global'
        option  anon_swap  '0'
        option  anon_mount '0'
        option  auto_swap  '1'
        option  auto_mount '1'
        option  delay_root '5'
        option  check_fs   '0'
#关于挂载exroot的配置
config 'mount'
        option  target  '/mnt/mmcblk0p1'
        option  uuid    'ac3174ef-7c68-47c1-b3c8-5613d138e9d4'
        option  enabled '0'

注意有坑

如果不想使用exroot了,这个时候修改/etc/config/fstab文件中enable为0,重启发现未生效。甚至删除相关配置信息,依然能够挂载。原因是这里修改的fstab并不是openwrt路由器启动所读取的配置文件。查看启动日志可以发现:

openwrt在加载文件系统时,所读取的fstab如下所示:对应的fstab是板载emmc中的配置文件中的fstab

block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab

我们在最开始修改/etc/config/fstab时,修改的就是这个fstab,然后将/overlay下的信息拷贝到SD卡中。配置完成后重启,依然读的是板载emmc中的fstab,然后配置文件中设置是通过SD卡的uuid找到设备挂载为/voerlay。

如果关机重启之前拔掉SD卡则提示block: extroot: cannot find device with UUID ac3174ef-7c68-47c1-b3c8-5613d138e9d45秒内再次尝试,还未找到,则mount_root: switching to jffs2 overlay选择板载emmc对应的分区挂载。所以,其实配置文件不修改的情况下,只需要关机拔出SD卡重启即可即可。如想修改文件则需要在未挂载SD卡时修改/etc/config/fstab文件。

附录

/overlay 是什么意思呢?
OpenWRT 一般使用的文件系统是 SquashFS ,这个文件系统的特点就是:只读。
那,一个只读的文件系统,是怎么做到保存设置和安装软件的呢?
这里就是使用一个 /overlay 的分区,overlay顾名思义就是覆盖在上面一层的意思。
虽然原来的文件不能修改,但我们把修改的部分放在 overlay 分区上,然后映射到原来的位置,读取的时候就可以读到我们修改过的文件了。
但为什么要用这么复杂的方法呢? OpenWRT 当然也可以使用 EXT4 文件系统,但使用 SquashFS + overlay 的方式有一定的优点。
首先 SquashFS 是经过压缩的,在路由器这种小型 ROM 的设备可以放下更多的东西。
然后 OpenWRT 的恢复出厂设置也要依赖于这个方式。在你捅 Reset 重置的时候,它只需要把 overlay 分区清空就可以了,一切都回到了刚刷进去的样子。
如果是 EXT4 文件系统,就只能够备份每个修改的文件,在恢复出厂设置的时候复制回来,十分复杂。
当然,SquashFS + overlay 也有它的缺点,修改文件的时候会占用更多的空间。
首先你不能够删除文件,因为删除文件实际上是在 overlay 分区中写入一个删除的标识,反而占用更多的空间。
另外在修改文件的时候相当于增加了一份文件的副本,占用了双份的空间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenWrt之U盘SD卡挂载overlay 的相关文章

  • Android如何使用覆盖图在MapView中徒手绘制绘画?

    在我的应用程序中 在地图视图上徒手绘制油漆 但搜索了大量信息 最终从地图视图上绘制的矩形形状中获得 但我想代替像之字形那样徒手绘制矩形 如何更改我的代码请提供任何帮助 MapOverlay java public class MapOver
  • 将鼠标悬停在缩略图上时显示完整图像作为弹出/叠加

    我在 JPanel 中显示缩略图 当将鼠标悬停在这样的缩略图上时 我想在缩略图上叠加显示其完整版本 使用 HTML 我只需创建一个具有适当位置和高 z index 的 div 以便它覆盖其他所有内容 Swing 是否可以实现类似且轻量级的功
  • 删除从父级继承的不透明度?

    我有一个div标签 我想取消孩子的继承权 overlay的不透明度 这是我的代码 div div
  • jquery工具覆盖,如何在切换覆盖时保留蒙版

    我有一个简单的问题 有 2 个叠加层 一个叠加层由另一叠加层触发 并由另一叠加层触发 由于任一时间只能有一个叠加层处于活动状态 因此触发叠加层 2 的叠加层 1 会正确关闭 然而 它带有遮罩 因此覆盖层 2 出现时没有遮罩 如何在 2 个叠
  • 在 WPF 中叠加两个位图图像

    我需要叠加两个图像 例如 具有透明度的 JPEG 和 PNG 输入 JPEG 图像 PNG 图像 输出 应用了 PNG 的 JPEG 图像 做到这一点的最佳方法是什么 预先感谢您的回复和提示 Cheers 您可以像这样使用 DrawingG
  • Primefaces 5 覆盖面板更新后损坏

    今天我在P5中发现了一个新的bug 当我更新覆盖面板所指的按钮时 它不再起作用 覆盖面板不再显示 作为一种解决方法 我确实使用PF widgetVar loadContents 但这感觉很不舒服 在 PF4 中 这确实有效 没有任何解决方法
  • 谷歌地图 API 未在精确位置放置标记

    我的代码应该找出用户位置并在进入应用程序时在地图上放置一个标记 我的位置值始终等于 null 并且从未收到值 if location null lat int location getLatitude 1E6 longi int locat
  • 使用 R 将 t 分布叠加到我的直方图上?

    如何使用 R 将 t 密度叠加到直方图上 这是我的功能 simfun lt function a 56 25102409 b 1 78977412 c 0 08664925 n 18 x1 sd 18 87671 x2 sd 18 8767
  • 如何在列表视图上创建覆盖布局

    我有一个将填充的列表视图AsyncTask在应用程序的底部边缘 我需要显示固定的覆盖布局 如下所示 但我不知道如何在 xml 中做到这一点 这是我现在的layout xml
  • 如何使用纯 CSS 和 HTML 叠加图像/水印

    有没有一种简单的方法可以通过相对定位将透明 PNG 或任何其他图像 覆盖在带有 CSS 的图像标签上 只需传递一个类 img class watermarked src http placehold it 500x325 jpg alt P
  • 使用 Ionic 框架将 html 文件的内容嵌入到另一个 html 页面?

    我目前正在创建一个网站使用离子框架 http ionicframework com左侧有一个侧边栏 用户可以单击某个项目转到网站的另一个页面 现在我必须将侧边栏的代码复制到每个页面 这是没有用的 也不是可行的方法 所以我的问题是是否可以将
  • 通过 SNMP 访问路由表

    如果我尝试查找安装了 openWRT 的 Linksys WRT54G 的路由表 我需要哪个 MIB 那应该是MIB II SNMP 对象 ID OID 为 1 3 6 1 2 1 4 21 可转换为ip ipRouteTable 这对我在
  • 通过按同一个按钮来打开/关闭 MapKit 叠加?

    我有一个带有工具栏按钮的 MapView 按下该按钮时会向 MapView 添加叠加层 我想要的是按钮 IBAction 检查地图上是否已经有覆盖物 如果有 则删除 如果没有 则添加它们 我当前添加叠加层的代码如下 IBAction wat
  • ViewGroupOverlay 不显示视图

    我目前正在尝试创建一个益智游戏 其中有一个网格 每个单元格应该能够在触摸时显示视觉 并且仅视觉 指示 因此 我打算使用视图组叠加 https developer android com reference android view View
  • FFMPEG 将视频叠加在另一个视频之上

    我已经浏览了 stackoverflow 上的所有问题 但没有一个答案对我有用 我有一个屏幕录制的 mp4 视频和另一个从网络摄像头录制的 mp4 视频 我想将网络摄像头视频覆盖在屏幕录制视频的左上角 我想我终于找到了执行此操作的正确命令行
  • 使用 Google Maps API 配置热图叠加层

    我正在尝试使用 Google Maps API 生成位置热图 它可以工作 但结果不是很有用 因为热图渲染的部分很小很难看到 文档中没有任何内容建议扩展热图以呈现更大的斑点的方法 是否有一种未记录的方法可以做到这一点 或者这只是 API 的限
  • Android 4.x - 系统覆盖 - 无法捕获触摸事件

    我正在尝试为 Android 4 4 创建一个简单的覆盖应用程序 我找到了一个在屏幕上绘制按钮的示例 一切正常 但触摸事件侦听器未触发 import android app Service import android content In
  • CSS 边距为负而不移动父容器

    我正在尝试进入此页面 http musicaladvocacy org http musicaladvocacy org 显示 Home 灰色渐变中的白色容器 的区域向上移动约 60 px 但正如您所看到的 它同时将父容器向上移动 我只是想
  • 扩展 Google 地图上的叠加标记?

    我可以将覆盖项目很好地绘制到谷歌地图上 图像如下所示 其中 部分是 图钉 用于标记地图上的纬度 经度以及中间的图片 我的问题是 当用户点击它时有什么办法可以展开它吗 我当然必须将其更改为某种对话框或布局 并在单击时更改它 我想让它变小 就像
  • 创建一个覆盖视图以覆盖整个活动,包括协调器布局中的工具栏

    我想创建一种覆盖类型的布局 以显示在包括工具栏在内的活动上方 我无法使用任何库来执行此操作 因为我编写的所有内容都是自定义的 我可以通过使用以下代码直接将视图添加到装饰视图来实现它 ViewGroup vg ViewGroup getWin

随机推荐

  • Could not find a declaration file for module 'vue-xxx'.

    我尝试添加到项目中的任何第三方Vue js库都会引发以下错误 Could not find a declaration file for module vue xxx Could not find a declaration file fo
  • MySQL 中的共享锁、排他锁与意向锁

    共享锁 Share Lock 共享锁又称读锁 简称 S 锁 一个事务获取了一个数据行的共享锁 其他事务能获得该行对应的共享锁 但不能获得排他锁 即一个事务在读取一个数据行的时候 其他事务可以并发读取数据 但不能对该数据行进行增删改 直到已释
  • 【Mybatis】Mybatis的介绍以及使用

    Mybatis的介绍以及使用 https www cnblogs com kenhome p 7764398 html resultMap的用法以及关联结果集映射 https blog csdn net qq 42780864 articl
  • N1盒子刷机经验分享

    小白入坑N1经验分享 n1的玩法很多 价格也很实惠 所以前几天也入手了一个 但是对这个小盒子是一无所知 完全摸不着方向 整天在恩山逛 恩山大佬很多 干货也很多 因此我折腾了几天 反复看了几个精品帖 算是有了点体会 但是 大佬们分享的帖子虽然
  • catalina 无法验证macos_macOS 10.15 Catalina无法打开app,提示“因为无法确认开发者身份”问题的解决方法......

    概述 本文最后更新 2020年5月4日 不少用户升级到macOS Catalina 10 15之后 遇到了网上下载的app无法运行的问题 出现以下几种提示 无法打开 xxx 因为无法确认开发者的身份 xxx 已损坏 无法打开 您应该将它移到
  • Java比较器

    一 Java比较器的概述 1 为什么要使用比较器 当java涉及到数组排序时 就会使用到比较器 import java util Arrays public class ComparableTest1 public static void
  • Java常见问题(1)navicat连接mysql报2059错误

    一 navicat连接mysql8后出现2059报错原因 使用navicat连接mysql数据库的时候 弹出2059错误 如下图所示 出现的原因是mysql8安装选择了强加密规则caching sha2 password 而mysql8之前
  • 买了一年CSDN年VIP,用着实在太爽!

    买一年CSDN的年VIP有多爽及使用攻略 一 前言 这段时间 一旦打开CSDN就不断的弹出618活动 在电脑网上打开 一股白嫖之的气息吹来 让人直接忍不住剁手 最后经过近5天的挣扎 我还是受不了CSDN的蛊惑 618不买衣服不买裤子 不买键
  • 链接器工具错误 LNK2005———— 符号 被定义了多次。

    出错函数为void BinaryTree test 如下 1 该函数在BInarySearchTree h中声明如下 void BinaryTree test 2 该函数在BInarySearchTree cpp中定义 如下 void Bi
  • 2021美赛A题

    2021百万 问题A 真菌 碳循环描述了整个地球化学过程中碳的交换过程 是地球生命的重要组成部分 碳循环的一部分包括 化合物的分解 使碳得以更新并以其他形式使用 一键 这一过程的组成部分是植物材料和木质纤维的分解 分解木质纤维的一些关键因素
  • 学习笔记(Putty使用指南)

    下载 Putty是用来远程连接服务器的 支持SSH Telnet Serial等协议的连接 其中最常用的是SSH 下载链接 链接 https pan baidu com s 1RpJCgizhzxBvc7VVdYxDFg 提取码 4v23
  • valgrind massif 分析内存问题

    旧博文 搬到 csdn 原文 http rebootcat com 2020 06 16 valgrind massif memory analysing Valgrind Massif valgrind 是什么 这里直接引用其他人的博客
  • 戴尔服务器重装系统的方法,Dell服务器安装操作系统四种方法.doc

    Dell服务器安装操作系统四种方法 doc Dell服务器安装操作系统四种方法PowerEdge服务器手动安装操作系统 适合有软驱软盘 硬盘有数据要保留的用户 Dell PowerEdge 1950 服务器 Windows 2003安装手册
  • 优美的讲解equals和==的区别

    初步了解在JVM中的内存分配知识 在JVM中 内存分为堆内存跟栈内存 他们二者的区别是 当我们创建一个对象 new Object 时 就会调用对象的构造函数来开辟空间 将对象数据存储到堆内存中 与此同时在栈内存中生成对应的引用 当我们在后续
  • 【Python】Stegano包:一个纯Python的隐写模块,提供不同的隐写和隐写分析方法

    文章目录 一 介绍 二 安装 三 使用 Stegano 作为 Python 模块 3 1 LSB method 3 2 LSB method with sets 3 3 图片的描述字段 一 介绍 隐写术是一门以这样的方式编写隐藏消息的艺术和
  • Type ‘string‘ is not assignable to type ‘“xx1“

    新手常遇typescript类型约束报错 是宽泛的字符串约束和具体值的类型约束的问题 使用as const 解决 原理详细如下 https blog csdn net weixin 43263355 article details 1209
  • java 对象多属性排序_java – 按多个属性对对象排序

    我一直在研究一些需要我按三个属性 软件 str 颜色 str 和体积 int 对物体 软饮料 进行分类的东西 我已经研究过 并找到了通过名称 颜色和体积分别订购它们的方法 但有没有办法按三种方式订购它们 我的意思是 例如 假设有四个Soft
  • 用OpenCV-Python制作灯光秀短视频

    老猿Python博文目录 https blog csdn net LaoYuanPython 用OpenCV Python读取摄像头写入视频文件 一 引言 在 https blog csdn net LaoYuanPython articl
  • cucu: a compiler u can understand (part 2)

    原文地址 http blog csdn net roger wong article details 8502477 原文地址 http zserge com blog cucu part2 html 到目前为止 我们已经定义了我们语言的语
  • OpenWrt之U盘SD卡挂载overlay

    官方参考 挂载扩展存储脚本 bin sh 一键脚本挂载rootfs到SD卡 u盘则改mmcblk0p1为sda1 umount dev mmcblk0p1 mkfs ext4 dev mmcblk0p1 F mount dev mmcblk