/etc/environment 에 관해서(전역환경변수)

Linux /etc/environment 완벽 가이드

1. 개요

/etc/environment리눅스 시스템 전역에서 사용하는 환경변수를 설정하는 파일입니다.
주요 특징:

  • 로그인 세션 전체에 적용 (PAM 기반)
  • 쉘 종류와 무관 (bash, zsh, GUI 로그인, SSH 등)
  • 간단한 문법 (KEY=value)
  • 스크립트 기능 없음 (export, 변수 확장 불가)

목적: PATH, 로케일, 프록시 설정 등 공통 환경변수를 한 곳에서 관리.


2. 문법 및 제약

  • 형식: KEY=value (공백 포함 시 "쌍따옴표"로 감싸야 함)
  • export 키워드 사용 불가
  • $HOME, ~, 명령 치환($(...)) 동작 안 함
  • 주석은 보장되지 않으므로 가급적 피할 것

예시 문법

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
LANG="ko_KR.UTF-8"
JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
HTTP_PROXY="http://192.168.0.10:3128"
HTTPS_PROXY="http://192.168.0.10:3128"
NO_PROXY="localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local"

3. 적용 범위와 우선순위

  • PAM을 거치는 로그인 세션(TTY, SSH, GUI)에 적용
  • 기존 세션에는 반영 안 됨재로그인 필요
  • 쉘 초기화 스크립트(/etc/profile, ~/.bashrc)에서 동일 변수를 재설정하면 덮어씀
  • systemd 서비스/etc/environment를 자동으로 읽지 않을 수 있음

4. 다른 설정 파일과 비교

파일대상특징
/etc/environment전역 세션간단한 KEY=value, 스크립트 불가
/etc/profile, /etc/bash.bashrc로그인 쉘export 가능, 조건문 가능
/etc/default/<서비스>서비스 전용Debian/Ubuntu 전통 방식
systemd unit 파일서비스 전용Environment=, EnvironmentFile= 사용

5. 설정 방법

sudoedit /etc/environment
# 또는
sudo nano /etc/environment

변경 후 새 세션에서 확인:

printenv | grep -E 'LANG|JAVA_HOME|HTTP|PATH'

현재 세션에 임시 반영 (테스트용):

export $(grep -v '^#' /etc/environment | xargs -d '\n')

6. 좋은 예시

(A) 로케일 설정

LANG="ko_KR.UTF-8"
LC_ALL="ko_KR.UTF-8"

(B) PATH 표준화

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

(C) 프록시 설정 (K8s 홈랩)

HTTP_PROXY="http://192.168.0.10:3128"
HTTPS_PROXY="http://192.168.0.10:3128"
NO_PROXY="localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local,harbor.home.local"

(D) 개발 도구 경로

JAVA_HOME="/usr/lib/jvm/java-17-openjdk-amd64"
GOPATH="/home/ubuntu/go"

7. K8s 홈랩 환경에서 주의점

7.1 kubelet, containerd 같은 systemd 서비스

  • /etc/environment만으로 적용 안 될 수 있음
  • systemd drop-in 사용 권장

예) containerd 프록시 설정

sudo mkdir -p /etc/systemd/system/containerd.service.d
cat <<'EOF' | sudo tee /etc/systemd/system/containerd.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.0.10:3128"
Environment="HTTPS_PROXY=http://192.168.0.10:3128"
Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,.svc,.cluster.local"
EOF

sudo systemctl daemon-reload
sudo systemctl restart containerd

7.2 파드 환경변수

  • 컨테이너 환경변수는 ConfigMap 또는 Secret 사용
  • /etc/environment에 비밀 값 저장 금지 (world-readable)

8. 자주 하는 실수

  1. $HOME 같은 변수 확장 사용 → 적용 안 됨
  2. 현재 세션에서 바로 안 보임 → 재로그인 필요
  3. cron 작업에서 적용 기대 → 별도 설정 필요
  4. 민감정보 저장 → 보안 취약
  5. PATH 덮어쓰기 충돌 → 최소한만 설정

9. K8s 운영 체크리스트

  • /etc/environment에 전역 환경 최소화 (로케일, PATH, 프록시)
  • 서비스별 환경(systemd drop-in) 별도 관리
  • 앱 환경변수는 ConfigMap/Secret 사용
  • 변경 시 재로그인/서비스 재시작
  • 민감정보 금지 원칙 준수