NFS에서 심볼릭 링크를 추적하는 방법은 무엇입니까?

NFS에서 심볼릭 링크를 추적하는 방법은 무엇입니까?

사진이 있는 다른 디스크가 있습니다.

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

라는 파일이 있습니다공유하다심볼릭 링크가 있습니다모든각각의 하위 폴더그림각 드라이브의 디렉터리입니다. 각 하위 폴더를 다음과 같은 스크립트로 병합합니다.

# 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

나는 한동안 Samba와 성공적으로 공유해 왔습니다.

[global]
# ...
follow symlinks = yes

이는 순수 개인 네트워크이고 공유는 읽기 전용이므로 보안은 그다지 문제가 되지 않습니다.

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

공유를 마운트하면 mount 1.2.3.4:/ foo심볼릭 링크가 localhost에서 추적을 시도합니다.

내 질문:심볼릭 링크로 폴더를 공유하는 방법존재하다공유 마운트 호스트?

노트:bind bind각 하위 폴더가 다른 위치/디스크를 가리키 므로 여기에서는 솔루션이 /etc/fstab작동하지 않습니다 ./media/share/

답변1

모든 심볼릭 링크를 상대적으로 만들 수 없는 이유는 무엇입니까? 그게 다야.

NFS 서버(1.2.3.4)에 다음 장치가 설치되어 있다고 가정합니다(물리적 드라이브가 다를 수 있음).

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

스크립트에서 ln 줄을 다음으로 변경합니다.

 ln -s "$item" "$target"

읽다

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

그러면 다음 형식의 심볼릭 링크가 생성됩니다.

../drive1/pictures/...

이것이 개인 네트워크이고 보안은 문제가 되지 않는다고 말씀하셨기 때문에 내보내기를 다음으로 설정할 수 있습니다.

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

그런 다음 NFS가 마운트된 클라이언트 시스템에서

mkdir -p foo; mount 1.2.3.4:/media foo

foo에는 이제 공유, 드라이브1, 드라이브2, 드라이브3, 드라이브4 등이 표시됩니다.

따라서 실제로 클라이언트에 전체 미디어 디렉토리가 마운트되어 있고 심볼릭 링크가 상대적이므로 제대로 작동합니다. 필요한 변경 사항은 매우 적으며, ${item#/media/}귀하의 bash 버전은 이 구문을 지원하거나 지원하지 않을 수 있으며, 동등한 명령이면 모두 가능합니다(sed 명령, awk 또는 /media/를 자르는 데 익숙한 명령을 사용할 수 있습니다). .

다음과 같은 폴더나 파일이 있는 경우 남은 유일한 문제는 고유한 이름입니다.

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

현재 코드

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

첫 번째 대상이 발견되면 기호 링크 생성을 건너뜁니다. 따라서 해당 이름이 이미 다른 드라이브에서 사용되고 있기 때문에 순전히 심볼릭 링크가 누락된 일부 파일이 있을 수 있습니다.

이러한 경우에 일종의 고유 식별자를 추가하려면 심볼릭 링크 이름을 수정해야 합니다.

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

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

답변2

이 방법은 NFS 탑재 공유에서는 작동하지 않습니다. 심볼릭 링크에는 공유 소스 시스템의 다른 파일이나 디렉터리에 대한 경로가 포함되어 있습니다. 링크를 상대 링크로 설정하거나 원격 시스템에서 공유 개시자와 동일한 디렉토리 구조를 복사하지 않으면 작동하지 않습니다.

NFS를 통해 디렉토리 구조를 설명하고 원하는 기능을 제공할 수 있는 방법이 생각나지 않습니다.

자동 마운트의 고급 기능, 특히 다음 페이지를 살펴보는 것이 좋습니다.고급 자동 마운트 매핑 옵션 설정.

인용하다

답변3

네,하지만...

정답대로지속 가능한 개발 관리, 당신은 할 수 없습니다역참조심볼릭 링크네트워크 파일 시스템 서버, 그러나 올바르게 지적했듯이알레한드로 이스키에르도,당신이 사용할 수있는바인드 마운트이 작업을 완료하려면 다음을 수행하세요.

  1. 올바른 사용자와 일치하도록 VFAT또는 NTFS옵션을 설치했는지 확인하십시오 (uid=XXXLSC).

    mount -o uid=XXX,gid=YYY /dev/sdX1 /media/drive1
    
  2. 이제 교체할 수 있습니다.for item in...루프는 다음과 같습니다:

    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
    

    물론 이 작업은 반드시 수행되어야 합니다.뿌리특권! sudo를 사용하거나 udev스크립트를 통해...

  3. umount "$target"실제 소스( /media/driveX)를 언로드하기 전에 바인딩()을 언로드하는 것에 주의하세요.그리고마운트 지점( rmdir "$target")을 삭제하는 것을 잊지 마세요.

    참고: rmdir /media/share/pictures/*다음 중 일부를 볼 수 있습니다.

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

    이는 무해하며 사용되지 않은 빈 디렉터리는 삭제됩니다.

답변4

NFS 내보내기 옵션 "nohide,crossmnt"와 함께 작동합니다.

  1. /dev/sdc1이 /shared에 마운트되었습니다.
  2. /dev/sdd1은 /shared/disk2에 마운트됩니다.
  3. /etc/exports에는 마운트 옵션이 있습니다와일드 쇼그리고교차로
  4. 이제 내보내기를 다시 로드하세요.파일 시스템-ra 내보내기

인용하다:https://linux.die.net/man/5/exports

관련 정보