由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Linux版 - 关于WRT54GS router 的 flash/nvram 的技术细节
相关主题
有没有人玩 openwrt 的 routerUbuntu 10.04启动加载分区错误求助
dd-wrt的web interface不见了why my mount only succeed with jffs2, not ext3 ?
有几个分区不知道怎么挂载的。。。问个一直没弄明白的initrd/initramfs问题
用 Linux 作 Router 需要些啥?最小的linux
scripting language lua欠扁看进来
有什么办法给PPStream限速???How to shrink the ubuntu UML rootfs size ?
OpenWRT 新版本改进了很多how to build a tiny size of ubuntu rootfs ?
请推荐一个demo board/kit 给embedded linux 的初学者How to get a rootfs for arm which supports 2 ethernet ports
相关话题的讨论汇总
话题: 377话题: nvram话题: flash话题: rootfs话题: config
进入Linux版参与讨论
1 (共1页)
S*A
发帖数: 7142
1
首先这是同一个 flash device 被按区划分成几个小块。
就像 sda 包含 sda1 sda2 ... 一样
dmesg:
Flash device: 0x800000 at 0x1fc00000
bootloader size: 262144
Creating 4 MTD partitions on "Physically mapped flash":
0x000000000000-0x000000040000 : "cfe"
0x000000040000-0x0000007e0000 : "linux"
0x00000011a800-0x0000007e0000 : "rootfs"
0x000000300000-0x0000007e0000 : "rootfs_data"
0x0000007e0000-0x000000800000 : "nvram"
这个是每个 mtd 的大小。注意 nvram 永远在最后而且大小是 128K.
rootfs data 有 5M.
root@OpenWrt:~# cat /proc/partitions
major minor #blocks name
31 0 256 mtdblock0 (cfe)
31 1 7808 mtdblock1 (linux)
31 2 6934 mtdblock2 (rootfs)
31 3 4992 mtdblock3 (rootfs_data)
31 4 128 mtdblock4 (nvram)
注意 rootfs 是用 squashfs 而且是 read only 的。这样可以最大
程度压缩 fs 的大小。Overlay 是用 jffs2 来提供 write support.
最后用 union fs 把 overlay 叠加在 rootfs 上面。恢复出场设置
只要 reset overlay 就可以了。
root@OpenWrt:~# mount
rootfs on / type rootfs (rw)
/dev/root on /rom type squashfs (ro,relatime) # mtd2
/dev/mtdblock3 on /overlay type jffs2 (rw,relatime) # mtd3
mini_fo:/overlay on / type mini_fo (rw,relatime)
nvram 就是简单的 key = value 的格式。似乎总在 0x18000 开始。
root@OpenWrt:~# hexdump -c /dev/mtdblock4 | less
0000000 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377
*
0018000 F L S H \b 005 \0 \0 342 001 \v 001 b \0 \0 \0
0018010 \b 377 376 \0 o p o = 0 x 0 \0 o s _ r
关于最低级的 flash 读写,有两个地方要注意的。
1)atomic. flash 需要先 erase 才写,如果中间断电了,有可能里面的内容
既不是新的也不是旧的内容。所以写有可能不是 atomic 的。
2)wear leveling. http://en.wikipedia.org/wiki/Wear_leveling
就是 flash 的写的次数是有限的,如果有些 block 被频繁写,
那些 block 就容易先坏。 所以比较好的策略是写的时候避免集中
写某些 block, 摊平了大家一起写。例如ext3 和 fat 这些都是对
flash 很不友好的, ext3 super block 和 fat 记住 free sector
count 的 block 都是被频繁写的。
高级的 flash 有专门的电路甚至小 micro controller 来解决这两个
问题,内部自己 wear leveling。这就是为什么有些 usb flash drive
价格差很多。特别便宜。高级的有 wear leveling 保护,自然成本高。
回到写 nvram 和 写 config file. 虽然两个写的是同一个 flash device.
但是还是有很大区别的。很明显 nvram 没有 wear leveling, 每次都要
写同一个地方。就算有 leveling, 128K 也不能 level 到什么地方。
atomic 估计处理也不是很好,因为只有一个 copy, 最好的策略大概是
在另一个地方写好新的,然后删除旧的内容。这个是我猜的,我不知道
wrt 是不是这么干的。
config file 就不一样了, 因为 jffs2 是专门针对 flash 设计的文件
系统,其中对 atomic 和 wear leveling 都做了专门设计。
http://sourceware.org/jffs2/
Jffs2 是 log structure file system. 每个 log node 有 32 bit CRC.
如果这个写是不完整的,CRC error, 这个最后的 log node 就无效。
所以 jffs2 是 journal file system,可以防止 not atomic update
损坏文件系统,自动恢复到上一个 valid node。
另外这个 log node 是一直向后写的,只有写完一圈(整个 fs size) 才
会回头重复写以前 free 掉的 block. 这样你的 config write 被平摊到
5M 的文件系统里面,和反复写同一个地方的 nvram (128k max) 比,
大大延长 flash 的寿命。
所以在我的理解里,写 nvram 和写 jffs2,虽然是同一个 flash,
效果是完全不一样的,后者技术上优越很多。而且管理 config file
比管理 nvram 的变量容易多了。看看论坛/mailing list,使用
config file 是极受欢迎的一个改动。
我的理解有什么不对的,欢迎指正,越技术越精确越好。谢谢。
bz
发帖数: 1770
2
都什么东东在rootfs_data和rootfs里面呢?
如果CONFIG给设错了,KERNEL起不来,这个时候怎么RESET FACTORY SETTINGS?
FLASH WEARING其实不是什么考虑因素,毕竟除了真的DEVELOPER做调试,谁会那么多次
写FLASH呢?坛子里讨论到底为什么要用CONFIG FILE?

