마운트 지점으로 하위 디렉터리가 있는 NFS 공유를 올바르게 내보내고 가져오는 방법은 무엇입니까?

마운트 지점으로 하위 디렉터리가 있는 NFS 공유를 올바르게 내보내고 가져오는 방법은 무엇입니까?

서버는 옵션을 사용하여 NFS를 통해 A디렉토리를 내보냅니다 . 내의 하위 디렉토리는 다음과 같은 옵션을 사용하는 NFS 서버의 다른 위치에 대한 마운트 지점입니다 ./srvnohide/srv/srv/foo--bind

server# mount --bind /bar/foo/ /srv/foo/

클라이언트는 NFS를 사용하여 이를 B가져와 A:/srv마운트합니다 /mnt/srv. 의 내용 /mnt/srv은 의 내용입니다 A:/srv.

문제는 그것이 /mnt/srv/foo비어 있는데 거기의 내용을 볼 것으로 예상된다는 것입니다 A:/bar/foo/.

마운트 지점으로 하위 디렉터리가 있는 NFS 공유를 올바르게 내보내고 가져오는 방법은 무엇입니까?

답변1

crossmnt당신의 친구입니다.

/srv        *(rw,fsid=0,no_subtree_check,crossmnt)

답변2

나는 다음을 따르는 동안이 문제에 부딪쳤다.디스크 없는 아치가이드, 정말 속도가 느려졌습니다. 이것이 다른 사람에게도 효과가 있을지 궁금하기 때문에 여기서 결과를 공유하겠습니다.

디스크 없는 가이드에 따라 다음 위치에 마운트된 루프백 이미지에 디스크 없는 클라이언트의 루트 파일 시스템(내보내야 하는 실제 데이터)이 있습니다 /srv/des1.

/srv/des1.img on /srv/des1 type btrfs (rw,relatime,compress=lzo,discard,space_cache)

그런 다음 마운트 지점을 생성한 /nfs/des1다음 마운트를 실행하고 모든 것을 볼 수 있는지 확인합니다.

# mkdir -p /nfs/des1 
# mount --bind /srv/des1 /nfs/des1
# ls -l /nfs/des1
bin  boot  dev  usr  #[SNIP]

다음을 참조하여아치 NFS/etc/exports가이드에 따라 서버에 다음을 넣습니다 .

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check,nohide)

exportfs -rav그런 다음 서버에서 이러한 변경 사항을 적용하기 위해 실행했습니다 .

그러나 그런 다음 다음을 사용하여 테스트 클라이언트에 공유를 마운트했습니다. mount server:/des1 /mnt/tmp디스크 없는 루트 파일 시스템이 있을 것으로 예상했을 때 빈 디렉터리라는 것을 알게 되었습니다.

이 단계에서는 매뉴얼 페이지에서 다음 옵션이 표시될 때까지 거의 모든 것을 시도했습니다 exports.

crossmnt
    This option is similar to nohide but it makes it possible for clients
    to move from the filesystem marked with crossmnt to exported filesystems
    mounted on it. Thus when a child filesystem "B" is mounted on a parent "A",
    setting crossmnt on "A" has the same effect as setting "nohide" on B. 

그래서 다른 모든 것을 시도한 후 이것을 바꿔서 /etc/exports다음과 같이 생겼습니다.

/nfs/      *(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
/nfs/des1/ *{rw,no_root_squash,no_subtree_check)

매뉴얼 페이지 항목을 읽으면 이전 코드와 동일한 효과가 있을 것이라고 생각할 수 있지만 exportfs -rav변경 사항을 등록하기 위해 다시 실행한 다음 클라이언트에서 다시 마운트하려고 시도하면 작동했습니다!

답변3

클라이언트가 볼 수 있도록 NFS 서버에서 모든 마운트 하위 지점을 내보내야 하는 것 같습니다. 위의 상황에서 /etc/exports파일은 다음과 같아야 합니다.

/srv        *(rw,fsid=0,nohide,no_subtree_check)
/srv/foo    *(rw,nohide,no_subtree_check)

그런 다음 /srv옵션을 사용하여 클라이언트에서 가져오면 및 -t nfs둘 다 적절하게 사용할 수 있게 됩니다 ./srv/srv/foo

OP로 편집

이 줄

    /srv/foo    *(rw,fsid=0,nohide,no_subtree_check)

내 경우에는 대신 일했습니다.

    /srv/foo    *(rw,nohide,no_subtree_check) 

답변4

메모:단일 사용자만 활성화됨

추가되는 것은 서버 측과 클라이언트 측에 대한 일련의 편집입니다. 서버 측 /etc/exports/etc/fstab클라이언트 측에서.

서버 측

  • 리눅스 민트 18.3 실비아 32비트
  • 커널 Linux 4.4.0-138-일반 i686
  • 아수스 eeepc

    $ cat /etc/exports 
    #insert shares (one for each mounted partition sub-folder):      
    /nfsshare/ /192.168.1.155(rw,no_root_squash,no_subtree_check,fsid=root,crossmnt)
    /nfsshare/media/ 192.168.1.155(rw,no_root_squash,no_subtree_check)
    /nfsshare/extra/ /192.168.1.155(rw,no_root_squash,no_subtree_check)   
    
    $ cat /etc/fstab  
    #shared media files on /media/ed/
    /media/ed/ /nfsshare/ nfs bind 0 0
    /media/ed/media/ /nfsshare/media/ nfs bind 0 0
    /media/ed//extra /nfsshare/extra/ nfs bind 0 0
    

고객 입장에서

  • 리눅스 민트 19 타라 64비트
  • 커널 Linux 4.15.0-38-일반 x86_64

    $ cat /etc/fstab
    #NFS Shares line added
    192.168.1.158:/nfsshare /mnt/share nfs rw,soft,intr,noatime,x-gvfs-show
    

관련 정보