문맥

문맥

아래 내용을 길게 읽어서 죄송합니다. 이것이 누군가가 나를 도울 수 있도록 충분한 컨텍스트와 추적을 제공하기를 바랍니다.

문맥

일부 zfs 데이터세트(사용자당 하나)에 사용자 홈 디렉터리를 저장합니다. 여기서 각 사용자는 각 Linux 배포 및 버전(예: Debian Buster)에 대해 서로 다른 홈 디렉터리를 갖지만 실제로는 모두 다운로드 또는 디렉터리에 대한 XDG 디렉터리입니다. 데스크탑은 모두 동일한 디렉토리를 가리키므로 사용자는 실행 중인 터미널에서 로그인한 Linux 배포판에 관계없이 모든 파일에 액세스할 수 있습니다. 제가 집에 보관하는 바이너리도 구조가 똑같습니다. 아래 예를 참조하세요(아래 대괄호 안의 숫자가 무엇을 의미하는지 확인하세요).

/media/zfs/home/user1/XDG-DIRS/[1]Downloads
                     |        /[2]Videos
                     |        /<some more directories and files>
                     |
                     /homes/[3]debian_buster/<some files(1)>
                     |     /[4]ubuntu_groovy/<some files(2)>
                     |
                     /[5]usr/share/<some files(3)>
                     |   /include/<some files(4)>
                     |
                     /local/linux-x86_64/[6]bin
                           |            /[7]lib
                           |
                           /linux-armhf/[8]bin
                                       /[9]lib

위 구조의 점을 수정하기 위해 특정 마운트를 사용하면 배포판 및 해당 버전에서 제공되는 데스크탑 환경과 일치하는 모든 사용자 설정 파일로 홈 디렉토리를 다시 구축할 수 있지만 운영 체제에서도 여전히 모든 개인 파일에 액세스할 수 있습니다. 시스템 홈 설치용 호환 바이너리 및 사용자 로그인용 스키마. 예를 들어, 사용자가 x86_64 아키텍처에서 실행되는 Linux Debian Buster에 로그인할 때 홈 디렉터리 구조는 다음과 같아야 합니다. 디렉토리 이름 끝에 대괄호 안의 숫자는 해당 디렉토리의 내용이 실제로 위 구조에서 이름 시작 부분에 동일한 숫자가 있는 디렉토리의 내용이어야 함을 나타냅니다. ubuntu groovy를 실행하는 Raspberry Pi에 로그인한 사용자의 홈 디렉터리가 어떻게 생겼는지 추측해 보겠습니다.

/home/AD.EXAMPLE.COM/user1[3]/Downloads[1]
                             /Videos[2]
                             /.local[5]/bin[6]
                                       /lib[7]

이는 터미널 시스템에서 autofs를 실행하고 필요한 만큼의 nfs를 마운트하는 실행 가능한 맵 파일을 사용하여 달성할 수 있습니다(위의 예에서는 사용자당 5개, 일반적으로 그 이상, XDG 카탈로그 이상). 내가 예상하는 문제는 사용자가 "다운로드"에서 "비디오"로 파일을 이동하려는 경우 두 개의 서로 다른 nfs 마운트 지점이므로 파일이 실제로 터미널에 다운로드된 다음 서버에 다시 업로드된다는 것입니다. 실제로 이것이 성능 저하를 가져오는지는 테스트하지 않았습니다. 이에 대한 통찰력이 있으면 알려주십시오.

위에서 언급한 성능 문제를 제한하기 위해 실제로 autofs를 사용하여 서버의 각 배포/버전(한쪽)과 각 OS/아키텍처(다른 쪽)에 대한 홈 디렉터리를 다시 빌드한 다음 NFS를 통해 결과를 내보냅니다. 이는 autofs 바인드 마운트를 사용하여 서버에 다음 구조를 구축한다는 의미입니다.

/media/user_data/unix/user1/home/[10]debian_buster/Downloads[1]
                           |    |                 /Videos[2]
                           |    |                 /.local/<empty>
                           |    /ubuntu_groovy/Downloads[1]
                           |                  /Videos[2]
                           |                  /.local/<empty>
                           /[11]local/linux-x86_64[5]/bin[6]
                           |                         /lib[7]
                           /local/linux-armhf[5]/bin[8]
                                                /lib[9]

