불필요한 Systemd 서비스 및 타이머 비활성화 모범 사례

Linux 호스트를 손상시키지 않고 불필요한 systemd 서비스, 소켓 및 타이머를 안전하게 식별, 중지, 비활성화 및 마스킹합니다.

불필요한 Systemd 서비스 및 타이머 비활성화 모범 사례

불필요한 systemd 서비스와 타이머는 부팅 속도를 늦추고 메모리를 소비하며 사용하지 않는 리스너를 노출시킬 수 있습니다. 목표는 Linux 호스트를 완전히 빈약하게 만드는 것이 아니라, 시스템 역할에 맞지 않는 유닛을 식별하고 안전하게 비활성화하는 것입니다.

이 가이드는 서비스, 소켓 및 타이머에 대한 실용적인 검토 프로세스를 안내하며, 각 변경 전후에 실행할 수 있는 명령어를 제공합니다.

Systemd 유닛 유형 이해

무엇이든 비활성화하기 전에 systemd가 관리하는 다양한 유닛 유형을 이해하는 것이 필수적입니다. 각 유닛의 영향과 관리 방법이 다르기 때문입니다:

  • 서비스 (.service): 가장 일반적인 유닛 유형으로, 데몬이나 애플리케이션을 실행합니다 (예: sshd.service, nginx.service).
  • 타이머 (.timer): 시간 지정에 따라 다른 유닛(주로 서비스)의 실행을 예약하는 데 사용되며, 전통적인 cron 작업을 대체합니다 (예: apt-daily.timer).
  • 소켓 (.socket): 네트워크 또는 IPC 소켓을 관리하며, 소켓 활성화에 자주 사용됩니다. 여기서 서비스는 연결된 소켓에서 트래픽이 수신될 때만 시작됩니다 (예: ssh.socket).

1단계: 실행 중이고 활성화된 유닛 식별

첫 번째 단계는 현재 활성 상태인 것과 자동으로 시작하도록 구성된 것을 파악하는 것입니다.

모든 활성 유닛 나열

시스템에서 현재 실행 중인 것을 확인하려면 systemctl list-units를 사용하세요:

systemctl list-units --type=service --state=running

systemctl list-units --type=timer --state=active

모든 활성화된 유닛 나열 (부팅 시 시작하도록 설정된 유닛)

enabled로 표시된 유닛은 재부팅 후에도 유지됩니다. 이를 검토하는 것은 부팅 최적화에 중요합니다:

systemctl list-unit-files --type=service | grep enabled

systemctl list-unit-files --type=timer | grep enabled

의존성 확인

비활성화하려는 유닛이 중요한 시스템 기능의 의존성인 경우, 비활성화하면 필수 서비스가 손상될 수 있습니다. 특정 유닛이 필요로 하는 것 또는 그 유닛을 필요로 하는 것을 확인할 수 있습니다:

systemctl list-dependencies <unit_name.service>

2단계: 유닛 안전하게 비활성화 및 마스킹

불필요하다고 판단되는 유닛을 식별한 후(예: 서버의 Bluetooth 서비스, 특정 프린터 서비스), 실행을 중지하기 위한 올바른 방법을 선택해야 합니다.

1. 서비스 중지 (임시)

다음 부팅 시 시작 동작에 영향을 주지 않고 즉시 서비스를 중지하려면 stop을 사용하세요:

sudo systemctl stop <unit_name.service>

2. 서비스 비활성화 (향후 시작 방지)

유닛을 비활성화하면 향후 자동으로 시작되지 않습니다. --now를 함께 전달하거나 별도로 stop을 실행하지 않는 한 현재 실행 중인 서비스를 중지하지 않습니다.

sudo systemctl disable <unit_name.service>
sudo systemctl disable --now <unit_name.service>

3. 서비스 마스킹 (가장 강력한 방법)

마스킹은 유닛이 시작되는 것을 방지하는 가장 강력한 방법입니다. 마스킹되면 systemd는 유닛 파일에서 /dev/null로 심볼릭 링크를 생성합니다. 이는 다른 활성화된 서비스가 명시적으로 요구하더라도 의존성 체인을 포함한 어떤 프로세스도 유닛을 시작하지 못하게 합니다.

