서비스가 실패하고, 로그에는 spawn과 디렉터리가 언급되며, 첫 반응은 VPN 설정을 확인하는 것입니다. 그 파일에서는 아직 아무것도 읽히지 않았습니다. systemd는 프로세스를 준비하던 중, 실행 파일이 시작되기 전에 실패했으므로 어떤 파서도, 어떤 인증서도, 어떤 원격 호스트도 조회되지 않았습니다. 상태 코드를 OpenVPN이 아니라 systemd에 대한 진술로 읽는 것이 이 일을 짧은 조사로 만듭니다.

애플리케이션보다 먼저 상태 코드를 읽으십시오

서비스 이름 뒤의 숫자 코드는 실패한 단계를 가리킵니다. 디렉터리 실패는 CHDIR 상태로 보고되지만, 실행할 수 없었던 실행 파일은 전혀 다른 코드입니다. 둘은 요약 줄에서 비슷해 보이지만 원인에는 공통점이 없습니다.

이 구분이 중요한 이유는 수정 위치가 다른 파일에 있기 때문입니다. CHDIR 실패는 경로와 서비스가 그것을 보는 방식에 관한 것입니다. exec 실패는 바이너리, 그 인터프리터 또는 무관한 마운트에 관한 것입니다. VPN 원격, 암호 목록, 인증서 경로를 바꿔도 둘 중 어느 것도 해결되지 않습니다.

실패가 시작 시점이며 성공한 동작 이후가 아님을 확인하십시오. 어제는 동작하던 서비스가 같은 단계에서 실패한다면 디렉터리, 그 권한 또는 unit 자체가 바뀐 것이며, 그 변화가 찾아야 할 증거입니다.

unit에게 어디에 있고 싶은지 물으십시오

설치되었다고 생각하는 파일이 아니라 유효한 unit을 읽으십시오. drop-in은 기본 unit을 편집하지 않고도 작업 디렉터리를 덮어쓸 수 있기 때문이며, show 출력은 질문에 직접 답합니다.

systemctl cat [email protected]
systemctl show [email protected] -p WorkingDirectory -p RootDirectory -p User -p ProtectHome
journalctl -u [email protected] -b --no-pager | tail -30

upstream 서버 템플릿에서 작업 디렉터리는 서버 설정 디렉터리이며 인스턴스 이름이 그 안의 프로필을 선택합니다. 따라서 branch라는 인스턴스는 같은 디렉터리에서 자기 파일을 기대하고, 다른 곳에 둔 프로필은 작업 디렉터리 요구를 전혀 충족하지 못합니다.

unit이 요구하는 것과 존재하는 것을 비교하십시오. 예전에 있던 경로, 이제 다른 곳을 가리키는 심볼릭 링크, 더 이상 디렉터리와 맞지 않는 인스턴스 이름은 모두 이 실패를 만드는 평범한 변화입니다.

서비스가 보는 방식으로 경로를 확인하십시오

당신의 shell과 서비스는 파일 시스템에 대한 같은 시야를 공유하지 않습니다. 설정된 루트 디렉터리나 root image는 unit 내부에서 절대 경로의 의미를 바꾸고, 호스트에 분명히 있는 경로가 그 이름 공간에는 없을 수 있습니다. 수동 테스트를 믿기 전에 unit 설정을 읽으십시오.

권한이 문제를 악화시킵니다. 서비스는 특정 사용자로 실행되며, 그 사용자는 목표에 도달하기 위해 모든 상위 디렉터리를 통과할 수 있어야 하고 목표 자체를 읽는 것만으로는 부족합니다. root는 읽을 수 있지만 서비스 사용자는 통과할 수 없는 디렉터리는 경로가 없는 것처럼 보이는 실패를 만듭니다.

namei -l /etc/openvpn/server
systemctl show [email protected] -p ProtectSystem -p ReadOnlyPaths

하드닝 설정도 이 그림의 일부입니다. 홈 디렉터리를 숨기거나 파일 시스템의 일부를 읽기 전용으로 만드는 unit은 설정된 대로 동작하며, 작업 디렉터리는 sandbox가 여전히 노출하는 곳에 있어야 합니다.

소유자를 고치고, 다음에는 다른 오류를 예상하십시오

레이아웃이나 unit을 그 설정을 소유한 사람을 통해 수정하십시오. 프로필을 예상 디렉터리로 옮기는 것은 레이아웃이 틀렸을 때 정당한 수정이지만, 들어갈 수 없는 디렉터리를 설명하지는 않으므로 일반적인 답으로 취급하지 마십시오.

설정 트리의 권한을 넓히거나 sandbox를 제거하는 지름길에 저항하십시오. 둘 다 증상을 없애면서 의도적으로 두었던 보호를 제거하며, 다음 실패는 해석하기 더 어려워집니다.

성공을 가정하지 말고 인스턴스를 다시 시작한 뒤 다음 이벤트를 읽으십시오. 다음에 예상되는 오류는 OpenVPN이 설정 파일을 열지 못하는 것이며, 이는 진전입니다. 작업 디렉터리에 들어갔고 파서가 지금 동작합니다. 거기서부터 unit의 실제 파일 매핑을 따라가고, 네트워크 문제 해결로 돌아가지 마십시오.

systemd 실행 참조는 작업 디렉터리가 루트 디렉터리 및 sandbox와 함께 어떻게 해석되는지 정의합니다. 기억할 패턴은 간단합니다. 각 상태 코드는 다른 단계를 가리키고, 애플리케이션 자체의 오류만이 애플리케이션을 설명합니다.

관련 글