当前位置: 首页 > ai >正文

CMCC RAX3000M nand版 OpenWrt 可用空间变小的恢复方法

文章目录

  • 问题背景
  • 尝试一、通过 Tftpd64 重新刷写 initramfs-recovery 镜像 (不成功)
  • 尝试二、重新分配 ubi 卷(此操作存在一定的危险,请查阅相关资料,避免影响到核心分区)

问题背景

CMCC RAX3000M Nand 版本的配置为 128MB 的 nand ROM + 512MBRAM,详细可见 CMCC RAX3000M
在这里插入图片描述
因此,在 CMCC RAX3000M 可用空间应该约为 128MB。但是最近在刷 OpenWrt 的时候,发现刷完新系统之后的可用空间只有几M了,但是镜像包都不是很大;同时刷写大于 55MB 的固件的时候,总是会刷写失败,并且刷写失败之后会进入到一个之前刷过的某个版本,这表明 Flash 中有一个系统占据了部分空间,导致实际可用的空间大幅度减少了

因此,依照这个思路,本文来研究一下如何释放掉无效的占用,恢复原来的 Flash 空间。

尝试一、通过 Tftpd64 重新刷写 initramfs-recovery 镜像 (不成功)

参考:CMCC RAX3000M使用Tftpd刷写OpenWrt固件的救砖方法

根据在刷写失败之后进入到一个之前刷写过的某个版本这个信息,因为这个系统曾经通过 Tftpd64 刷写了其 initramfs-recovery 镜像,随后启动了 ramdiskOpenWrt,然后再通过 System Upgrade 刷写了 squashfs-sysupgrade,使其可以完整的运行 OpenWrt 镜像,因此由此推测,使用 initramfs-recovery 镜像会额外占用空间,作为 recovery 启动。

综上分析,做出了第一次尝试,是不是只有刷一个小的initramfs-recovery 镜像,就可以减小占用了呢?那么直接从官方的镜像选择器,找到 CMCC RAX3000MOpenWrt 的官方镜像:https://firmware-selector.openwrt.org/?version=24.10.1&target=mediatek%2Ffilogic&id=cmcc_rax3000m,从而可以使用到集成最小文件系统的 OpenWrt 系统,最大程度的减小占用。
在这里插入图片描述
下载KERNELSYSUPGRADE ,此时会得到 openwrt-24.10.1-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itbopenwrt-24.10.1-mediatek-filogic-cmcc_rax3000m-squashfs-sysupgrade.itb 两个文件,即第一个是 ramdik,用于在 Tftpd64 刷机,第二个为完整的系统,用于在系统升级中使用。

参考CMCC RAX3000M使用Tftpd刷写OpenWrt固件的救砖方法 这篇文章的方法刷写 ramdik 系统,然后再升级 squashfs-sysupgrade 系统。

但遗憾的是,根据此方法之后,依旧没有释放出空间了,可用空间还是只有 55MB 左右,并且刷写失败之后,依旧会进入到之前的系统中,证明 Flash 中的那个系统没有被移除。

尝试二、重新分配 ubi 卷(此操作存在一定的危险,请查阅相关资料,避免影响到核心分区)

OpenWrt 官方 pull 中,添加了 CMCC RAX3000M 支持的提交中,给出了刷机的方法,参考:mediatek: add CMCC RAX3000M support #1075
在这里插入图片描述
第二三步是刷写 BL2 分区 和 uboot 分区的,而第七步提到了重新分配 UBI 分区卷的过程。而在 OpenWrtUBI 卷是存放 rootfsoverlay 分区的卷,此卷的大小就会影响到刷机之后实际可用的空间。因此,由此推测,是不是 UBI 卷分区有问题呢,导致可用空间变小了。

由于在正常系统运行的时候,ubi卷是被使用的,无法直接操作,因此我们先在 ramdik 系统中,检查 ubiVolume 情况。

我们先使用 ubinfo -a 列出 ubi 分区情况,得到的结果如下:

