전제는 다음과 같습니다
.NFSv4Centos7에서만 구성되고 잘 실행되는 서버, 다음과 같이 내보냄(샌드박스 환경이므로 보안 문제 없음):
server> cat /etc/exports
/export/dcs *(sec=sys,rw,no_root_squash,sync,no_subtree_check)
server> cat /proc/fs/nfsd/versions
-2 -3 +4 +4.1 +4.2
server>
NFSv4 서버와 구성된 공유가 MacOS(Monterey) 및 원격 Docker 컨테이너(Centos7 아래)에서 마운트할 수 있기 때문에 제대로 작동한다는 것을 알고 있습니다.
문제:
그러나 특정 시스템(또한 Centos 7)에서 설치 후 nfs-utils
동일한 공유를 마운트할 수 없습니다.
bash# rpm -qa | grep nfs-utils
nfs-utils-1.3.0-0.65.el7.i686
bash#
bash# mkdir -p /mnt/nfs
bash#
bash# mount.nfs4 10.1.2.3:/export/dsc /mnt/nfs
mount.nfs4: Protocol not supported
bash#
A) 클라이언트에서 tcp 및 udp nfs 포트(2049)에 액세스할 수 있다는 것을 알고 있습니다. netcat
B로 확인했습니다. s-tracing할 때 mount.nfs4
다음 오류가 표시됩니다.
bash# strace mount.nfs4 10.1.2.3:/export/dsc /mnt/nfs
...
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("10.1.2.3")}, 16) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(57709), sin_addr=inet_addr("10.4.5.6")}, [16]) = 0
close(3) = 0
mount("10.1.2.3:/export/dsc", "/mnt/nfs", "nfs4", 0, "vers=4.1,addr=10.1.2.3,client"...) = -1 EPROTONOSUPPORT (Protocol not supported)
...
mount()
call( EPROTONOSUPPORT
)에 의해 반환된 오류는 일부 로컬/클라이언트 검사와 관련이 있습니다. 왜냐하면 tcpdump
서버에서 실행할 때 클라이언트 시스템이 mount
작업 중에 어떤 패킷도 보내지 않는다는 것을 관찰했기 때문입니다.
설치도 시도했지만 LIBMOUNT_DEBUG=0xffff mount.nfs4 -vvv 10.1.2.3:/export/dsc /mnt/nfs
명백한 실패는 표시되지 않았습니다.
bash# LIBMOUNT_DEBUG=0xffff mount.nfs4 -vvv 10.1.2.3:/export/dsc /mnt/nfs
5733: libmount: INIT: library debug mask: 0xffff
5733: libmount: INIT: library version: 2.23.0
5733: libmount: INIT: feature: selinux
5733: libmount: INIT: feature: debug
5733: libmount: INIT: feature: assert
5733: libmount: CXT: [0x576b2008]: ----> allocate
5733: libmount: UTILS: mtab: /etc/mtab
5733: libmount: UTILS: /etc/mtab: irregular/non-writable
5733: libmount: UTILS: utab: /run/mount/utab
5733: libmount: UTILS: try write /run/mount/utab dir: /run/mount
5733: libmount: UTILS: access OK [/run/mount]
5733: libmount: CXT: [0x576b2008]: enabling flag 0020
5733: libmount: CXT: [0x576b2008]: enabling flag 2000000
5733: libmount: CXT: [0x576b2008]: initialized for [u]mount.<type> helper [rc=0]
5733: libmount: CXT: [0x576b2008]: enabling flag 0010
5733: libmount: CXT: [0x576b2008]: enabling flag 0010
5733: libmount: CXT: [0x576b2008]: enabling flag 0010
5733: libmount: CACHE: [0x576b2158]: alloc
5733: libmount: CACHE: [0x576b2158]: add entry [ 1] (path): /mnt/nfs: /mnt/nfs
5733: libmount: CXT: [0x576b2008]: use default optmode
5733: libmount: CXT: [0x576b2008]: OPTSMODE: ignore=0, append=0, prepend=1, replace=0, force=0, fstab=1, mtab=1
5733: libmount: CXT: [0x576b2008]: fstab not required -- skip
5733: libmount: CXT: [0x576b2008]: mount: preparing
5733: libmount: CXT: [0x576b2008]: OPTSMODE: ignore=0, append=0, prepend=1, replace=0, force=0, fstab=1, mtab=1
5733: libmount: CXT: [0x576b2008]: fstab not required -- skip
5733: libmount: CXT: [0x576b2008]: merging mount flags
5733: libmount: CXT: [0x576b2008]: final flags: VFS=00000000 user=00000000
5733: libmount: CXT: [0x576b2008]: mount: evaluating permissions
5733: libmount: CXT: [0x576b2008]: mount: fixing optstr
5733: libmount: CXT: [0x576b2008]: mount: fixing vfs optstr
5733: libmount: CXT: applying 0x00000000 flags to '(null)'
5733: libmount: CXT: new optstr 'rw'
5733: libmount: CXT: [0x576b2008]: mount: fixing user optstr
5733: libmount: CXT: applying 0x00000000 flags to '(null)'
5733: libmount: CXT: new optstr '(null)'
5733: libmount: CXT: [0x576b2008]: fixed options [rc=0]: vfs: 'rw' fs: '(null)' user: '(null)', optstr: 'rw'
5733: libmount: CXT: [0x576b2008]: preparing source path
5733: libmount: CXT: [0x576b2008]: preparing target path
5733: libmount: CXT: [0x576b2008]: final target '/mnt/nfs'
5733: libmount: CXT: [0x576b2008]: FS type: nfs4 [rc=0]
mount.nfs4: timeout set for Tue Apr 18 11:20:16 2023
mount.nfs4: trying text-based options 'vers=4.1,addr=10.1.2.3,clientaddr=10.4.5.6'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: trying text-based options 'vers=4.0,addr=10.1.2.3,clientaddr=10.4.5.6'
mount.nfs4: mount(2): Protocol not supported
mount.nfs4: Protocol not supported
5733: libmount: CXT: [0x576b2008]: syscall status set to: -1
5733: libmount: CXT: [0x576b2008]: prepare update
5733: libmount: CXT: [0x576b2008]: skip update: syscall failed [status=-1]
5733: libmount: CXT: [0x576b2008]: don't update: no update prepared
5733: libmount: CXT: [0x576b2008]: <---- reset [status=0] ---->
5733: libmount: CXT: [0x576b2008]: tabfiler disabled
5733: libmount: CACHE: [0x576b2158]: free
5733: libmount: CXT: [0x576b2008]: <---- free
bash#
클라이언트에서 이 오류가 발생하는 이유는 무엇입니까(프로토콜 버전 협상의 결과가 아님을 알고 있음)? 그리고 이 문제를 어떻게 더 해결할 수 있을까요?
UPD, 추가 디버깅 정보(@aviro의 요청대로):
mount.nfs4
다음은 실행 중에 수집된 rpcdebug입니다.
Apr 24 14:52:52 nfsclient kernel: [13064.997882] NFS: nfs mount opts='vers=4.1,addr=10.1.2.3,clientaddr=10.4.5.6'
Apr 24 14:52:52 nfsclient kernel: [13064.997884] NFS: parsing nfs mount option 'vers=4.1'
Apr 24 14:52:52 nfsclient kernel: [13064.997890] NFS: parsing nfs mount option 'addr=10.1.2.3'
Apr 24 14:52:52 nfsclient kernel: [13064.997894] NFS: parsing nfs mount option 'clientaddr=10.4.5.6'
Apr 24 14:52:52 nfsclient kernel: [13064.997897] NFS: MNTPATH: '/export/disco'
Apr 24 14:52:52 nfsclient kernel: [13065.000040] NFS: nfs mount opts='vers=4.0,addr=10.1.2.3,clientaddr=10.4.5.6'
Apr 24 14:52:52 nfsclient kernel: [13065.000042] NFS: parsing nfs mount option 'vers=4.0'
Apr 24 14:52:52 nfsclient kernel: [13065.000047] NFS: parsing nfs mount option 'addr=10.1.2.3'
Apr 24 14:52:52 nfsclient kernel: [13065.000050] NFS: parsing nfs mount option 'clientaddr=10.4.5.6'
Apr 24 14:52:52 nfsclient kernel: [13065.000053] NFS: MNTPATH: '/export/disco'
출력 strace -s1024
:
https://pastebin.ubuntu.com/p/8mMZmgR8w9/
(여기에 올리기에는 출력이 너무 커서 거기에 게시했습니다)
추신. 업그레이드 RPM을 제공하지 마세요 nfs-utils
. 다른 부팅(Docker 환경)에서는 동일한 RPM이 제대로 작동하며 이는 제 통제 범위를 벗어납니다.