http://blog.chinaunix.net/uid-27057175-id-4584360

openwrt的overlayfs 通过/etc/preinit调用 /sbin/mount_root来完成rootfs的切换挂载和overlay

所以研究下openwrt工程中mount_root的实现。源码目录 trunk/build_dir/target-arm_cortex-a9+vfpv3_uClibc-0.9.33.2_eabi/fstools-2014-06-22/mount_root.c
通过CMakeList.txt 的依赖关系,得知mount_root的最终实现是overlay.c的mount_overlay()

代码程:

1.overlay_mount_fs()
2.mount_extroot();
3.mount_move("/tmp", "", "/overlay")
4.fopivot("/overlay", "/rom")
  4.1 find_filesystem("overlay") 
  4.2 mount_f("overlayfs:/overlay", "/mnt", "overlayfs", MS_NOATIME, "lowerdir=/,upperdir=/overlay")
  4.3 pivot("/mnt", "/rom")

翻译为脚本:

1.
mkdir /tmp/overlay
mount -n -t jffs2 /dev/mtdblock3 -o rw,noatime,mode=0755 /tmp/overlay
2.检查无 /tmp/overlay/sbin/block,ret=-1
3.mount("/tmp/overlay", "/overlay", 0, MS_NOATIME | MS_MOVE, 0);
等效
  mount -n -t NULL /tmp/overlay -o noatime,--move /overlay
mount -n /tmp/overlay -o noatime,--move /overlay
4.
    4.1 /proc/filesystem 下确认是否支持overlay
    4.2 
        mount -n -t overlayfs overlayfs:/overlay -o rw,noatime,lowerdir=/,upperdir=/overlay /mnt
    4.3 
        mount -n /proc -o noatime,--move /mnt/proc
        pivot_root /mnt /mnt/rom
        mount -n /rom/dev -o noatime,--move /dev
        mount -n /rom/tmp -o noatime,--move /tmp
        mount -n /rom/sys -o noatime,--move /sys
        mount -n /rom/overlay -o noatime,--move /overlay

提炼一下,核心的mount jffs2分区并实现overlayfs的脚本就是:

mount -n -t jffs2 /dev/mtdblock3 -o rw,noatime,mode=0755 /overlay
mount -n -t overlayfs overlayfs:/overlay -o rw,noatime,lowerdir=/,upperdir=/overlay /mnt
mount -n /proc -o noatime,--move /mnt/proc
pivot_root /mnt /mnt/rom 
mount -n /rom/dev -o noatime,--move /dev
mount -n /rom/tmp -o noatime,--move /tmp
mount -n /rom/sys -o noatime,--move /sys
mount -n /rom/overlay -o noatime,--move /overlay
exit 0

不想用openwrt的init,把上面的脚本放到 /etc/preinit开头。

==========================================================
broadcom的SDK中SPI flash驱动有个bug,flash分区mount的jffs2,写上大文件,多写几次就会出现校验错误,
[   11.190000] Node totlen on flash *** != totlen from node ref ***
复位后jffs2分区里面内容丢失,文件节点全部破坏掉了。
[   37.290000] jffs2_scan_inode_node(): CRC failed on node at 0x005400f4: Read 0x4b9b488a, calculated 0x1f5aad85
[   37.300000] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0054084c: 0x1881 instead
[   37.310000] jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00540850: 0x0201 instead
本以为是overlayfs的补丁给打坏了,跟到最后应该是flash擦除有问题。博通重新给了一份spiflash驱动才算解决。
为啥他们不像ATHEROS使用内核的m25p80?

