Como seguir links simbólicos no NFS?

4

Eu tenho discos diferentes com fotos

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

Eu tenho uma pasta chamada share que tem links simbólicos para a subpasta todos de cada diretório imagens de cada unidade. Eu mesclo cada subpasta com um script como este:

# I do this for every drive
for item in "/media/drive1/pictures/"*
do
    target=/media/share/pictures/'basename "$item"'
    if [ ! -d "$target" ]; then
        ln -s "$item" "$target"
        chown -h lsc:lsc "$target"
    fi
done

Eu tenho compartilhado isso com sucesso com o Samba agora.

[global]
# ...
follow symlinks = yes

Como esta é uma rede privada pura e o compartilhamento é READONLY, a segurança não é grande coisa.

### /etc/exports
/media/share *(ro,async)

Quando eu montei meu compartilhamento mount 1.2.3.4:/ foo os links simbólicos tentam seguir no host local.

Minha pergunta: Como posso compartilhar uma pasta que segue os links no host que está compartilhando a montagem?

OBSERVAÇÃO: A solução bind bind em /etc/fstab não funcionará aqui, já que todas as subpastas de /media/share/ apontam para locais / discos diferentes.

    
por Lucas 08.06.2014 / 01:57

5 respostas

4

Essa abordagem não funcionará com compartilhamentos montados do NFS. Os links simbólicos contêm apenas um caminho para outro arquivo ou diretório no sistema de origem do qual eles estão sendo compartilhados. A menos que você tenha o cuidado de tornar os links relativos ou duplicar as mesmas estruturas de diretório em sistemas remotos como o originador do compartilhamento, eles simplesmente não funcionarão.

Não consigo pensar em nenhum método que permita a estrutura de diretórios conforme descrito no NFS e forneça a funcionalidade que você está procurando.

Você pode querer dar uma olhada nos recursos avançados de automontagem, especificamente nesta página intitulada: Configuração avançada opções de mapa do automount .

Referências

por 08.06.2014 / 04:18
1

Você pode montar um tipo de ligação, que é melhor do que links em muitas situações, no arquivo fstab você pode colocar:

/source    /dest    none defaults,bind   0   0   
    
por 23.06.2017 / 12:27
1

Por que você não pode tornar todos os links simbólicos relativos? Isso faria o truque.

Assumindo que no servidor NFS (1.2.3.4), você tem o seguinte montado (diferentes unidades físicas possíveis)

/media/drive1/pictures/
/media/drive2/pictures/
/media/drive3/pictures/
/media/drive4/pictures/
# ...

No script, mude sua linha ln de

 ln -s "$item" "$target"

para ler

 ln -s "../${item#/media/}" "$target"

Isso criaria seus links simbólicos no formato

../drive1/pictures/...

Como você mencionou que é uma rede privada e a segurança não é uma preocupação, você pode definir as exportações para

### /etc/exports
/media *(ro,async)

Em seguida, nas caixas do cliente que montam o NFS

mkdir -p foo; mount 1.2.3.4:/media foo

Em foo, você verá share, drive1, drive2, drive3, drive4, ...

Então, na verdade, você montou todo o diretório de mídia em seu cliente, e os links simbólicos são relativos para que funcionassem bem. A quantidade de mudança necessária é mínima, a sintaxe ${item#/media/} pode ou não ser suportada pela sua versão do bash, qualquer equivalente faria (você pode usar comandos sed, awk ou qualquer coisa que você esteja familiarizado para cortar o / media /).

O único problema que resta são os nomes exclusivos, se você tiver a seguinte pasta ou arquivo

/media/drive1/pictures/same_name1
/media/drive2/pictures/same_name1

O código atual

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi

Ignoraria a criação de um link simbólico após o primeiro destino ser encontrado. Então você pode ter arquivos que estão faltando links simbólicos puramente porque o nome já é usado em outra unidade.

Você precisaria modificar seu nome de link simbólico para acrescentar algum tipo de identificador exclusivo para esses casos.

if [ -d "$target" ]; then
    #extract out the "drive1" part from $item and prepend it to target 
    target="$(echo item | sed -e 's!/media/\([^/]*\)/pictures.*!!g')_${target}"
fi

if [ ! -d "$target" ]; then
    ln -s "$item" "$target"
    chown -h lsc:lsc "$target"
fi
    
por 07.08.2018 / 02:37
0

Funciona com as opções de exportação do NFS 'nohide, crossmnt'

  1. / dev / sdc1 montado em / shared
  2. / dev / sdd1 montado em / shared / disk2
  3. / etc / exports tem a opção de montagem nohide e crossmnt
  4. Agora recarregue as exportações com exportfs -ra

Ref: link

    
por 24.01.2018 / 11:24
-1

Sim, mas ...

Como foi respondido corretamente por slm , você não pode referenciar os links simbólicos > servidor nfs , mas como corretamente apontado por alejandro izquierdo , você poderia usar < em> bind mount para fazer o trabalho:

  1. Certifique-se de montar sua VFAT ou NTFS com a opção uid=XXX para corresponder ao usuário correto ( lsc ).

    mount -o uid=XXX,gid=YYY /dev/sdX1 /media/drive1
    
  2. Agora você pode substituir seu loop for item in... por algo como:

    for item in /media/"drive1/pictures"/*
    do
        target="/media/share/pictures/$(basename "$item")"
        if [ ! -d "$target" ]; then
            mkdir "$target"
            mount --bind "$item" "$target"
        fi
    done
    

    Claro, isso tem que ser feito com privilégios root ! Usando sudo ou talvez de udev scripts ...

  3. Cuidado para desmontar a ligação ( umount "$target" ) antes de desmontar a fonte real ( /media/driveX ) e não se esqueça de remover o ponto de montagem ( rmdir "$target" ).

    Nota: você pode rmdir /media/share/pictures/* , então verá alguns:

    rmdir: failed to remove '/media/share/pictures/drive1/': Device or resource busy
    

    que não são prejudiciais, os dirs vazios não utilizados serão removidos.

por 22.12.2017 / 11:43

Tags