root@OpenWrt:~# ubinfo -a
UBI version:                    1
Count of UBI devices:           1
UBI control device major/minor: 10:127
Present UBI devices:            ubi0ubi0
Volumes count:                           6
Logical eraseblock size:                 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks:     912 (115802112 bytes, 110.4 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  20
Current maximum erase counter value:     92
Minimum input/output unit size:          2048 bytes
Character device major/minor:            250:0
Present volumes:                         0, 1, 2, 3, 4, 5Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        29 LEBs (3682304 bytes, 3.5 MiB)
State:       OK
Name:        kernel
Character device major/minor: 250:1
-----------------------------------
Volume ID:   1 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        9 LEBs (1142784 bytes, 1.0 MiB)
State:       OK
Name:        ubootenv
Character device major/minor: 250:2
-----------------------------------
Volume ID:   2 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        9 LEBs (1142784 bytes, 1.0 MiB)
State:       OK
Name:        ubootenv2
Character device major/minor: 250:3
-----------------------------------
Volume ID:   3 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        459 LEBs (58281984 bytes, 55.5 MiB)
State:       OK
Name:        fit
Character device major/minor: 250:4
-----------------------------------
Volume ID:   4 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        359 LEBs (45584384 bytes, 43.4 MiB)
State:       OK
Name:        recovery
Character device major/minor: 250:5
-----------------------------------
Volume ID:   5 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        21 LEBs (2666496 bytes, 2.5 MiB)
State:       OK
Name:        rootfs_data
Character device major/minor: 250:6

此时我们就会发现,ubi 有六个卷(Volume ),分别如下:

卷标卷名大小
0kernel3.5 MiB
1ubootenv1.0MB
2ubootenv21.0MB
3fit55.5MB
4recovery43.4MB
6rootfs_data2.5MB

此时就会发现,fit 是存放实际运行系统的大小,即刷写 squashfs-sysupgrade 系统存放的空间,而 rootfs_data 就是 overlay 分区所对应的卷了。因此,这里就多了一个 recovery 的无效分区,占了 43.4MB,也就是之前的系统。因此为了恢复可用空间,就是需要减小这个 recovery 的无效分区了。

pull 信息中,其会在 ramdik 系统中 擦除了 ubi 的卷信息,并重建了 ubootenv 卷 和 ubootenv2 卷,同时 CMCC RAX3000Muboot 是放在 FIP 分区的,只要不修改到 FIP 分区,uboot 就不会出问题, 因此可以知道在这里处理 ubi 分区是安全的,即使 ubi 分区挂了,只要在 uboot 中重新刷写 ramdik 系统,再升级squashfs-sysupgrade 系统即可救砖。因此基于此,我们开始修改 ubi 分区。

7. After OpenWrt has booted, erase UBI volumes:ubidetach -p /dev/mtd0ubiformat -y /dev/mtd0ubiattach -p /dev/mtd0
8. Create new ubootenv volumes:ubimkvol /dev/ubi0 -n 0 -N ubootenv -s 128KiBubimkvol /dev/ubi0 -n 1 -N ubootenv2 -s 128KiB

ramdisk 的系统中,可以通过 Putty 等终端软件建立 SSH 连接到 OpenWrt,从而可以使用终端。

首先,我们先用 ubidetach -p /dev/mtd0 命令卸载 ubi 分区。但是,在我的设备上,其报了一个错误:

ubidetach: error!: cannot detach "/dev/mtd0"error 16 (Resource busy)

原因是 /dev/mtd0 正在被使用,通过命令 cat /proc/cmdline 查看系统依赖的卷,得到的结果如下:

root@OpenWrt:~# cat /proc/cmdline
root=/dev/fit0 rootwait

可以知道,运行的 ramdisk 系统是使用了 /dev/fit0,其正在使用 fit 卷(UBI Volume 3)作为根文件系统(rootfs),因此无法正常卸载。也就不能再往下执行 ubiformat -y /dev/mtd0 命令去格式化 ubi 分区。因此我们需要另外寻找方法了。

我们可以使用 ubirmvol /dev/ubi0 -n 卷号 命令,去删除多余的卷,这样效果就等同于格式化 ubi 分区了,我们有以下命令,删除所有卷

ubirmvol /dev/ubi0 -n 0
ubirmvol /dev/ubi0 -n 1
ubirmvol /dev/ubi0 -n 2
ubirmvol /dev/ubi0 -n 3
ubirmvol /dev/ubi0 -n 4
ubirmvol /dev/ubi0 -n 5

这里执行 ubirmvol /dev/ubi0 -n 3 会出现失败,因为它是 fit 卷,正在被作为 rootfs ,被系使用中,但是没有关系,可以忽略此错误。等删除完成之后,用命令重新建立 ubootenv 卷 和 ubootenv2 卷。

ubimkvol /dev/ubi0 -n 0 -N ubootenv -s 128KiB
ubimkvol /dev/ubi0 -n 1 -N ubootenv2 -s 128KiB

待成功之后,在系统升级中,刷入 squashfs-sysupgrade 系统,此时会重新分配 fit 卷 和 rootfs_data,系统启动之后,会发现空间成功恢复。

http://www.xdnf.cn/news/14573.html

相关文章:

  • redis相关面试题
  • 使用模板创建uniapp提示未关联uniCloud问题
  • vscode+react+ESLint解决不引入组件,vscode不会报错的问题
  • 小孙学变频学习笔记(四)变频器的逆变器件—IGBT管(下)
  • linux 远程终端执行qt应用显示到接入的物理显示器上
  • 如何仅用AI开发完整的小程序<5>—让AI制作开始页面
  • C++ Programming Language —— 第2章:数据类型
  • C#.NET HttpClient 使用教程
  • 【Dicom标准】dicom数据中pixelData显示处理流程详细介绍
  • Linux 服务器运维:磁盘管理与网络配置
  • 一个免费的视频、音频、文本、图片多媒体处理工具
  • ICM-20948 Wake on Motion功能开发全过程(8)
  • Python 的内置函数 hash
  • python模块常用语法sys、traceback、QApplication
  • 操作系统内核态和用户态--2-系统调用是什么?
  • 决策树:化繁为简的智能决策利器
  • GO语言---数组
  • 【Docker基础】Docker镜像管理:docker rmi、prune详解
  • 经典:在浏览器地址栏输入信息到最终看到网页的全过程,涉及网络协议以及前后端技术
  • Vue状态管理实践:使用Vuex进行前端状态管理
  • FVISION 未来视界工作室:AI驱动的创新与智能外包平台
  • TodoList 案例(Vue3): 使用Composition API
  • Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
  • 基于SpringBoot+Uniapp的活动中心预约小程序(协同过滤算法、腾讯地图、二维码识别)
  • 【论文笔记】【强化微调】TinyLLaVA-Video-R1:小参数模型也能视频推理
  • SQLite 数据库操作完整指南
  • Spring Boot邮件发送终极指南:从基础到高级应用
  • AI大模型学习之基础数学:高斯分布-AI大模型概率统计的基石
  • RocketMQ--为什么性能不如Kafka?
  • Mac电脑-Markdown编辑器-Typora