개요
systemd는 시스템 부팅 과정을 효율적으로 관리하고, 실행 중인 서비스들을 감독하며, 시스템의 다양한 상태를 제어하는 핵심적인 역할을 합니다. init이 순차적으로 스크립트를 실행하는 방식과 달리, systemd는 의존성 기반으로 서비스들을 병렬 처리하여 부팅 속도를 크게 향상시킵니다. 이는 현대 리눅스 시스템의 성능과 안정성에 기여하는 중요한 요소입니다.
주요 특징
systemd의 주요 특징은 다음과 같습니다.
- 병렬 부팅: 서비스 의존성을 분석하여 동시에 여러 서비스를 실행하므로 부팅 시간을 단축합니다.
- 통합 관리: 시스템 부팅, 서비스, 장치, 로그 등 다양한 요소를 단일 프레임워크로 관리합니다.
- 서비스 모니터링: 서비스가 실패할 경우 자동으로 재시작하는 등 안정적인 운영을 돕습니다.
- 런레벨 대체: 런레벨(runlevel) 대신 '타겟(target)'이라는 개념을 도입하여 시스템 상태를 제어합니다.
init과의 관계
systemd는 전통적인 init 시스템의 후속이자 대체자입니다. init이 수행하던 시스템 시작 및 종료의 역할을 계승하고, 더 나은 기능들을 추가했습니다.
- init: 가장 먼저 실행되는 프로세스로, 부팅 시 `/etc/inittab` 파일을 참조하여 런레벨에 따라 순차적으로 스크립트를 실행했습니다.
- systemd: 역시 PID 1번 프로세스지만, 런레벨 대신 '타겟'을 사용하며, 의존성 기반으로 서비스를 병렬 처리하여 더 빠르고 유연합니다.
- 호환성: 대부분의 현대 리눅스 시스템에서 init은 systemd의 심볼릭 링크로 연결되어, init 명령어를 사용해도 systemd가 대신 동작하게 됩니다.
핵심 개념
systemd를 이해하는 데 필수적인 핵심 개념들입니다.
유닛(Unit)
systemd가 관리하는 모든 객체(서비스, 마운트 지점, 장치 등)는 '유닛'으로 정의됩니다. 각 유닛은 특정 작업을 정의하는 설정 파일(`*.service`, `*.mount` 등)을 가집니다.
- Service Unit: 웹 서버(nginx.service)나 데이터베이스(mysql.service)와 같은 백그라운드 프로세스를 관리합니다.
- Target Unit: 여러 유닛을 그룹화하는 역할을 합니다. 런레벨을 대체하는 개념으로, 'multi-user.target'은 멀티 유저 모드, 'graphical.target'은 그래픽 모드를 의미합니다.
- Mount Unit: 파일 시스템 마운트 지점을 관리합니다.
systemctl
systemd를 제어하는 주요 명령어 라인 유틸리티입니다. 서비스를 시작, 중지, 재시작하거나, 유닛 상태를 확인하는 데 사용됩니다.
- 서비스 시작: sudo systemctl start nginx
- 서비스 상태 확인: sudo systemctl status nginx
- 시스템 재부팅: sudo systemctl reboot
journalctl
systemd에서 통합적으로 관리하는 시스템 로그를 조회하는 명령어입니다. 서비스별, 시간별, 우선순위별로 로그를 필터링하여 확인할 수 있습니다.
- 전체 로그 보기: journalctl
- 특정 서비스 로그 보기: journalctl -u nginx.service
- 실시간 로그 보기: journalctl -f
사용 예시
systemd의 핵심 명령어인 systemctl과 journalctl의 사용 예시입니다.
시스템 부팅 타겟 확인
systemctl get-default
시스템이 어떤 타겟으로 부팅되었는지 확인합니다.
시스템 종료
sudo systemctl poweroff
systemd를 통해 시스템을 안전하게 종료합니다. poweroff 명령어와 동일한 기능을 수행합니다.
특정 서비스 활성화/비활성화
sudo systemctl enable nginx
sudo systemctl disable nginx
시스템 부팅 시 특정 서비스가 자동으로 시작되도록 설정하거나, 비활성화합니다.
서비스 재시작
sudo systemctl restart nginx
실행 중인 웹 서버 서비스를 재시작합니다. 설정 파일을 변경했을 때 유용합니다.
팁 & 주의사항
systemd 사용 시 알아두면 좋은 점들입니다.
팁
- systemd의 유닛 파일들은 주로 `/etc/systemd/system/` 또는 `/lib/systemd/system/` 디렉토리에 위치합니다.
- systemd는 대부분의 부팅/종료 관련 명령어를 통합하여 관리합니다. 따라서 `halt`, `reboot`, `poweroff` 등은 `systemctl`의 심볼릭 링크인 경우가 많습니다.
- `systemctl status` 명령으로 서비스의 상태뿐만 아니라 최근 로그까지 한 번에 확인할 수 있습니다.