overlayfs之替换根目录
简介
Overlayfs是一种类似aufs的一种堆叠文件系统,于2014年正式合入Linux-3.18主线内核。
overlayfs 主要有四个目录:
lower:底层目录,一般放置只读文件
upper:上层目录,一般是可读写的
merge:upper和loader合并后的目录
work:一些中间、临时文件
overlayfs最基本的特性,简单的总结为以下3点:(1)上下层同名目录合并;(2)上下层同名文件覆盖;(3)lower dir文件写时拷贝。这三点对用户都是不感知的。
简单举例来说,
如果我在merge新创建了文件,那么文件会出现在upper;
如果删除了一个merge中已有的来自upper的文件,那么upper中也会删除;
如果删除了一个merge中已有的来自lower的文件,那么lower中不会变化,只是在merge中屏蔽。
很简单就可以验证,只需要创建以上四个目录,然后执行
mount -t overlay overlay -o lowerdir=/lower,upperdir=/upper,workdir=/work /merge
这种应用方式比较简单,详细原理可以看参考,重点是下节。
overlay_init脚本
此脚本可以实现将系统原rootfs从根目录转移到其他位置,转而将overlay合并后的目录作为根目录,这样对于用户是没有任何感觉的,但是却做到了安全隔离,防止损坏原系统。
tip:可以将脚本放到 /rtc/init.d/中让其开机自启动,挂载
#!/bin/sh
if [ ! -d /overlay ]
then
mkdir /overlay
fi
mount -t ext4 /dev/mmcblk0p9 /overlay
if [ ! -d /rom ]
then
mkdir /rom
fi
if [ ! -d /overlay/merge ]
then
mkdir -p /overlay/merge
fi
if [ ! -d /overlay/upper ]
then
mkdir -p /overlay/upper
fi
rm -rf /overlay/work
mkdir -p /overlay/work
mount -t overlay overlay -o lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work /overlay/merge
bin/mount -o noatime -v --move /proc /overlay/merge/proc && \
pivot_root /overlay/merge /overlay/merge/rom && {
#mount /dev/mmcblk0p7 /rom/oem #之前mountall.sh挂载就可以不用再挂了
#mount /dev/mmcblk0p9 /rom/data
bin/mount -o noatime -v --move /rom/dev /dev
bin/mount -o noatime -v --move /rom/tmp /tmp
bin/mount -o noatime -v --move /rom/run /run
bin/mount -o noatime -v --move /rom/sys /sys
bin/mount -o noatime -v --move /rom/oem /oem
bin/mount -o noatime -v --move /rom/data /data
bin/mount -o noatime -v --move /rom/overlay /overlay
#bin/mount -o noatime -v --move rom/mnt /mnt
步骤理解:
- 创建相应目录。
- 挂载一个可读写的物理分区到overlay。
- 创建目录。
- 挂载,将根目录作为lower,这样意味着原来的根目录是用户不可以修改的;上层目录用来存放可以修改的文件,这里其实随便来一个就行,因为之中的文件一定是挂载动作之后产生的;work略过;merge点在/overlay。
- 将/proc切换,因为其中是系统运行所需的资源。
- pivot_root是一个系统命令,将现在的根目录移动到/overlay/rom,/overlay作为新的根目录。这样相当于新的根目录中会有一个rom目录存放原来的(或者说不想被修改的)根目录。
- 注意脚本前是否挂载过oem、data等其他物理分区,如果没有记得挂载,可以挂在rom里再移出来,也可以等8完成直接挂在新的根下。
- 将原来的根下的一些目录移动挂载出来,这样他们就是可以直接读写,而不用做为upper。
2、4、6是关键点