diff --git a/journey/troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md b/journey/troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md index acd5d8c..d0b606b 100644 --- a/journey/troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md +++ b/journey/troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md @@ -80,7 +80,7 @@ sudo apt update sudo apt upgrade -y ``` -### 4. Codex CLI 런타임 복구 +### 4. Codex CLI 런타임 근본 복구 문제 재현: ```bash @@ -102,13 +102,15 @@ sudo -u happybell80 bash -lc 'which node; node -v; which codex; codex login stat ```bash sudo cp -a /usr/local/bin/codex /usr/local/bin/codex.pre_node24_fix -sudo install -m 0755 /home/admin/.tmp_codex_wrapper.sh /usr/local/bin/codex -sudo install -o happybell80 -g xusers -m 0644 /home/admin/happybell80.profile.fixed /home/happybell80/.profile +sudo cp -a /usr/local/bin/codex /usr/local/bin/codex.wrapper.20260309 +sudo ln -sfn /home/happybell80/.nvm/versions/node/v24.4.0/bin/node /usr/local/bin/node +sudo ln -sfn /home/happybell80/.nvm/versions/node/v24.4.0/bin/codex /usr/local/bin/codex ``` 적용 내용: -- `/usr/local/bin/codex`를 `/home/happybell80/.nvm/versions/node/v24.4.0/bin/node`와 Codex JS 엔트리포인트를 직접 호출하는 래퍼로 교체했다. -- 기존 전역 진입점은 `/usr/local/bin/codex.pre_node24_fix`로 백업했다. +- `/usr/local/bin/node`를 `node v24.4.0` 바이너리로 연결해, `#!/usr/bin/env node`가 더 이상 시스템 `node v12.22.9`를 집지 않도록 했다. +- `/usr/local/bin/codex`는 래퍼가 아니라 원래 Codex CLI 바이너리 심볼릭 링크로 되돌렸다. +- 기존 전역 진입점은 `/usr/local/bin/codex.pre_node24_fix`로 유지했고, 임시 래퍼는 `/usr/local/bin/codex.wrapper.20260309`로만 보관했다. - `happybell80`의 `~/.profile`에 Node `v24.4.0` 경로를 PATH 앞단에 두는 설정을 추가해 로그인 셸에서도 동일한 런타임을 사용하도록 맞췄다. 검증: @@ -124,6 +126,7 @@ env -i PATH=/usr/local/bin:/usr/bin:/bin HOME=/home/happybell80 USER=happybell80 - `codex --help` 정상 출력 - `codex login status` -> `Logged in using ChatGPT` - 최소 PATH 환경에서도 `/usr/local/bin/codex --help` 정상 출력 +- 즉 최종 상태는 래퍼 우회가 아니라, `env node`가 시스템 차원에서 지원 버전 Node를 찾도록 바로잡은 상태다. ## Python 관련 핵심 해설 - Ubuntu 22.04는 시스템 도구 다수가 `python3.10` 기준으로 패키징돼 있다. @@ -148,6 +151,7 @@ python3.13 -m venv .venv - 23 서버에서 위 SSH 명령으로 실제 접속 검증 시 `hostname=robeing-i9`, `user=admin` 응답을 확인했다. - 추가 확인 결과 Codex CLI 직접 장애 원인은 네트워크 전면 차단이 아니라 `node v12.22.9`와 `@openai/codex 0.53.0` 조합의 런타임 충돌이었다. - 2026-03-09 수정 후 `happybell80` 로그인 셸과 `/usr/local/bin/codex` 직접 호출 모두 `node v24.4.0` 기준으로 정상 동작한다. +- `/usr/local/bin/node`도 `node v24.4.0`를 가리키도록 맞춰, `env node` 기반 실행 경로의 런타임 충돌을 제거했다. ### 23 서버 현재 점검 범위 - 본 문서는 2026-03-09 현재 작업 환경에서 23 서버로 사용 중인 호스트를 기준으로 확인했다. @@ -185,33 +189,50 @@ sudo systemctl reset-failed - 이후 `sudo logrotate -d /etc/logrotate.conf`에서 `Ignoring nginx.backup.20251021.bak, because of *.bak pattern match`를 확인했다. - `sudo systemctl status logrotate.service`는 `status=0/SUCCESS`로 종료됐고, `systemctl --failed`는 `0 loaded units listed.`, `sudo systemctl is-system-running`은 `running`으로 복귀했다. -## 2026-03-09 추가 확인: 잔존 사설 IP 설정 -- 활성 인터페이스 `eno1`에는 현재도 `192.168.219.52/24`와 `192.168.0.106/24`가 동시에 붙어 있다. -- `ip route` 기준 기본 경로도 `192.168.0.1` 외에 `192.168.219.1 metric 100`이 함께 남아 있다. -- NetworkManager 프로필 `/etc/NetworkManager/system-connections/Wired connection 1.nmconnection`에는 여전히 아래 고정값이 저장돼 있다. +## 2026-03-09 추가 확인 및 수정: 잔존 사설 IP 설정 +- 작업 전 활성 인터페이스 `eno1`에는 `192.168.219.52/24`와 `192.168.0.106/24`가 동시에 붙어 있었다. +- 작업 전 `ip route` 기준 기본 경로도 `192.168.0.1` 외에 `192.168.219.1 metric 100`이 함께 남아 있었다. +- 원인은 NetworkManager 프로필 `/etc/NetworkManager/system-connections/Wired connection 1.nmconnection`에 과거 고정값이 남아 있던 것이다. ```ini [ipv4] -address1=192.168.219.52/24,192.168.219.1 +address1=192.168.0.106/24,192.168.0.1 +dns=8.8.8.8;1.1.1.1; method=manual +route-metric=0 ``` -- 즉 과거 사설 IP `192.168.219.52/24`는 문서 기록만이 아니라 현재 영구 설정에도 남아 있는 상태다. -- 이번 작업에서는 SSH 세션 리스크 때문에 NetworkManager 프로필 자체는 변경하지 않았고, Codex 런타임 복구와 사실 확인까지만 수행했다. +적용 조치: + +```bash +sudo nmcli connection modify 'Wired connection 1' \ + ipv4.method manual \ + ipv4.addresses '192.168.0.106/24' \ + ipv4.gateway '192.168.0.1' \ + ipv4.dns '8.8.8.8 1.1.1.1' \ + ipv4.routes '' \ + ipv4.route-metric 0 +sudo ip addr del 192.168.219.52/24 dev eno1 +sudo ip route del default via 192.168.219.1 dev eno1 metric 100 +``` + +수정 결과: +- 활성 `eno1`에는 현재 `192.168.0.106/24`만 남아 있다. +- 기본 경로는 `192.168.0.1`만 남아 있다. +- 즉 과거 사설 IP `192.168.219.52/24`는 런타임과 영구 설정 모두에서 제거됐다. ## 재발 방지 - 24 서버에서 시스템 `python3` 링크를 변경하지 않는다. - 개발용 Python 3.13은 `venv` 또는 명시적 바이너리 경로로만 사용한다. - 고정 IP를 운용할 때는 현재 LAN 대역과 SSOT를 먼저 대조하고, 과거 대역의 잔존 주소를 제거한다. -- Node 기반 전역 CLI는 `#!/usr/bin/env node` shebang에 의존할 때 사용자별 PATH 차이로 런타임 충돌이 날 수 있으므로, 운영 명령은 요구 버전을 만족하는 Node 경로를 명시적으로 고정한다. +- Node 기반 전역 CLI는 `#!/usr/bin/env node` shebang에 의존할 때 사용자별 PATH 차이로 런타임 충돌이 날 수 있으므로, 시스템이 먼저 찾는 `node` 경로 자체를 지원 버전으로 유지한다. - GUI 터미널 불가 시에는 바로 재설치부터 하지 말고 `TTY 진입 -> 네트워크 확인 -> 시스템 Python 확인 -> apt 복구` 순서로 본다. - 23 서버에서는 `/etc/logrotate.d/` 아래에 운영 중인 설정의 백업 파일을 같은 확장자 없이 남기지 않는다. ## 후속 권장 작업 -- 24 서버의 네트워크 설정 파일에서 `192.168.219.52/24`가 다시 붙지 않도록 영구 설정 위치를 확인한다. -- 24 서버의 NetworkManager 프로필 `Wired connection 1`을 현재 운영 LAN 기준(`192.168.0.106/24`, 게이트웨이 `192.168.0.1`)으로 정리하고, SSH 유지 시간대에 재적용한다. +- 24 서버에서 `node` 경로를 바꿀 일이 생기면 `/usr/local/bin/node`와 `happybell80`의 NVM 기본 버전이 함께 맞는지 점검한다. - 24 서버에서 Python 3.13이 필요한 프로젝트가 있으면 시스템 링크 변경 없이 가상환경으로 분리한다. -- 24 서버에서 Codex/Node를 업데이트할 때는 `/usr/local/bin/codex` 래퍼의 고정 경로도 함께 점검한다. +- 24 서버에서 Codex/Node를 업데이트할 때는 `/usr/local/bin/node`, `/usr/local/bin/codex`, `happybell80`의 NVM 기본 버전이 함께 일치하는지 점검한다. - 23/24 공통 운영 기준 문서에 "Ubuntu 22.04 시스템 Python 변경 금지"를 반복 규칙으로 승격할지 검토한다. - 23 서버의 남은 패키지 업데이트 `2건`(`network-manager-openvpn`, `network-manager-openvpn-gnome`)은 영향 시간대 확인 후 반영 여부를 결정한다.