정상적으로 작동하던 GCP Compute Engine VM에서 NetworkManager를 재시작하자 서비스가 올라오지 않았다. 운영체제는 CentOS 8이었고, 로그에는 libgio-2.0.so.0을 열 수 없다는 Permission denied가 반복됐다. 직전까지 정상 작동했지만, 장애를 촉발한 변경 사항은 확인하지 못했다.
당시에는 SELinux를 비활성화한 뒤 서비스가 정상적으로 시작됐다. 다만 장애 당시의 AVC 기록을 보관하지 못해 어떤 SELinux 규칙이나 파일 상태가 직접 원인이었는지는 확인하지 못했다. 이 글은 실제 오류와 임시 복구 결과를 기록하고, 같은 상황에서 먼저 확인할 진단 절차를 정리한다.
오류 로그#
호스트명에서 개인 식별 문자열을 제외하고 centos8로 표기했다.
[root@centos8 ~]# sudo systemctl restart NetworkManager
Job for NetworkManager.service failed because the control process exited with error code.
See "systemctl status NetworkManager.service" and "journalctl -xe" for details.
Apr 26 13:23:38 centos8 systemd[1]: Starting Network Manager...
Apr 26 13:23:38 centos8 NetworkManager[2128]: /usr/sbin/NetworkManager: error while loading shared libraries: libgio-2.0.so.0: cannot open shared object file: Permission denied
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:38 centos8 systemd[1]: Failed to start Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Service RestartSec=100ms expired, scheduling restart.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 1.
Apr 26 13:23:38 centos8 systemd[1]: Stopped Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: Starting Network Manager...
Apr 26 13:23:38 centos8 NetworkManager[2132]: /usr/sbin/NetworkManager: error while loading shared libraries: libgio-2.0.so.0: cannot open shared object file: Permission denied
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:38 centos8 systemd[1]: Failed to start Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Service RestartSec=100ms expired, scheduling restart.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 2.
Apr 26 13:23:38 centos8 systemd[1]: Stopped Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: Starting Network Manager...
Apr 26 13:23:38 centos8 NetworkManager[2135]: /usr/sbin/NetworkManager: error while loading shared libraries: libgio-2.0.so.0: cannot open shared object file: Permission denied
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:38 centos8 systemd[1]: Failed to start Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Service RestartSec=100ms expired, scheduling restart.
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 3.
Apr 26 13:23:38 centos8 systemd[1]: Stopped Network Manager.
Apr 26 13:23:38 centos8 systemd[1]: Starting Network Manager...
Apr 26 13:23:38 centos8 NetworkManager[2138]: /usr/sbin/NetworkManager: error while loading shared libraries: libgio-2.0.so.0: cannot open shared object file: Permission denied
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
Apr 26 13:23:38 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:38 centos8 systemd[1]: Failed to start Network Manager.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Service RestartSec=100ms expired, scheduling restart.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 4.
Apr 26 13:23:39 centos8 systemd[1]: Stopped Network Manager.
Apr 26 13:23:39 centos8 systemd[1]: Starting Network Manager...
Apr 26 13:23:39 centos8 NetworkManager[2140]: /usr/sbin/NetworkManager: error while loading shared libraries: libgio-2.0.so.0: cannot open shared object file: Permission denied
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Main process exited, code=exited, status=127/n/a
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:39 centos8 systemd[1]: Failed to start Network Manager.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Service RestartSec=100ms expired, scheduling restart.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Scheduled restart job, restart counter is at 5.
Apr 26 13:23:39 centos8 systemd[1]: Stopped Network Manager.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Start request repeated too quickly.
Apr 26 13:23:39 centos8 systemd[1]: NetworkManager.service: Failed with result 'exit-code'.
Apr 26 13:23:39 centos8 systemd[1]: Failed to start Network Manager.NetworkManager가 시작 단계에서 필요한 공유 라이브러리 libgio-2.0.so.0을 읽지 못해 프로세스가 종료됐다. 종료 상태 127은 이 로그에서 라이브러리 로딩 실패와 함께 나타난 결과다. 재시작이 반복된 뒤 systemd가 추가 시작 요청을 제한했지만, 이는 최초 원인이라기보다 실패가 반복된 뒤의 상태다.
로그의 Permission denied만으로는 일반 파일 권한, 상위 디렉터리 접근 권한, SELinux 정책 중 무엇이 거부했는지 판별할 수 없다. 따라서 이 메시지만 보고 라이브러리 권한을 바꾸거나 SELinux 문제라고 단정해서는 안 된다.
당시 조치: SELinux 비활성화#
당시 기억으로는 /etc/selinux/config에서 다음 값을 설정하고 재부팅했다.
SELINUX=disabled그 뒤 NetworkManager가 정상적으로 시작됐다. SELinux가 차단에 관여했을 가능성을 보여주는 결과지만, 당시 AVC 로그를 확인하지 않았으므로 차단 규칙이나 파일 컨텍스트 등 구체적인 원인은 확인되지 않았다. SELinux를 꺼서 서비스가 시작됐다는 사실만으로 처음에 왜 차단이 발생했는지까지 밝혀진 것은 아니다.
이 설정은 SELinux 정책을 적용하지 않으므로 장애 원인을 고친 것이 아니라 보안 통제를 해제한 우회 조치다. Red Hat은 SELinux를 비활성화하면 정책을 적용하지 않고 AVC 기록도 남기지 않는다고 설명한다. 또한 RHEL 8에서는 설정 파일에 SELINUX=disabled를 지정하는 방식이 deprecated 상태이며, 디버깅 목적이라면 SELinux를 계속 끄기보다 permissive 모드를 사용하라고 안내한다. 이 방식은 부팅 중 SELinux가 활성화됐다가 나중에 꺼져 메모리 누수나 경쟁 상태를 일으킬 수도 있다. Red Hat: SELinux 상태와 모드 변경
SELinux가 비활성화된 상태에서 다시 활성화하면 파일 레이블이 맞지 않아 부팅이나 서비스 실행에 문제가 생길 수 있다. 설정을 곧바로
enforcing으로 바꾸고 재부팅하기보다, 해당 배포판의 복구 절차에 따라 permissive 모드와 파일 재레이블을 먼저 확인해야 한다.
같은 오류가 다시 발생하면 확인할 순서#
장애가 재현되는 서버에서는 설정을 바꾸기 전에 현재 상태와 기록을 보존한다.
getenforce
sestatus
systemctl status NetworkManager --no-pager -l
journalctl -u NetworkManager -b --no-pagerSELinux가 Enforcing이라면 같은 부팅 시점의 AVC 거부 기록을 찾는다.
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today감사 데몬이 동작하지 않는 환경에서는 커널 로그도 확인할 수 있다.
dmesg | grep -i -e type=1300 -e type=1400Red Hat 문서는 AVC 메시지를 SELinux 거부 여부를 확인하는 자료로 안내한다. 실제 AVC에 NetworkManager와 libgio-2.0.so.0 접근 거부가 기록되어 있다면 그 경로와 거부 동작을 바탕으로 정책 또는 파일 컨텍스트를 조사한다. AVC 기록이 없으면 SELinux가 원인이라고 결론내리지 말고 일반 권한과 파일 상태도 확인한다.
namei -l /usr/lib64/libgio-2.0.so.0
ls -lZ /usr/lib64/libgio-2.0.so.0
rpm -V glib2namei는 라이브러리 파일까지 이어지는 디렉터리 경로의 접근 권한을, ls -lZ는 파일 권한과 SELinux 컨텍스트를 보여준다. rpm -V glib2는 RPM 데이터베이스와 설치된 glib2 파일을 비교하므로 출력이 있다면 항목별로 의미를 확인한다. 검증 결과만으로 파일을 덮어쓰거나 권한을 일괄 변경하지 않는다.
임시 진단에는 permissive 모드를 우선한다#
SELinux가 Enforcing인 시스템에서 차단 여부를 확인해야 한다면, 전체 정책을 끄는 대신 일시적으로 permissive 모드를 사용한다. 이 모드에서는 정책 위반을 차단하지 않고 AVC 기록을 남긴다. 다음 명령은 현재 실행 중인 모드만 바꾸며, 재부팅 후에도 유지되는 설정은 아니다.
sudo setenforce 0
getenforcePermissive가 표시되면 같은 서비스 동작을 확인하면서 AVC 기록을 수집한다. 진단이 끝나면 이전 상태를 복구한다.
sudo setenforce 1
getenforce이 방법은 현재 SELinux가 활성화된 시스템에서만 적용할 수 있다. permissive도 정책 차단을 일시적으로 멈추므로 장기간 유지하지 않는다. AVC 기록에서 원인을 찾으면 파일 컨텍스트나 필요한 정책을 바로잡고 Enforcing으로 운영한다. 설정 파일을 수정해 영구 모드를 바꾸는 절차는 배포판 버전과 부팅 설정을 확인한 뒤 진행한다.
CentOS 8 지원 상태 확인#
이 사례는 GCP Compute Engine에서 운영하던 CentOS 8 VM의 장애 기록이다. CentOS Linux 8을 사용했다면 2021년 12월 31일 지원이 종료됐다. CentOS Linux 8과 CentOS Stream 8은 서로 다른 배포판이므로, 정확한 이름은 cat /etc/centos-release로 확인해야 한다. CentOS Linux 8이라면 새 VM 구축이나 기존 VM 운영 시 지원되는 운영체제로 이전하는 계획도 검토해야 한다. CentOS Linux EOL 안내
이번 장애에서는 SELINUX=disabled 적용 후 NetworkManager가 다시 시작됐지만, 근본 원인을 입증할 AVC 기록은 남아 있지 않았다. 다음에 같은 문제가 생기면 SELinux를 끄는 데서 끝내지 않고, 서비스 로그와 AVC, 라이브러리 권한·패키지 상태를 함께 보존해야 원인을 좁힐 수 있다.