런레벨은 리눅스 시스템이 작동하는 상태를 나타낸 숫자다. 0 ~ 6까지 7단계로 나뉘어져 있다.
일반적으로 runlevel 명령을 통해 확인할 수 있다.
하지만 현대 배포판에서는 runlevel을 더이상 사용하지 않고, 후술할 systemd target 을 사용한다.
타겟은 시스템의 특정 상태를 기반으로 유닛들을 그룹화 하는 개념이다. 타겟은 시스템의 특정 상태를 의미한다는 점에서 런레벨과 동일하다. 또한 실제로 런레벨과 의미적으로 동일한 target들이 있다.
| runlevel | target |
|---|---|
| 0 | poweroff.target |
| 1 | rescue.target |
| 2 | multi-user.target |
| 3 | multi-user.target |
| 4 | multi-user.target |
| 5 | graphical.target |
| 6 | reboot.target |
타겟끼리도 의존관계가 있으며, graphical.target 은 multi-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)
[Install]
WantedBy=multi-user.target
우리가 서비스를 부팅시 동작하게 하려고 작성할때 [Install] 섹션에 저렇게 작성한다.
저 의미가 무엇인지 찾아보다 여기까지 공부하게 되었다.
우리는 서비스가 시스템을 부팅시킬때 실행되도록 하기 위해 systemctl enable {service} 명령으로 등록한다. 과연 이 의미가 무엇이었을까?
위에서 언급했듯, 타겟에 도달하면 타겟에 속한 유닛(서비스) 들이 활성화 되게 된다. 이때 해당 타겟에 유닛(서비스)를 속하게 하는것이 systemctl enable 명령이고, 속할 타겟이 WantedBy 에 쓰여진 타겟인것이다.
Systemd Target Units Explained