Systemd 타겟 설명: 부팅 상태 및 런레벨 효과적으로 관리하기

전통적인 리눅스 런레벨을 대체하는 Systemd 타겟의 역할을 살펴보세요. 이 가이드에서는 `multi-user.target` 및 `graphical.target`과 같은 일반적인 타겟, `systemctl`을 사용하여 이들을 보고, 변경하고, 관리하는 방법, 그리고 현대 리눅스 시스템 초기화 및 관리에서 이들의 중요성을 설명합니다. 시스템의 부팅 상태와 운영 모드를 효과적으로 제어하는 방법을 알아보세요.

34 조회수

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이 기본값 역할을 하도록 만듭니다.

사용자 지정 타겟 생성

일상적인 사용에는 덜 일반적이지만, 고유한 서비스 집합을 가진 특정 시스템 상태를 정의하기 위해 자신만의 사용자 지정 타겟을 만들 수 있습니다.

사용자 지정 타겟을 만드는 단계:

  1. .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.target

    Or 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.targetgraphical.target과 같은 일반적인 타겟을 이해하고 기본 타겟을 확인하고 변경하는 방법을 알면 리눅스 시스템의 부팅 프로세스 및 런타임 동작을 더 잘 제어할 수 있습니다. 서버를 구성하든, 데스크톱을 관리하든, 시스템 문제를 해결하든, Systemd 타겟에 대한 확실한 이해는 모든 리눅스 관리자에게 매우 귀중한 기술입니다.