文章目录
- 抛出问题
- 基本概念
- 使用场景
- OverlayFS的详细介绍
- 框架
- 目录合并
- 修改文件
- 删除文件
- 添加文件
- 小结
- OverlayFS在嵌入式系统中的应用
- 内核配置
- OverlayFS简单应用
- OverlayFS应用新思路
- 总结
环境介绍
硬件:T113平台
软件:Tina5.0 SDK(使用的buildroot系统)
抛出问题
OverlayFS到底是个什么东西?是有一个软件叫OverlayFS?还是OverlayFs一种框架?如果是一个框架,它又应用在哪?怎么应用?不用不行吗?又或者它到底是个什么?
基本概念
OverlayFS 是一个面向Linux的文件系统服务,而不是一个独立的软件或应用程序。Overlayfs是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现。
使用场景
关于OverlayFS的详细介绍后面再说。先了解一下到底为什么要使用OverlayFS。有需求才会有方案,因为这篇文章是关于OverlayFS在嵌入式系统中的应用,所以例举一下,在什么样的需求下,会使用OverlayFS:
- 1、在板子上对大量文件做了大量修改,此时想快速回到最原始的状态;
- 2、…
OverlayFS的详细介绍
框架
OverlayFS主要有两层目录,分别是下层目录(Lower)和上层目录(Upper)。下层目录只读,上层目录可读可写。
目录合并
若上层(Upper)与下层(Lower)出现了相同的文件,则下层的文件会被上层的文件覆盖。
修改文件
若此时要修改下图的c文件。由于下层(Lower)是不可写的,因此采用了CoW技术,在对c文件进行修改时,会复制了一份数据到上层(Upper),即实际修改的是上层(Upper)里的c文件。
删除文件
若删除了下图的c文件,实际是在上层(Upper)创建了一个同名的c标识的文件,这个文件叫whiteout文件。当扫描到此文件时,会忽略此文件名。因此不会真正的删除下层(Lower)的c文件。
添加文件
添加文件实际就是在上层(Upper)添加的。
小结
以上图片来源和关于OverlayFS更详细的介绍可以参考这篇文章。
OverlayFS在嵌入式系统中的应用
内核配置
内核开启OverlayFS( File systems -> Overlay filesystem support )。
OverlayFS简单应用
例如现在要对根目录下的usr目录应用上OverlayFS。
- 先在根目录下创建一个overlay文件夹;
- 在overlay文件夹下创建一个merge、upper、work文件夹;
- 分别在merge、upper、work文件夹下创建一个usr文件夹;
此时的目录结构应该如下:
/
...
bin
usr
overlay
merge
usr
upper
usr
work
usr
...
挂载命令:
mount -t overlay overlay -o lowerdir=/usr,upperdir=/overlay/upper/usr,workdir=/overlay/work/usr /overlay/merge/usr
mount -t overlay
:使用 mount 命令来挂载一个文件系统,-t overlay 指定文件系统类型为 overlay;overlay
:这是 overlay 文件系统本身的名称(或称为“伪设备”)。lowerdir=/usr
:指定/usr目录为下层目录(Lower),只读,包含原始的文件和数据;upperdir=/overlay/upper/usr
:指定/overlay/upper/usr目录为上层目录(Upper),所有对叠加文件系统的写操作都会发生在这个目录中。这些更改是私有的,并且不会影响到下层目录;workdir=/overlay/work/usr
:指定/overlay/work/usr目录为工作目录,overlay 文件系统需要它来管理元数据和临时文件;/overlay/merge/usr
:这是叠加文件系统的挂载点。一旦挂载成功,该目录就会显示下层目录和上层目录的合并内容,并且任何对 /overlay/merge/usr 的写操作都会发生在上层目录中;
查看挂载点会发现,下层目录和上层目录的合并内容出现了:
OverlayFS应用新思路
虽然上面已经体验了OverlayFS的挂载。但使用时还得进到overlay/merge/usr目录,这不太方便。能不能直接将/usr挂载到/usr呢?【该方法是从一个同事学来的】
mount -t overlay overlay -o lowerdir=/usr,upperdir=/overlay/upper/usr,workdir=/overlay/work/usr /usr
挂载成功后,在/usr目录下创建new文件夹,查看/overlay/upper/usr,确实多了一个new文件夹:
基于这种思路编写一个启动脚本,上电后自动挂载所需的目录。即上电后,会自动将/usr挂载到/usr、将/lib挂载到/lib等。可以将该脚本放到/etc/init.d/下。
echo "setting OverlayFS..."
# 检索要挂载的目录
for dir in $(ls / | grep -vE 'proc|sys|dev|udisk|tmp|lost|sddisk|var|home|overlay|root|mnt'); do
if [ -d /$dir ];then
workdir=/overlay/work/$dir
# upper层路径
updir=/overlay/upper/$dir
if [ ! -d ${updir} ];then
mkdir -p ${updir}
echo "mkdir updir ${updir} now"
fi
if [ ! -d ${workdir} ];then
mkdir -p ${workdir}
echo "mkdir work ${workdir} now"
fi
# 自己挂载自己
mount -t overlay overlay -o lowerdir=/${dir},upperdir=${updir},workdir=${workdir} /${dir}
fi
done
echo "OverlayFS has been mounted successfully!"
这是执行脚本后的挂载情况:
这样挂载后,被挂载的目录都在下层(Lower)。操作就像平时一样操作,但实际并不会修改下层文件。如果想要恢复到原始的样子,把所有/overlay/upper/xxx/下的文件清除即可。
下面是一个恢复出厂设置的脚本,主要工作就是上面所讲的,删除所有/overlay/upper目录下所有文件夹里的内容:
#!/bin/bash
echo "restore factory setting ... "
# 定义目录变量
TARGET_DIR="/overlay/upper"
# 进入目标目录
cd ${TARGET_DIR} || { echo "无法进入目录 $TARGET_DIR"; exit 1; }
# 删除/overlay/upper目录下所有文件夹的所有内容,但不删除文件夹本身
find ${TARGET_DIR} -mindepth 1 -type d -print0 | while IFS= read -r -d '' dir; do
echo "remove ${dir}"
rm -rf ${dir}/*
done
cd /
echo "restore factory setting successfully!"
总结
1、对于为什么要在嵌入式系统中应用OverlayFS,还找不出太多原因。
2、对于如何正确地在嵌入式系统中使用OverlayFS,还有待继续验证。