Red Hat Certified System Administrator (RHCSA) #9 시스템 운영: chronyd, journald, cron, systemd timer, tuned

9 분 소요

#8 패키지와 repository에서 dnf로 소프트웨어를 설치하고 관리하는 작업을 다졌다면, 이번 글은 설치를 마친 시스템을 운영 상태로 유지하는 일상 작업을 정리하겠습니다. 시간을 맞추고, 로그를 읽고, 작업을 예약하고, 성능 프로파일을 고르는 작업은 RHCSA에서 작업당 점수가 분명하게 떨어지는 영역입니다. 명령이 단순한 만큼 손에 익혀 두면 시험에서 빠르게 처리할 수 있습니다.

이 네 가지(시간,로그,예약,튜닝) 작업은 모두 재부팅 후에도 유지되어야 점수가 됩니다. cron 작업이 살아 있어야 하고, journald 영구 저장이 켜져 있어야 하며, NTP 동기화가 부팅 후에도 자동으로 이뤄져야 합니다. 그래서 이 글도 영구 적용을 매 작업에서 함께 확인하겠습니다.

시스템 시간 관리 #

시간이 어긋난 시스템은 로그 타임스탬프, 인증서 검증, 클러스터 동기화에서 곧장 문제를 일으킵니다. RHEL 9의 시간 관리 진입점은 timedatectl이며, 실제 시간 동기화는 chronyd 서비스가 NTP로 담당합니다.

timedatectl로 상태 확인과 설정 #

현재 시간,시간대,동기화 상태를 한눈에 보겠습니다.

# 현재 상태 확인
timedatectl

# 출력 예시
#                Local time: Sat 2026-06-06 14:30:00 KST
#            Universal time: Sat 2026-06-06 05:30:00 UTC
#                  Time zone: Asia/Seoul (KST, +0900)
# System clock synchronized: yes
#               NTP service: active

System clock synchronized: yesNTP service: active가 동기화가 정상임을 알려 줍니다.

시간대 설정은 다음과 같이 합니다.

# 사용 가능한 시간대 목록에서 검색
timedatectl list-timezones | grep -i seoul

# 시간대 설정
timedatectl set-timezone Asia/Seoul

# NTP 동기화 켜기
timedatectl set-ntp true

NTP가 켜진 상태에서는 시간을 수동으로 설정할 수 없으므로, 수동 설정이 필요하면 먼저 timedatectl set-ntp false로 동기화를 끈 뒤 timedatectl set-time "2026-06-06 14:00:00"처럼 지정합니다. 시험에서는 대부분 NTP 동기화를 켜는 쪽이 정답입니다.

chronyd와 /etc/chrony.conf #

실제 NTP 동기화는 chronyd가 담당하고, 설정은 /etc/chrony.conf에 둡니다. 시험에서 자주 나오는 작업은 지정된 NTP 서버를 가리키도록 설정 파일을 수정하는 것입니다.

# 패키지가 없다면 설치
dnf install -y chrony

# 설정 파일 편집
vi /etc/chrony.conf

/etc/chrony.conf의 핵심 지시어는 다음과 같습니다.

# NTP 서버 지정 (시험에서 주어진 서버로 교체)
server classroom.example.com iburst

# pool 형태로 여러 서버 묶음을 받을 수도 있음
pool 2.rhel.pool.ntp.org iburst

# 로컬 네트워크에서 시간 제공을 허용할 대역
# allow 192.168.0.0/16

iburst 옵션은 서비스 시작 직후 빠르게 동기화하도록 요청을 몰아 보내므로, 시험에서 서버를 추가할 때 함께 적어 두면 동기화 확인이 빨라집니다.

설정을 바꾼 뒤에는 서비스를 재시작하고 부팅 시 자동 시작을 보장합니다.

systemctl restart chronyd
systemctl enable chronyd

NTP 동기화 확인 #

설정이 실제로 적용되었는지는 chronyc로 확인합니다.

# 현재 동기화 대상 소스 목록
chronyc sources

# 출력 예시 (^* 가 현재 동기화 중인 서버)
# MS Name/IP address         Stratum Poll Reach LastRx Last sample
# ===============================================================
# ^* classroom.example.com         3   6    17    23   +12us[...]

# 동기화 추적 상태 (오프셋, 정확도)
chronyc tracking

chronyc sources 출력에서 서버 앞의 ^* 표시가 현재 동기화 중인 소스를 뜻합니다. 설정 파일에 적은 서버가 이 목록에 나타나고 timedatectlsynchronized: yes를 보이면 작업이 완료된 것입니다.

로그 관리: journald와 rsyslog #

RHEL 9의 로그는 systemd의 journald가 바이너리 저널로 수집하고, journalctl로 조회합니다. 텍스트 로그가 필요할 때는 rsyslog/var/log/ 아래의 전통적 파일로도 기록합니다.

journalctl로 로그 읽기 #

