리눅스의 시간대(TZ)를 한국(KST)로 변경하기

리눅스와 유닉스는 주로 미국과 유럽의 개발자들이 개발하는 운영체제다. 그래서 언어(character set), locale과 Time 및 Time Zone 역시 유럽과 미국을 기준으로 만들어 배포된다. 그렇다 보니 리눅스를 다운로드 받아 설치하고 나면 설치과정에서 지역과 타임존을 한국을 선택해도 묘하게 지역과 시간이 한국과 맞지 않는 문제가 발생하곤 한다. 이번에도 그런 경험을 할 수 있었다. 테스트 용으로 사용하고 있는 오라클 클라우드의 Rocky 리눅스를 dnf 명령으로 업데이트 한 뒤 갑자기 타임존이 KST에서 UTC로 바뀌어 있는 경험을 했다.

컴퓨터가 시간을 인식하는 방법

유닉스와 리눅스는 물론 대부분의 운영체제에서 공통으로 시간을 설정하는 방법은 두 가지가 있다. 먼저 서버나 컴퓨터의 기본 시간대(Time Zone)를 설정하는 방법이다. 이 방법은 흔히 “로컬타임을 변경하는 방법”이라고 알려져 있는데 사실 이는 정확하지 않은 표현이다.

시스템의 시간은 서버의 보드에 있는 클럭칩에서 정한다. 그리고 이 시스템의 클럭은 모두 UTC로 맞춰져있다. 즉 그리니치 천문시. 즉 영국 표준시다. 이는 전세계에 판매되는 모든 컴퓨터, 서버 등이 지키도록 되어 있는 약속이다. 컴퓨터가 제조되면 메인 보드에 있는 배터리에 의해 전원이 꺼져 있더라도 UTC 기준으로 시간이 계속 카운트 된다.

운영체제가 컴퓨터에 설치되면 운영체제는 UTC 시간을 메인보드의 클럭 칩에서 받아오고 사용자 계정의 쉘 환경과 무관하게 설정된 시스템의 기본 시간대로 환산한다. 당연히 운영체제의 시간대(Time Zone)이 KST로 설정되어 있다면 9시간을 더한다. 그래서 UTC+9 로 표현되는 것이다. 만약 운영체제의 시간대가 UTC로 설정되어 있다면 환산하지 않고 date 명령 등으로 볼 때 UTC로 표시되는 것이다.

리눅스는 계정마다 다른 시간대를 사용할 수 있다

리눅스는 기본적으로 멀티유저(Multi User) 환경을 지원한다. 이 이야기가 무슨 소리인가 하면 사용자 계정마다 다른 환경을 설정해 사용할 수 있다는 이야기다. 그리고 여러 계정이 동시에 접속해 각자의 작업을 할 수 있다는 이야기다. 이게 무슨 당연한 “개소리”냐 생각할 수도 있겠지만 그런 멀티유저 환경을 제공하기 위해서는 미국에서 접속한 사람과 서울에서 접속한 사람이 각자 다른 시간대를 설정해 사용할 수도 있어야 한다는 이야기다.

즉 그것이 당연하다고 생각하는 것과 그것이 “어떻게 가능하지?” 그것이 “어떻게 구현됐을까?”를 고민해보지 않았다면 IT 전문가가 되기는 아직 멀었다고 생각하고 더욱 정진하길 바란다.

리눅스는 계정마다 “프로파일(profile)”을 갖고 있다. bash를 사용한다면 bash를 사용하는 모든 계정에 적용되는 공통 프로파일인 /etc/bash.bashrc가 로그인할 때 자동으로 적용된다. 그리고 계정마다 다른 환경을 만들기 위해 계정의 홈디렉토리에 .bashrc 라는 개인 프로파일을 사용할 수 있다. 만약 서울에서 접속하는 사람이 .bashrc에 export TZ=’Asia/Seoul’ 이라는 한 라인을 추가한 다음 다시 접속하면 한국 시간대를 사용할 수 있고 미국 로스앤젤리스에서 접속하는 사람은 export TZ=’America/Los_Angeles’ 라고 추가하면 미국 로스앤젤리스의 현지 시간을 사용할 수 있다. 이는 쉘(bash)이 운영체제의 기본 시간을 받아서 TZ에 설정된 지역의 시간으로 변환해서 해당 계정에게 보여주기 때문이다.

문제는 특정 계정에서 실행하는 응용프로그램이 사용자 환경의 시간대를 사용하느냐…아니면 시스템에 기본으로 설정된 시간을 가져와 사용하느냐에서 발생한다. 이는 정확하게 약속된 것이 없기 때문이다.

그래서 혼자 사용하는 리눅스이거나 특정 국가에 서비스를 제공하는 서버라면 시스템(운영체제)의 기본 시간대를 정확하게 설정하는 것이 중요하다.

리눅스의 기본 시간대(타임존) 변경하기

혼자 사용하거나 여러 사람이 사용하지만 다른 시간대를 사용하지 않고 하나의 시간대만 사용한다면 리눅스의 로컬 시간대를 특정 지역이나 표준시로 설정하고 사용자 계정의 환경변수는 설정하지 않는 것이 좋다.

먼저 /etc 디렉토리로 이동하여 다음과 같이 명령을 실행한다.

/etc/localtime 은 심볼릭 링크이고 /usr/share/zoneinfo/UTC 로 연결되어 있다. 이 설정은 리눅스 시스템의 기본 시간대가 UTC로 설정되어 있다. 이렇게 되면 우리나라의 표준시와 9시간의 차이가 난다. 당연히 로그에 기록되는 시간과 시간 기반으로 동작하는 모든 응용프로그램의 시간이 9시간 틀리게 된다.

그리고 date 명령을 실행해보면 시간대가 UTC로 표시된다.

이제 이 시간대를 서울로 변경한다.

Seoul 로 시간대를 변경
Seoul 로 시간대를 변경

다음의 명령어를 그냥 Copy / Paste 명령을 사용해 실행해주면 된다.

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

그리고 date 명령을 실행하면 시간대가 한국(KST)로 변경된 것을 알 수 있다.

KST 시간대로 변경한 화면
KST 시간대로 변경한 화면

즉시 시간이 변경되었지만 모든 응용프로그램 및 시스템 프로그래밍에 활용되도록 하기 위해서는 리눅스를 리부팅 해줄 필요가 있다.

#리눅스 #TZ #시간대

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다