OverlayFS

来自资料库(何亚红)
跳转到导航 跳转到搜索

说明

OverlayFS是一个堆叠文件系统,其在Linux上比较常见。

OverlayFS可把一个或者多个目录按照某种方式堆叠的合并目录挂载到另一个目录上,不需要设备文件。

由于OverlayFS不需要设备文件(使用overlay作为设备名称),故在使用mount挂载时,需要使用-t选项指定文件系统为overlay,使用-o选项指定挂载的参数(下列为主要参数):

选项名称 说明
lowerdir 字符串,底层目录,必须指定底层目录,当上层目录未找到的文件将在底层目录中寻找。
upperdir 字符串,上层目录,文件优先在上层目录查找,写入的文件只写入上层目录,当不指定上层目录时为只读挂载
workdir 字符串,工作目录。
redirect_dir 枚举值,其值可为off、follow、nofollow、on。
index 枚举值,其值可为off、on。

使用OverlayFS可将一个只读的目录改为可写目录,具体做法为将lowerdir与挂载的目录均指定为需要修改的目录,挂载后所有新的访问将访问OverlayFS实现可写挂载(已经打开的访问仍访问原目录)。

脚本

将脚本所在目录挂载为OverlayFS

#!/bin/bash
#遇到错误立即退出
set -e
#设置overlay挂载的tmp路径
if [ -d "${TMP_OVERLAY_DIR}" ]
then
        echo TMP_OVERLAY_DIR is ${TMP_OVERLAY_DIR}
else
        export TMP_OVERLAY_DIR=/tmp/overlay
        echo TMP_OVERLAY_DIR is ${TMP_OVERLAY_DIR}
fi


#检查工具是否存在,$1为待检查的工具名。
function CheckTool
{
        [  -n "$1"  ] ||
        {
                echo -e  "\033[41;37mCheckTool 参数错误!!\033[40;37m";
                return 255;
        };
        ToolPath=`which $1`;
        [ -e "$ToolPath" ] ||
        {
                 echo -e "\033[41;37m$1 不存在,请先安装此工具\033[40;37m";
                 return 255;
        };
        return 0;
}

#获取脚本所在目录,成功时导出ScriptDir变量
function GetScriptDir
{
        self_path=""
        # shellcheck disable=SC2128  # ignore array expansion warning
        if [ -n "${BASH_SOURCE-}" ]
        then
                self_path="${BASH_SOURCE}"
        elif [ -n "${ZSH_VERSION-}" ]
        then
                self_path="${(%):-%x}"
        else
                echo -e "\033[41;37m不能获取工作目录\033[40;37m";
                return 1
        fi

        # shellcheck disable=SC2169,SC2169,SC2039  # unreachable with 'dash'
        if [[ "$OSTYPE" == "darwin"* ]]; then
                # convert possibly relative path to absolute
                script_dir="$(realpath_int "${self_path}")"
                # resolve any ../ references to make the path shorter
                script_dir="$(cd "${script_dir}" || exit 1; pwd)"
        else
                # convert to full path and get the directory name of that
                script_name="$(readlink -f "${self_path}")"
                script_dir="$(dirname "${script_name}")"
        fi
        export ScriptDir=${script_dir}
        return 0
}

#检查必要的工具
CheckTool mount
[ $? -eq 0 ] || exit;
CheckTool mkdir
[ $? -eq 0 ] || exit;
CheckTool grep
[ $? -eq 0 ] || exit;
CheckTool id
[ $? -eq 0 ] || exit;
CheckTool chmod
[ $? -eq 0 ] || exit;
CheckTool stat
[ $? -eq 0 ] || exit;


#获取当前脚本所在目录
GetScriptDir
echo ScriptDir is ${ScriptDir}

#检查是否支持overlay
if [  -z "`cat /proc/filesystems | grep -Fw overlay `" ]
then
        echo -e "\033[41;37m不支持overlay\033[40;37m";
        exit;
fi


#检查是否已挂载overlay
if [  -n "`mount | grep -Fw overlay | grep -Fw ${ScriptDir} `" ]
then
        echo -e "\033[41;37m已经挂载overlay\033[40;37m";
        exit;
fi

#检查是否为root用户
if [ `id -u` -ne 0 ]
then
        echo -e "\033[41;37m挂载文件系统需要root用户\033[40;37m";
        exit;
fi


#准备相关目录
if [ -d "${TMP_OVERLAY_UPPER_DIR}" ]
then
        echo TMP_OVERLAY_UPPER_DIR is ${TMP_OVERLAY_UPPER_DIR}
else
        export TMP_OVERLAY_UPPER_DIR=${TMP_OVERLAY_DIR}/${ScriptDir}/upper
        mkdir -p ${TMP_OVERLAY_UPPER_DIR}
        echo TMP_OVERLAY_UPPER_DIR is ${TMP_OVERLAY_UPPER_DIR}
fi
if [ -d "${TMP_OVERLAY_WORK_DIR}" ]
then
        echo TMP_OVERLAY_WORK_DIR is ${TMP_OVERLAY_WORK_DIR}
else
        export TMP_OVERLAY_WORK_DIR=${TMP_OVERLAY_DIR}/${ScriptDir}/work
        mkdir -p ${TMP_OVERLAY_WORK_DIR}
        echo TMP_OVERLAY_WORK_DIR is ${TMP_OVERLAY_WORK_DIR}
fi

#设置目录权限
chown -R `stat -c %g ${ScriptDir}`:`stat -c %u ${ScriptDir}` ${TMP_OVERLAY_UPPER_DIR}
chown -R `stat -c %g ${ScriptDir}`:`stat -c %u ${ScriptDir}` ${TMP_OVERLAY_WORK_DIR}

#挂载overlay
mount -t overlay -o lowerdir=${ScriptDir},upperdir=${TMP_OVERLAY_UPPER_DIR},workdir=${TMP_OVERLAY_WORK_DIR} overlay ${ScriptDir}

此脚本可将脚本所在目录挂载OverlayFS,将对该目录的新读写保存在/tmp目录。

注意:

  • 执行此脚本后应当退出脚本目录再重新进入。如需卸载OverlayFS,需要先退出该目录再使用umount命令卸载。
  • 若提示不支持overlay可尝试使用modprobe命令加载overlay并使用/etc/modules实现自动加载。
  • 当安装某些软件(docker)后,会自动加载overlay。

官方资料