ubnt NAND flash保护策略
本人使用的设备及版本为:EdgeRouter X v1.10.11。
我的设备是er-x。考虑到网上说,erx的flash大概只能用3年,个人感觉是nand flash的频繁擦写问题,导致flash坏掉,设备无法再正常使用。讨论附图如下:
(原始链接)
决定研究一下,如何保护"路由器NAND闪存里频繁读写"问题
计划的nand flash保护方案如下:
- 静默跑几天(假设2天),然后登陆设备,通过这条命令获取这2天系统修改的文件
find /root.dev -mtime -2
- 将这些文件的所在目录进行tmpfs格式mount,方法如下:
- 在tmp目录下新建一个文件夹,因为tmp目录是tmpfs格式的,不会占用磁盘空间;
- 拷贝这些文件所在目录(注意保持文件所有者和权限)到这个tmpfs文件夹;
- 将这个tmpfs目录直接mount到文件所在目录;
- 再静默跑几天(假设2天),然后登陆设备,再查找这2天系统修改的文件
- 如此反复,直至所有相关文件都转义到tmpfs下
- 编写脚本或程序,并实现开机自启;关机时自动将修改写入flash进行保存,确保下次开机不丢失。
方案原理:
将易变的数据,使用tmpfs方式挂载掉,这样设备在运行过程中的频繁磁盘写动作,变成了内存条里的数据的改写,从而保护了nand flash不会被频繁刷写。
最后,设备关机时,还是需要将数据写入flash进行保存的。因为在内存中的数据,断电就会强制被丢失。写回磁盘后,才能确保数据不被丢失。
优化之后,就没有了设备在运行过程中的频繁flash擦写动作,有效保护了nand flash。
实施方法:
- 部分脚本的sed需要调整为自研的sed2程序,因为sed用的mv,mount后是不能用mv命令进行覆写文件的。(sed2是一个脚本,源码参看附件中的sed2文件)
- 编写mount工具。(源码参看附件中的tmp-mount_src,对应二进制程序在附件中的tmp-mount_bin目录下)
- 经实践积累,需要mount掉的文件清单(即mount工具的配置文件)
# 将频繁变动的文件转为tmpfs来mount /etc/ubnt/last_time /etc/hosts /var/lib/logrotate/status /home/nat/.ssh/authorized_keys /config/dhcpd.leases /var/lib/ntp # 2022-9-7新添加 /etc/dnsmasq.conf /etc/cron.hourly/dnsmasq-cron /config/dnsmasq-dhcp.leases /var/cache/ddclient /etc/ppp # 2022-11-18新添加 /etc/resolv.conf /etc/resolv.conf.tmp /etc/resolv.conf.pppd-backup # 2022-12-11新添加 /home/ubnt/.lesshst /root/.lesshst
- 系统开机自动mount掉上述文件,关机时再自动写回上述文件到磁盘。工具已含umount功能(但仅写回单个文件,写回文件夹太复杂就暂不实现了)。
- 安装配置工具,让其开机自动执行mount,关机也能自动执行umount。(源码参看附件中的install.sh)
可能的缺陷:
- 强制断电的话没有umount,就没有拷贝文件的内容回去了。经过实际测试,断电并没有对系统有什么影响,还是能正常使用。
目前的机器现状(作记录,仅供参考)
查看dmesg信息如下(2022-09-11):
root@ubnt:/var/log# dmesg
UBI: attaching mtd7 to ubi0
UBI: scanning is finished
UBI: attached mtd7 (name "RootFS", size 247 MiB) to ubi0
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
UBI: VID header offset: 2048 (aligned 2048), data offset: 4096
UBI: good PEBs: 1982, bad PEBs: 0, corrupted PEBs: 0
UBI: user volume: 1, internal volumes: 1, max. volumes count: 128
UBI: max/mean erase counter: 16/7, WL threshold: 4096, image sequence number: 1473513539
UBI: available PEBs: 0, total reserved PEBs: 1982, PEBs reserved for bad PEB handling: 40
UBI: background thread "ubi_bgt0d" started, PID 54
UBIFS: background thread "ubifs_bgt0_0" started, PID 55
UBIFS: mounted UBI device 0, volume 0, name "troot"
UBIFS: LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
UBIFS: FS size: 244428800 bytes (233 MiB, 1925 LEBs), journal size 12189696 bytes (11 MiB, 96 LEBs)
UBIFS: reserved for root: 4952683 bytes (4836 KiB)
UBIFS: media format: w4/r0 (latest is w4/r0), UUID D4683CBE-27A0-4D67-BB9C-0BD4293353B8, small LPT model
VFS: Mounted root (aufs filesystem) on device 0:12.
devtmpfs: mounted
max/mean erase counter: 16/7
的含义:最大单个块的擦除次数为16次,平均每个块的擦除次数为7次。
下面分析其中几条其他的主要信息(分析的数据是从其他博文拷贝的,不是依据上面的打印数据来的):
# 在 mtddata 原始分区初始化 ubi 卷
Info: init ubi volumes on mtddata raw partition
# 将mtd20附加到ubi0...
UBI: attaching mtd20 to ubi0
# 将mtd20附加到ubi0 完成
UBI: attached mtd20 (name "mtddata", size 30 MiB) to ubi0
# PEB 128KB, LEB 124KB
UBI: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
# 最小最大I/O读写单元:2048/2048, subpage 2048, 就是2KB
UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
# VID header偏移量2KB,用于对齐,数据偏移量4KB
UBI: VID header offset: 2048 (aligned 2048), data offset: 4096
# 240 pebs正常,无坏块
UBI: good PEBs: 240, bad PEBs: 0, corrupted PEBs: 0
# 剩余可用3 PEBs, 总保留 237 PEBs(已用或保留),用于坏块处理的保留PEBs 20(本文讨论重点)
UBI: available PEBs: 3, total reserved PEBs: 237, PEBs reserved for bad PEB handling: 20
# UBI 设备号0,共240 LEBs(29.1MB),剩余可用3 LEBs,每个LEB大小为124KB
UBI device number 0, total 240 LEBs (30474240 bytes, 29.1 MiB), available 3 LEBs (380928 bytes, 372.0 KiB), LEB size 126976 bytes
(124.0 KiB)
# 成功在mtddata附加ubi设备
Info: attach ubi device on mtddata success!
从log中可以知晓很多关键信息,UBI挂载的分区名称为mtddata,对应mtd20; PEB 128KB, LEB 124KB; ubi0共240 LEBs/PEBs, 剩余可以3 LEBs/PEBs, 无坏块; 用于坏块处理的保留部分为20 PEBs。
执行
sudo ubinfo -a
信息如下(2022-09-11):ubnt@ubnt:/var/log$ sudo ubinfo -a
UBI version: 1
Count of UBI devices: 1
UBI control device major/minor: 10:60
Present UBI devices: ubi0
ubi0
Volumes count: 1
Logical eraseblock size: 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks: 1982 (251666432 bytes, 240.0 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: 40
Current maximum erase counter value: 16
Minimum input/output unit size: 2048 bytes
Character device major/minor: 254:0
Present volumes: 0
Volume ID: 0 (on ubi0)
Type: dynamic
Alignment: 1
Size: 1938 LEBs (246079488 bytes, 234.7 MiB)
State: OK
Name: troot
Character device major/minor: 254:1
ubi的工具集,保存在/usr/sbin/目录下:
工具 | 作用 |
---|---|
ubinfo | 提供ubi设备和卷的信息 |
ubiattach | 链接MTD设备到UBI并且创建相应的UBI设备 |
ubidetach | ubiattach相反的操作,将MTD设备从UBI设备上去链接 |
ubimkvol | 从UBI设备上创建UBI卷 |
ubirmvol | 从UBI设备上删除UBI卷 |
ubiblock | 管理UBI卷上的block |
ubiupdatevol | 更新卷,例如OTA直接更新某个分区镜像 |
ubicrc32 | 使用与ubi相同的基数计算文件的crc32 |
ubinize | 制作UBI镜像 |
ubiformat | 格式化空的Flash设备,擦除Flash,保存擦除计数,写入UBI镜像到Flash |
mtdinfo | 报告从系统中找到的UBI设备的信息 |
NAND的物理性质决定了其每个块都有擦除寿命的限制,SLC约10W次,MLC约5000次,TLC约1000次
未能分析出ubnt的颗粒,感觉非常可能就是TLC,甚至以下,毕竟是比较老型号的设备了。
源码附件:
https://download.csdn.net/download/whgjjim/87399944
参考链接:
MTD中的nand驱动初步分析_shexujia的博客-CSDN博客; Linux MTD下获取Nand flash各个参数的过程的详细解析 - 程序员大本营
ubnt NAND flash保护策略相关推荐
- 全面理解SSD和NAND Flash
Flash Memory又叫做闪存,是一种非易失性存储器.非易失性是指断电之后数据不会丢失,这里就涉及到断电保护(后面详细讲解). 总体思路 1.NAND Flash的用途. 2.NAND Flash ...
- NAND FLASH ECC校验原理与实现
NAND FLASH ECC校验原理与实现 2008-01-25 14:57:27 转自:http://blog.csdn.net/nhczp/archive/2007/07/20/1700031.a ...
- EEPROM, NAND FLASH, NOR FLASH
EEPROM, NAND FLASH, NOR FLASH 基础:内部结构 EEPROM结构特点 EEPROM基于浮栅管单元(Floating gate transister)的结构. EEPROM ...
- 分析DRAM、NAND FLASH、NOR FLASH三大存储器
来源:电子发烧友网 内存的正式名字叫做"存储器",是半导体行业三大支柱之一.2016年全球半导体市场规模为3400亿美金,存储器就占了768亿美元.对于你身边的手机.平板.PC.笔 ...
- Linux MTD架构下的nand flash驱动详解
转载自:http://blog.csdn.net/wang_zheng_kai/article/details/18988521 有了前面的基础(Nandflash详解:https://blog.cs ...
- 基于nand flash的文件系统的整理
一. Nandflash简介 基本概念:flash芯片.block.page.附加页 1.1结构 Flash芯片的擦除以块为单位,写以页为单位.在每个flash芯片中包括非常多的 ...
- NAND FLASH学习笔记之MTD下nand flash驱动(二)
在这里补充这一片是为了更好的理解上一篇,补充的内容包括:MTD下NAND的布局中几个重要文件的诠释和MTD涉及的几个重要的结构体(更好的理解接口) 一.内核中的NAND代码布局 在Linux 内核中, ...
- linux驱动之nand flash
1. Nand Flash一些名词的解释 1.1 (Bad) Block Management(坏)块管理 Nand Flash由于其物理特性,只有有限的擦写次数,超过那个次数,基本上就是坏了.在使用 ...
- Android Nand Flash 分区
一般的嵌入式Linux开发人员是要清晰区分不同器材的作用和名称的.比如系统,内核所有保存在Nand Flash之上,断电后仍然存在,而运行后程序是装入SDRAM或Mobile DDR之类的内存设备运行 ...
最新文章
- tensorflow就该这么学--6(多层神经网络)
- LightOJ 1269 Consecutive Sum (Trie树)
- 在程序员的道路上,义无反顾的努力,有思想的人,很多,好的想法,需要学习。(以此共勉)...
- Codeforces Round #354 (Div. 2)
- 签字后被开除_员工虚假报销公司可以开除吗?
- mysql 进阶方向_mysql数据库入门、进阶和提升(续二)
- java数组的扩容,将两个数组合并成一个数组
- js预览本地word文档_怎么免费下载百度文库付费文档?
- pxe结合kickstart文件实现全自动化安装
- matlab中min函数
- 建个网站需要多少钱?
- WebSocket通讯C#实例
- Python实现Word表格转成Excel表格
- CC2591和RFX2401C在zstack中的设置
- PHPUnit袖珍指南 第六章 装置器
- 代码管理和编辑工具Source Insight 4.0使用介绍
- oracle卸载ksh,oracle与ksh(Korn Shell) | 学步园
- VOS3000 IVR 语音业务的接入号码如何设置
- 汽车诊断仪常用特殊功能-节气门匹配
- C# 绘制验证码图片
热门文章
- Chipsec UEFI Shell启动盘的制作与使用,让你可以在所有平台轻松使用Chipsec
- 微软认证考试六大考试技巧
- 1039 到底买不买 (20 分)
- 计算机课可以坐着讲吗,探寻如何把计算机专业课上得更有意思
- php 混合开发框架,Spiral: 性能卓越的PHP/Golang混合开发框架
- 抖音小店无货源选品玩法,有什么软件推荐使用?资深电商人来告诉你
- python中字符串转xml对象_将文本字符串转换为XML
- 公司类型其他有限责任公司什么意思
- File类的删除文件夹(有目录,无目录)
- 支付接口申请_谈一下关于个人网站实现免签支付接口自动收款