Systemd 타겟 설명: 부팅 상태와 런레벨을 효과적으로 관리하기
리눅스 시스템에서 서비스를 초기화하고 관리하는 현대적인 표준인 Systemd는 전통적인 init 시스템의 런레벨에 비해 시스템 상태를 관리하는 더욱 유연하고 강력한 메커니즘을 도입했습니다. 이 메커니즘이 바로 Systemd 타겟입니다. 타겟은 본질적으로 시스템이 도달할 수 있는 동기화 지점 또는 상태입니다. 이들은 시스템이 특정 상태에 도달하기 위해 활성화되어야 하는 유닛(서비스, 소켓, 마운트 지점 등)의 집합을 정의합니다. Systemd 타겟을 이해하는 것은 리눅스 시스템의 부팅 프로세스, 서비스 종속성 및 전반적인 운영 상태를 효과적으로 관리하는 데 매우 중요합니다.
이 기사에서는 Systemd 타겟의 개념을 명확히 설명하고, 이들이 어떻게 기존의 런레벨 개념을 대체했는지 설명하며, 그 구조, 목적 및 일반적인 사용 사례에 대해 심층적으로 다룰 것입니다. 우리는 시스템의 동작을 더욱 세밀하게 제어할 수 있도록, 타겟을 확인하고, 변경하고, 심지어 자신만의 맞춤형 타겟을 만드는 방법을 탐구할 것입니다.
런레벨에서 Systemd 타겟으로의 진화
역사적으로 리눅스 시스템은 부팅 및 런타임 동안 시스템의 운영 상태를 정의하기 위해 런레벨이라는 개념을 사용했습니다. 런레벨은 시작되거나 중지되는 서비스를 지시하는 숫자 식별자(0-6)였습니다. 예를 들어, 런레벨 3은 일반적으로 다중 사용자 텍스트 모드를 의미했고, 런레벨 5는 그래픽 다중 사용자 환경을 나타냈습니다. 이 시스템은 작동은 했지만 다음과 같은 한계가 있었습니다:
- 경직성: 런레벨은 다소 고정된 방식으로 정의되는 경우가 많았기 때문에 특정 상태에 대해 활성화되는 정확한 서비스 집합을 사용자 정의하기 어려웠습니다.
- 암묵적 종속성: 서비스 간의 종속성은 런레벨 할당을 통해 간접적으로 관리되는 경우가 많아 잠재적인 충돌이나 누락된 서비스가 발생할 수 있었습니다.
- 세분성의 부족: 숫자 시스템은 설명적인 명확성이 부족하여 시스템의 의도된 상태를 이해하기 더 어려웠습니다.
Systemd 타겟은 보다 명시적이고, 종속성 중심적이며, 설명적인 접근 방식을 제공하여 이러한 한계를 해결합니다. 추상적인 숫자 대신, 타겟은 의도된 시스템 상태를 명확하게 나타내는 의미 있는 이름(예: multi-user.target, graphical.target)을 가집니다. 종속성은 유닛 파일 내에서 명시적으로 정의되므로 필요한 모든 구성 요소가 올바른 순서로 시작됩니다.
Systemd 타겟 이해하기
Systemd 타겟은 그 자체가 유닛의 한 유형입니다. 타겟 유닛이 활성화되면, Systemd는 해당 타겟의 유닛 파일 내에 종속성으로 나열된 모든 유닛을 활성화하려고 시도합니다. 이는 연쇄 효과를 생성하여, 필요한 모든 서비스, 장치 및 기타 구성 요소가 온라인 상태가 되어 원하는 시스템 상태에 도달하도록 보장합니다.
Systemd 타겟의 주요 특징:
- 종속성 관리: 타겟이 도달한 것으로 간주되기 위해 활성화되어야 하는 다른 유닛을 정의합니다. 이것이 바로 타겟의 핵심 능력입니다.
- 동기화 지점: 부팅 프로세스 중 동기화 지점 역할을 합니다. 현재 타겟이 완전히 초기화될 때까지 시스템은 다음 단계로 진행하지 않습니다.
- 설명적인 이름 지정: 타겟은 설명적으로 이름이 지정되어 시스템의 의도된 상태를 쉽게 이해할 수 있습니다(예:
rescue.target,poweroff.target).
일반적인 Systemd 타겟
Systemd는 일반적인 시스템 상태를 포괄하도록 설계된 사전 정의된 타겟 세트를 제공합니다. 이를 이해하는 것은 시스템 관리에 핵심입니다.
multi-user.target
이것은 가장 기본적인 타겟 중 하나입니다. 네트워킹은 활성화되었지만, 그래픽 로그인 관리자나 데스크톱 환경 없이 완전히 기능하는 다중 사용자 시스템을 나타냅니다. 이는 일반적으로 서버의 기본 타겟입니다.
- 목적: 서비스 실행 및 텍스트 기반 콘솔 또는 SSH를 통한 다중 사용자 로그인을 허용하기 위한 안정적인 환경을 제공합니다.
- 종속성: 일반적으로 네트워킹, 시스템 서비스 및 콘솔 로그인 프롬프트용 유닛을 포함합니다.
graphical.target
이 타겟은 사용자 상호 작용을 위한 그래픽 데스크톱 환경을 갖춘 완전히 기능하는 다중 사용자 시스템을 나타냅니다. 일반적으로 multi-user.target의 종속 요소이며 그래픽 세션에 필요한 구성 요소를 추가합니다.
- 목적: 그래픽 디스플레이 관리자(GDM, LightDM, SDDM 등) 및 관련 데스크톱 환경을 시작합니다.
- 종속성:
multi-user.target의 모든 종속성을 상속하며, X 서버 또는 Wayland 컴포지터, 디스플레이 관리자 및 데스크톱 세션을 위한 유닛을 추가합니다.
rescue.target
이 타겟은 최소한의 단일 사용자 환경을 제공합니다. 주로 시스템 유지 보수 및 복구에 사용됩니다. 기본적인 시스템과 루트 셸을 불러오지만, 일반적으로 네트워킹이나 다중 사용자 서비스를 시작하지 않습니다.
- 목적: 시스템 관리자가 다른 서비스의 방해 없이 유지 보수 작업을 수행할 수 있는 안전한 환경을 제공합니다.
- 종속성: 필수 시스템 구성 요소의 최소 집합과 루트 셸.
emergency.target
이것은 rescue.target보다 훨씬 더 최소화된 상태입니다. 시스템을 단일 읽기 전용 파일 시스템과 루트 셸 상태로만 불러옵니다. 기본적인 서비스조차 문제가 될 수 있는 심각한 비상 상황을 위해 고안되었습니다.
- 목적:
rescue.target조차 적절하지 않을 수 있는 위급한 시스템 복구를 위해. - 종속성: 절대적으로 가장 필수적인 시스템 구성 요소와 루트 셸(대부분 읽기 전용).
reboot.target, poweroff.target, halt.target
이것들은 시스템을 종료하거나 재시작하는 데 사용되는 특별한 타겟입니다. Systemd가 이 타겟 중 하나를 활성화하면, 실행 중인 모든 서비스를 중지한 다음 지정된 작업(재부팅, 전원 끄기, 중단)을 수행합니다.
- 목적: 시스템을 정상적으로 종료하거나 재시작합니다.
- 종속성: 시스템을 종료하기 전에 중지해야 하는 서비스에 일반적으로 종속됩니다.
Systemd 타겟 관리하기
Systemd는 타겟과 상호 작용하기 위한 여러 명령줄 도구를 제공합니다. 주 도구는 systemctl입니다.
현재 및 기본 타겟 확인
시스템이 현재 실행 중인 타겟과 부팅 시 기본적으로 사용할 타겟을 확인하려면 다음을 사용합니다:
systemctl status
이 명령은 활성 타겟을 포함하여 풍부한 정보를 제공합니다. 기본 타겟을 구체적으로 쿼리하려면:
systemctl get-default
사용 가능한 모든 타겟을 보려면:
systemctl list-unit-files --type=target
기본 타겟 변경하기
시스템이 기본적으로 다른 타겟(예: 그래픽에서 다중 사용자로 또는 그 반대로)으로 부팅되도록 하려면 systemctl set-default를 사용할 수 있습니다:
기본값을 그래픽 타겟으로 설정하려면 (데스크톱 시스템에 일반적):
sudo systemctl set-default graphical.target
기본값을 다중 사용자 타겟으로 설정하려면 (서버에 일반적):
sudo systemctl set-default multi-user.target
중요: 기본 타겟 변경은 다음 재부팅 시에만 적용됩니다.
타겟으로 전환하기 (재부팅 없이)
재부팅 없이 즉시 시스템을 다른 타겟으로 전환할 수 있습니다. 이는 테스트하거나 시스템 상태를 일시적으로 변경하는 데 유용합니다. systemctl isolate 명령을 사용합니다:
그래픽 타겟으로 전환하려면:
sudo systemctl isolate graphical.target
다중 사용자 타겟으로 전환하려면:
sudo systemctl isolate multi-user.target
주의: systemctl isolate는 강력한 명령입니다. rescue.target 또는 emergency.target과 같은 타겟으로 격리하면 실행 중인 대부분의 서비스가 중지됩니다. 사용하기 전에 그 의미를 이해해야 합니다. 네트워크 연결 또는 그래픽 세션을 잃을 수 있습니다.
타겟이 유닛 파일과 관련되는 방식
타겟은 유닛 파일로 구현되며, 일반적으로 /usr/lib/systemd/system/ 또는 /etc/systemd/system/에 위치합니다. 타겟 유닛 파일(예: graphical.target)은 다른 타겟 및 서비스를 포함하여 다른 유닛에 대한 종속성을 지정합니다.
일반적인 graphical.target 유닛 파일은 다음과 유사할 수 있습니다 (간략화):
[Unit]
Description=Graphical multi-user system
Documentation=man:systemd.special(7)
# This target is intended to be a prerequisite for the graphical login manager.
# It's the target that the system will boot into if not otherwise specified.
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이 기본값 역할을 하도록 만듭니다.
사용자 지정 타겟 생성
일상적인 사용에는 덜 일반적이지만, 고유한 서비스 집합을 가진 특정 시스템 상태를 정의하기 위해 자신만의 사용자 지정 타겟을 만들 수 있습니다.
사용자 지정 타겟을 만드는 단계:
-
.target유닛 파일 생성:/etc/systemd/system/에 배치합니다 (예:my-custom.target).
```ini
[Unit]
Description=My Custom Target[Install]
WantedBy=multi-user.target # Or another appropriate target
2. **`.service` 또는 기타 유닛 파일 생성:** 사용자 지정 타겟에 대해 활성화되어야 하는 서비스 및 기타 유닛을 정의합니다. 3. **종속성 추가:** 사용자 지정 타겟의 유닛 파일에서 `Requires=` 또는 `Wants=`를 사용하여 어떤 유닛이 시작되어야 하는지 또는 시작되어야 하는지를 지정합니다.ini
[Unit]
Description=My Custom Target
Wants=service1.service
Wants=service2.service
After=service1.service service2.service[Install]
WantedBy=multi-user.target
4. **Systemd 재로드:**bash
sudo systemctl daemon-reload
5. **타겟 활성화/시작:**bash
sudo systemctl start my-custom.targetOr to make it bootable
sudo systemctl enable my-custom.target
```
사용 사례: 특정 데이터베이스 및 애플리케이션 서버가 실행되어야 하는 개발 환경을 상상해 보십시오. 이러한 서비스를 시작하는 dev-env.target을 만들 수 있습니다.
모범 사례 및 팁
- 기본값 이해: 초기 부팅 경험을 좌우하므로 시스템의 기본 타겟(
graphical.target또는multi-user.target)을 알고 있어야 합니다. isolate는 주의해서 사용: 특히 프로덕션 시스템에서systemctl isolate를 사용할 때는 실행 중인 서비스를 중단시킬 수 있으므로 유의해야 합니다.- 종속성 확인: 서비스가 시작되지 않는 경우,
systemctl list-dependencies <target_name>을 사용하여 서비스가 연결된 타겟의 종속성을 검토하십시오. - 서버 대 데스크톱: 서버에서는 보안 및 리소스 효율성을 위해
multi-user.target이 거의 항상 선호됩니다. 데스크톱에서는graphical.target이 표준입니다. - 시스템 유지 관리: 최소한의 방해가 필요한 작업에는
rescue.target이 유용합니다. 위급 복구에는emergency.target을 사용할 수 있습니다.
결론
Systemd 타겟은 전통적인 런레벨에 비해 시스템 상태를 관리하는 데 더 표현력이 풍부하고, 유연하며, 종속성을 인식하는 방식을 제공함으로써 중요한 발전을 나타냅니다. multi-user.target 및 graphical.target과 같은 일반적인 타겟을 이해하고 기본 타겟을 확인하고 변경하는 방법을 알면 리눅스 시스템의 부팅 프로세스 및 런타임 동작을 더 잘 제어할 수 있습니다. 서버를 구성하든, 데스크톱을 관리하든, 시스템 문제를 해결하든, Systemd 타겟에 대한 확실한 이해는 모든 리눅스 관리자에게 매우 귀중한 기술입니다.