심볼릭 링크 경로에 대한 openat 호출에서 EROFS 오류가 발생할 수 있는 이유는 무엇입니까?(가끔만 발생함)

심볼릭 링크 경로에 대한 openat 호출에서 EROFS 오류가 발생할 수 있는 이유는 무엇입니까?(가끔만 발생함)

간헐적으로(보통 서버당 한두 번만) 나타나고 사라지는 문제를 디버깅하려고 합니다. 플래그를 사용하여 잠긴 openat()파일을 열려고 하는 응용 프로그램이 있습니다 O_WRONLY|O_CREAT. 환경 구성으로 인해 이 잠금 파일은 읽기 전용 네트워크 공유에 있어야 하는 디렉터리에 있습니다. (기술적으로 이것은 AWS EFS 공유이지만 NFS 공유처럼 보입니다.)

마운트 지점은 읽기 전용이므로 애플리케이션이 잠금 파일이 있을 것으로 예상하는 경로에 심볼릭 링크를 배치합니다. 심볼릭 링크 대상은 존재하지 않는 경로 /tmp(쓰기 가능) 입니다.

# ls -l /mnt/share/files/.LOCK
lrwxrwxrwx 1 nfsnobody nfsnobody 16 Jan  1  1970 /mnt/share/files/.LOCK -> /tmp/application.LOCK
# ls -l /tmp/application.LOCK 
ls: cannot access /tmp/application.LOCK: No such file or directory

일반적으로 이것은 잘 작동합니다. 응용 프로그램이 열립니다표적링크, 파일 생성(아래 /tmp), 모두 좋습니다. 그러나 때때로 서버를 구성하고 처음으로 애플리케이션을 시작할 때 애플리케이션이 이 파일에 쓸 수 없는 경우가 있습니다. EROFS(읽기 전용 파일 시스템) 오류 로 인해 쓰기가 실패했습니다 .

나는 strace -s 1024 -y -e trace=%file -f오류와 그에 따른 성공을 실행하고 포착했습니다. 둘 사이에는 눈에 띄는 차이가 없습니다.

...
[pid 17654] openat(AT_FDCWD, "/mnt/share/files/.LOCK", O_WRONLY|O_CREAT, 0666) = -1 EROFS (Read-only file system)
...
[pid 17654] openat(AT_FDCWD, "/mnt/share/files/.LOCK", O_WRONLY|O_CREAT, 0666) = 112</tmp/application.LOCK>
...

이 테스트 전에는 /tmp/application.LOCK존재하지 않으며 그 이후에는 /tmp/application.LOCK텍스트가 포함된 일반 파일이 있습니다.test\n

echo를 실행하면 strace거의 동일한 시스템 호출이 표시되며 시도할 때마다 성공합니다.

# strace -s 1024 -y -e trace=%file -f bash -c "echo test > /mnt/share/files/.LOCK`
execve("/usr/bin/bash", ["bash", "-c", "echo test > /mnt/share/files/.LOCK"], 0x7ffc3a86df10 /* 22 vars */) = 0
...
access("/usr/bin/bash", R_OK)           = 0
openat(AT_FDCWD, "/mnt/share/files/.LOCK", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3</tmp/application.LOCK >

관련성이 있다고 의심되는 한 가지는 앱이 에서 실행되는 시스템 서비스라는 것입니다 ProtectSystem=full. PrivateTmp=yes그러나 PrivateDevices=yes이는 변경되지 않았으므로 액세스가 때때로 작동하고 실패하는 이유가 무엇인지 잘 모르겠습니다. (그렇습니다. 그뿐만 아니라 systemd가 생성한 개인 임시 디렉터리도 확인해 보았는데, 호출이 성공하면 /tmp예상대로 파일이 생성됩니다.)/tmp/systemd-private-blah/tmp/

EROFS쓰기 심볼릭 링크를 사용할 때 가끔/간헐적으로 발생하는 (읽기 전용 파일 시스템) 오류는 무엇입니까 ?openat()

답변1

at.ftpd 데몬을 통해 이런 일이 나에게 일어나고 있음을 확인할 수 있습니다. systemd.service가 DynamicUser=yes읽기 전용 으로 설정되어 FS가 발생합니다.

이를 보면 DynamicUser는 여러 가지 모드를 의미합니다. 시스템화된 동적 사용자 및 사용자

관련 정보