질문

질문

업데이트: 5(20171209)

업데이트: 5(20171210)

  • mount -t nfs4 [SERVER IP]:/archlinux /mnt일하다.
  • ss -ntp | grep 2049클라이언트는 systemd가 시작되기 전에 서버에 대한 연결을 설정합니다.
  • NSF4 ID 매퍼는 Kerberos에서만 작동합니까?

질문

디스크 없는 노드/워크스테이션/시스템을 설정하려고 합니다. 운영 체제(4.13.12-1-ARCH)가 서버에 설치되어 있습니다 /srv/archlinux. ~ 후에GRUB 네트워크에서 NFSv4로 성공적으로 부팅되었습니다., systemd가 시작되지만 여러 단계에서 실패합니다. 예:

  • 커널 프로필 시스템을 마운트할 수 없습니다.
  • 커널 디버그 파일 시스템을 마운트할 수 없습니다.
  • 대형 페이지 파일 시스템을 마운트하지 못했습니다.
  • 무작위 시드 로드/저장을 시작할 수 없습니다.
  • /tmp를 마운트할 수 없습니다.
  • 저널 카탈로그 재구축을 시작할 수 없습니다.
  • 다음으로 끝납니다Not tainted 4.13.12-1-ARCH #1...

또는,

  • POSIX 메시지 큐 파일 시스템을 마운트할 수 없습니다.
  • 루트 및 커널 파일 시스템을 다시 마운트하여 부팅할 수 없습니다.
  • hugepage 파일 시스템을 마운트할 수 없습니다.
  • 커널 디버그 파일 시스템을 마운트할 수 없습니다.
  • 커널 프로필 시스템을 마운트할 수 없습니다.
  • 다음으로 끝납니다Not tainted 4.13.12-1-ARCH #1...

NFSv4 또는 잘못된 로컬 네트워크 구성으로 인해 오류가 발생한 것으로 의심됩니다.

rpc.idmapd

/etc/idmapd.conf
  [General]
  Verbosity = 7
  Pipefs-Directory = /var/lib/nfs/rpc_pipefs
  Domain = localdomain
  [Mapping]
  Nobody-User = nobody
  Nobody-Group = nobody
  [Translation]
  Method = nnswitch

