현재 저는 두 개의 하드 드라이브를 설정했습니다. 하나는 xfs이고 다른 하나는 btrfs입니다. 루트 fs는 xfs에 마운트되고 btrfs는 /data에 마운트됩니다. 여러 가지 이유로 /var/www
xfs의 디렉터리는 /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"