리눅스 런레벨, systemd target

jhkim31·2024년 5월 10일

TL;DR

  • service 유닛 파일에 쓰여진 WantedBy는 이 유닛이 어떤 타겟에 속할지를 지정
  • 타겟에 도달하면 해당 타겟에 속한 모든 유닛 활성화

런레벨

런레벨은 리눅스 시스템이 작동하는 상태를 나타낸 숫자다. 0 ~ 6까지 7단계로 나뉘어져 있다.

  • 0 : 시스템 종료 (셧다운)
  • 1 : 싱글유저 모드 (유지복구)
  • 2 : 멀티유저 모드 (네트워크 없음)
  • 3 : 멀티유저 모드 (네트워크 있음)
  • 4 : unused (사용자 정의)
  • 5 : GUI 모드 (그래픽 모드)
  • 6 : 재부팅 (restart)

일반적으로 runlevel 명령을 통해 확인할 수 있다.

하지만 현대 배포판에서는 runlevel을 더이상 사용하지 않고, 후술할 systemd target 을 사용한다.

systemd target

타겟은 시스템의 특정 상태를 기반으로 유닛들을 그룹화 하는 개념이다. 타겟은 시스템의 특정 상태를 의미한다는 점에서 런레벨과 동일하다. 또한 실제로 런레벨과 의미적으로 동일한 target들이 있다.

runleveltarget
0poweroff.target
1rescue.target
2multi-user.target
3multi-user.target
4multi-user.target
5graphical.target
6reboot.target

타겟의 의존관계

타겟끼리도 의존관계가 있으며, graphical.targetmulti-user.target 에 대한 의존관계가 있으므로, multi-user.target 이 먼저 선행되어야 도달할 수 있다.

그외에도 다른 서비스들또한 확인할 수 있다. 예를들어 gdm.service라는 디스플레이 매니저또한 의존관계에 있다.

타겟 도달

특정 타겟에 도달하게 되면, 타겟에 등록된 유닛들이 활성화되게 된다.

예를들어 아래는 sshd.service 유닛 파일이다.


sshd.service

sshd는 multi-user.target 에 도달하면 활성화하도록 설정되어있다.

타겟에 등록된 유닛들을 확인하고자 한다면, /etc/systemd/system/*.target.wants 디렉토리에서 확인할 수 있다.


multi-user.target.wants 디렉토리

만약 특정 유닛(서비스 파일)을 만들고 systemctl enable 로 등록을 한다면, 해당 디렉토리에서 링크가 생기게 된다.


개인적으로 만든 ssh_tunnel.service

기본 타겟

기본 타겟은 시스템이 목표하고자 하는 타겟이다. 부팅후 시스템이 가정하는 타겟이다.

만약 GUI 환경이라면 graphical.target 일것이고, 만약 CLI 환경이라면 multi-user.target 일것이다.

기본 타겟systemctl get-default 명령으로 확인할 수 있다.

그 외

모든 타겟systemctl list-units --type=target 명령으로 확인할 수 있다.

해당 명령으로 모든 타겟과 함께, 타겟의 상태도 확인할 수 있다. (LOAD)

Service의 WantedBy

[Install]
WantedBy=multi-user.target 

우리가 서비스를 부팅시 동작하게 하려고 작성할때 [Install] 섹션에 저렇게 작성한다.

저 의미가 무엇인지 찾아보다 여기까지 공부하게 되었다.

우리는 서비스가 시스템을 부팅시킬때 실행되도록 하기 위해 systemctl enable {service} 명령으로 등록한다. 과연 이 의미가 무엇이었을까?

위에서 언급했듯, 타겟에 도달하면 타겟에 속한 유닛(서비스) 들이 활성화 되게 된다. 이때 해당 타겟에 유닛(서비스)를 속하게 하는것이 systemctl enable 명령이고, 속할 타겟이 WantedBy 에 쓰여진 타겟인것이다.

💡 즉 `[Install]` 섹션에 `WantedBy=multi-user.target` 이라고 작성해두고 `system enable` 로 등록을 하게 되면 시스템이 `multi-user.target` 타겟에 도달할때 해당 서비스를 실행하게 되는것이다.

ref

Systemd Target Units Explained

What is systemd's target, service and socket?

Understanding systemd at startup on Linux

profile
김재현입니다.

0개의 댓글