본문 바로가기

Linux/systemd

systemd 유닛 설정 수정하기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

최근 대부분의 배포판들이 systemd를 init으로 사용하고, 패키지 안에 systemd service 유닛 파일을 포함하고 있어서 사용자는 그냥 systemctl 명령으로 프로그램을 실행, 중지를 하면 됩니다. 그런데 몇몇 패키지 간에 우선순위나 환경변수, 리소스 컨트롤이 필요한 경우가 발생할 수 있습니다. systemd는 최대한 동시에 실행하려하기 때문에 우선순위를 제대로 정하지 않는다면 실행이 성공할 수도 있고 실패할 수도 있는 마치 슈뢰딩거의 고양이같은 상황이 발생할 수 있습니다. 저의 경우는 postfix와 bind9이 동일한 서버에 있고 postfix가 bind9이 완전히 실행되기도 전에 제 서버의 도메인을 리졸브 시도를 하여 실행 실패한 적이 있었습니다. 우연히 bind9이 빨리 실행되어 postfix가 문제없이 실행되기도 해서 알아채기도 어려웠습니다.

 

그렇다고 /usr/lib/systemd/system/ 디렉토리에 패키지 매니저가 설치한 유닛을 직접 수정하는 것은 좋지 못합니다. 업데이트를 하면 다시 원상태로 돌아가버릴테고 다시 기존의 설정으로 돌리기도 어려워질 수 있습니다. 이를 위해서 systemctl에 edit, revert 명령이 존재합니다.

 

먼저 edit 명령은 기본적으로 drop-in 디렉토리와 파일을 생성하여 유닛이 실행될 때 해당 파일에 들어있는 내용을 추가로 적용시킵니다. 예제를 위해 저는 아래의 유닛을 /etc/systemd/system/test.service 로 생성하였습니다.

[Unit]
Description=test service

[Service]
ExecStart=/bin/wall test

[Install]
WantedBy=multi-user.target

systemctl status test.service로 보면 아래와 같이 나옵니다.

 

이제 edit 명령을 사용하여 Description을 수정해 보겠습니다. 아래의 명령을 실행하면 vi, vim, nano 중에 하나로 텍스트 편집기가 뜹니다.

# systemctl edit test.service

여기에 기존의 Unit 작성법대로 변경하거나 추가할 섹션과 설정을 적어주면 됩니다. 저는 Description을 수정할 예정이기에 [Unit]섹션과 Description= 설정을 넣었습니다.

이제 다시 systemctl status로 확인하면 설명이 바뀌었고 Drop-in 이 생긴 것을 볼 수 있습니다.

 

추가적으로 edit 명령에 --runtime 옵션을 사용할 수 있습니다. 이 옵션과 함께 수정된 설정은 시스템이 켜져있을 때만 적용되고 리부팅하면 원상태로 돌아가게 됩니다. 대신 이미 --runtime 옵션없이 drop-in이 생성되었다면 /run 디렉토리보다 /etc 디렉토리가 우선순위가 높기 때문에 거부합니다.

 

이제 revert 명령으로 drop-in들을 삭제하여 원상태의 유닛 설정으로 되돌릴 수 있습니다.

# systemctl revert test.service

 

 

추가적으로 리소스 제한할 때 주로 사용하는 set-property 명령도 있습니다만 edit 가 좀 더 범용적으로 사용할 수 있고 edit를 사용할 줄 알면 set-property를 사용하는 것도 간단합니다. 짧은 예제로 아래와 같이 실행하면 해당 유닛에 포함되는 프로세스들의 최대 메모리 사용량을 1GB로 제한 할 수 있습니다.

# systemctl set-property test.service MemoryMax=1G