systemd 관련

1 출발점

며칠 전에 내 젠투 portage를 업데이트 했더니 Gnome 3.8이 올라와 있었다(ACCEPT_KEYWORDS~amd64). 얼씨구나 드디어 기다리던게 왔구나 하고 시스템을 업그레이드 하려니 emerge 가 systemd와 consolekit를 같이 설치할 수 없다는 에러메시지를 뿌린다. 둘 중 하나를 선택해야 한단다.

웹서핑을 약간 해보니 Gnome 3가 systemd를 쓰게 되었다는 얘기가 얼핏 보이고, consolekit는 더이상 관리되지 않기 때문에 안쓰는게 좋다는 얘기가 보였다. 더구나 현재 내 젠투에서 systemd을 설치하지 않으면 Gnome 3.8로 업그레이드 하는 것을 더 이상 진행할 수 없기도 하거니와 이미 3.6 패키지들을 막 지운 상태여서, 이렇게 된 이상 청와대 아니 systemd로 가야 했다.

문제는 이 systemd 가 기존의 init 시스템인 OpenRC 를 대체한다는 점이다. 즉 시스템의 부팅을 관장하는 프로그램이 바뀌는 것이 때문에 무턱대로 설치할 수도 없는 노릇이었다. 그래서 우선 systemd 로 왜 바꾸는지, 그리고 이게 도데체 무엇인지 좀 알아봤다.

2 이건 또 뭐야?

systemd는 오랫동안 사용되어 온 shell script 기반의 init 시스템을 대체하기 위해 만들어졌다. 가장 큰 특징은 부팅시에 띄워야 하는 서비스 수를 최대한 줄이고, 서비스 간의 의존성을 없애서 서비스들을 병렬로 실행하게 함으로써 부팅속도를 획기적으로 개선했다는 점이다. 가령 bluetoothd 와 같은 daemon은 블루투스 동글이 접속되지 않은 이상 꼭 떠야할 필요는 없다. 즉 그것이 필요할 때까지 최대한 기다려서 띄우는 방식이라 꼭 부팅 때 실행할 필요가 없게 만든 것이다. 또 서비스 간의 의존성이란, 예를 들어 D-Bus가 실행되려면 로그시스템인 syslog가 먼저 준비되어 있어야 하는 경우처럼 순차적으로 꼭 실행해야하는 것을 의미한다. 하지만 systemd는 이 부분을 각 서비스가 의존하고 있는 선행 서비스에서 꼭 필요한 부분이 그 서비스 전체가 아니라 소켓이라는 사실을 이용하여 해당 소켓을 먼저 생성해 두고, 경우에 따라 들어오는 시그널은 소켓 버퍼에 쌓아두었다가 해당 서비스가 준비 완료되면 그것을 처리하게 해주는 방식으로 의존성을 낮추었다고 한다.

암튼 이런 기발한 방법으로 시스템의 부팅속도를 높였다. 이런 장점 외에도 대부분 c로 구현되어 있어서, 실행중 사용하는 다른 유틸리티들 때문에 수시로 포크가 일어나는 shell script 기반의 실행속도 보다 훨씬 빠르다고 한다. 이런 저런 이유로 최근 배포판들의 대세가 된 듯한데…

이거 반대하는 쪽도 꽤 있나보다. systemd 메인개발자 중 한명이 PulseAudio 개발자인데 이걸 싫어하는 사람들이 systemd도 싫어하는 듯 하다(나는 PulseAudio의 내력을 잘 몰라서 뭐가 문제인지 모르겠다). 그런데 그들의 주장 또한 일리가 있는 듯 한다. 우선 systemd가 이식성이 낮아서 리눅스에만 적용할 수 있다는 점이다. Debian의 경우 커널을 리눅스 뿐만 아니라 FreeBSD나 Hurd 버전도 있기 때문에 systemd을 default로 적용하기 어렵다고 한다. 또 다른 이유로는 소켓 preallocation 관련하여 각 데몬들에 패치를 적용해야한다는 점이다.

3 그럼 설치는?

우선 내 젠투에는 consolekit와 충돌을 없애야 했다. 그래서 사용한 방법은 강제로 consolekitUSE flag를 제거하고 systemd 를 추가하는 것이었다.

# in the /etc/portage/profile/use.force
-consolekit

와 같이 하고,

# in the /etc/portage/make.conf
USE="${USE} -consolekit systemd"

한 다음,

emerge --ask --changed-use --deep world

를 실행해 준다.

이 와중에 emerge --depcleanrevdep-rebuild 를 번갈아 가면 몇번 더 실행했다.

암튼 시스템이 정상적으로 설치가 되었다면 systemd도 설치가 되었을 것이다. systemd가 설치된 디렉토리는 대충 다음과 같다.

/usr/lib/systemd 혹은 /usr/lib64/systemd
service나 target 같은 기본 설정파일들이 들어있다. 젠투에서만 /usr 아래로 가 있고, 기본적으로는 /lib/systemd 이다.
/bin/systemd
init으로 실행되는 파일이다. 젠투에서는 /usr/lib/systemd/systemd 의 심볼릭 링크이다.
/etc/systemd
만약 여기에 특정 서비스에 대한 설정파일이 있다면 /usr/lib/systemd 에 있는 같은 설정파일은 무시된다. 일반적으로는 systemctl 으로 서비스를 추가할 경우 /usr/lib/systemd 에 있는 것이 링크된다.

그 다음, systemd가 부팅에 관여하게 하려면 커널 파라미터로 init=/usr/lib/systemd/systemd 를 추가해주면 된다. grub 설정 파일에 위 내용을 추가하고 재부팅해보면 OpenRC가 아닌 systemd가 부팅을 관장하는 것을 볼 수 있을 것이다. 구체적인 내용은 여기저기 를 참조.