CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
    • 1.프로세스 관리: PID부터 시그널·우선순위까지
    • 2.데몬과 프로세스 생애: fork·exec부터 좀비·고아까지
    • 3.시스템 초기화: init·런레벨에서 systemd·target까지
    • 4.작업 예약: cron의 5필드부터 at·batch까지
    • 5.Week 6 종합 복습: 프로세스·초기화·예약을 한 장으로 꿰기
  • Week 7
  • Week 8
  • Week 9
  • Week 10
  • Week 11
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 6/Day 3

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 6 · Day 3읽기 약 9분
핵심 정리
  • 부팅 관리에는 두 세대가 있다 — 전통 SysV init(런레벨 기반)과 현대 systemd(unit·target 기반). 1급은 둘 다 묻는다.
  • 런레벨: 0 종료 / 1 단일 사용자(복구) / 3 텍스트+네트워크 / 5 GUI / 6 재부팅. 0과 6은 절대 기본값으로 두면 안 된다.
  • target 대응: 2·3·4 → multi-user.target, 5 → graphical.target, 1 → rescue, 0 → poweroff, 6 → reboot.
  • systemctl에서 start(지금 한 번)와 enable(부팅마다 자동)은 다르다. 둘 다 하려면 enable --now.
  • unit 파일은 [Unit]·[Service]·[Install] 구조. /etc/systemd/system이 /usr/lib/systemd/system보다 우선하며, 수정 후 daemon-reload가 필수다. 로그는 journalctl -u 서비스 -f.

Day 3 - 시스템 초기화: init·런레벨에서 systemd·target까지

SysV init과 런레벨

  • 전통적 부팅에서는 PID 1번 init이 /etc/inittab을 읽어 시스템을 어느 런레벨(runlevel)로 띄울지 결정했다.
  • 런레벨 = "시스템이 제공하는 서비스의 묶음 상태"를 숫자 0~6으로 나눈 것.
런레벨의미설명
0Halt(종료)시스템 전원 끔
1 (S, single)단일 사용자 모드복구·점검용, root만, 네트워크 없음
2다중 사용자(NFS 없음)네트워크 일부
3다중 사용자 + 네트워크텍스트(CLI) 환경 — 서버 표준
4미사용(사용자 정의)예약됨
5다중 사용자 + 네트워크 + GUI그래픽(X11) 환경
6Reboot(재부팅)시스템 재시작
runlevel             # 현재 런레벨 확인 (예: N 3 → 이전 N, 현재 3)
who -r               # 런레벨과 전환 시각 확인
init 3               # 런레벨 3(텍스트)으로 전환
init 0               # 시스템 종료 (init 6 = 재부팅)
telinit 5            # init과 동일하게 런레벨 전환

⚠️ 함정: 런레벨 0과 6을 부팅 기본값으로 지정하면 절대 안 된다. 0(종료)이나 6(재부팅)을 기본 런레벨로 두면 시스템이 켜지자마자 꺼지거나 무한 재부팅에 빠진다. 기본값은 보통 텍스트 서버는 3, GUI 데스크톱은 5다. 그리고 1번 = 단일 사용자(복구) 모드라는 점도 알아 둔다.

런레벨 3과 5의 차이는 딱 하나, GUI(X 윈도)의 유무다. 3은 텍스트 콘솔, 5는 그래픽 로그인 화면까지 띄운다. 서버는 자원을 아끼려 3을, 데스크톱은 5를 기본으로 쓴다. 런레벨별 스크립트는 /etc/rc.d/rc{0~6}.d/에 S(시작)·K(종료) 접두사로 들어 있었다.

systemd의 등장과 target

  • systemd는 init의 한계(순차적 느린 부팅, 의존성 관리 부족)를 극복하려 등장했다.
  • 특징: 서비스를 병렬로 띄우고, 의존성을 명시적으로 관리하며, 모든 것을 unit이라는 단위로 통일했다.
  • 채택 배포판: RHEL 7+, CentOS 7+, Ubuntu 16.04+, Fedora 등 현대 배포판 전부.
  • systemd는 런레벨 대신 target을 쓴다. 옛 런레벨과의 대응을 외워야 한다.
런레벨systemd target의미
0poweroff.target종료
1rescue.target단일 사용자(복구)
2multi-user.target다중 사용자(텍스트)
3multi-user.target다중 사용자 + 네트워크(텍스트)
4multi-user.target(사용자 정의)
5graphical.target그래픽(GUI)
6reboot.target재부팅
systemctl get-default                      # 현재 기본 target 확인
systemctl set-default multi-user.target    # 기본을 텍스트 모드로
systemctl set-default graphical.target     # 기본을 GUI 모드로
systemctl isolate multi-user.target        # 즉시 텍스트 target으로 전환(init 3 격)
systemctl rescue                           # 단일 사용자(복구) 모드로
systemctl reboot                           # 재부팅
systemctl poweroff                         # 종료

