쉘 도구/스크립트를 사용하여 바인드 설치 해결

쉘 도구/스크립트를 사용하여 바인드 설치 해결

현재 저는 두 개의 하드 드라이브를 설정했습니다. 하나는 xfs이고 다른 하나는 btrfs입니다. 루트 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"로 정규화됩니다. 쉘 도구를 어떻게 사용하여 이 작업을 수행? resolve /var/www 그러면 다음과 같은 결과가 반환됩니다 /data/var/www(또는 바인드 마운트가 여러 개인 경우 올바른 경로가 반환됩니다.

답변1

df --output=source /var/www

장비를 주세요. 그러나 btrfs하위 볼륨을 제공하지 않는 경우. 하지만 어쩌면 이 장치로 충분할 수도 있습니다.

장치에 마운트 지점이 하나만 있는 경우 다음을 사용하여 얻을 수 있습니다.

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"

관련 정보