Systemd 타겟 이해: 핵심 개념 설명

Linux에서 시스템 상태를 정의하고 관리하는 강력한 systemd 유닛인 systemd 타겟을 이해합니다. 이 종합 가이드는 타겟이 서비스 및 다른 유닛을 그룹화하고, 부팅 프로세스를 조정하며, 기존 런레벨에 대한 현대적인 대안을 제공하는 방법을 설명합니다. `multi-user.target` 및 `graphical.target`과 같은 일반적인 타겟, 기본 타겟을 확인하고 변경하는 방법, 런타임 중에 타겟을 전환하는 방법, 그리고 애플리케이션을 위한 사용자 지정 타겟을 생성하는 방법까지 배울 수 있습니다. systemd 기반 Linux 환경을 효과적으로 관리하는 데 도움이 되는 실제 명령과 모범 사례도 포함되어 있습니다.

39 조회수

Systemd 타겟 이해하기: 필수 개념 설명

Systemd는 대부분의 Linux 배포판에서 사실상의(de facto) init 시스템이 되었으며, 서비스와 프로세스가 관리되는 방식을 혁신했습니다. systemd의 정교한 시스템 초기화 및 상태 관리 기능의 핵심에는 타겟(targets) 개념이 있습니다. 단순한 서비스 모음 이상의 타겟은 원하는 시스템 상태를 정의하는 특별한 systemd 유닛으로, 부팅 과정 전반에 걸쳐 동기화 지점 역할을 합니다.

이 글은 systemd 타겟의 신비를 해소하고, 다른 유닛들을 그룹화하고 시스템의 전반적인 상태를 제어하는 타겟의 근본적인 역할을 설명하는 것을 목표로 합니다. 우리는 타겟이 기존의 런레벨(runlevels)과 어떻게 관련되는지 탐구하고, 여러분이 접하게 될 가장 일반적인 타겟들을 상세히 설명하며, 이들을 관리하고 상호작용하기 위한 실용적인 명령어들을 제공할 것입니다. 이 글을 마칠 때쯤에는 타겟이 전원 켜기부터 완전히 작동 가능한 환경까지 시스템의 여정을 어떻게 조정하는지 명확하게 이해하게 될 것입니다.

Systemd 타겟이란 무엇인가요?

systemd 생태계에서 타겟은 중요한 조직적 목적을 수행하는 특별한 유형의 유닛 파일(예: .service 또는 .socket 파일)입니다. 특정 프로세스를 시작하거나 중지하는 방법을 정의하는 서비스 유닛과 달리, 타겟 유닛은 시스템 상태 또는 함께 활성화되어야 하는 유닛들의 집합을 정의합니다. 이들은 다른 systemd 유닛들을 위한 논리적인 그룹화 지점 및 동기화 지점 역할을 합니다.

타겟을 시스템 운영 여정의 이정표로 생각해보세요. systemd가 부팅될 때, 임의로 서비스 목록을 실행하는 것이 아니라, 특정 타겟을 달성하기 위해 작동합니다. 이 타겟은 그 상태를 충족하는 데 필요한 모든 서비스, 소켓, 마운트 지점 및 다른 타겟들을 순서대로 가져옵니다(pulls in). 이 종속성 기반 접근 방식은 예측 가능하고 효율적인 부팅 프로세스를 보장합니다.

SysVinit과 같은 구형 Linux init 시스템에 익숙한 사람들에게 systemd 타겟은 런레벨(runlevels)의 현대적인 동등물입니다. SysVinit은 고정된 런레벨 세트(예: 다중 사용자 텍스트 모드를 위한 런레벨 3, 다중 사용자 그래픽 모드를 위한 런레벨 5)를 가졌지만, systemd 타겟은 더 유연합니다. 이들은 숫자가 아닌 이름으로 지정되며, 사용자 정의 타겟을 정의할 수 있어 더 뛰어난 세분성과 확장성을 제공합니다.

타겟 작동 방식: 그룹화 및 종속성

