Watch at Ease세상을 읽고, 일상의 답을 찾다.

기술 · 실용 가이드

systemd status=200/CHDIR? 권한을 바꾸기 전에 서비스의 파일시스템 보기를 증명하세요

적용된 유닛과 journal의 정확한 errno를 읽고, 설정된 사용자로 서비스 네임스페이스 안의 작업 디렉터리를 검사합니다. User=root나 chmod 777로 숨기지 마세요.

원본 일러스트: 적용 유닛, journal errno, 서비스 보기와 완료 증명.
원본 일러스트: 권한 변경 전에 서비스가 보는 경로를 증명합니다. Watch at Ease

status=200/CHDIR은 systemd가 서비스 명령을 실행하기 전에 요청된 작업 디렉터리로 이동하지 못했다는 뜻입니다. 실행 파일이 존재하고 셸에서 실행되어도 서비스는 더 이른 디렉터리 단계에서 실패할 수 있습니다.

적용된 유닛, journal의 전체 오류, 설정 사용자, 서비스가 보는 파일시스템을 보존하세요. 그러면 없는 경로, 부모 검색 권한, 네임스페이스 불일치를 분리할 수 있습니다.

적용된 유닛과 첫 실패를 고정하기

systemctl cat으로 본문과 drop-in을 저장하고 systemctl show로 User, Group, WorkingDirectory, RootDirectory, RootImage를 읽습니다. 첫 실패 주변의 journalctl도 보존합니다.

아직 권한을 바꾸지 마세요. 200/CHDIR은 단계를, errno는 경로 없음·권한 거부·디렉터리 아님 등의 분기를 알려 줍니다.

서비스 파일시스템 보기에서 WorkingDirectory 해석하기

RootDirectory나 RootImage가 적용되면 WorkingDirectory는 그 내부에서 해석됩니다. 마운트 및 사용자 네임스페이스도 보이는 경로를 바꿉니다. 호스트 경로의 존재만으로는 충분하지 않습니다.

ENOENT면 적용된 루트의 각 구성 요소를 추적합니다. 앞의 빼기 기호는 누락을 의도적으로 무시합니다. 관리 경로라면 RuntimeDirectory나 StateDirectory를 검토하세요.

설정된 서비스 사용자로 경로 탐색 시험하기

Linux 경로 해석에는 모든 디렉터리 구성 요소의 검색 권한이 필요합니다. 부모, ACL, 강제 접근 제어가 막을 수 있습니다. namei -l과 설정 사용자로 실행하는 읽기 전용 cd/pwd 시험을 사용하세요.

적용된 User와 Group을 그대로 사용합니다. root 셸의 성공은 서비스 사용자의 도달성을 증명하지 않습니다. 증거가 지목한 소유권, 그룹, ACL, 검색 비트 또는 정책만 고칩니다.

기록된 errno에 맞는 수리 선택하기

ENOENT는 올바른 루트에서 경로를 만들거나 마운트하고 오타나 조기 삭제를 고칩니다. EACCES는 특정 부모 탐색이나 ACL을, ENOTDIR은 파일 또는 끊어진 링크를 고칩니다.

User=root나 chmod 777을 수리로 쓰지 마세요. 작업 디렉터리가 선택 사항이면 의존성을 제거하거나 문서화된 빼기 동작을 명시하고 대체 동작을 설명합니다.

서비스를 약화하지 않고 종료 조건 증명하기

구성이 바뀌었으면 daemon-reload 후 한 번 재시작하고 status와 journal을 저장합니다. 의도한 사용자로 실행되며 /proc/$MainPID/cwd 등이 예상 디렉터리를 가리키는지 확인합니다.

200/CHDIR이 사라지고 신원을 약화하지 않았으며 cwd가 맞고 두 번째 재시작도 성공해야 완료입니다. 적용 유닛과 errno 기록을 남기세요.

원본 일러스트: ENOENT, EACCES, ENOTDIR 등의 분기.
원본 일러스트: 기록된 errno에 따라 증명된 경계만 수리합니다. Watch at Ease