使用 shell 工具/脚本解决绑定安装

使用 shell 工具/脚本解决绑定安装

目前我有两个硬盘驱动器的设置,一个带有 xfs,另一个带有 btrfs。 root fs 挂载在 xfs 上,btrfs 挂载在 /data 下。由于多种原因, /var/wwwxfs 上的目录被绑定挂载到/data/var/www.( mount -o bind /data/var/www /var/www) 所取代,因此如果您查看两个目录 ( /var/www & /data/var/www) ,其内容完全相同。

令我惊讶的是,一些 btrfs 工具无法处理绑定安装的路径,因此无论我需要什么,在某些情况下,给定路径“/var/ww”被规范化为“/data/var/www”,我如何使用 shell 来做到这一点工具?resolve /var/www 然后会返回类似的内容/data/var/www(或者如果有多个绑定安装,它将返回正确的路径。

答案1

df --output=source /var/www

给你设备。但是,如果btrfsis 不会给您子卷。但也许这个设备对你来说就足够了。

如果设备只有一个挂载点,那么您可以使用以下命令获取它:

awk -v dev=/dev/mapper/backup '$1==dev { count++; path=$2; } END { if(count==1) print path; else exit 1; }' /proc/mounts

答案2

这是我想出的。它解决了“绑定安装”问题。如果你跑resolve.sh /var/www,它就会返回"/data/var/www"。如果该路径中有多个绑定挂载,则对于任何给定路径,这可能应该从下到上递归地完成。但我把它留给有需要的人。现在您可以将结果 (/data/var/www) 扔到 btrfs 中。 btrfs show /data/var/www 有效,而绑定安装的 /var/www 仍然没有返回任何结果btrfs show /var/www

#!/bin/sh
# Script name: resolve.sh path
function find_bind_mount
{
  RESULT=$(findmnt -c -n "$1"|grep "\[.*\]")
  RET=$?

  # Did we check "/" and did not find any bind mounts
  if [ "$1" == "/"  -a $RET != 0 ]; then
    return 1
  fi

  # so if we didn't find a bind mount check parent directory
  if [ $RET != 0 ]; then
    find_bind_mount $(dirname "$1")
    return $?
  else
    echo "$RESULT"|sed -r "s:^([^ ]+) ([^\[]+)\[([^]]+)(.*)$:\1\t\2\t\3:g"
    return 0
  fi
}

function resolve_bind_mount
{
  local TARGET="$1"

  local RESULT=$(find_bind_mount "$TARGET")
  local PARENT_DIR_ORIG=$(awk '{ print $1;}' <<<"$RESULT")
  local PARENT=$(awk '{ print $2;}' <<<"$RESULT")
  local PARENT_DIR1=$(awk '{ print $3;}' <<<"$RESULT")
  local PARENT_DIR2=$(findmnt -c -n  "$PARENT"  |grep -v "\[.*\]"|awk '{ print $1;}')
  local PARENT_DIR_NEW="$PARENT_DIR2$PARENT_DIR1"

  echo $(sed "s:$PARENT_DIR_ORIG:$PARENT_DIR_NEW:" <<<"$TARGET")

}

resolve_bind_mount "$1"

相关内容