Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言

通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理,这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层,upperdir是可读写层,merged是合并层(挂载点),那么我们可以利用这个机制来实现一个恢复出厂的应用。

通过入门那章我们知道在挂载点的任何操作都只会影响upperdir,而lowerdir不影响,我们删除过挂载点的文件,这个文件本身是来自lowerdir的,但是删除后其实不会影响lowerdir,其实,我们也可以删除upperdir中的文件,也是不会影响lowerdir的,只会影响挂载点,因为挂载点是lowerdir与upperdir的合并。所以我们可以利用这个机制实现恢复出厂。

首先将我们想要保护的目录设置为lowerdir,upperdir与work我们另创建目录,最重要的点来了,那就是挂载点要选择我们指定的lowerdir,也就是自己挂自己,虽然原理上我们是不能直接操作lowerdir的,但是我们的挂载点也是lowerdir,挂载点是可以操作的。挂载以后我们就可以正常操作了,当我们想恢复出厂的时候就把upperdir中的相关对应的目录内容删除但不删除目录本身,删除后重新启动lowerdir就会恢复原样,而lowerdir也是我们的挂载点,从而实现恢复出厂。

理论上可以将整个根目录挂载上,从而实现全机的恢复出厂,但是后来通过验证会有些奇奇怪怪的问题出现,可能就是因为lowerdir本身是不可以直接操作的原因。所以这里只是为了验证可以实现。这里就以挂载

实现

1、先在根目录创建upper、work目录,并在各文件夹内初建opt目录,因为我们要实现根目录下opt目录的恢复出厂功能。

复制代码
cd /
mkdir -p /upper/opt /work/opt

2、挂载文件系统,将/opt作为lowerdir挂载到/opt。

复制代码
mount -t overlay overlay -o lowerdir=/opt,upperdir=/upper/opt,workdir=/work/opt /opt

3、在/opt内新建目录test,并在其内新建abc文件,模拟后续开发,然后去/upperdir查看。可以看到在挂载点也就是/opt下新建的文件在upperdir也出现了。

4、实现恢复出厂,将/upper/opt/内的所有内容清空,但是保留/upper/opt目录。然后查看/opt内是否还有之前新建的abc.txt,可以看到已经恢复出厂了。

​​​​​​​ ​​​​​​​ ​​​​​​​

5、可以看到这种方法是可以实现恢复出厂的。但是有一个问题就是每次开机都得自己去挂载,很麻烦,如果可以通过开机自动挂载就可以很方便,可以利用写一个脚本来实现自动挂载。删除upperdir目录的内容也可以写一个脚本,执行才方便。

脚本

1)挂载脚本

复制代码
#!/bin/bash

echo "Start mounting OverlayFS for /opt"

# 处理 /opt 目录
dir="opt"
if [ -d /$dir ]; then
  echo "Processing directory: /$dir"
  workdir=/work/work_$dir
  updir=/upper/upper_$dir
  if [ ! -d $updir ]; then
    mkdir -p $updir
    echo "Created upper directory: $updir"
  fi
  if [ ! -d $workdir ]; then
    mkdir -p $workdir
    echo "Created work directory: $workdir"
  fi
  mount -t overlay overlay -o lowerdir=/$dir,upperdir=$updir,workdir=$workdir /$dir
  echo "Mounted overlay for: /$dir"
else
  echo "/$dir directory does not exist."
fi

echo "Finished mounting OverlayFS for /opt"

2)删除脚本

复制代码
#!/bin/bash

TARGET_DIR="/upper"

# 检查目标目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
  echo "Directory $TARGET_DIR does not exist."
  exit 1
fi

echo "Start cleaning contents of $TARGET_DIR"

# 查找 TARGET_DIR 中的所有子目录并删除其中文件
find "$TARGET_DIR" -type d | while read -r dir; do
  echo "Cleaning contents of directory: ${dir}"
  find "$dir" -maxdepth 1 -type f -exec rm -f {} +
done

echo "Finished cleaning contents of $TARGET_DIR"

总结

这个小应用只是选取opt目录进行恢复,本质上可以将整个根目录挂载上,但是为了保险起见需要换根目录去实现,更多的细节就不再实现,后续有需求再去研究。

相关推荐
fanged5 分钟前
HarvardX TinyML小笔记3(番外6:视觉探测)(TODO)
笔记
摇滚侠7 分钟前
Spring Boot 3零基础教程,Spring Boot 特性介绍,笔记02
java·spring boot·笔记
武清伯MVP7 分钟前
阮一峰《TypeScript 教程》学习笔记——基本用法
笔记·学习·typescript
jz_ddk11 分钟前
[LVGL] 从0开始,学LVGL:基础构建篇 - 掌握UI的核心构建块
linux·网络协议·ui·rpc·嵌入式·gui·lvgl
要做朋鱼燕16 分钟前
STM32与W25Q64 SPI通信全解析
笔记·嵌入式·hal·spi
轻赚时代27 分钟前
新手做国风视频难?AI + 敦煌美学高效出片教程
人工智能·经验分享·笔记·创业创新·课程设计·学习方法
霖0038 分钟前
ZYNQ裸机开发指南笔记
人工智能·经验分享·笔记·matlab·fpga开发·信号处理
Dream Algorithm44 分钟前
物联网卡的TAC
笔记
Suckerbin1 小时前
Monitoring: 1靶场渗透
笔记·安全·web安全·网络安全
ding_zhikai1 小时前
SD:在一个 Ubuntu 系统安装 stable diffusion ComfyUI
linux·ubuntu·stable diffusion