Systemd Targets 설명: 부팅 상태와 런레벨 효과적으로 관리하기
systemd targets, 런레벨 동등 항목, 기본 부팅 상태, 격리, 복구 및 그래픽 모드 이해하기
Systemd Targets 설명: 부팅 상태와 런레벨 효과적으로 관리하기
Systemd targets는 명명된 시스템 상태입니다. target은 일반 서버 부팅, 그래픽 데스크탑, 복구 셸, 종료 또는 함께 시작하려는 서비스의 사용자 정의 그룹을 나타낼 수 있습니다. 이전 Linux 시스템에서 온 경우, targets는 사람들이 실제로 사용했던 런레벨 부분을 대체하는 systemd의 역할을 하지만, 숫자 대신 종속성으로 구축되기 때문에 더 유연합니다.
일반적으로 서버가 잘못된 모드로 부팅되거나, 데스크탑 디스플레이 관리자가 시작되지 않거나, 복구 가이드에서 rescue.target을 입력하라고 할 때 targets를 접하게 됩니다. 몇 가지 명령어를 알면 이러한 상황이 훨씬 덜 신비롭게 느껴집니다.
런레벨에서 Systemd Targets로의 진화
역사적으로 Linux 시스템은 부팅 및 런타임 중 시스템의 운영 상태를 정의하기 위해 런레벨이라는 개념을 사용했습니다. 런레벨은 시작 또는 중지할 서비스를 결정하는 숫자 식별자(0-6)였습니다. 예를 들어, 런레벨 3은 일반적으로 다중 사용자 텍스트 모드를 의미하고, 런레벨 5는 그래픽 다중 사용자 환경을 나타냈습니다. 이 시스템은 기능적이었지만 한계가 있었습니다:
- 경직성: 런레벨은 종종 고정되거나 배포판별 방식으로 정의되어 특정 상태에 대해 활성화된 서비스 집합을 사용자 정의하기 어려웠습니다.
- 암시적 종속성: 서비스 간의 종속성은 종종 런레벨 할당을 통해 간접적으로 관리되어 잠재적인 충돌이나 누락된 서비스를 초래했습니다.
- 세분성 부족: 숫자 시스템은 설명적 명확성이 부족하여 시스템의 의도된 상태를 이해하기 어려웠습니다.
Systemd targets는 더 명시적이고 종속성 기반이며 설명적인 접근 방식을 제공하여 이러한 한계를 해결합니다. 추상적인 숫자 대신 targets는 의도된 시스템 상태를 명확히 나타내는 의미 있는 이름(예: multi-user.target, graphical.target)을 가집니다. 종속성은 유닛 파일 내에 명시적으로 정의되어 모든 필수 구성 요소가 올바른 순서로 시작되도록 보장합니다.
많은 systemd 시스템에서 대략적인 매핑은 다음과 같습니다:
| 전통적 런레벨 | 일반적인 systemd 동등 항목 | 의미 |
|---|---|---|
| 0 | poweroff.target |
종료 및 전원 끄기 |
| 1 | rescue.target |
단일 사용자 복구 모드 |
| 3 | multi-user.target |
다중 사용자 텍스트/서버 모드 |
| 5 | graphical.target |
다중 사용자 모드 및 그래픽 로그인 |
| 6 | reboot.target |
재부팅 |
이것을 법칙이 아닌 번역 도구로 취급하십시오. 런레벨 동작은 배포판마다 다양했으며, systemd targets는 이전 런레벨이 표현할 수 없었던 관계를 표현할 수 있습니다.
Systemd Targets 이해하기
Systemd target는 그 자체로 유닛 유형입니다. target 유닛이 활성화되면, systemd는 해당 target의 유닛 파일에 종속성으로 나열된 모든 유닛을 활성화하려고 시도합니다. 이는 계단식 효과를 만들어 원하는 시스템 상태에 도달하기 위해 필요한 모든 서비스, 장치 및 기타 구성 요소가 온라인 상태가 되도록 보장합니다.
Systemd Targets의 주요 특징:
- 종속성 관리: Targets는 target이 도달된 것으로 간주되기 위해 활성화되어야 하는 다른 유닛을 정의합니다. 이것이 그 힘의 핵심입니다.
- 동기화 지점: 부팅 과정에서 동기화 지점 역할을 합니다. 현재 target이 완전히 초기화될 때까지 시스템은 다음 단계로 진행되지 않습니다.
- 설명적 명명: Targets는 설명적으로 명명되어 시스템의 의도된 상태를 쉽게 이해할 수 있습니다(예:
rescue.target,poweroff.target).
Targets는 일반적으로 장기 실행 코드 자체를 실행하지 않습니다. 다른 유닛을 그룹화합니다. 다음 명령으로 그룹화를 검사할 수 있습니다:
systemctl list-dependencies multi-user.target
systemctl list-dependencies graphical.target
이것은 "이 서비스가 부팅 시 왜 시작됩니까?"라는 질문에 답하는 좋은 방법입니다. 유닛이 기본 target의 종속성 트리에 나타나면 어딘가에서 끌어오고 있는 것입니다.
일반적인 Systemd Targets
Systemd에는 일반적인 시스템 상태를 다루도록 설계된 사전 정의된 targets 세트가 함께 제공됩니다. 이를 이해하는 것이 시스템 관리의 핵심입니다.
multi-user.target
이것은 가장 기본적인 targets 중 하나입니다. 네트워킹이 활성화되어 있지만 그래픽 로그인 관리자나 데스크탑 환경이 없는 완전한 기능의 다중 사용자 시스템을 나타냅니다. 일반적으로 서버의 기본 target입니다.
- 목적: 서비스 실행 및 텍스트 기반 콘솔이나 SSH를 통한 여러 사용자 로그인을 위한 안정적인 환경 제공.
- 종속성: 일반적으로 네트워킹, 시스템 서비스 및 콘솔 로그인 프롬프트용 유닛을 포함합니다.
헤드리스 서버의 경우 multi-user.target이 일반적으로 올바른 기본값입니다. 디스플레이 관리자에 리소스를 소비하지 않고 SSH 및 일반 서비스를 제공합니다.
graphical.target
이 target는 사용자 상호 작용을 위해 그래픽 데스크탑 환경이 준비된 완전한 기능의 다중 사용자 시스템을 나타냅니다. 일반적으로 multi-user.target의 종속 항목이며 그래픽 세션에 필요한 구성 요소를 추가합니다.
- 목적: 그래픽 디스플레이 관리자(GDM, LightDM, SDDM 등) 및 관련 데스크탑 환경을 시작합니다.
- 종속성: 일반적으로
multi-user.target동작을 끌어오고 디스플레이 관리자 및 그래픽 세션 구성 요소용 유닛을 추가합니다.
워크스테이션이 검은 화면으로 부팅되지만 SSH가 여전히 작동하는 경우 다음을 비교하십시오:
systemctl get-default
systemctl status display-manager.service
journalctl -u display-manager.service -b
기본 target은 시스템이 도달하려고 시도한 것을 알려줍니다. 디스플레이 관리자 로그는 그래픽 계층이 왜 올라오거나 올라오지 않았는지 알려줍니다.
rescue.target
이 target는 최소한의 단일 사용자 환경을 제공합니다. 주로 시스템 유지 보수 및 복구에 사용됩니다. 기본 시스템과 루트 셸을 제공하지만 일반적으로 네트워킹이나 다중 사용자 서비스를 시작하지 않습니다.
- 목적: 시스템 관리자가 다른 서비스의 간섭 없이 유지 보수 작업을 수행할 수 있는 안전한 환경 제공.
- 종속성: 최소한의 필수 시스템 구성 요소와 루트 셸. 수동으로 시작하지 않으면 네트워킹을 사용할 수 없는 경우가 많습니다.
emergency.target
이것은 rescue.target보다 더 최소화됩니다. 시스템을 단일 읽기 전용 파일 시스템과 루트 셸로 부팅합니다. 기본 서비스조차 문제가 될 수 있는 심각한 응급 상황을 위해 설계되었습니다.
- 목적:
rescue.target조차 적절하지 않을 수 있는 중요한 시스템 복구용. - 종속성: 가장 필수적인 시스템 구성 요소와 루트 셸만 포함합니다. 루트 파일 시스템은 실패 및 배포판에 따라 읽기 전용으로 마운트될 수 있습니다.
reboot.target, poweroff.target, halt.target
이것들은 시스템을 종료하거나 다시 시작하는 데 사용되는 특수 targets입니다. systemd가 이러한 targets 중 하나를 활성화하면 실행 중인 모든 서비스를 중지한 다음 지정된 작업(재부팅, 전원 끄기 또는 중지)을 수행합니다.
- 목적: 시스템을 정상적으로 종료하거나 다시 시작합니다.
- 종속성: 일반적으로 시스템이 종료되기 전에 중지해야 하는 서비스에 종속됩니다.
Systemd Targets 관리
Systemd는 targets와 상호 작용하기 위한 여러 명령줄 도구를 제공합니다. 주요 도구는 systemctl입니다.
현재 및 기본 Targets 보기
시스템이 현재 실행 중인 target과 부팅 시 기본값으로 설정된 target을 확인하려면 다음을 사용하십시오:
systemctl status
이 명령은 활성 target을 포함한 풍부한 정보를 제공합니다. 기본 target을 구체적으로 쿼리하려면:
systemctl get-default
사용 가능한 모든 targets를 보려면:
systemctl list-unit-files --type=target
활성 target 유닛을 보려면:
systemctl list-units --type=target
차이점은 서비스와 동일합니다: list-unit-files는 systemd가 알고 있는 target 파일을 표시하고, list-units는 실행 중인 시스템에서 현재 로드되거나 활성화된 targets를 표시합니다.
기본 Target 변경
시스템이 기본적으로 다른 target으로 부팅되도록 하려면(예: 그래픽에서 다중 사용자로 또는 그 반대로) systemctl set-default를 사용할 수 있습니다:
데스크탑 시스템의 일반적인 경우 그래픽 target을 기본값으로 설정:
sudo systemctl set-default graphical.target
서버의 일반적인 경우 다중 사용자 target을 기본값으로 설정:
sudo systemctl set-default multi-user.target
중요: 기본 target 변경은 다음 재부팅 시에만 적용됩니다.
내부적으로 이것은 default.target 심볼릭 링크를 변경합니다. 손상된 부팅 이미지를 디버깅하는 경우 직접 검사할 수 있습니다:
systemctl get-default
ls -l /etc/systemd/system/default.target
Target으로 전환(재부팅 없이)
재부팅하지 않고 즉시 시스템을 다른 target으로 전환할 수 있습니다. 이는 테스트하거나 시스템 상태를 일시적으로 변경하는 데 유용합니다. systemctl isolate 명령을 사용하십시오:
그래픽 target으로 전환:
sudo systemctl isolate graphical.target
다중 사용자 target으로 전환:
sudo systemctl isolate multi-user.target
주의: systemctl isolate는 강력한 명령입니다. rescue.target 또는 emergency.target과 같은 target으로 격리하면 대부분의 실행 중인 서비스가 중지됩니다. 사용하기 전에 그 영향을 이해해야 합니다. 네트워크 연결이나 그래픽 세션을 잃을 수 있습니다.
원격 서버에서는 isolate rescue.target 또는 isolate emergency.target에 특히 주의하십시오. SSH를 잃고 클라우드 제공업체, 하이퍼바이저 또는 물리적 머신을 통해 콘솔 액세스가 필요할 수 있습니다. 워크스테이션에서 그래픽 데스크탑만 중지해야 하는 경우 multi-user.target으로 격리하는 것이 바로 복구 모드로 들어가는 것보다 덜 급진적입니다.
Targets가 유닛 파일과 관련되는 방식
Targets는 일반적으로 /usr/lib/systemd/system/ 또는 /etc/systemd/system/에 위치한 유닛 파일로 구현됩니다. target 유닛 파일(예: graphical.target)은 다른 targets 및 서비스를 포함한 다른 유닛에 대한 종속성을 지정합니다.
일반적인 graphical.target 유닛 파일은 다음과 같이 보일 수 있습니다(단순화됨):
[Unit]
Description=Graphical multi-user system
Documentation=man:systemd.special(7)
# 이 target는 그래픽 로그인 관리자의 전제 조건으로 사용됩니다.
# 별도로 지정되지 않은 경우 시스템이 부팅되는 target입니다.
Wants=display-manager.service
Before=shutdown.target
[Install]
Alias=default.target
여기서:
Wants=display-manager.service:display-manager.service(GDM 또는 LightDM과 같은 실제 로그인 관리자)가 가능하면 시작되어야 함을 나타냅니다. 이것은Requires=보다 약한 종속성입니다.Before=shutdown.target: 시스템이 종료 프로세스에 들어가기 전에 그래픽 환경이 중지되도록 보장합니다.Alias=default.target: 이것은default.target이 이에 연결된 경우(데스크탑 시스템의 경우 일반적임)graphical.target이 기본값으로 작동하도록 만듭니다.
사용자 정의 Targets 생성
일상적인 사용에서는 덜 일반적이지만, 고유한 서비스 집합으로 특정 시스템 상태를 정의하기 위해 자신만의 사용자 정의 targets를 만들 수 있습니다.
사용자 정의 Target 생성 단계:
.target유닛 파일 생성:/etc/systemd/system/에 배치합니다(예:my-custom.target).[Unit] Description=My Custom Target [Install] WantedBy=multi-user.target # 또는 다른 적절한 target.service또는 다른 유닛 파일 생성: 사용자 정의 target에 대해 활성화되어야 하는 서비스 및 기타 유닛을 정의합니다.- 종속성 추가: 사용자 정의 target의 유닛 파일에서
Requires=또는Wants=를 사용하여 시작해야 하거나 시작해야 하는 유닛을 지정합니다.[Unit] Description=My Custom Target Wants=service1.service Wants=service2.service After=service1.service service2.service [Install] WantedBy=multi-user.target - Systemd 다시 로드:
sudo systemctl daemon-reload
5. **Target 활성화/시작:** bash
sudo systemctl start my-custom.target
# 또는 부팅 가능하게 만들기
sudo systemctl enable my-custom.target
```
사용 사례: 특정 데이터베이스 및 애플리케이션 서버가 실행되어야 하는 개발 환경을 상상해 보십시오. 이러한 서비스를 시작하는 dev-env.target을 만들 수 있습니다.
사용자 정의 targets는 어플라이언스와 같은 시스템에도 유용합니다. 예를 들어, 키오스크 머신에는 네트워킹, 브라우저, 로컬 감시 및 로깅 에이전트를 시작하지만 일반 데스크탑 세션의 나머지는 시작하지 않는 target이 있을 수 있습니다. 실험실 서버에는 운영자가 알려진 서비스 그룹을 함께 시작할 수 있도록 테스트 스택과 데모 스택에 대한 별도의 targets가 있을 수 있습니다.
모범 사례 및 팁
- 기본값 이해: 시스템의 기본 target(
graphical.target또는multi-user.target)을 알아야 초기 부팅 경험을 결정할 수 있습니다. isolate주의해서 사용: 특히 프로덕션 시스템에서systemctl isolate를 사용할 때 주의하십시오. 실행 중인 서비스를 방해할 수 있습니다.- 종속성 확인: 서비스가 시작되지 않는 경우
systemctl list-dependencies <target_name>을 사용하여 관련 target의 종속성을 검사하십시오. - 서버 vs. 데스크탑: 서버에서는 보안 및 리소스 효율성을 위해
multi-user.target이 거의 항상 선호됩니다. 데스크탑에서는graphical.target이 표준입니다. - 시스템 유지 보수: 최소한의 간섭이 필요한 작업에는
rescue.target이 유용합니다. 중요한 복구에는emergency.target을 사용할 수 있습니다.
Targets에 대한 실용적인 사고 방식
대부분의 관리 작업에서는 짧은 정신 모델만 있으면 됩니다:
systemctl get-default
systemctl set-default multi-user.target
systemctl isolate graphical.target
systemctl list-dependencies graphical.target
get-default는 머신이 부팅되어야 하는 위치를 알려줍니다. set-default는 다음 부팅을 변경합니다. isolate는 현재 상태를 변경하고 해당 상태 외부의 서비스를 중지할 수 있습니다. list-dependencies는 target이 무엇을 끌어오는지 설명합니다.
Targets는 단순히 이름이 변경된 런레벨이 아닙니다. 그것들은 종속성 그룹입니다. 그렇게 취급하면 부팅 문제를 추론하기 쉬워집니다: 시스템이 도달하려고 시도한 target을 찾고, 그것이 원하는 서비스를 검사한 다음, 실패한 유닛이나 종속성을 수정하십시오.