openwrt 切换overlay文件系统为根文件系统的更多相关文章

  1. Linux--安装过程中的根文件系统的分析

    前言: 在这篇文章中S3C6410公版的Linux BSP和U-Boot为了分析,名词和数据文件的所有内容本文是基于环境为例,所有的代码是在设置的示例进行分析的过程中.哈. 假设有不对或者不完好的地方 ...

  2. 使用ubifs作为根文件系统的openwrt如何在进行sysupgrade时保存旧的配置

    1.openwrt的默认方案(squashfs + jffs2) sysupgrade脚本直接调用default_do_upgrade更新设备树.内核.根文件系统,那么它是如何保存旧配置的呢?请看de ...

  3. openwrt的编译系统是如何制作根文件系统的

    答:分析以下makefile即可获取整个过程 以nxp layerscape系统的编译过程为例 1.分析target/linux/layerscape/image/Makefile的最后一句,这是一个 ...

  4. linux根文件系统制作

    在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误. 那么根文件系统在系统启动中到底是什么时候挂载的呢?先将/dev/ram0挂载,而后执行/l ...

  5. Yocto开发笔记之《根文件系统裁剪》(QQ交流群:519230208)

    开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...

  6. zju(4)使用busybox制作根文件系统

    1.实验目的 1.学习和掌握busybox相关知识及应用: 2.学会使用交叉编译器定制一个busybox: 3.利用该busybox制作一个文件系统: 4.熟悉根文件系统组织结构: 5.定制.编译ra ...

  7. 使用busybox构建根文件系统

    当我们在Qemu上运行起来自己编译的内核之后,需要使用busybox构建一个文件系统,将此文件系统挂载上去就可以使用busybox提供的各种命令了. 1.编译安装busybox 源码下载地址:http ...

  8. Linux内核与根文件系统的关系1

    Linux内核与根文件系统的关系开篇题外话:对于Linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题!一语破天机: “尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用 ...

  9. Linux内核与根文件系统的关系

    开篇题外话:对于Linux初学者来说,这是一个很纠结的问题,但这也是一个很关键的问题!         一语破天机: “尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具.这 ...

随机推荐

  1. js Date.parse()时区问题

    比较两个时间,parse() 方法可解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数.Date.parse时间多了8小时. 正确的方法: var nowDate = Dat ...

  2. CentOS "libc.so.6: version 'GLIBC_2.14' not found"解决方法,同理'GLIBC_2.15' not found"

    出现"libc.so.6: version 'GLIBC_2.14' not found"问题,是由于glibc版本过低,升级glibc即可. 由于CentOS系统RPM源目前gl ...

  3. HTML用table布局排版 padding清零

    之前博文:HTML布局排版2如何设置div总是相对于页面居中 中是用div进行排版的,div是切了三条,顶部的图片,下部的图片,中间的平铺条,中间的div不设高度,根据内容,该区域的大小不固定,便于后 ...

  4. LODOP插件的IE浏览器的安全设置

    LodopFuncs.js里的判断默认是混合部署,IE等支持np插件的浏览器会走lodop插件方式,但是IE的安全设置可能会阻挡lodop插件,可点击允许或修改IE浏览器的安全设置让Lodop每次都能 ...

  5. java-socket-demo的实现

    目录 前言 IO通讯模型 IO通讯模型简介 1. 阻塞式同步IO 2. 非阻塞式同步IO 3. 多路复用IO(阻塞+非阻塞) 4. 异步IO Java对IO模型的支持 注意点及实现方案 TCP粘包/拆 ...

  6. 漏洞复现之Redis-rce

    通过主从复制 GetShell Redis主从复制 Redis是一个使用ANSI C编写的开源.支持网络.基于内存.可选持久性的键值对存储数据库.但如果当把数据存储在单个Redis的实例中,当读写体量 ...

  7. C++_没有STL不能解决的问题之——<algorithm>

    这个坑好大,慢慢写 一.非修改式序列操作 1.find() 在区间中查找出某元素第一次出现的位置(注意!!是返回地址值) int main(){ ]={,,,,,}; int *b; b=find(a ...

  8. [ES] - 图形化界面工具

    推荐更新: Windows平台为 ElasticSearch 6.x 安装 Head 客户端插件 elasticsearch-head A web front end for an Elasticse ...

  9. todo...git ssh http的区别

    todo...git ssh http的区别 https://www.jianshu.com/p/2cced982009f https://www.cnblogs.com/skating/p/6296 ...

  10. grpc proto文件生成java、.net实体类以及客户端代码

    背景 工作中对接对方服务是GRPC,对方只提供了proto契约文件,需要自己生成对应的实体类以及客户端代码,故记录下操作流程. Java 代码生成 实体类: 通过protoc插件生成实体类 在 htt ...