런레벨 2·3·4가 모두 multi-user.target 하나로 합쳐진 점이 핵심이다(텍스트 다중 사용자). GUI는 graphical.target(옛 5). 따라서 "GUI에서 텍스트로 바꿔라"는 systemctl set-default multi-user.target이고, "즉시 전환"은 systemctl isolate(옛 init N 역할)다. set-default는 다음 부팅부터, isolate는 지금 당장이다.

systemd는 2010년 레드햇의 Lennart Poettering이 발표했다. init의 셸 스크립트 기반 순차 부팅은 서비스가 늘수록 느려졌는데, systemd는 소켓·D-Bus를 미리 만들어 두고 서비스를 동시에 띄워 부팅 시간을 크게 줄였다. 도입 당시 "유닉스 철학을 깬다"는 논쟁이 컸지만, 현재는 사실상 표준이 되었다.

systemctl — 서비스 제어의 만능 도구

  • systemd 환경에서 서비스(데몬)를 다루는 단일 명령이 systemctl이다. 옛 service·chkconfig를 모두 대체한다.
명령동작옛 SysV 대응
systemctl start 서비스지금 즉시 시작service X start
systemctl stop 서비스지금 즉시 중지service X stop
systemctl restart 서비스재시작service X restart
systemctl reload 서비스설정만 다시 읽기(무중단)service X reload
systemctl status 서비스상태·최근 로그 확인service X status
systemctl enable 서비스부팅 시 자동 시작 등록chkconfig X on
systemctl disable 서비스부팅 시 자동 시작 해제chkconfig X off
systemctl is-enabled 서비스자동 시작 여부 확인—
systemctl list-units활성 unit 목록—
systemctl start sshd          # SSH 데몬 즉시 시작
systemctl enable sshd         # 부팅 때마다 자동 시작 등록
systemctl enable --now sshd   # 등록 + 즉시 시작 한 번에
systemctl status sshd         # 상태(active/inactive)와 로그 일부
systemctl is-active sshd      # 동작 중이면 active 출력

⚠️ 함정: start와 enable은 다르다. start는 "지금 한 번 켠다"(재부팅하면 다시 꺼질 수 있음), enable은 "부팅할 때마다 자동으로 켠다"(지금 당장 켜지는 건 아님)이다. 둘 다 하려면 systemctl enable --now를 쓴다. 시험에서 이 둘을 바꿔 묻는 함정이 있다.

직접 쳐보기: systemctl status sshd(또는 crond)를 실행해 Active: 줄과 Loaded: 줄을 본다. Active: active (running)이면 실행 중, 괄호 안 enabled/disabled가 부팅 자동 시작 여부다. 실행 여부(active)와 자동 시작 여부(enabled)가 별개 정보임을 한 화면에서 확인할 수 있다.

unit 파일 — 서비스의 설계도

  • systemd가 관리하는 모든 대상은 unit이며, 종류는 파일 확장자로 구분된다.
unit 종류확장자대상
service.service데몬/서비스
target.target런레벨 같은 상태 묶음
socket.socket소켓 기반 활성화
mount.mount파일시스템 마운트
timer.timer예약 실행(cron 대체)
device.device장치
  • unit 파일 위치는 두 곳이다.
    • 패키지가 제공하는 원본 → /usr/lib/systemd/system/(또는 /lib/systemd/system/)
    • 관리자가 수정·추가한 것 → /etc/systemd/system/
  • /etc의 것이 /usr/lib의 것보다 우선한다.
  • 서비스 unit 파일의 기본 구조는 세 섹션이다.
[Unit]
Description=My Web Service
After=network.target          # network.target 이후에 시작
 
[Service]
ExecStart=/usr/bin/myapp      # 시작 명령
Restart=on-failure            # 실패 시 자동 재시작
User=myuser
 
[Install]
WantedBy=multi-user.target    # enable 시 어느 target에 연결할지
  • unit 파일을 새로 만들거나 고친 뒤에는 systemd가 변경을 인식하도록 다시 읽혀야 한다.
systemctl daemon-reload       # unit 파일 변경 후 반드시 실행
systemctl start myapp         # 새 서비스 시작
systemctl enable myapp        # WantedBy의 target에 자동 시작 등록

[Install]의 WantedBy=multi-user.target이 enable 시 동작의 핵심이다. enable하면 이 target의 .wants/ 디렉터리에 심볼릭 링크가 생겨, 부팅 때 해당 target에 도달하면 자동 시작된다. [Unit]의 After=/Before=는 시작 순서를, Requires=/Wants=는 의존성을 정의한다.

