파일을 읽을 수 있지만 사용자는 NFS에서 맨페이지를 읽을 수 없습니다.

파일을 읽을 수 있지만 사용자는 NFS에서 맨페이지를 읽을 수 없습니다.

NFS 설치 시 매뉴얼 페이지를 읽는 데 문제가 있습니다. 나는 그것을 다음과 같은 최소한의 예제로 분리했습니다. 매뉴얼 페이지 파일은 /data다음 경로의 NFS 마운트에 있습니다./data/program.1

파일을 콘솔에 인쇄할 수 있으므로 cat /data/program.1읽기 권한이 확실히 있습니다(관련된 디렉터리의 경우 755, 파일의 경우 644, ACL이나 고정 비트 등의 권한은 없음).

그러나 man -l /data/program.1일반적으로 작동하지 않습니다.

그러나 이상하게 도 파일이나 해당 메타데이터(예: 성공적)를 읽은 직후 짧은 시간(~30초) 동안 ls /data/program.1갑자기 man -l /data/program.1작동하는데, 이는 일부 캐싱과 관련이 있는 것처럼 보입니다. 그래도 여전히 결론이 나지 않은 것 같습니다(ls 이후에는 대부분 작동하지만 반복하고 앞뒤로 다시 작동하면 일부 시도가 작동하지 않습니다).

그러나 이상한 점은 전체 문제가 일부 클라이언트 컴퓨터에만 존재하고 동일한 NFS 서버(동일한 설치 옵션 사용)의 다른 클라이언트 컴퓨터에서는 문제가 없다는 것입니다.

"작동하지 않을 때" 출력됩니다.man: /data/program.1: Permission denied

사용하면 strace man -l /data/program.1다음과 같은 관련 줄이 표시됩니다.

stat("/data/program.1", 0x7ffe5ac9c9e0) = -1 EACCES (Permission denied)

방금 실행하면 man program(적절한 MANPATH를 사용하여) 다음이 표시됩니다.

access("/data/program.1", R_OK) = -1 EACCES (Permission denied)

그래서 호출을 완료할 수 없다고 생각했지만 access내 C 프로그램을 컴파일하여 호출하면 작동합니다(0이 인쇄됨).

#include <unistd.h>
#include <stdio.h>
int main(){
  printf("%d", access("/data/program.1", R_OK));
}

여기서 무엇이 잘못되었을 수 있습니까?

man 의 소스 코드를 봤는데 아마도 이 줄과 관련이 있을 것 같습니다(https://git.savannah.gnu.org/cgit/man-db.git/tree/src/man.c#n3746) drop_effective_privs()? 그렇지 않으면 모든 것(cat, head, 내 C 프로그램 등)이 파일에 액세스할 수 있지만 man최근에 다른 프로그램이 메타데이터를 읽지 않는 한 왜 액세스할 수 없는지 설명할 수 없습니다.

Ubuntu 18.04는 클라이언트와 서버 모두에 설치됩니다. 마운트는 다음과 같습니다.

x.x.x.x:/srv/nfs/data on /data type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=x.x.x.x,fsc,local_lock=none,addr=x.x.x.x)

답변1

Ubuntu 18.04에는 기본적으로 manNFS를 통한 파일 액세스를 포함하여 의 네트워크 액세스를 차단하는 AppArmor가 활성화되어 있습니다.

네트워크/NFS 액세스를 허용하려면 man다음을 추가하십시오 /etc/apparmor.d/local/usr.bin.man.

  # TCP/UDP network access for NFS
  network inet stream,
  network inet6 stream,
  network inet dgram,
  network inet6 dgram,

그런 다음 systemctl reload apparmor.

또는 예를 들어 apparmor=0커널 매개변수를 설정하여 AppArmor를 비활성화합니다.

관련 정보