journalctl의 옵션은 시험에서 그대로 묻는 경우가 많으므로 자주 쓰는 형태를 정리하겠습니다.

# 특정 유닛(서비스)의 로그만
journalctl -u sshd

# 우선순위로 필터 (err 이상만)
journalctl -p err

# 시간 범위로 필터
journalctl --since "2026-06-06 09:00:00"
journalctl --since "1 hour ago"
journalctl --since yesterday --until "2026-06-06 12:00:00"

# 이번 부팅의 로그만
journalctl -b

# 직전 부팅의 로그 (-1)
journalctl -b -1

# 실시간으로 따라 보기
journalctl -f

-p(priority)는 emerg,alert,crit,err,warning,notice,info,debug 순의 우선순위를 받으며, 지정한 수준 이상을 보여 줍니다. 옵션은 자유롭게 조합할 수 있으므로 journalctl -u sshd -p err --since today처럼 한 번에 좁혀 들어가는 연습이 도움이 됩니다.

journald 영구 저장 (Storage=persistent) #

기본 상태의 journald는 로그를 /run/log/journal의 메모리에 두므로 재부팅하면 사라집니다. RHCSA 단골 작업은 이 로그를 디스크에 영구 저장하도록 바꾸는 것입니다.

# 설정 파일 편집
vi /etc/systemd/journald.conf

[Journal] 섹션에서 Storage를 다음과 같이 지정합니다.

[Journal]
Storage=persistent

영구 저장은 /var/log/journal 디렉터리에 기록됩니다. 디렉터리를 미리 만들고 권한을 맞춘 뒤 서비스를 재시작하면 확실합니다.

# 영구 저장 디렉터리 생성
mkdir -p /var/log/journal

# 소유권과 권한 적용 (systemd 제공 도구)
systemd-tmpfiles --create --prefix /var/log/journal

# journald 재시작으로 설정 반영
systemctl restart systemd-journald

이렇게 하면 journalctl -b -1이전 부팅의 로그까지 조회할 수 있어, 설정이 적용되었는지 직접 확인할 수 있습니다.

rsyslog 한 줄 #

journalctl로 모든 로그를 볼 수 있지만, RHEL은 여전히 rsyslog/var/log/messages, /var/log/secure 같은 텍스트 로그를 함께 남깁니다. 설정은 /etc/rsyslog.conf/etc/rsyslog.d/에 두며, 인증 로그는 /var/log/secure, 일반 시스템 메시지는 /var/log/messages에서 확인한다는 점만 기억해 두면 충분합니다.

작업 예약: cron과 systemd timer #

정해진 시각에 작업을 돌리는 방법은 전통적인 cron과 systemd의 timer 두 갈래가 있습니다. RHCSA는 주로 cron을 묻지만, systemd timer도 함께 알아 두면 안전합니다.

사용자 crontab #

사용자별 예약 작업은 crontab 명령으로 관리합니다.

# 현재 사용자의 crontab 편집
crontab -e

# 현재 사용자의 crontab 목록 보기
crontab -l

# 특정 사용자의 crontab 편집 (root만 가능)
crontab -u alice -e

# 현재 사용자의 crontab 삭제
crontab -r

crontab 한 줄의 형식은 분 시 일 월 요일 명령의 다섯 필드입니다.

# ┌───── 분 (0-59)
# │ ┌───── 시 (0-23)
# │ │ ┌───── 일 (1-31)
# │ │ │ ┌───── 월 (1-12)
# │ │ │ │ ┌───── 요일 (0-7, 0과 7은 일요일)
# │ │ │ │ │
# * * * * * 실행할 명령

# 매일 14시 23분에 실행
23 14 * * * /usr/local/bin/backup.sh

# 매주 월요일 오전 3시 정각
0 3 * * 1 /usr/local/bin/weekly.sh

# 5분마다
*/5 * * * * /usr/local/bin/check.sh

시험에서는 “특정 사용자가 매일 몇 시 몇 분에 어떤 명령을 실행하도록” 같은 형태로 나오므로, crontab -u 사용자 -e로 대상 사용자를 정확히 맞추는 것이 중요합니다.

/etc/cron.d와 시스템 cron #

시스템 단위 예약은 /etc/crontab이나 /etc/cron.d/ 아래 파일에 둡니다. 이 형식은 사용자 crontab과 달리 시각 필드 다음에 실행 사용자가 추가됩니다.

# /etc/cron.d/mytask
# 분 시 일 월 요일  사용자  명령
30 2 * * *  root  /usr/local/bin/system-backup.sh

이 밖에 /etc/cron.daily/, /etc/cron.hourly/ 같은 디렉터리에 실행 가능한 스크립트를 두면 해당 주기로 자동 실행됩니다.

systemd timer (.timer / .service) #

systemd timer는 한 쌍의 유닛으로 동작합니다. 무엇을 실행할지 정의하는 .service와 언제 실행할지 정의하는 .timer입니다.

먼저 실행할 작업을 .service로 정의합니다.