/etc/auto.master.d/user_data.autofs(서비스-단말기)

/media/user_data/unix/  /etc/auto.AD.EXAMPLE.COM.unix       --ghost --timeout=120

/etc/auto.AD.EXAMPLE.COM.unix(ugo에 대해 설정된 서버 측, 실행 가능 및 읽기 비트)

#!/bin/bash

key=$1

echo '- /home   -fstype=bind            :/media/zfs/home/'$key'/unix/ browse \'
for i in $(ls /media/zfs/home/$key/unix) 
do
    for j in $(ls /media/zfs/home/$key/XDG_DIRS)
    do
        echo '  /home/'$i'/'$j' -fstype=bind            :/media/zfs/home/'$key'/XDG_DIRS/'$j' browse \'
    done
done

for i in $(ls /media/zfs/home/$key/usr) 
do
    echo '  /local/'$i' -fstype=bind            :/media/zfs/home/'$key'/local/ browse \'
    for j in $(ls /media/zfs/home/$key/usr/$i)
    do
        echo '  /local/'$i'/'$j'    -fstype=bind            :/media/zfs/home/'$key'/usr/'$i'/'$j' browse \'
    done
done
echo ''

다음은 위에 표시된 스크립트의 샘플 출력입니다.

root@server:~# /etc/auto.AD.EXAMPLE.COM.unix user1
-   /home   -fstype=bind            :/media/zfs/home/user1/unix/ browse \
    /home/debian_buster/Downloads   -fstype=bind            :/media/zfs/home/user1/XDG_DIRS/Downloads browse \
    /home/debian_buster/Videos  -fstype=bind            :/media/zfs/home/user1/XDG_DIRS/Videos browse \
    /local/linux-armhf  -fstype=bind            :/media/zfs/home/user1/local/ browse \
    /local/linux-armhf/bin  -fstype=bind            :/media/zfs/home/user1/usr/linux-armhf/bin browse \
    /local/linux-armhf/lib  -fstype=bind            :/media/zfs/home/user1/usr/linux-armhf/lib browse \
    /local/linux-armhf/sbin -fstype=bind            :/media/zfs/home/user1/usr/linux-armhf/sbin browse \
    /local/linux-x86_64 -fstype=bind            :/media/zfs/home/user1/local/ browse \
    /local/linux-x86_64/bin -fstype=bind            :/media/zfs/home/user1/usr/linux-x86_64/bin browse \
    /local/linux-x86_64/lib -fstype=bind            :/media/zfs/home/user1/usr/linux-x86_64/lib browse \

root@server:~# 

나에게는 약간 느리긴 하지만 지금까지는 완벽하게 작동합니다. /media/user_data/unix다음 내보내기 파일을 사용하여 NFS를 통해 내보냈습니다 .

# <other exports of unrelated directories>
/media/user_data    *(sec=krb5p,rw,crossmnt)
# <other exports of unrelated directories>

이 시점에서 이 파일 계층 구조에 "user_data" 단계가 존재하는 한 가지 이유는 내보낼 때 /media/user_data/unix( /etc/exportfs또는 /media/unix아래에 설명되지 않았지만 이에 상응하는 경우) 아래 경고가 표시되기 때문이라는 점을 언급할 가치가 있습니다. 이는 고무적이지는 않지만 내보내는 계층에 설치된 것을 내보내기 user data위해 어쨌든 계층에서 이 추가 레이어를 사용하려고 노력할 것입니다 . crossmnt시스템은 이 시도에 대해 불평하지 않는 것 같습니다.

root@server:~# cat /etc/exports
# Other exports of unrelated directories
/media/user_data    *(sec=krb5p,rw,crossmnt)
/media/user_data/unix   *(sec=krb5p,rw,crossmnt)
# More unrelated exports

root@server:~# exportfs -ra; zfs share -a
exportfs: /etc/exports [5]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/media/user_data".
  Assuming default behaviour ('no_subtree_check').
  NOTE: this default has changed since nfs-utils version 1.0.x

exportfs: /media/user_data/unix does not support NFS export
root@server:~# showmount -e
Export list for server:
/media/user_data      *
/media/user_data/unix *
# <nfs exports of unrelated zfs datasets>
root@server:~# 

