태그 보관물: systemd

[스터디-공지] WAYLAND 기반 윈도우 매니저 동작 원리 이해 (3주차)

이번 스터디에서는 윈도우 매니저의 입력 장치 관련된 내용을 진행하려고 합니다. 스터디에서 다룰 구체적인 내용은 아래와 같습니다.

  • 윈도우 매니저 입력 : 기본 동작 과정 (포커스, …)
  • 그랩 인터페이스 : 윈도우 위치/크기 변경 과정
  • 데이터 인터페이스 : 드래그&드롭, 셀렉션(클립보드), …
  • 가상 키보드/한글 입력 동작 과정
  • 세션 관리 : TTY(VT), SEAT, SYSTEMD/LOGIND, …

그리고 세미나 때 사용할 자료를 첨부하였으니 관심있으신 분들은 참고하시기 바랍니다.
http://www.slideshare.net/nemoux/3-39954418

세부 모임 공지는 아래와 같습니다.

일시 : 2014년 11월 1일 (토요일) 오후 2시 ~ 4시
장소 : 성균관대학교 자연과학캠퍼스 제 1공학과 21515호 (1호선 성균관대역)
연락 : nemoux00@gmail.com (페이스북 그룹 : https://www.facebook.com/groups/uxcoding/)

Advertisements

[WAYLAND] 가상 터미널과 세션 관리 (SYSVINIT+VT vs SYSTEMD+CONSOLED)

일반적으로 리눅스는 부팅을 하면 6개의 가상 터미널을 생성하고, 우리는 ALT+F[1-6] 키를 이용하여 가상 터미널을 이동하면서 사용한다. 오늘은 전통적인 SYSVINIT 과 VT 기반의 가상 터미널이 어떻게 동작하는지, 그리고 어떤 문제를 가지고 있는지와 이에 대한 대안으로 등장한 SYSTEMD 와 CONSOLED 에 대해 알아보자.

sysvinit+vt

위의 그림은 SYSVINIT 과 VT 기반의 가상 터미널 동작 과정이다. 우선 VT(Virtual Terminal) 는 리눅스 커널이 제공하는 가상 터미널 에뮬레이터이다. 간단히 얘기하면 모든 입력 장치(event0/1)로부터의 입력을 활성화된 가상 터미널(tty0)로 전달해주고, 활성화된 가상 터미널로부터의 출력을 하나의 출력 장치(card0)로 전달해주는 역할을 한다. 그리고 각각의 가상 터미널은 /dev/tty[1-6] 장치 파일을 통해 접근이 가능하다. 즉, SYSVINIT 을 통해 /sbin/getty 를 tty[1-6] 에 연결해놓으면 우리가 일반적으로 사용하는 리눅스 환경처럼 6개의 가상 터미널이 로그인 준비를 하게 된다는 말이다. getty 의 기본적인 역할은 할당받은 tty 로 표준입력(0) 과 표준출력(1)/에러(2) 파일디스크립터를 준비하고, “login:” 프롬프트를 출력한 후에 사용자 입력을 대기한다. 그리고 사용자가 usename 을 입력하면 해당 username 을 인자로 하여 /bin/login 프로그램을 실행(exec)한다. (이 때, fork 는 하지 않고 getty 가 미리 준비해둔 표준 입출력을 그대로 사용한다.) 그리고 login 은 사용자로부터 password 를 입력받은 후에, 틀리면 해당 프로세스를 종료하여 SYSVINIT 에 의해 다시 getty 가 실행되도록 하고, 맞으면 쉘(bash)을 실행(exec)한다. 이러한 과정을 거쳐 우리는 가상 터미널에서 로그인하여 쉘을 이용할 수 있게 된다. 그리고 가상 터미널을 교체하는 방법은 우리에게 매우 익숙한 ALT+F[1-6] 키를 입력하면 리눅스 커널의 VT 가 가로채서 해당 번호의 가상 터미널을 활성화하게 된다.

이러한 SYSVINIT 과 VT 는 굉장히 오랜 세월 동안 사용되어오던 방식으로 현재는 여러 가지 문제에 봉착하여 한계점을 드러내고 있다. 대표적으로 SYSVINIT 은 스크립트 기반이라는 점과 직렬/동기 방식의 초기화 과정으로 인해 부팅 속도 저하라는 한계점을 가지고 있고, VT 는 하나의 SEAT 만을 지원하고 커널에 터미널 에뮬레이션 관련 코드가 모두 포함되어 유지/보수를 어렵게 만드는 문제가 있다. 또한 VT 를 이용한 시그널 기반의 세션 교체는 예전부터 심각한 문제를 발생시켜왔다. 이는 특히 SYSVINIT 과 VT 기반의 X 그래픽 환경에서 많은 어려움을 유발시킨다.

sysvinit+x

위의 그림은 기본적인 X 그래픽 환경의 동작 과정이다. getty 를 기반으로 하는 텍스트 쉘 환경과는 다르게 X 그래픽 환경은 입출력 장치에 직접 접근할 필요가 있다. (그림이 약간 애매하게 그려져있는데, event0/1 과 card0/1 은 X 서버에 직접 연결되어있고, 그림에서는 X 서버가 tty0 에 속해있다는 의미로 받아들이면 되겠다.) 그래서 X 서버는 DRM 과 EVDEV 를 통해 입출력 장치를 직접 제어하게 된다. 여기서 문제는 사실 여러 가지가 겹쳐있는데 우선, 다른 가상 터미널로 이동할 때 X 서버가 직접 DRM 과 EVDEV 에 대한 접근을 내려놓아야 한다는 것이다. 이를 위해 커널의 VT 는 가상 터미널을 교체하는 과정에서 X 서버에게 시그널을 보내는데, 만약에 X 서버가 이를 제대로 처리하지 못 하면 시스템은 먹통이 되어버린다.

이 외에도 SYSVINIT 과 VT 는 여러 가지 문제를 가지고 있고, 이를 해결하기 위해 나온 것이 바로 SYSTEMD 와 CONSOLED 이다. 사실 SYSTEMD 는 SYSVINIT 을 대체하기 위해 나온 것이고, CONSOLED 는 커널 레벨의 터미널 에뮬레이션(VT)을 유저 레벨에서 구현한 것이라고 보면 된다. 하지만, SYSTEMD 도 아직 한창 작업 및 표준화 중이고, CONSOLED 는 얼마 전에 공개되었기 때문에 아직 동작이 명확하지 않은 부분도 있고, 기존의 SYSVINIT 과 VT 와 혼용해서 사용하는 경우도 많다. 그래서 오늘은 기본적인 이해를 위해 꼭 필요한 부분만 간단히 설명하도록 하겠다.

systemd+consoled

우선 SYSTEMD 에서 가장 중요한 부분 중에 하나인 LOGIND 에 대해 알아보자. 기본적으로 SYSTEMD 는 모든 서비스(세션)가 직접 장치 파일을 여는 것을 금지하고 있다. 기본적으로 장치 파일을 열기 위해서는 D-BUS 를 통해 LOGIND 에 요청하고, LOGIND 는 해당 장치 파일을 대신 열고 해당 세션에 등록한 후, 장치 파일을 요청한 서비스에게 전달해준다. 이렇게 하는 가장 큰 목적은 LOGIND 가 모든 장치 파일에 대한 제어권을 가지기 위해서이다. 그래서 기존과 달리 LOGIND 에서는 가상 터미널을 교체할 때 시그널을 전달할 필요없이 해당 세션에서 사용 중인 장치 파일을 직접 중지시킬 수 있다. (이를 위한 인터페이스는 DRM 과 EVDEV 에서 이미 제공하고 있다.) 이러한 기능 덕분에 X 서버가 다운되거나 다른 문제가 발생하더라도 시스템 전체가 먹통이 되는 일을 막을 수 있게 된다.

그리고 CONSOLED 는 위에서 간단히 언급했던 대로 터미널 에뮬레이터이다. 그래서 터미널에서 사용하는 입출력 장치를 관리하기 위해 입력은 EVDEV 를, 출력은 DRM 을 사용한다. (당연히 해당 장치 파일은 LOGIND 를 통해 열게 된다.) 그리고 쉘과의 통신을 위해서는 PTY 를 사용하는데, 이는 간단히 설명하면, 기존의 TTY 를 이용하는 쉘은 쉘의 표준 입출력이 커널에 있는 VT 와 바로 연결되어 있지만, CONSOLED 에서 사용하는 쉘은 쉘의 표준 입출력이 프로세스 형태로 동작하는 CONSOLED 에 연결되어있기 때문에 쉘과 CONSOLED 를 위한 IPC 로 사용되는 것이라고 보면 된다. 이는 기존에도 많이 사용되던 방식으로, 대표적인 예가 바로 SSH 와 GNOME-TERMINAL 이다. SSH 와 GNOME-TERMINAL 에서도 쉘과의 통신을 위해 PTY 를 사용한다.

그렇다면 기존의 커널의 VT 에서 처리해주던 가상 터미널 이동은 어떻게 할까? 기존보다 훨씬 단순해졌는데, 기본적인 과정은 ALT+F[1-6] 키를 CONSOLED 가 받아서 D-BUS 로 SwitchTo 메소드를 호출한다. 그러면 LOGIND 가 이 메소드를 받아서 앞에서 잠깐 설명했던 것처럼 이전 세션에서 사용 중이던 모든 장치 파일을 중지시키고, 다음 세션에서 사용할 모든 장치 파일은 재시작시킨다. 이전보다 훨씬 간단하면서도 강력한 제어가 가능해진 것이다.

지금까지 SYSVINIT 과 VT, 그리고 SYSTEMD 와 CONSOLED 에 대해 설명하였다. 현재 많은 배포판과 프로젝트들이 SYSTEMD 를 적용하기 위한 작업을 진행하고 있지만, X11 에서 WAYLAND 로 넘어가는 것처럼 수많은 일들이 걸쳐있기 때문에 언제 일이 완료될지는 모르겠다. 그리고 CONSOLED 가 잘 진행되어 커널에서 VT 관련 코드를 완전히 제거할 수 있는 날이 어서 빨리 오기를…

Systemd/Logind 참고자료

리눅스의 Virtual Terminal 동작 과정과 한계점, 그리고 Multi-Seat, Multi-Session, systemd/logind 등에 대해 짧고 명쾌하게 설명이 되어있는 블로그를 소개드립니다. 블로그 운영자는 David Herrmann 이라는 사람으로 Wayland/Weston 과 DRM/KMS 관련 오픈소스 활동을 굉장히 열심히 하고 있는 사람입니다.

http://dvdhrm.wordpress.com/2013/08/24/session-management-on-linux/
http://dvdhrm.wordpress.com/2013/08/24/how-vt-switching-works/
http://dvdhrm.wordpress.com/2013/08/25/sane-session-switching/