시스템의 불필요한 systemd 서비스 및 타이머 비활성화 모범 사례
시스템 리소스를 효율적으로 관리하는 것은 빠르고 안전하며 안정적인 Linux 환경을 유지하는 데 매우 중요합니다. 최신 배포판에서 보편적으로 사용되는 systemd init 시스템 및 서비스 관리자는 부팅 시 또는 이벤트에 의해 트리거되는 방대한 수의 서비스, 소켓 및 타이머를 제어합니다. systemd는 매우 다재다능하지만, 사용되지 않는 구성 요소를 불필요하게 실행하면 메모리, CPU 사이클을 소비하고 잠재적으로 공격 표면을 늘릴 수 있습니다.
이 가이드에서는 불필요한 systemd 유닛(서비스, 소켓 및 타이머)을 식별, 평가 및 안전하게 비활성화 또는 마스킹하는 모범 사례에 대한 포괄적인 안내를 제공합니다. 활성 유닛을 간소화하면 부팅 시간을 크게 개선하고 시스템의 전반적인 운영 부하를 줄일 수 있습니다.
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. 서비스 비활성화 (향후 시작 방지)
유닛을 비활성화하면 다음 부팅 시 자동으로 시작되지 않도록 하고 현재 실행 중인 경우 즉시 중지합니다. 이것은 사용되지 않는 서비스에 대한 표준 접근 방식입니다.
sudo systemctl disable <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 cups.service
# 관련 타이머 비활성화 (있는 경우)
sudo systemctl disable cups-browsed.timer
예제 2: 원치 않는 Snapd 서비스 처리 (DNF/APT를 기본적으로 사용하는 경우)
일부 배포판은 snapd를 설치합니다. 스냅을 사용하지 않는 경우 기본 서비스 구성 요소를 중지하고 비활성화하는 것이 좋습니다.
sudo systemctl stop snapd.service
sudo systemctl disable snapd.service
⚠️ 배포판별 서비스 경고: 배포판의 핵심 패키지 관리자(예:
systemd-networkd또는 NetworkManager 구성 요소)에서 직접 제공하는 서비스를 비활성화할 때는 매우 주의하십시오. 비활성화하기 전에 유닛의 기능을 철저히 조사하십시오. 그렇지 않으면 네트워크 연결 손실 또는 시스템 불안정으로 이어질 수 있습니다.
모범 사례 요약
- 항상 먼저 조사하십시오:
disable또는mask를 실행하기 전에 해당 배포판에서 특정.service또는.timer유닛이 하는 일에 대해 온라인으로 검색하십시오(예: "ModemManager.service란 무엇입니까?"). mask보다disable우선: 부팅 시퀀스에서 표준 제거를 위해disable을 사용합니다. 완전히 제거하려는 지속적으로 문제가 있거나 보안 위험이 있는 유닛의 경우mask를 예약합니다.- 종속성 확인: 유닛 A를 비활성화하여 필요한 유닛 B가 작동하지 않는 경우 A를 다시 활성화하거나 B에 대한 대체 메커니즘을 찾아야 합니다.
- 재부팅 테스트: 중요한 변경 후 시스템을 재부팅(
sudo reboot)하여 시스템이 깨끗하게 시작되고 필수 서비스가 계속 작동하는지 확인합니다.
변경 사항 확인
명령을 실행한 후에는 예상대로 유닛이 더 이상 활성화되거나 실행되지 않는지 항상 확인하십시오.
# 비활성화 후 상태 확인
systemctl status <unit_name.service>
# 출력에는 'Loaded: loaded (...; disabled; vendor preset: disabled)'가 표시되어야 합니다.
systemd 구성을 정기적으로 감사하고 간소화하면 Linux 머신이 명시적으로 요구하는 작업에만 리소스를 할당하여 성능을 개선하고 오버헤드를 줄일 수 있습니다.