마스킹은 주의해서 사용하세요. 일반적으로 절대 실행되어서는 안 된다고 확신하는 유닛에만 사용하십시오.

sudo systemctl mask <unit_name.service>

# 마스킹 해제:
sudo systemctl unmask <unit_name.service>

타이머 및 소켓 관리

타이머는 일반적으로 트리거하는 서비스가 불필요한 경우 비활성화해야 합니다. 소켓은 소켓 활성화를 사용하는 경우 관련 서비스가 요청될 때까지 리소스를 소비하지 않으므로 그대로 두어도 됩니다. 그러나 소켓에 연결된 서비스가 불필요한 경우 서비스를 비활성화하는 것으로 충분합니다.

# 특정 타이머 비활성화
sudo systemctl disable <unit_name.timer>

# 특정 소켓 유닛 중지 및 비활성화
sudo systemctl stop <unit_name.socket>
sudo systemctl disable <unit_name.socket>

3단계: 실용적인 예제 및 모범 사례

이러한 개념을 적용하려면 시스템 역할(예: 데스크탑 대 서버)을 신중히 고려해야 합니다.

예제 1: 서버에서 CUPS(인쇄 시스템) 비활성화

Linux 머신이 인쇄 하드웨어가 없는 헤드리스 서버인 경우 CUPS 서비스는 종종 불필요한 오버헤드입니다. 서비스와 관련 타이머를 모두 비활성화해야 합니다.

# 먼저 상태 확인
systemctl status cups.service

# 서비스 비활성화 및 중지
sudo systemctl disable --now cups.service

# 관련 검색 서비스가 있는 경우 비활성화
sudo systemctl disable --now cups-browsed.service

예제 2: 원치 않는 Snapd 서비스 처리 (DNF/APT를 기본으로 사용하는 경우)

일부 배포판은 snapd를 설치합니다. 스냅을 사용하지 않는 경우 주요 서비스 구성 요소를 중지하고 비활성화할 수 있습니다:

sudo systemctl stop snapd.service
sudo systemctl disable snapd.service snapd.socket

⚠️ 배포판별 서비스 경고: 배포판의 핵심 패키지 관리자(예: systemd-networkd 또는 NetworkManager 구성 요소)에서 직접 제공하는 서비스를 비활성화할 때는 매우 주의하십시오. 비활성화하기 전에 유닛의 기능을 철저히 조사하십시오. 그렇지 않으면 네트워크 연결 손실이나 시스템 불안정이 발생할 수 있습니다.

모범 사례 요약

  1. 항상 먼저 조사하세요: disable 또는 mask를 실행하기 전에 특정 .service 또는 .timer 유닛이 배포판에서 무엇을 하는지 온라인에서 검색하세요 (예: "ModemManager.service란 무엇인가?").
  2. mask보다 disable을 우선시하세요: 표준 부팅 시퀀스 제거에는 disable을 사용하세요. mask는 지속적으로 문제가 되거나 완전히 제거하려는 보안 위험이 있는 유닛에만 사용하세요.
  3. 의존성 확인: 유닛 A를 비활성화하면 필요한 유닛 B가 손상되는 경우, 유닛 A를 다시 활성화하거나 유닛 B를 위한 대체 메커니즘을 찾아야 합니다.
  4. 재부팅 테스트: 중요한 변경 후에는 시스템을 재부팅(sudo reboot)하여 시스템이 깨끗하게 시작되고 필수 서비스가 계속 작동하는지 확인하세요.

변경 사항 확인

명령어를 실행한 후에는 항상 유닛이 더 이상 활성화되지 않았거나 예상대로 실행되지 않는지 확인하세요:

# 비활성화 후 상태 확인
systemctl status <unit_name.service>
# 출력에 'Loaded: loaded (...; disabled; vendor preset: disabled)'가 표시되어야 함

systemd 정리를 다른 프로덕션 변경 사항처럼 취급하세요: 유닛을 조사하고, 확실하지 않으면 임시로 중지하고, 테스트 후에만 비활성화하며, 어떤 경로로도 시작되어서는 안 되는 유닛에만 mask를 사용하세요. 이렇게 하면 일상적인 유지 관리를 복구 작업으로 만들지 않고 더 가벼운 호스트를 얻을 수 있습니다.