타겟은 유닛 파일 내에 정의된 명시적인 종속성을 통해 그룹화 및 상태 정의 기능을 달성합니다. 이를 위해 사용되는 주요 지시문은 Wants=, Requires=, After=, 그리고 Before=입니다.

  • Wants=: "약한" 종속성을 지정합니다. 만약 target Aunit BWants= 한다면, target A가 활성화될 때 systemd는 unit B를 시작하려고 시도합니다. 그러나 unit B가 시작에 실패하더라도 target A는 여전히 시작될 것입니다. 이는 바람직하지만 엄격하게 필수적이지 않은 관련 서비스들을 그룹화하는 데 주로 사용됩니다.
  • Requires=: "강한" 종속성을 지정합니다. 만약 target Aunit BRequires= 한다면, target A가 활성화되기 위해서는 unit B가 성공적으로 시작되어야 합니다. 만약 unit B가 실패하면, target A 역시 실패하거나 시작되지 않을 것입니다. 이는 핵심적인 종속성에 사용됩니다.
  • After=: 순서 종속성을 정의합니다. 만약 target AAfter= unit B를 가진다면, target Aunit B가 시작된 후에만 시작될 것입니다. 이는 성공에 대한 종속성을 의미하는 것이 아니라, 오직 순서만을 의미합니다.
  • Before=: After=의 역입니다. 만약 target ABefore= unit B를 가진다면, unit Btarget A가 시작된 후에만 시작될 것입니다.
  • Conflicts=: 특정 유닛들이 동시에 활성화되지 않도록 보장합니다. 만약 target Aunit BConflicts= 한다면, target A를 활성화하면 unit B가 실행 중일 경우 중지되고, 그 반대도 마찬가지입니다.

이러한 지시문들은 타겟이 강력한 오케스트레이터 역할을 하여, 필요에 따라 서비스 및 다른 타겟들을 가져오고(pulling in), 이들이 시작되어야 하는 순서를 정의할 수 있게 합니다. 예를 들어, multi-user.target은 일반적으로 network.target 및 다양한 다른 서비스들을 Wants=하여, 시스템이 다중 사용자 상태에 도달했을 때 이들이 활성화되도록 보장합니다.

타겟 유닛 파일의 내용을 검사하여 그 종속성을 확인할 수 있습니다:

systemctl cat multi-user.target

이 명령어는 multi-user.target 유닛 파일의 내용을 출력하며, 해당 타겟이 다중 사용자 상태를 구성하는 요소들을 정의하는 Description, Documentation, 그리고 결정적으로 Wants=, Requires=, After= 등의 지시문들을 보여줍니다.

일반적인 Systemd 타겟 설명

Systemd는 다양한 사전 정의된 타겟을 제공하며, 각 타겟은 특정 시스템 상태 또는 기능에 해당합니다. 이들을 이해하는 것은 시스템 관리에 필수적입니다.

  • default.target: 이 타겟은 시스템이 부팅할 기본 상태를 정의하므로 가장 중요합니다. 일반적으로 데스크톱용인 graphical.target 또는 서버용인 multi-user.target 중 하나에 대한 심볼릭 링크입니다.
  • graphical.target: 이 타겟은 일반적으로 그래픽 데스크톱 환경을 사용하는 시스템에 사용됩니다. 이는 multi-user.target을 가져온(pulls in) 다음 그래픽 로그인 관리자 및 디스플레이 서버(예: GDM, LightDM, Xorg, Wayland)에 필요한 서비스들을 추가합니다.
  • multi-user.target: 이는 그래픽 인터페이스가 없는 다중 사용자 시스템의 표준 상태입니다. 서버에서 일반적이며 명령줄 접근, 네트워킹 및 대부분의 데몬 작업에 필요한 모든 서비스를 제공합니다.
  • basic.target: 기본적인 운영에 필요한 필수 시스템 서비스를 포함하지만, multi-user.target 이전 상태인 최소 상태입니다. 일반적으로 sysinit.target 및 기타 필수 서비스들을 가져옵니다.
  • sysinit.target: 이 타겟은 부팅 프로세스 초기에 도달합니다. /etc/fstab 파일 시스템(원격 파일 시스템 제외) 마운트, 스왑 설정 및 기타 하드웨어 관련 초기화와 같은 핵심 시스템 초기화 작업을 담당합니다.
  • local-fs.target: /etc/fstab에 지정된 모든 로컬 파일 시스템이 마운트되었는지 확인합니다.
  • remote-fs.target: /etc/fstab에 지정된 모든 원격 파일 시스템(예: NFS, CIFS)이 마운트되었는지 확인합니다.
  • network.target: 기본 네트워크 연결이 사용 가능하다는 것을 나타냅니다(예: 네트워크 인터페이스가 활성화됨). 완전한 인터넷 연결이나 IP 주소 할당을 보장하지는 않습니다.
  • network-online.target: 더 강력한 네트워크 타겟으로, 할당된 IP 주소와 잠재적으로 도달 가능한 게이트웨이를 포함하여 시스템이 완전한 네트워크 연결 상태임을 나타냅니다. 활성 인터넷 접근이 필요한 서비스는 After=network-online.target을 사용해야 합니다.
  • rescue.target: 최소한의 서비스만 실행되고 로컬 파일 시스템이 마운트된 단일 사용자 셸을 제공합니다. 시스템 복구 및 문제 해결에 유용합니다.
  • emergency.target: rescue.target보다 훨씬 더 최소한의 환경입니다. 일반적으로 읽기 전용으로 마운트된 루트 파일 시스템에서 셸을 제공합니다. 다른 서비스는 시작되지 않습니다. 치명적인 비상 상황을 위한 것입니다.
  • poweroff.target, reboot.target, halt.target: 이 타겟들은 각각 시스템을 종료, 재시작 또는 정지하는 데 사용됩니다. 활성화되면 대부분의 서비스를 중지하고 원하는 전원 상태를 위해 시스템을 준비합니다.

