systemd: 읽기 전용 파일 시스템에 코어 덤프를 생성할 수 없습니다

systemd: 읽기 전용 파일 시스템에 코어 덤프를 생성할 수 없습니다

임베디드 Linux 설정을 사용하고 있습니다. 쓰기 가능한 오버레이가 있는 squashfs를 설치하고( 사용하여 overlayfs) 여기에 chroot하여 제어권을 systemd로 옮겼습니다.

코어 덤프 를 /var/log./var/lib/systemd/coredump

coredump를 요청하면 systemd-coredump호출되는데 이런 오류가 발생합니다.

Jul 30 08:54:14 evo4k-e6872f kernel: ClearApp[803]: segfault at 0 ip 000000000042bcb0 sp 00007ffcd4915f18 error 6 in ClearApp[400000+868000]
Jul 30 08:54:14 evo4k-e6872f kernel[359]: ClearApp[803]: segfault at 0 ip 000000000042bcb0 sp 00007ffcd4915f18 error 6 in ClearApp[400000+868000]
Jul 30 08:54:14 evo4k-e6872f systemd[1]: Started Process Core Dump (PID 804/UID 0).
Jul 30 08:54:14 evo4k-e6872f systemd-coredump[805]: Failed to create temporary file for coredump /var/log/coredump/core.ClearApp.0.54a13c5624ad4ed6b3>
Jul 30 08:54:14 evo4k-e6872f systemd-coredump[805]: Process 803 (ClearApp) of user 0 dumped core.
Jul 30 08:54:14 evo4k-e6872f systemd[1]: clearapp.service: Main process exited, code=dumped, status=11/SEGV
Jul 30 08:54:14 evo4k-e6872f systemd[1]: clearapp.service: Failed with result 'core-dump'.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: clearapp.service: Service hold-off time over, scheduling restart.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: clearapp.service: Scheduled restart job, restart counter is at 5.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: Stopped MedX ClearApp.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: clearapp.service: Start request repeated too quickly.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: clearapp.service: Failed with result 'core-dump'.
Jul 30 08:54:15 evo4k-e6872f systemd[1]: Failed to start MedX ClearApp.

/proc/sys/kernel/core_pattern것은 |/lib/systemd/systemd-coredump %P %u %g %s %t %c %e. core_pattern로 설정하면 /tmp/cores/core.%e.%p.%h.%t작동합니다. 따라서 이것은 확실히 체계적인 것입니다.

저는 systemd 버전 237을 사용하고 있습니다. 이는 이전에 systemd 버전 234에서 작동했습니다.

내 파일 시스템이 정확하고 깨끗합니다. 어떤 식으로든 손상되지 않았습니다( fsck깨끗하게 복원됨).

오류 없이 코어 덤프를 생성하도록 시스템화하려면 어떻게 해야 합니까?

편집 #1

systemd-coredump다른 디렉토리, 심지어 마운트된 썸 드라이브에 로그인하기 위해 다시 컴파일했는데 동일한 오류가 발생했습니다.

Jul 30 10:43:39 evo4k-e6872f systemd-coredump[1910]: Failed to create temporary file for coredump /run/media/Pauls/core.ClearApp.0.dd6557bb31264bf2b3773b534fd6e2b1.1908.1532961819000000: Read-only file system

커널이나 systemd가 단지 임시 파일을 생성하는 것 이외의 다른 작업을 수행하고 있다고 생각하기 시작했습니다.

편집 #2

나는 사용자 공간에서 만들어진 정확한 호출 시스템을 실행했고 open작동했습니다. 커널이 코어 덤퍼를 호출하는 컨텍스트가 있습니까?

이 줄을 systemd에 추가했습니다.

    fd = open(tmp, O_CREAT|O_EXCL|O_NOFOLLOW|O_NOCTTY|flags, 0640);
    if (fd < 0) {
            log_error("Couldn't open: %d: %s", fd, tmp);
            return -errno;
    }

이 출력을 얻습니다.

Couldn't open: -1: /run/media/Pauls/.#core.ClearApp.0.7833dca6d3354c0e959b366df731bf9f.879.15329633730000000f174d1155a09d96

답변1

이 질문은 GitHub(9756 화).

후손의 경우: "coredump 서비스가 실행 ProtectSystem=strictProtectHome=yes설정됩니다. 이는 StateDirectory=IE에 나열된 경로 이외의 다른 곳에 쓸 수 없음을 의미합니다 /var/lib/systemd/coredump/."

코어 덤프를 다른 위치(예: 의 하위 디렉터리 /var/log/)에 저장하는 권장 방법은 해당 디렉터리를 에 바인드 마운트하는 것입니다 /var/lib/systemd/coredump/.

관련 정보