【在 S*A 的大作中提到】
: 首先这是同一个 flash device 被按区划分成几个小块。
: 就像 sda 包含 sda1 sda2 ... 一样
: dmesg:
: Flash device: 0x800000 at 0x1fc00000
: bootloader size: 262144
: Creating 4 MTD partitions on "Physically mapped flash":
: 0x000000000000-0x000000040000 : "cfe"
: 0x000000040000-0x0000007e0000 : "linux"
: 0x00000011a800-0x0000007e0000 : "rootfs"
: 0x000000300000-0x0000007e0000 : "rootfs_data"

S*A
发帖数: 7142
3

rootfs_data 是你自从 factory setting 以后的改动。
rootfs 就是 read only 的 factory setting 的文件。例如 web server etc.
Kernel 不会因为 CONFIG 错了起不起来,因为 kernel 起来以后才会去
mount rootfs_data, 才有可能去读那些错的 config. 但是你可以错误 config
导致无法使用你的 router. 这个时候就是用 tftp reinstall firmware。
这是两个不同的问题。我回答的主要是针对“写flash和写nvram是完全一样”
的说法深入解释一下技术上有什么区别。这个技术上的优略是比较客观的。
你问的是用户到底喜欢 config file 什么东西,这个是比较主观的。
每个人可以有不同的原因喜欢,我不是 typical 用户,我在乎的东西别人
不一定在乎,这个我完全同意。
回到你的问题,对不关心内部细节的用户来说,最大的可见的好处是比较
reliable, 比较少出现 reflash 以后机器还是不能用,或者 reset factory
setting 以后有 nvram 的参数残留在里面结果还是不能真正 reset.
nvram 的里从管理的角度上要清除未知的参数是比较麻烦的。这样要求
reset factory setting 的时候知道每个应用程序使用什么参数。因为
boot loader (cfe)也使用 nvram, 你不想清楚掉未知的 boot loader
使用的参数。
而且是用文件系统比较符合 Linux 的一贯传统习惯。
问题不应该是 why, 优势很明显的,问题是 why not?

【在 bz 的大作中提到】
: 都什么东东在rootfs_data和rootfs里面呢?
: 如果CONFIG给设错了,KERNEL起不来,这个时候怎么RESET FACTORY SETTINGS?
: FLASH WEARING其实不是什么考虑因素,毕竟除了真的DEVELOPER做调试,谁会那么多次
: 写FLASH呢?坛子里讨论到底为什么要用CONFIG FILE?

S*A
发帖数: 7142
4
BTW, flash firmware 不是很经常, 改配置还是比较经常的一个操作。
每次你点 "save" 的时候就是一个 config file or nvram 写操作。
OpenWRT 的开发人员不喜欢 nvram 另一个原因是 openwrt 开始支持很多
其里古怪的 router. 有很多 router 没有 nvram. 这样要么在文件系统里
面虚拟出一个 nvram 来,要么就要改应用程序可以使用 config file.
同时维护 config file 和 nvram 反而增加程序配置的负担。所以 nvram
在新的 openwrt 就根本不用了,皆大欢喜。
1 (共1页)
进入Linux版参与讨论
相关主题
How to get a rootfs for arm which supports 2 ethernet portsscripting language lua
多个filesystem分享同一个mount point有什么办法给PPStream限速???
突发奇想,请教大家OpenWRT 新版本改进了很多
macbook pro怎么读ext3的硬盘? (转载)请推荐一个demo board/kit 给embedded linux 的初学者
有没有人玩 openwrt 的 routerUbuntu 10.04启动加载分区错误求助
dd-wrt的web interface不见了why my mount only succeed with jffs2, not ext3 ?
有几个分区不知道怎么挂载的。。。问个一直没弄明白的initrd/initramfs问题
用 Linux 作 Router 需要些啥?最小的linux
相关话题的讨论汇总
话题: 377话题: nvram话题: flash话题: rootfs话题: config