Systemd 타겟 관리

systemd 타겟과의 상호 작용은 주로 systemctl 명령줄 유틸리티를 통해 이루어집니다.

활성 타겟 및 기본 타겟 보기

시스템이 현재 실행 중인 타겟을 확인하려면:

systemctl get-default

현재 로드된 모든 타겟 유닛을 나열하려면:

systemctl list-units --type=target

이 명령어는 활성, 로드됨, 정적 타겟과 그 설명을 보여줍니다.

기본 부팅 타겟 변경하기

시스템이 기본적으로 부팅되는 타겟을 변경할 수 있습니다. 예를 들어, multi-user.target을 기본값으로 설정하려면:

sudo systemctl set-default multi-user.target

graphical.target으로 되돌리려면:

sudo systemctl set-default graphical.target

이 명령어는 /etc/systemd/system/default.target에서 원하는 타겟 파일로의 심볼릭 링크를 생성합니다.

임시적으로 다른 타겟으로 부팅하기

때때로 (예: 문제 해결을 위해) 특정 타겟으로 한 번만 부팅해야 할 때가 있습니다. 이는 부팅 중에 커널 매개변수를 추가함으로써 달성할 수 있습니다. GRUB 부팅 메뉴가 나타날 때, 부팅 항목을 편집하고(일반적으로 e 키를 눌러서) 커널 명령줄에 systemd.unit=target_name.target을 추가합니다.

예를 들어, 복구 모드로 부팅하려면:

systemd.unit=rescue.target

런타임 중 타겟 전환하기

시스템이 실행되는 동안 systemctl isolate 명령어를 사용하여 다른 타겟으로 전환할 수 있습니다. 이 명령어는 새 타겟에 필요하지 않은 모든 서비스를 중지하고 필요한 모든 서비스를 시작합니다.

경고: systemctl isolate를 사용하는 것은 시스템 운영을 방해할 수 있습니다. 특히 데스크톱 머신에서 graphical.target에서 multi-user.target과 같이 훨씬 낮은 수준의 타겟으로 전환하는 경우 더욱 그렇습니다. 주의하여 사용하십시오.

graphical.target에서 multi-user.target으로 전환하려면:

sudo systemctl isolate multi-user.target

graphical.target으로 돌아가려면 (이것이 이전 상태였다고 가정하면):

sudo systemctl isolate graphical.target

사용자 정의 타겟 생성

systemd가 유용한 많은 타겟을 제공하지만, 사용자 정의 타겟을 생성하는 것이 유리한 상황이 있을 수 있습니다. 이는 항상 함께 시작하고 중지해야 하는 여러 서비스를 그룹화하거나 애플리케이션에 대한 특정 환경을 정의해야 하는 복잡한 애플리케이션 배포에서 특히 그러합니다.

