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. Django models中的\_\_repr__方法

    先看个例子: class D(object): def __init__(self): pass def __str__(self): return "__str__" def _ ...

  2. WebSocket接收音频,并推送到声卡上

    使用信息 import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableM ...

  3. mycat搭建环境

    macos完全卸载mysql: https://blog.csdn.net/u012721519/article/details/55002626 踩过的坑: mycat1.6不支持单库分表; 最少要 ...

  4. formSelects隐藏功能键

    隐藏后 方法: // selectId就是select的id,这是在select渲染完后执行 $("#selectId").parent().find(".xm-sele ...

  5. ROS初探--意义、基本模块

    顾虑就使我们都变成了懦夫,使得那果断的本色蒙上了一层思虑的惨白的容颜,本来可以做出伟大的事业,由于思虑就化为乌有了,丧失了行动的能力.-----哈姆雷特 ROS: Robot Operating Sy ...

  6. Bean配置

    1.xml配置(摘抄自:https://www.cnblogs.com/zyx1301691180/p/7665971.html) 一.setter方法配置Bean: 1.创建一个 Spring Be ...

  7. k8s 证书反解

    k8s证书反解 1.将k8s配置文件(kubelet.kubeconfig)中client-certificate-data:内容拷贝 2.echo "client-certificate- ...

  8. python学习-54 正则表达式2

    re模块 之分组 >>> import re >>> re.findall("ab|c","sdfab|csdf") ['a ...

  9. 【Linux】一步一步学Linux——Linux发展史(01)

    目录 00. 目录 01. Linux概述 02. Linux简史 03. Linux主要特性 04. Linux之父 05. Linux相关术语 06. Linux其它 07. Linux应用领域 ...

  10. CH08 QSPI启动并从EMMC运行APP

    8.1 概述 在前一节课,我们必须手动挂载TF卡到mnt,然后输入./a.out程序才能启动.而在嵌入式系统里面,我们很多时候需要实现开机启动程序.很多时候我们会把程序固化到FLASH,然后从EMMC ...