/etc/exports
(printed using # exportfs -v)
  /srv            <world>(rw,sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys,no_root_squash,no_all_squash)
  /srv/archlinux  <world>(rw,sync,wdelay,hide,no_subtree_check,sec=sys,no_root_squash,no_all_squash)

(Exposed to "world" for debugging purposes)

rpc.idmapd -fvvv시작하는 동안 단독으로 실행하면 tty다음이 기록됩니다.

rpc.idmapd: libnfsidmap: using domain: localdomain
rpc.idmapd: libnfsidmap: Realms list: 'LOCALDOMAIN'
rpc.idmapd: libnfsidmap: processing 'Method' list
rpc.idmapd: libnfsidmap: loaded plugin /usr/lib/libnfsidmap/nsswitch.so for method nsswitch
rpc.idmapd: Expiration time is 600 seconds.
rpc.idmapd: Opened /proc/net/rpc/nfs4.nametoid/channel
rpc.idmapd: Opened /proc/net/rpc/nfs4.idtoname/channel
rpc.idmapd: nfsdcb: authbuf=* authtype=user
rpc.idmapd: nfs4_uid_to_name: calling nsswitch->uid_to_name
rpc.idmapd: nfs4_uid_to_name: nsswitch->uid_to_name returned 0
rpc.idmapd: nfs4_uid_to_name: final return value is 0
rpc.idmapd: Server : (user) id "0" -> name "root@localdomain"

그렇다면 exportfs sec=sys다음과 같이 계속하십시오.

rpc.idmapd: nfsdch: authbuf=* authtype=user
rpc.idmapd: nfs4_name_to_uid: calling nsswitch->name_to_uid
rpc.idmapd: nss_getpwnam: name '0' domain 'localdomain': resulting localname '(null)'
rpc.idmapd: nss_getpwnam: name '0' does not map into domain 'localdomain'
rpc.idmapd: nfs4_name_to_uid: nsswitch->name_to_uid returned -22
rpc.idmapd: nfs4_name_to_uid: final return value is -22
rpc.idmapd: Server : (user) name "0" -> id "99"
(stops here)

/etc/hostname+(20171209) 클라이언트가 client2(duh) 로 설정되어 있는지 확인하세요 .exportfs sec=none 또는 sec=sys, 이는 다음과 같이 계속됩니다.

rpc.idmapd: nfsdch: authbuf=* authtype=group
rpc.idmapd: nfs4_gid_to_name: calling nsswitch->gid_to_name
rpc.idmapd: nfs4_gid_to_name: nsswitch->gid_to_name returned 0
rpc.idmapd: nfs4_gid_to_name: final return value is 0
rpc.idmapd: Server : (group) id "190" -> name "systemd-journal@localdomain"
rpc.idmapd: nfsdch: authbuf=* authtype=user
rpc.idmapd: nfs4_name_to_uid: calling nsswitch->name_to_uid
rpc.idmapd: nss_getpwnam: name '0' domain 'localdomain': resulting localname '(null)'
rpc.idmapd: nss_getpwnam: name '0' does not map into domain 'localdomain'
rpc.idmapd: nfs4_name_to_uid: nsswitch->name_to_uid returned -22
rpc.idmapd: nfs4_name_to_uid: final return value is -22
rpc.idmapd: Server : (user) name "0" -> id "99"
(stops here)

방법 nsswitch을 에서 static(NFS의 UID 매핑)

/etc/idmapd.conf
  ...
  [Translation]
  Method = static
  [Static]
  root@localdomain = root

rpc.idmapd -fvvvtty다음은 시작하는 동안 별도로 기록 됩니다.

rpc.idmapd: libnfsidmap: using domain: localdomain
rpc.idmapd: libnfsidmap: Realms list: 'LOCALDOMAIN'
rpc.idmapd: libnfsidmap: processing 'Method' list
rpc.idmapd: static_getpwnam: name 'root@localdomain' mapped to 'root'
rpc.idmapd: static_getpwnam: group 'root@localdomain' mapped to ' root'
rpc.idmapd: libnfsidmap: loaded plugin /usr/lib/libnfsidmap/static.so for method static
rpc.idmapd: Expiration time is 600 seconds.
rpc.idmapd: Opened /proc/net/rpc/nfs4.nametoid/channel
rpc.idmapd: Opened /proc/net/rpc/nfs4.idtoname/channel
rpc.idmapd: nfsdcb: authbuf=* authtype=user
rpc.idmapd: nfs4_uid_to_name: calling static->uid_to_name
rpc.idmapd: nfs4_uid_to_name: static->uid_to_name returned 0
rpc.idmapd: nfs4_uid_to_name: final return value is 0
rpc.idmapd: Server : (user) id "0" -> name "root@localdomain"

그렇다면 exportfs sec=sys다음과 같이 계속하십시오.

rpc.idmapd: nfsdch: authbuf=* authtype=user
rpc.idmapd: nfs4_name_to_uid: calling static->name_to_uid
rpc.idmapd: nfs4_name_to_uid: static->name_to_uid returned -2
rpc.idmapd: nfs4_name_to_uid: final return value is -2
rpc.idmapd: Server : (user) name "0" -> id "99"
(stops here)

그렇다면 exportfs sec=none다음과 같이 계속하십시오.

rpc.idmapd: nfsdch: authbuf=* authtype=group
rpc.idmapd: nfs4_gid_to_name: calling static->gid_to_name
rpc.idmapd: nfs4_gid_to_name: static->gid_to_name returned -2
rpc.idmapd: nfs4_gid_to_name: final return value is -2
rpc.idmapd: Server : (group) id "190" -> name "nobody"
rpc.idmapd: nfsdch: authbuf=* authtype=user
rpc.idmapd: nfs4_name_to_uid: calling static->name_to_uid
rpc.idmapd: nfs4_name_to_uid: static->name_to_uid returned -2
rpc.idmapd: nfs4_name_to_uid: final return value is -2
rpc.idmapd: Server : (user) name "0" -> id "99"
(stops here)

사용자 ID 매핑에 대한 비슷한 질문:

문제 해결

  • 방화벽 없음
  • Kerberos, LDAP 등이 없습니다.
  • SELinux 없음
  • 이 사용자는 rootSERVER와 CLIENT 모두에 존재하며 동일한 비밀번호를 가지고 있습니다.

섬기는 사람

서버에서 NFSv4에 대한 다른 모든 관련 구성 파일을 식별할 수 있습니다.

/etc/nsswitch.conf
  passwd: compat mymachines systemd
  group: compat mymachines systemd
  shadow: compat
  publickey: files
  hosts: files mymachines resolve [!UNAVAIL=return] dns myhostname
  networks: files
  protocols: files
  services: files
  ethers: files
  rpc: files
  netgroup: files

/etc/nfs.conf
  (all settings commented out)
/etc/conf.d/nfs-common.conf
  (all settings commented out)

네트워크 구성

SERVER 호스트 이름은 server이고 3개의 네트워크 장치(nd[1-3])가 있습니다. 게이트웨이 default via 192.168.0.1 nd1.

/etc/hosts
  127.0.0.1      localhost.localdomain  localhost
  ::1            ip6.localhost          localhost
  192.168.0.101  nd1.localdomain        server servernd1
  192.168.1.101  nd2.localdomain        server servernd2
  192.168.2.101  nd3.localdomain        server servernd2
  192.168.1.102  client1.localdomain    client1
  192.168.2.102  client2.localdomain    client2

/etc/resolveconf.conf
  name_servers=192.168.0.1

# hostname -f
# nd1.localdomain

# hostname -i
192.168.0.101 192.168.1.101 192.168.2.101

# getent hosts IP -> the corresponding line in /etc/hosts
# getent ahosts HOSTNAME -> the corresponding line in /etc/hosts

# ping -c 3 server.localdomain -> 0% packet loss

# id -u root -> 0
# id -un 0 -> root

Display the system's effective NFSv4 domain name on stdout.
# nfsidmap -d -> localdomain

Display on stdout all keys currently in the keyring used to cache ID mapping results. These keys are visible only to the superuser.
# nfsidmap -l -> nfsidmap: '.id_resolver' keyring was not found.

고객

/etc/hostname +(20171209)
  client2
/etc/hosts
  (exactly the same as the hosts file on the server)
/etc/resolveconf.conf
  name_servers=192.168.0.1
/etc/idmapd.conf
  (exactly the same as the idmapd.conf file on the server)
/etc/fstab
  # sys=sec or sys=none to correspond to server export settings. 
  /dev/nfs  /  nfs  rw,hard,rsize=9151,sec=sys,clientaddr=192.168.2.102  0  0
  devtmpfs  /dev   devtmpfs  defaults
  proc      /proc  proc      defaults
  none      /run   tmpfs     defaults
  sys       /sys   sysfs     defaults
  run       /run   tmpfs     defaults
  tmp       /tmp   tmpfs     defaults

이는 fstab서버에 설치된 디렉토리를 비교하여 정의됩니다 findmnt -A.

net_nfs4

  • +(20171210) 서버 및 클라이언트의 NFS 버전cat /proc/fs/nfsd/versions -> -2 +3 +4 +4.1 +4.2
  • 서버와 클라이언트에서cat /sys/module/nfsd/parameters/nfs4_disable_idmapping -> N.
  • 서버에서 echo "options nfsd nfs4_disable_idmapping=0" > /etc/modprobe.d/nfsd.conf.
  • 클라이언트에는 파일이 /sys/module/nfs/parameters/nfs4_disable_idmapping존재하지 않으며 /sys읽기 전용이므로 수동으로 생성하는 방법을 잘 모르겠습니다.
  • 클라이언트의 +(20171210) echo "options nfs nfs4_disable_idmapping=0" > /etc/modprobe.d/nfs.conf.

클라이언트 IP는 입니다 192.168.2.102/24. CLIENT 네트워크 장치는 SERVER nd2 192.168.2.101/24(호스트 이름: servernd2)에 연결됩니다.

부팅 시 네트워크 정보:

:: running early hook [udev]
starting version 235
:: running hook [udev]
:: Triggering uevents...
:: running hook [net_nfs4]
IP-Config: eth0 hardware address [CLIENT NETWORK DEVICE MAC] mtu 1500 DHCP
hostname client2 IP-Config: eth0 guessed broadcast address 192.168.2.255
IP-Config: eth0 complete (from 192.168.0.101):
 address: 192.168.2.102     broadcast: 192.168.2.255     netmask: 255.255.255.0
 gateway: 192.168.2.101     dns0     : 192.168.0.1       dns1   : 0.0.0.0
 host   : client2
 domain : localdomain
 rootserver: 192.168.0.101 rootpath: /srv/archlinux
 filename  : /netboot/grub/i386-pc/core.0
NFS-Mount: 192.168.2.101:/archlinux
Waiting 10 seconds for device /dev/nfs ...
(systemd takes over from here)

NSFv4 오류가 발생하는 이유는 무엇입니까?

Server : (group) id "190" -> name "nobody"

NFSv4를 사용하면 상황이 달라집니다. 사용자는 사용자 이름으로 매핑되고 사용자 이름과 사용자 ID 간의 매핑은 "ID 매핑 데몬"(idmapd)이라는 프로세스에 의해 처리됩니다. 특히 NFSv4 클라이언트와 서버는 매핑이 제대로 작동하려면 동일한 도메인을 사용해야 합니다. 그렇지 않으면 요청이 익명 사용자/그룹에 매핑됩니다. --NFSv4 사용해 보기(Linux 및 Solaris) -- 2012년 3월 15일 - 13:03 / 브론토


이상적인 세계에서는 요청 클라이언트의 사용자와 그룹이 반환된 데이터에 대한 권한을 결정합니다. 우리는 이상적인 세상에 살고 있지 않습니다. 두 가지 실제 문제가 개입됩니다.

  1. 서버 파일에 대한 루트 액세스 권한이 있는 클라이언트 루트 사용자를 신뢰하지 못할 수도 있습니다.
  2. 클라이언트와 서버의 동일한 사용자 이름이 다른 숫자 ID를 가질 수 있습니다.

질문 1은 개념적으로 간단합니다. John Q. 프로그래머는 루트 액세스 권한이 있는 테스트 시스템을 얻었습니다. 이것은 결코 John Q. Programmer가 서버에서 루트가 소유한 파일을 변경할 수 있어야 한다는 의미는 아닙니다. 따라서 NFS는 uid 0(root)을 익명(nfsnobody) uid로 매핑하는 루트 압축을 제공합니다. 이 uid의 기본값은 -2(16비트 숫자로 65534)입니다. --NFS: 개요 및 함정 - Copyright (C) 2003 by Steve Litt

+(20171209)rpc.idmapd: nss_getpwnam: name '0' domain 'localdomain': resulting localname '(null)'

~에 따르면Red Hat Bugzilla에 대한 의견의 Steve Dickson - 버그 715430 보고서(2011-08-12 16:01:55 EDT)

[error] 문은 문제를 설명합니다. 로컬 컴퓨터의 DNS가 설정되지 않았거나 NULL을 반환하고 /etc/idmapd.conf의 Domain= 변수가 설정되지 않았습니다.

nss_getpwnam: name '0' does not map into domain

데비안 메일링 리스트에는,"Kerberos Secure NFSv4"에 관한 Jonas Meurer와 Christian Seiler 간의 이메일 서신(20150722)오류가 자세히 설명되어 있습니다. 내 토론 요약:

NFS 클라이언트가 보낼 때nss_getpwnam: name '8' domain 'freesources.org': resulting localname '(null)'

어떤 경우에는 NFS 클라이언트가 올바르게 변환된 NFS 사용자 이름을 보내는 대신 문자열로 변환된 uid만 보내는 경우가 있는데, 이는 서버에서 거부됩니다.

클라이언트가 보내야 할 것nss_getpwnam: name '[email protected]' domain 'freesources.org': resulting localname 'mail'

여기에서 NFS 클라이언트 전송의 소유자 이름이 "[이메일 보호됨]'('8'이 아님)이므로 @가 포함됩니다. nss_getpwname은 도메인 이름이 일치하는지 확인하고 이를 제거하여 /etc/passwd에서 찾아 사용자 이름 'mail'을 가져옵니다. ID(이 경우 클라이언트와 서버가 동일하므로 8)와 서버는 이에 만족합니다.

그렇다면 클라이언트가 잘못된 사용자 이름을 보내는 이유는 무엇입니까? ...가끔 idmapping이 실패하므로 커널은 숫자만 보냅니다. 그러나 이 숫자는 서버가 이를 다시 변환하지 않기 때문에 chown 명령이 실패하게 만듭니다.

짧은 대답: 모르겠습니다.

더 긴 답변:…

더 긴 답변을 올바르게 이해하면 NFS 클라이언트가 "커널의 키 캐시"에 의존하기 때문에 문제가 발생할 수 있습니다. "커널 키 캐시"가 사용되지 않기 때문에 이는 NFS 서버에서는 결코 문제가 되지 않습니다.

그럼에도 불구하고,

/etc/passwd를 통해 일반 nsswitch만 사용하고 있으므로 nss_getpwnam은안 돼요/etc/passwd에 이상한 작업을 수행하지 않는 한 실패할 것입니다.

답변에는 idmapd에 대한 대안도 언급되어 있지만, 그것이 어떻게 대체되는지 nfsidmapman잘 모르겠습니다 idmapd.

+(20171209)nss_getpwnam: name '[email protected]' does not map into domain 'localdomain'

이 오류 메시지는 나에게 발생하지 않는 것 같지만 다음의 답변을 포함했습니다.SUSE 지원 기술 자료 -- 2013년 12월 10일 최종 수정 날짜: 2017년 10월 12일 --원인에 대한 설명과 제안된 해결 방법이 다른 결과에 대한 논의와 뚜렷하게 대조되기 때문입니다.

NFSv4는 NFSv3과 다르게 사용자 ID를 처리합니다. v3에서 nfs 클라이언트는 chown(및 기타 요청)에서 UID 번호만 전달하면 되며 nfs 서버는 해당 값을 허용합니다(nfs 서버가 해당 UID 번호를 가진 계정을 모르는 경우에도 마찬가지입니다). 그러나 v4는 @ 형식으로 ID를 전달하도록 설계되었습니다. 올바른 작동을 위해서는 일반적으로 클라이언트와 서버 모두에서 idmapd(id 매핑 데몬)가 활성화되고 각 서버가 자신을 동일한 ID 매핑 도메인의 일부로 볼 수 있어야 합니다.

위에 설명된 것과 유사한 Chown 오류 또는 idmapd 오류는 일반적으로 다음으로 인해 발생합니다.

  1. 사용자 이름은 클라이언트에는 알려져 있지만 서버에는 알려지지 않았습니다.
  2. idmapd 도메인 이름은 클라이언트와 서버에서 다르게 설정됩니다.

따라서 이 문제는 nfs 서버와 클라이언트가 동일한 idmapd 도메인 이름(/etc/idmapd.conf)으로 구성되고 둘 다 관련 사용자 이름/계정을 알고 있는지 확인하여 해결할 수 있습니다.

그러나 양 당사자가 사용자 계정에 대해 동일한 지식을 갖고 있는지 확인하는 것은 종종 불편한데, 특히 NFS 서버가 파일 관리자인 경우에는 더욱 그렇습니다. NFS 커뮤니티는 NFSv4의 idmapd 기능이 더 문제가 되는 경우가 많다는 점을 인식했습니다. 따라서 NFSv3 동작이 NFSv4에서도 작동할 수 있도록 하려면 몇 가지 단계와 수정을 수행해야 합니다.

권장되는 해결 방법은 idmapd를 비활성화하는 것입니다.

nfs.nfs4_disable_idmapping=1

+(20171209) 와이어샤크

Wireshark 로그를 분석하면 매우 광범위하지만 다음과 같이 시작됩니다.

[IP CLIENT] -> [IP SERVER] NFS 226 V4 Call ACCESS FH: [HEX VALUE], [Check: RD LU MD XT DL]
[IP SERVER] -> [IP CLIENT] NFS 238 V4 Reply (Call In 34) ACCESS, [Allowed: RD LU MD XT DL]
[IP CLIENT] -> [IP SERVER] NFS 246 V4 Call LOOKUP DH: [HEX VALUE]/archlinux

그 중에서 , , , , , , , , , , , , , [A HEX VALUE]/[PATH]유사한 패턴을 볼 수 있다./sbin/usr/bin/init/lib/systemd/dev/proc/sys/run//lib64

클라이언트가 요청할 때 /Id-linux-x86-64.so.2첫 번째 오류가 나타나기 시작합니다 .

[IP CLIENT] -> [IP SERVER] NFS 342 V4 Call OPEN DH: [HEX VALUE]/Id-linux-x86-64.so.2
[SERVER IP] -> [CLIENT IP] NFS 166 V4 Reply (Call In 124) OPEN Status: NFS4ERR_SYMLINK

LOOKUP Status;이 패턴은 보고된 오류와 같은 오류가 더 자주 발생하면서 어느 정도 반복됩니다 OPEN Status:.NFS4ERR_NOENT

흥미롭게도 이는 사용자 권한이 참조되는 최초이자 유일한 위치인 로그 끝에 있습니다.

[SERVER IP] -> [CLIENT IP] NFS 182 V4 Reply (Call In 9562) SETATTR Status: NFS4ERR_BADOWNER

RFC

~에 따르면

NFS4ERR_BADOWNER(오류 코드 10039)

이 오류는 ACL 속성 값의 Owner 또는 Owner_group 속성 값이나 ACE의 who 필드를 로컬 표현으로 변환할 수 없는 경우 반환됩니다.

사양은 섹션 5.9에서 논의됩니다.소유자 및 소유자 그룹 설명, 그러나 이에 대해 무엇을 인용해야 할지 잘 모르겠습니다.

NFS4ERR_SYMLINK(오류 코드 10029)

현재 파일 핸들은 현재 작업에서 기호 링크를 대상으로 허용하지 않는 경우 기호 링크를 지정합니다.

NFS4ERR_NOENT(오류 코드 2)

이는 해당 파일이나 디렉터리가 없음을 나타냅니다. 지정된 이름으로 참조되는 파일 시스템 개체가 존재하지 않습니다.

그러나 오류는 예상됩니다 ...

현재 파일 핸들은 일반 디렉터리와 명명된 특성 디렉터리를 모두 참조하는 것으로 가정됩니다. LOOKUPP은 상위 디렉터리의 파일 핸들을 현재 파일 핸들로 지정합니다. 상위 디렉토리가 없으면 NFS4ERR_NOENT 오류가 반환되어야 합니다. 따라서 현재 파일 핸들이 서버 파일 트리의 루트 또는 최상위에 있으면 서버는 NFS4ERR_NOENT를 반환합니다.

+(20171210)mount -t nfs4 [SERVER IP]:/archlinux /mnt

클라이언트 시스템에서 Archlinux "LiveUSB"를 사용하여 네트워크 드라이브를 마운트하고 SERVER 인터넷 연결을 통해 최신 커널(4.14-4-1-ARCH)을 다운로드한 다음 [SERVER IP]/archlinux.

설치 중 rpc.idmapd -fvvv성공적인 사용자 이름 매핑을 나타냅니다 . 예:

rpc.idmapd: Server : (user) id "0" -> name "root@localdomain"
rpc.idmapd: Server : (group) id "99" -> name "nobody@localdomain"
... -> name "tty@localdomain"
... -> name "systemd-journal-upload@localdomain"
... -> name rpc@localdomain
... -> name systemd-journal@localdomain
... -> name utmp@localdomain

결과 genfstab도 다릅니다.

[SERVER IP]:/archlinux  /  nfs4 rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,times=600,retrans=2,sec=sys,clientaddr=[CLIENT IP],local_lock=none,addr=[SERVER IP]  0 0

그러나 재부팅 후 systemd게시물 시작 부분에서 언급한 것과 동일한 결함으로 다시 실패했습니다.

+(20171210) 서버의 원격 디렉터리가 마운트되어 있습니까 /new_root?

스크립트 mkinitcpio는 이 변수를 사용하여 할당된 "설치 함수"를 전달합니다. 이 경우에는 이후 단계에서 함수에 전달 mount_handler될 "루트 경로"입니다 .nfs_mount_handler()$1/new_root

[SERVER IP]:/archlinux클라이언트가 에 마운트했는지 확인하려고 합니다 /new_root. 서버에서는 클라이언트가 연결을 설정했다는 것만 관찰할 수 있지만 디렉토리가 어디에 마운트되었는지는 알 수 없습니다.

showmount -a server -> All mount points on server: (empty)

ss -ntp | grep 2049 ->
ESTAB  0    0   192.168.2.101:2049  192.168.2.102:809 (random port)

+(20171210) NFS4 sec=sys와 ID 매퍼가 호환되지 않나요?

doco를 읽으면 sec=sys처럼 보이며 id 매퍼를 사용하면 클라이언트와 서버가 /etc/passwd 및 /etc/group에서 서로 다른 매핑을 갖는 이름에 uid/gid를 올바르게 매핑할 수 있습니다. 이것은 사실이 아닙니다.

sec=sys를 사용할 때 id 매퍼는 nfs 프로토콜의 인증 부분에서는 역할을 하지 않고 파일 속성 부분에서만 역할을 하기 때문입니다. sec=sys 인증을 사용하면 nfs는 서버에서 직접 사용하는 클라이언트 uid/gid만 전달합니다. 따라서 클라이언트와 서버의 uid와 gid가 일치하지 않으면 권한 확인이 실패합니다. 상황을 더욱 혼란스럽게 만드는 것은 클라이언트가 새 파일을 생성할 때 인증 자격 증명이 사용되므로 클라이언트의 uid/gid를 사용하여 서버에 파일이 생성된다는 점입니다. 그런 다음 nfs는 idmap을 사용하여 파일 속성을 가져오므로 uid/gid(원래 클라이언트에서)가 서버에 매핑되고 결국 클라이언트 uid/gid에 대한 서버 이름이 표시됩니다. 보카치! 반면, 파일이 원래 서버에서 생성된 경우 uid/gid가 달라도 클라이언트에는 올바른 이름이 표시됩니다. 그러나 권한 확인은 여전히 ​​중단됩니다. --kimmie -- 게시일: 2013년 2월 20일 수요일 오전 3:14 게시물 제목:--원래 강조

답변1

~에서커널 매개변수에 대한 커널 문서

nfs.nfs4_disable_idmapping=

[NFSv4] 기본값인 '1'로 설정된 경우, 이 옵션은 마운트가 'sec=sys' 보안 스타일을 사용하는 경우 RPC 수준 인증 체계와 NFS 수준 작업 모두 숫자 uids/gid 사용에 동의하도록 보장합니다. 실제로 idmapping을 비활성화하여 이전 NFSv2/v3 시스템에서 NFSv4로 더 쉽게 마이그레이션할 수 있습니다. 클라이언트는 이 작업 모드를 지원하지 않는 서버를 자동으로 감지하고 idmapper를 사용하도록 대체합니다. 이 동작을 끄려면 값을 "0"으로 설정하십시오.

nfsd.nfs4_disable_idmapping=

[NFSv4] 기본값 '1'로 설정되면 NFSv4 서버는 auth_sys를 사용하는 클라이언트에 숫자 uid 및 gid만 반환하고 해당 클라이언트로부터 숫자 uid 및 gid를 허용합니다. 그 목적은 NFSv2/v3에서 마이그레이션을 단순화하는 것입니다.

nfs.nfs4_disable_idmapping=1그리고nfsd.nfs4_disable_idmapping=1

서버와 클라이언트 모두에서 ID 매퍼를 비활성화하면 systemd가 사용자 로그인 프롬프트와 함께 시작되고 nfsd.nfs4_disable_idmapping=1오류는 1개만 발생합니다.nfs.nfs4_disable_idmapping=1

  • 루트 및 커널 파일 시스템을 다시 마운트하여 부팅할 수 없지만 후크를 추가하면 이 modconf문제가 해결되었습니다 mkinitcpio. block keyboard다른 명백한 문제도 해결해 보십시오.
  • 노트북 키보드가 더 이상 작동하지 않습니다 ...

메시지가 출력되지 않습니다 rpc.idmapd -fvvv.

외부 USB 키보드를 사용하여 루트로 로그인하고 파일을 읽고 만들 수 있습니다. 광범위한 테스트를 수행하지 않았으므로 이 솔루션에 여전히 문제가 있을 수 있습니다.

nfs.nfs4_disable_idmapping=0그리고nfsd.nfs4_disable_idmapping=0

echo "options nfs nfs4_disable_idmapping=0" >> /etc/modprobe.d/nfs.conf(또는 cat /sys/module/nfsd/parameters/nfs4_disable_idmapping -> N)은 CLIENT에 아무런 영향을 미치지 않는 것 같습니다 .

CLIENT ID 매퍼는 nfs.nfs4_disable_idmapping=0부팅(GRUB) 중에 커널에 매개변수를 명시적으로 전달할 때까지 비활성화됩니다.

불만 사항이 출력되지 않았습니다 rpc.idmapd -fvvv. 반면에 첫 번째 것을 만든 후에는 다른 것이 인쇄되지 않았습니다 rpc.idmapd: Server : (user) id "0" -> name "root@localdomain"...

그러나 Wireshark 로그는 더 이상 기록되지 않습니다 NFS4ERR_BADOWNER.

여전히 모든 시스템 시작 오류가 지속됩니다 ...

  • POSIX 메시지 큐 파일 시스템을 마운트할 수 없습니다.
  • 루트 및 커널 파일 시스템을 다시 마운트하여 부팅할 수 없습니다.
  • hugepage 파일 시스템을 마운트할 수 없습니다.
  • 커널 디버그 파일 시스템을 마운트할 수 없습니다.
  • 커널 프로필 시스템을 마운트할 수 없습니다.
  • 그런 다음 Not tainted 4.13.12-1-ARCH #1로 끝납니다...

결론적으로

nfs.nfs4_disable_idmapping=0그리고nfsd.nfs4_disable_idmapping=0

Kerberos 설정 및 문제 해결 외에 다음에 무엇을 시도해야 할지 모르겠습니다. 여전히 rpc.idmapd올바른 권한을 매핑할 수 없는 것 같지만 rpc.idmapd -fvvv더 이상 오류가 출력되지 않습니다...? 무엇을 해야 할까요? 시작 오류는 다른 원인으로 인해 발생할 수 있습니다...모르겠어요...

nfs.nfs4_disable_idmapping=1그리고nfsd.nfs4_disable_idmapping=1

효과적이긴 하지만 이 접근 방식은 잘못된 것 같습니다. 마이그레이션하는 것이 아닙니다 rpc.idmapd. 지금 해야 합니다. 나중에 다시 문제가 발생할 수 있습니다.

관련 정보