resolve montagens de ligação com uma ferramenta / script shell

1

Atualmente eu tenho uma configuração com dois hardrives, um com o xfs, o outro com o btrfs nele. O root fs é montado no xfs e o btrfs no / data. Por razões verious, o diretório /var/www no xfs foi substituído por uma montagem de ligação para /data/var/www. ( mount -o bind /data/var/www /var/www ) Então, se você olhar em ambos os diretórios ( /var/www & /data/var/www ), é exatamente o mesmo conteúdo.

Para minha surpresa, algumas ferramentas btrfs não podem manipular pathes montados em bind, então o que eu preciso para certas situações, o caminho dado "/ var / ww" é canonizado para "/ data / var / www" Como posso fazer isso com uma ferramenta shell? algo como resolve /var/www que retornaria /data/var/www (ou se houver mais de uma montagem de ligação, ela retornaria o caminho correto.

    
por Mandragor 06.02.2016 / 12:42

2 respostas

0

df --output=source /var/www

Dá-lhe o dispositivo. No caso de btrfs is, no entanto, não dá o subvolume. Mas talvez o dispositivo seja suficiente para você.

Se houver apenas uma montagem para o dispositivo, você poderá obtê-lo com este comando:

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

Isso foi o que eu criei. Ele resolve a "montagem de ligação". se você executar resolve.sh /var/www , ele retornará "/data/var/www" . Provavelmente isso deve ser feito de forma recursiva de baixo para cima para qualquer caminho dado, se houver mais de uma ligação montada no caminho. Mas eu deixo isso para alguém que precisa disso. Agora você pode jogar o resultado (/ data / var / www) no btrfs. btrfs show /data/var/www funciona, enquanto o bind montado / var / www ainda não retorna nenhum resultado com 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:^([^ ]+) ([^\[]+)\[([^]]+)(.*)$:\t\t: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"
    
por 07.02.2016 / 16:50