unit 파일을 수정한 뒤 systemctl daemon-reload를 빼먹으면 변경이 반영되지 않는다. systemd는 unit 파일을 메모리에 캐시하기 때문에, 디스크의 파일을 고쳐도 daemon-reload 전까지는 옛 내용으로 동작한다. "unit 수정 → daemon-reload → restart" 순서를 한 세트로 외운다.

journalctl — systemd의 통합 로그

  • systemd는 모든 서비스의 로그를 journal이라는 바이너리 형식으로 모아 관리한다.
  • 이것을 조회하는 도구가 journalctl이며, 옛날의 /var/log/messages 텍스트 로그를 보완(또는 대체)한다.
journalctl                    # 전체 로그(오래된 것부터)
journalctl -u sshd            # sshd 서비스의 로그만
journalctl -f                 # 실시간 로그 추적(tail -f 같음)
journalctl -b                 # 이번 부팅 이후 로그만
journalctl --since "1 hour ago"   # 최근 1시간 로그
journalctl -p err             # 에러(우선순위 err 이상)만
journalctl -k                 # 커널 메시지(dmesg 격)
옵션의미
-u 서비스특정 unit의 로그
-f실시간 추적(follow)
-b현재 부팅 세션 로그
-p우선순위 필터(emerg~debug)
-r최신순 역정렬
--since/--until시간 범위 지정

journalctl -u 서비스 -f는 특정 서비스의 로그를 실시간으로 보는 가장 유용한 조합이다. journal은 기본적으로 메모리/임시 저장이라 재부팅하면 사라질 수 있는데, /etc/systemd/journald.conf에서 Storage=persistent로 바꾸면 디스크(/var/log/journal/)에 영구 보존된다.

직접 쳐보기: journalctl -b -p err로 이번 부팅에서 발생한 에러만 추려 본다. 시스템에 문제가 있었다면 빨갛게 표시된다. 이어 journalctl -u sshd --since "today"로 오늘 SSH 관련 로그만 좁혀 보면, 필터 조합의 위력을 체감할 수 있다.

📖 용어

  • 런레벨(runlevel) : SysV init이 쓰던 0~6 숫자 상태. 어떤 서비스 묶음까지 띄울지를 나타낸다.
  • /etc/inittab : 전통 init이 읽어 기본 런레벨을 결정하던 설정 파일.
  • 단일 사용자 모드(런레벨 1 / rescue.target) : root만 들어가는 복구·점검용 모드. 네트워크가 없다.
  • target : systemd에서 런레벨을 대체하는 "상태 묶음" unit. multi-user는 텍스트, graphical은 GUI.
  • unit : systemd가 관리하는 모든 대상의 단위. 확장자로 service·target·socket·mount·timer·device를 구분한다.
  • systemctl start vs enable : 지금 한 번 켜기 vs 부팅할 때마다 자동으로 켜지게 등록하기. 별개 개념이다.
  • systemctl isolate : 지금 즉시 다른 target으로 전환. 옛 init N에 해당한다.
  • daemon-reload : 디스크의 unit 파일을 systemd가 다시 읽게 하는 명령. 캐시 때문에 수정 후 필수다.
  • WantedBy= : [Install] 섹션 지시어. enable 시 어느 target의 .wants/에 링크를 걸지 정한다.
  • journal : systemd가 모든 서비스 로그를 모아 두는 바이너리 저장소. journalctl로 조회한다.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

전통적 SysV init 체계에서 텍스트(CLI) 기반 다중 사용자 + 네트워크 환경에 해당하는 런레벨은?

문제 2

런레벨을 부팅 기본값으로 지정하면 절대 안 되는 것끼리 묶은 것은?

문제 3

systemd 환경에서 옛 런레벨 5(GUI)에 대응하는 target은?

문제 4

systemctl start httpd와 systemctl enable httpd의 차이로 옳은 것은?

문제 5

systemd unit 파일을 수정한 뒤 변경 사항을 systemd가 인식하도록 반드시 실행해야 하는 명령은?

문제 6

systemd unit 파일에서 enable 시 서비스를 연결할 target을 지정하는 섹션과 지시어로 옳은 것은?

문제 7

sshd 서비스의 로그만 실시간으로 추적하려 한다. 올바른 journalctl 명령은?

이전데몬과 프로세스 생애: fork·exec부터 좀비·고아까지Week 6 · Day 2다음 작업 예약: cron의 5필드부터 at·batch까지Week 6 · Day 4

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • SysV init과 런레벨
  • systemd의 등장과 target
  • systemctl — 서비스 제어의 만능 도구
  • unit 파일 — 서비스의 설계도
  • journalctl — systemd의 통합 로그
  • 용어
  • 연습 문제