OverlayFS:修订间差异
跳转到导航
跳转到搜索
创建页面,内容为“== 说明 == OverlayFS是一个堆叠文件系统,其在Linux上比较常见。 OverlayFS可把一个或者多个目录按照某种方式堆叠的合并目录挂载到另一个目录上,不需要设备文件。 由于OverlayFS不需要设备文件(使用overlay作为设备名称),故在使用mount挂载时,需要使用-t选项指定文件系统为overlay,使用-o选项指定挂载的参数(下列为主要参数): {| class="wikitable" !选项名称…” |
|||
(未显示同一用户的2个中间版本) | |||
第25行: | 第25行: | ||
|} | |} | ||
使用OverlayFS可将一个只读的目录改为可写目录,具体做法为将lowerdir与挂载的目录均指定为需要修改的目录,挂载后所有新的访问将访问OverlayFS实现可写挂载(已经打开的访问仍访问原目录)。 | 使用OverlayFS可将一个只读的目录改为可写目录,具体做法为将lowerdir与挂载的目录均指定为需要修改的目录,挂载后所有新的访问将访问OverlayFS实现可写挂载(已经打开的访问仍访问原目录)。 | ||
== 脚本 == | |||
=== 将脚本所在目录挂载为OverlayFS === | |||
<syntaxhighlight lang="bash" line="1"> | |||
#!/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} | |||
</syntaxhighlight>此脚本可将脚本所在目录挂载OverlayFS,将对该目录的新读写保存在/tmp目录。 | |||
注意: | |||
* 执行此脚本后应当退出脚本目录再重新进入。如需卸载OverlayFS,需要先退出该目录再使用umount命令卸载。 | |||
* 若提示不支持overlay可尝试使用modprobe命令加载overlay并使用/etc/modules实现自动加载。 | |||
* 当安装某些软件(docker)后,会自动加载overlay。 | |||
== 官方资料 == | == 官方资料 == | ||
* https://docs.kernel.org/filesystems/overlayfs.html | * https://docs.kernel.org/filesystems/overlayfs.html |
2023年9月29日 (五) 06:55的最新版本
说明
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。