사용자 정의 타겟을 생성하는 방법:

  1. .target 파일 생성: /etc/systemd/system/에 배치합니다. 예를 들어, my-application.target.
    ini # /etc/systemd/system/my-application.target [Unit] Description=My Custom Application Target Wants=my-database.service my-webserver.service After=my-database.service my-webserver.service
    • Description: 사람이 읽을 수 있는 설명입니다.
    • Wants=: 이 타겟이 가져와야 할 서비스 또는 다른 타겟들을 나열합니다.
    • After=: 순서를 정의합니다. 타겟은 이 유닛들이 시작된 후에 시작됩니다.
  2. 서비스 생성: my-database.servicemy-webserver.service (또는 여러분이 나열한 서비스)가 존재하고 올바르게 구성되었는지 확인하십시오.
  3. systemd 재로드: systemd에 새 유닛 파일에 대해 알립니다.
    bash sudo systemctl daemon-reload
  4. 활성화 및 시작: 이제 사용자 정의 타겟을 활성화하고 시작할 수 있으며, 이는 원하는 서비스들을 차례로 시작할 것입니다.
    bash sudo systemctl enable my-application.target sudo systemctl start my-application.target

이를 통해 관련된 서비스 그룹을 단일 논리적 유닛으로 관리하여 복잡한 애플리케이션 배포를 단순화할 수 있습니다.

타겟을 이용한 문제 해결

타겟은 부팅 문제나 서비스 실패를 해결하는 데에도 매우 유용합니다.

  • 종속성 식별: 서비스가 시작에 실패하는 경우, 해당 서비스가 속한 타겟을 검사하면 누락되거나 실패한 종속성을 파악할 수 있습니다. systemctl status <service_name>systemctl list-dependencies <target_name>을 사용하십시오.
  • 최소 타겟으로 부팅: 시스템이 graphical.target 또는 multi-user.target으로 부팅되지 않으면, 커널 매개변수 방법을 사용하여 rescue.target 또는 emergency.target으로 부팅을 시도하십시오. 이는 많은 실행 중인 서비스의 복잡성 없이 문제를 진단할 수 있는 최소 환경을 제공합니다.
  • 로그 확인: 타겟 또는 서비스 시작을 시도한 후에는 항상 journalctl 로그에서 오류를 확인하십시오.
    bash journalctl -b -u <target_or_service_name>

모범 사례 및 팁

  • network-online.target 선호: 서비스가 활성 네트워크 연결(예: 외부 API에 접근)을 필요로 하는 경우, 단순히 network.target 또는 특정 네트워크 서비스가 아닌 After=network-online.target을 사용하도록 보장하십시오. 이는 서비스가 다양한 네트워크 설정 시간에 대해 더 강력하게 대처할 수 있도록 합니다.
  • 부팅 순서 이해: sysinit.target에서 basic.target, 그리고 multi-user.target/graphical.target으로 이어지는 일반적인 흐름을 숙지하십시오. 이는 부팅 프로세스 초기에 실패하는 서비스를 디버깅하는 데 도움이 됩니다.
  • default.target 사용 시 주의: default.target을 변경하면 시스템의 부팅 동작이 크게 바뀔 수 있습니다. 사용자 정의 구성은 항상 비프로덕션 환경에서 먼저 테스트하십시오.
  • 필수적이지 않은 종속성에는 Wants= 사용: 타겟이 "활성" 상태로 간주되는 데 유용하지만 엄격하게 필요하지 않은 서비스의 경우, Requires= 대신 Wants=를 사용하십시오. 이렇게 하면 단일 선택적 서비스 실패가 연쇄 반응을 일으켜 전체 타겟의 활성화를 막는 것을 방지할 수 있습니다.

결론

Systemd 타겟은 현대 Linux 시스템 관리의 초석이며, 시스템 상태를 정의, 제어 및 조정하기 위한 유연하고 강력한 메커니즘을 제공합니다. 타겟이 유닛을 그룹화하고, 종속성을 관리하며, 부팅 프로세스를 정의하는 방식을 이해함으로써, 관리자와 개발자는 시스템 동작에 대한 상당한 통제권을 얻게 됩니다. multi-user.target과 같은 일반적인 타겟부터 사용자 정의 애플리케이션별 타겟에 이르기까지, 이러한 개념을 숙달하는 것은 효과적인 시스템 관리, 문제 해결, 그리고 강력하고 유지보수 가능한 Linux 환경 구축에 필수적입니다.

systemd 여정을 계속하면서, 타겟은 유닛 종속성 및 시스템 초기화의 복잡한 환경을 탐색하는 지도이며, 서비스가 예측 가능하게 시작되고 시스템이 의도한 운영 상태를 달성하도록 보장한다는 것을 기억하십시오.