目前我有两个硬盘驱动器的设置,一个带有 xfs,另一个带有 btrfs。 root 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”,我如何使用 shell 来做到这一点工具?resolve /var/www
然后会返回类似的内容/data/var/www
(或者如果有多个绑定安装,它将返回正确的路径。
答案1
df --output=source /var/www
给你设备。但是,如果btrfs
is 不会给您子卷。但也许这个设备对你来说就足够了。
如果设备只有一个挂载点,那么您可以使用以下命令获取它:
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"