Linux generic

psycho 2013. 1. 11. 00:58

※이 글은 openSUSE 12.2를 기준으로 하여 작성되었다. 다른 배포판을 전부 시험해본 것이 아니므로 서술된 내용과는 약간의 차이가 있을 수 있다.

※이 글에서 다루고 있는 내용은 완전하게 테스트되지 않았다. 언제라도 문제가 발생할 수 있으며, 만약 이 글의 설명과 다른 현상이 목격되면 제보 바란다.


 요즘 Linux 배포판에는 종래의 Sys-V init 대신 systemd라는 물건이 올라가 있다. 시스템 서비스 관리를 상당히 체계적으로 만들어준 것까지는 상당히 높은 평가를 줄 수 있지만, 문제는 별 쓸데없는 기능까지 통합해서 "필수"로 돌린다는 데 있다. 이번에는 "도대체 왜 있는 건지 모를"1 기능 중 하나인 journald를 비활성화하는 방법을 소개한다.


 journald는 파일시스템의 저널링 기능을 시스템 전체 영역으로 확대했다고 보면 정확하지는 않아도 이해가 빠르다. 차이점이라면 journald는 기본적으로 단지 기록만을 맡으며 파일시스템의 그것처럼 자동적인 오류 복구에 사용하기는 용이하지 않다는 점이다. 이렇게 보면 보통의 시스템 로그와 별다를 게 없어 보인다. 그런데도 불구하고, 이 물건은 램과 디스크에 이중으로 파일을 저장한다. 기존의 시스템 로그에 비해 큰 도움도 안 되는 정보를 저장하는 데 귀중한 시스템 자원을 엄청나게 낭비하는 꼴이다. 물론 일정 주기로 로그를 지워준다지만 램과 디스크 공간이 남아돌아서 처치곤란인 수준이 아닌 다음에야 (이 로그가 필요없다는 전제하에) 로그를 기록하지 않는 방법을 찾는 것이 인지상정일 것이다.


 systemd 초기 버전을 탑재한 Linux 배포판에서는 설정 파일이 /etc/systemd/journald.conf에 위치하며 "Storage=none"을 추가해서 로그 기록을 막을 수 있었다. 그런데, 언젠가부터 설정 파일이 /etc/systemd/systemd-journald.conf인 배포판이 등장했으며, 이런 경우에는 "Storage=none"이 동작하지 않는다. man page를 확인해보면 아예 Storage라는 옵션 자체가 없다. 로그 파일 크기를 제한하는 옵션은 있지만, 이걸 사용해서 기록을 막을 수는 없다.


 보통의 다른 서비스의 경우에는 다음과 같은 식으로 동작하지 않게 만들 수 있다.

 systemctl disable (서비스명) 혹은 systemctl mask (서비스명)

 당연하게도 systemd-journald에는 효과가 없다. 꼴에 의존하는 다른 서비스가 많은 일종의 "필수" 서비스로 되어 있어 disable은 전혀 먹히지 않고, 강제로 실행을 차단하는 mask를 해버리면 정상적으로 부팅되지 않고 emergency mode로 진입하게 된다. 덕분에 로그 기록을 못 하게 하려면 꽤 지저분한 삽질을 해 줘야 한다.


 일단 디스크에 기록하지 못하게 하는 방법은 그다지 어렵지 않다. /var/log/journal 디렉토리만 지워주면 그만이다. 물론 다시 기록하게 하고 싶으면 해당 디렉토리를 다시 만들어주면 된다. 이는 systemd-journald의 기본 동작 사양으로, /var/log/journal 디렉토리가 없으면 자동으로 만들지 않기 때문에 가능하다. 하지만, 똑같은 로그가 /run/log/journal 디렉토리에도 기록되며, /run이 보통 tmpfs로 마운트되기 때문에 이쪽은 "램에 기록된다"로 표현하였다. 이 디렉토리는 없으면 자동으로 새로 만들어서 기록해버리기 때문에 /var/log/journal만큼 처리하기가 간단하지 않다. 이쪽은 같은 systemd의 기능 중 하나인 tmpfiles-setup이라는 서비스를 이용하여 제거할 수 있다.


 /usr/lib/tmpfiles.d 디렉토리 안에 run_log.conf2라는 파일을 만든다. 내용은 다음과 같이 한다.


D /run/log/journal 0555 root root -


 이는 시스템 시작시 /run/log/journal 디렉토리를 만들되 안의 내용을 확실하게 비워버리며, permission을 0555로 설정하여 쓰기를 할 수 없게 만든다3. journald가 tmpfiles-setup보다 먼저 동작하기 때문에 명시적으로 내용을 지워주지 않으면 이미 만들어진 파일을 통해 로그를 남길 수 있게 된다. 이 설정 파일의 형식에 대한 자세한 설명은 tmpfiles.d의 man page를 확인하라.


 이상으로 굉장히 지저분한 대상에 대한 굉장히 지저분한 설명을 마친다. 혹시 좀 더 깔끔한 방법을 알고 있는 독자가 있다면 제보 바란다. 개인적으로는 systemd 개발진 쪽에서 이렇게 사람을 고생시키는 삽질은 좀 그만둬줬으면 하지만, 단시간에 바뀌기는 힘들 것이라 본다.

각주 1

어디까지나 필자의 주관적인 판단이다.

각주 2

파일 이름은 무엇이든 상관없다. '.conf'로 끝나는 것만 지키면 된다.

각주 3

permission 조정은 실상 별 효과가 없다. 중요한 것은 "기존의 내용을 확실하게 비운다"는 것이다.

  1. 어디까지나 필자의 주관적인 판단이다. [본문으로]
  2. 파일 이름은 무엇이든 상관없다. '.conf'로 끝나는 것만 지키면 된다. [본문으로]
  3. permission 조정은 실상 별 효과가 없다. 중요한 것은 "기존의 내용을 확실하게 비운다"는 것이다. [본문으로]