# /etc/systemd/system/backup.service
[Unit]
Description=Daily backup job

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

다음으로 실행 시각을 .timer로 정의합니다.

# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar는 시각을 표현하는 핵심 지시어입니다. daily, weekly처럼 줄임말로도, Mon *-*-* 03:00:00처럼 요일과 시각을 조합해서도 쓸 수 있습니다. Persistent=true는 시스템이 꺼져 있어 놓친 실행을 부팅 후 따라잡게 합니다.

타이머는 .timer 유닛을 enable 합니다.

# 유닛 재로딩 후 타이머 활성화
systemctl daemon-reload
systemctl enable --now backup.timer

# 등록된 타이머와 다음 실행 시각 확인
systemctl list-timers

OnCalendar 표현이 의도대로 해석되는지는 다음으로 검증할 수 있습니다.

# OnCalendar 표현 검증과 다음 실행 시각 출력
systemd-analyze calendar "*-*-* 02:30:00"

tuned로 시스템 프로파일 조정 #

tuned는 워크로드 성격에 맞춰 커널,디스크,네트워크 파라미터 묶음을 적용하는 서비스입니다. RHCSA에서는 지정된 프로파일을 활성화하는 작업으로 나옵니다.

# tuned 서비스 활성화 (필요 시)
systemctl enable --now tuned

# 사용 가능한 프로파일 목록과 현재 권장 프로파일
tuned-adm list

# 현재 적용 중인 프로파일 확인
tuned-adm active

# 프로파일 적용
tuned-adm profile throughput-performance

# 시스템에 권장되는 프로파일 자동 선택
tuned-adm recommend

대표적인 프로파일로 균형형인 balanced, 처리량 위주인 throughput-performance, 가상 머신 게스트용 virtual-guest, 지연 시간 최소화인 latency-performance가 있습니다. 시험에서는 주어진 프로파일 이름을 tuned-adm profile로 적용하고 tuned-adm active로 확인하면 됩니다.

시험 포인트 #

  • 시간 동기화. timedatectl set-timezone으로 시간대를 맞추고, timedatectl set-ntp true로 NTP를 켭니다. NTP 서버 지정은 /etc/chrony.confserver/pool 줄을 고친 뒤 systemctl restart chronyd로 반영하고, chronyc sources^*로 동기화를 확인합니다.
  • journald 영구 저장. /etc/systemd/journald.confStorage=persistent를 넣고 /var/log/journal을 만든 뒤 systemctl restart systemd-journald로 반영합니다. journalctl -b -1로 이전 부팅 로그가 보이면 성공입니다.
  • 로그 조회. journalctl-u, -p, --since/--until, -b를 조합해 좁혀 들어가는 연습을 합니다.
  • cron 작업. crontab -e로 본인, crontab -u 사용자 -e로 대상 사용자의 작업을 등록합니다. 분 시 일 월 요일 필드 순서를 정확히 맞춥니다.
  • systemd timer. .service.timer를 한 쌍으로 만들고 OnCalendar로 시각을 지정한 뒤 .timer를 enable 합니다. systemctl list-timers로 다음 실행을 확인합니다.
  • tuned. tuned-adm profile 이름으로 적용하고 tuned-adm active로 확인합니다.
  • 영구 적용. chronyd,tuned는 systemctl enable, cron 작업은 등록 자체로 유지, timer는 enable --now로 부팅 후에도 살아 있어야 점수가 됩니다.

정리 #

이번 글에서 잡은 것:

  • 시간. timedatectl로 시간대,NTP를 제어하고, /etc/chrony.conf로 NTP 서버를 지정하며, chronyc sources/chronyc tracking으로 동기화를 확인합니다.
  • 로그. journalctl의 필터 옵션으로 로그를 읽고, Storage=persistent로 저널을 디스크에 영구 저장합니다. 텍스트 로그는 rsyslog/var/log/에 남깁니다.
  • 예약. crontab/etc/cron.d로 cron 작업을, .timer/.serviceOnCalendar로 systemd timer를 구성합니다.
  • 튜닝. tuned-adm으로 시스템 성능 프로파일을 적용하고 확인합니다.
  • 함정. journald 기본값은 휘발성이라 영구 저장 설정이 빠지면 재부팅 후 사라지고, cron의 필드 순서나 cron.d의 사용자 필드 누락이 흔한 실점 원인입니다.

다음: 기본 네트워킹 #

시스템 운영의 시간,로그,예약,튜닝을 잡았습니다. 이제 시스템을 네트워크에 올리는 작업으로 넘어갑니다.

#10 기본 네트워킹: NetworkManager (nmcli), hostname, /etc/hosts에서는 nmcli로 연결을 만들고 IP,게이트웨이,DNS를 영구 설정하는 법, hostnamectl로 호스트명을 바꾸는 법, 그리고 /etc/hosts로 이름을 해석하는 법까지 직접 쳐 보며 정리하겠습니다.

X