아래 텍스트에서는 NFS 서버가 NFS 내보내기를 지원하지 않는 디렉터리에 대해 불평하지 않도록 내보내기 /media/user_data/unix를 제거 /etc/exports하고 실행했습니다 . 마지막으로 터미널 시스템의 autofs는 실행 중인 배포판 및 버전에 해당하는 홈 디렉터리와 운영 체제 및 아키텍처에 해당하는 하위 디렉터리만 마운트하면 되므로 Linux Debian Buster x86_64의 user1에 대한 계층 구조는 다음과 같습니다.exportfs -razfs share -alocal

/home/AD.EXAMPLE.COM/user1[10]/Downloads
                              /Videos
                              /.local[11]

다음 autofs 구성을 사용하여 이를 달성하려고 했습니다.

/etc/auto.master.d/home.autofs(터미널, Linux Debian Buster, x86_64)

/media/AD.EXAMPLE.COM  /etc/auto.AD.EXAMPLE.COM.home    --timeout=120

/etc/auto.AD.EXAMPLE.COM.home(터미널, Linux Debian Buster, x86_64, ugo용으로 설정된 실행 및 읽기 비트)

#!/bin/bash

key=$1

distributor()
{
    lsb_release -i | cut -f 2 -d : | xargs echo | tr '[:upper:]' '[:lower:]'
}

codename()
{
    lsb_release -c | cut -f 2 -d : | xargs echo | tr '[:upper:]' '[:lower:]'
}

architecture()
{
    uname -m | tr '[:upper:]' '[:lower:]'
}

os()
{
    uname -s | tr '[:upper:]' '[:lower:]'
}

echo '- /   -fstype=nfs,vers=4.2,sec=krb5p,fsc  server.example.com:/media/user_data/unix/'$key'/home/'$(distributor)'_'$(codename)' \'
echo '  /.local -fstype=nfs,vers=4.2,sec=krb5p,fsc  server.example.com:/media/user_data/local/'$key'/local/'$(os)'-'$(architecture)' \'
echo ''

다음은 위 스크립트의 샘플 출력입니다.

root@terminal:~$ /etc/auto.AD.EXAMPLE.COM.exp user1
-   /   -fstype=nfs,vers=4.2,sec=krb5p,fsc  server.example.com:/media/user_data/unix/user1/home/debian_buster \
    /.local -fstype=nfs,vers=4.2,sec=krb5p,fsc  server.example.com:/media/user_data/local/user1/local/linux-x86_64 \

root@terminal:~$ 

질문

터미널 컴퓨터의 autofs는 서버에서 내보낸 재구성된 홈 디렉터리를 탑재할 수 없습니다. 다음은 목록을 나열하려고 할 때 자동 마운트에서 얻은 추적입니다 /home/AD.EXAMPLE.COM/user1.

root@terminal:~# automount -d -f -v 
... <lots of output>
get_nfs_info: called with host server.example.com(192.168.80.101) proto 17 version 0x30
get_nfs_info: nfs v3 rpc ping time: 0.000000
get_nfs_info: host server.example.com cost 0 weight 0
prune_host_list: selected subset of hosts that support NFS3 over TCP
mount_mount: mount(nfs): calling mkdir_path /media/AD.EXAMPLE.COM/user1
mount_mount: mount(nfs): calling mount -t nfs -s -o vers=4.2,sec=krb5p,fsc server.example.com:/media/user_data/unix/user1/home/debian_buster /media/AD.EXAMPLE.COM/user1
>> mount.nfs: mounting server.example.com:/media/user_data/unix/user1/home/debian_buster failed, reason given by server: No such file or directory
mount(nfs): nfs: mount failure server.example.com:/media/user_data/unix/user1/home/debian_buster on /media/AD.EXAMPLE.COM/user1
do_mount_autofs_offset: mount offset /media/AD.EXAMPLE.COM/user1/.local at /media/AD.EXAMPLE.COM/user1
mount_autofs_offset: calling mount -t autofs -s  -o fd=16,pgrp=20379,minproto=5,maxproto=5,offset automount /media/AD.EXAMPLE.COM/user1/.local
mounted offset on /media/AD.EXAMPLE.COM/user1/.local with timeout 120, freq 30 seconds
mount_autofs_offset: mounted trigger /media/AD.EXAMPLE.COM/user1/.local at /media/AD.EXAMPLE.COM/user1/.local
dev_ioctl_send_ready: token = 114
mounted /media/AD.EXAMPLE.COM/user1

아무것도 나열되어 있지 않습니다 /home/AD.EXAMPLE.COM/user1.

root@terminal:~$ ls /home/AD.EXAMPLE.COM/user1
root@terminal:~$ 

서버의 소위 마운트 디렉터리가 파일로 가득 차 있음에도 불구하고:

root@server:~# ls /media/user_data/unix/user1/home/debian_buster
 file1   file2   file3
root@server:~# 

위의 자동 마운트 추적은 내가 마운트하려는 디렉토리가 서버에 존재하지 않는다는 것을 의미하지만 이상합니다. 첫째, 서버에서 정확한 디렉토리를 나열하려고 하면 디렉토리가 존재한다는 것을 표시하고(위 참조) 어쨌든 이 디렉터리를 마운트할 수 있습니다. 터미널에서 다음과 같이 수동으로 마운트하세요.

root@terminal:~$ mount -vvvv -t nfs server.example.com:/media/user_data/unix/user1/home/debian_buster /mnt
mount.nfs: timeout set for Sat Feb 13 22:37:06 2021
mount.nfs: trying text-based options 'vers=4.2,addr=192.168.80.101,clientaddr=192.168.104.1'
mount.nfs: mount(2): No such file or directory
mount.nfs: trying text-based options 'addr=192.168.80.101'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.80.101 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.80.101 prog 100005 vers 3 prot UDP port 39874
root@terminal:~$ ls /mnt
 file1   file2   file3
root@terminal:~$ 

해결책에 대한 나의 시도

터미널의 autofs가 아직 서버에 설치되지 않았기 때문에 설치할 디렉터리를 찾지 못할 수도 있다고 생각하여 --ghost및 옵션을 사용해 보았지만 ( browser위에 표시된 서버 /etc/auto.master.d/media.autofs및 파일에서 볼 수 있습니다 /etc/auto.AD.EXAMPLE.COM.unix) 그것은 작동하지 않았습니다. 영구적인 해결책을 탐색하고 찾을 수 있는 옵션이 부족합니다.

임시 해결 방법

현재 사용 중인 임시 해결 방법은 서버 측에서 autofs를 사용하는 것이 아니라 모든 디렉터리를 수동으로 바인딩하여 내보낼 올바른 파일 계층 구조를 가져오는 것입니다. 영구적으로 활성화하려면 많은 설치가 필요하고 서버를 불안정한 상태로 두는 것처럼 보이기 때문에 이 솔루션이 별로 만족스럽지 않습니다. 비록 이유는 정확히 모르겠지만요.

논평

  • 내 테스트에서는 서버와 터미널 모두 Debian Buster(Linux x86_64)를 실행하고 있었고 위의 추적을 생성했습니다.
  • NFS는 autofs-reconstitutioned 디렉토리가 NFS 내보내기를 지원하지 않는다고 불평합니다. 이는 상위 디렉토리를 비밀리에 내보내서 전혀 내보내려고 시도해서는 안 된다는 것을 의미합니다. autofs가 마운트된 하위 디렉토리가 있는 디렉토리를 NFS로 내보낼 수 없다는 내용의 참조를 찾을 수 없으므로 시도해 볼 가치가 있습니다. 또한 mount --bindautofs를 사용하는 대신 서버 측에서 이러한 하위 디렉터리를 수동으로 설정하면 제대로 작동하므로 약간의 희망이 있을 것입니다.
  • 이것은 다소 복잡하고 깨지기 쉬운 설정입니다. 동일한 기능을 달성하기 위한 더 간단하고 더 강력한 제안이 있다면 저도 관심이 있을 것입니다. :)

답변1

기본적으로 클라이언트가 NFSv4를 먼저 시도하는 것 같습니다. 수동으로 설치하면 NFSv3으로 대체됩니다. Autofs는 첫 번째 실패를 포기할 가능성이 높습니다.

NFSv3을 먼저 사용하도록 기본 클라이언트 동작을 조정할 수도 있습니다.

관련 정보