Suckless 데스크탑 환경에 대해 간단하게 설명하고, 그 중 가장 핵심적인 프로그램인 dwm의 설치 과정과 사용법을 정리해본다.


미리보는 Suckless 환경

백문이 불여일견이므로,

서브레딧 r/unixporn에서 Suckless 소프트웨어를 충실히 사용하면서도 가장 예쁜 예시를 꼽아왔다 (홍보 대사 급 무브).

[dwm] Cherry and rose from r/unixporn


위에 보이는 전반적인 디스플레이 환경과, 터미널 에뮬레이터, 인터넷 브라우저, 탭 도구 모두 Suckless 소프트웨어이다. 위 예시는 커스터마이징 경험이 꽤 있어야 구축 가능한 환경이고, 초보인 나는 외관 변경 없이 기본적인 기능만을 사용하고 있다. 그래도 기본적으로 웹서핑을 제외한 자신의 대부분의 일이 터미널에서 이루어진다면, Suckless 환경은 시스템 리소스 효율성이나 작업 생산성 측면에서 탁월한 선택이 될 것이다.

이 환경에 관심이 간다면, 본격적으로 알아보러 가보자.


Suckless Softwares

이 섹션의 모든 내용은 suckless.org에서 찾아볼 수 있다. 다만 여기 저기 흩어져있는 내용들을 묶어서 정리한 것이다. 여기에서 "무언가 강력하게 주장하는 바"는 블로그 주인인 내가 주장하는 것이 아니고, Suckless 단체에서 주장하는 바임을 밝힌다. "~라고 한다" 라고 계속 쓰기엔 글이 지저분해지기 때문에, 내가 주장하는 것처럼 쓰는 점을 알아주시길 바란다.


Suckless 소프트웨어란? 컴퓨터 전문가가 사용하기에 알맞은, 매우 정제된 코드 베이스를 추구하는 가볍고 빠른 오픈소스 소프트웨어. 주요 철학을 몇 영어 단어로 요약하자면 simple, minimal, usable한 프로그램과 simplicity, clarity, frugality를 가진 코드.

이 세상에 많은 사람들이 사용하기 편한 멋진 소프트웨어가 많고, 또한 계속 만들어지고 있는 반면, 이와 동시에 무겁고 복잡하며 에러가 나기 일쑤인 프로그램이 만연하는 것도 사실이다. 또한 소프트웨어 유행이 이런 방향으로 지속되면서 숙련된 프로그래머를 위한 것들은 외면당하고 있다. 그래서 Suckless 소프트웨어는 숙련된 컴퓨터 전문가를 사용자로 삼고 질 좋은 소프트웨어를 제공하는 것을 목표로 한다.

코드를 쓰는 것만이 프로그래밍이 아니다. 코드를 줄이는 것은 더욱 어려운 프로그래밍이다. 프로그래머가 코드를 쓰는 것만 신경쓰고 코드의 질에 대해 신경쓰지 않는다면, 그 결과물은 비대하고 일관적이지 못해서 거의 사용할 수 없는 지경이 될 것이다. X window system의 표준 터미널 에뮬레이터라는 xterm의 README를 볼까? (suckless.org에서 보고 믿기지가 않아서 직접 소스코드를 찾아보고 확인했다.)

-- $XTermId: README,v 1.3 2007/05/24 19:49:19 tom Exp $
-- Below is the original README for xterm from 1991, for your amusement.
-- For a better overview, see http://invisible-island.net/xterm/
-------------------------------------------------------------------------------
                        Abandon All Hope, Ye Who Enter Here


This is undoubtedly the most ugly program in the distribution.  It was one of
the first "serious" programs ported, and still has a lot of historical baggage.
Ideally, there would be a general tty widget and then vt102 and tek4014
subwidgets so that they could be used in other programs.  We are trying to
clean things up as we go, but there is still a lot of work to do.

If you are porting this to a machine that has problems with overlapping
bcopy's, watch out!

There are two documents on xterm: the man page, xterm.man, which describes
how to use it, and ctlseqs.ms, which describes the control sequences it
understands.


하지만 코드를 더 좋은 방향으로 줄이거나, 다시 쓰는 것은 현실에선 흔히 일어나지 않는 일이다. Suckless 소프트웨어 팀은 기존의 구린 프로그램들을 처음부터 새롭게 만들어왔고, 지속적인 리뷰와 개선을 통해 최소한의 코드로 좋은 효율성과 가독성을 가지는 프로젝트들을 유지해나가고 있다.


Suckless 소프트웨어는 공통적으로 가지고 있는 철학이 있다.

  • UNIX 계열 운영체제를 기반으로 하는 오픈소스 프로젝트이다.
  • C 언어로 작성된 프로그램으로, 최소한의 코드로 필수적인 기능만을 구현한다.
  • 설정은 곧 헤더 파일이다. 따라서 설정을 바꾼다는 것은 헤더 파일을 수정해서 스스로 컴파일하는 것을 의미한다.
  • 추가적인 멋진 기능은 추가하지 않는다. 대신 사용자들이 공유한 patch를 적용시켜서 기능을 추가시킨다.

주로 성능에 초점이 맞추었다고 보여진다. 특히나 헤더 파일이 곧 설정 파일이라는 생각은 초심자인 나에겐 충격적이었다.

이게 무슨 소린가 싶으면, 아래 dwm 튜토리얼을 보시라.


Main Lineup

프로그래머가 사용하기 편한 환경을 위한 Suckless 소프트웨어로 대표적인 것들을 몇 나열해보겠다.

  • dwm (dynamic window manager): 윈도우 매니저, 데스크탑 환경
  • dmenu (dynamic menu for X): 시스템 PATH에서 찾을 수 있는 실행 파일을 쉽게 찾아서 실행할 수 있는, 한 마디로 런쳐
  • st (suckless terminal, 또는 simple terminal): 터미널
  • tabbed + surf: 탭 도구 + 인터넷 브라우저
  • slock (simple X display locker): 화면 보호기

인터넷 브라우저의 탭 기능을 별도의 프로그램으로 따로 분리한 점은 "Do one thing and do it well" 이라는 UNIX 철학을 잘 따르는 예라고 볼 수 있다 (dwm + dmenu 역시 마찬가지이다).


dwm Tutorial

Suckless 소프트웨어 중에서 가장 유명한 소프트웨어인 dwm을 설치하고 설정하는 법을 간단하게 소개하려 한다.


윈도우 매니저가 뭐야, dwm이 뭐야

아직도 이게 뭔지 모르겠는 분들을 위해 간단히 설명해보려 한다. UNIX 계열 운영체제의 GUI (graphical user interface) 시스템은 크게 두 가지 부류로 나눌 수 있는데, desktop environment와 window manager다.

Desktop environment는 곧 MS Windows나 Ubuntu 데스크탑을 생각하면 된다. 사용자가 필요로 할 것 같은 모든 기능을 한 묶음으로 파는, 말 그대로 "데스크탑 환경"이다. 반대로 window manager는 한 프로그램이 GUI에 나타나는 단위인 "창 (window)"의 위치와 행동을 제어하는 것만을 목표로 한다. Desktop environment는 window manager를 포함해서 파일 탐색기, 화면 보호기 등의 여러 기능들이 더 포함된 패키지라고 볼 수 있겠다.

dwm은 단어 그대로 윈도우 매니저 중 하나이다. 여러 윈도우 매니저들 중에서도 적은 코드, 가벼움, 빠른 성능을 장점으로 갖고 있다.


글로 설명하는 것보다 영상으로 보는 것이 훨씬 나을 것 같다. Kai Hendry의 유튜브 채널의 영상 몇 개를 추천한다.


아래에 계속되는 나의 정리는 눈으로 읽고 "이런 식이구나" 파악하는 정도로 도움이 되리라 생각한다. 직접 해보자 한다면, 꼭 영상과 함께 따라해보시길 추천한다.


설치 전 준비물

  • 인터넷이 연결된 Linux 환경
  • C 컴파일러 (기본적으로 cc를 사용한다), make
  • Git
  • X11 디스플레이 시스템
  • 최소한의 정상적인 dwm 경험을 위해서 dmenu와 st는 설치되어 있는 것이 좋다.


소스 코드 가져오기

공식 repository에서 clone해서 쉽게 소스 코드를 가져올 수 있다.

$ git clone https://git.suckless.org/dwm


그대로 실행해보기

다짜고짜 make를 실행해서 문제 없이 컴파일이 되는지 확인해보자.

$ cd dwm
$ make
dwm build options:
CFLAGS   = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os -I/usr/X11R6/include -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION="6.1" -DXINERAMA
LDFLAGS  = -L/usr/X11R6/lib -lX11 -lXinerama -lfontconfig -lXft
CC       = cc
cc -c -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os -I/usr/X11R6/include -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"6.1\" -DXINERAMA drw.c
cc -c -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os -I/usr/X11R6/include -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"6.1\" -DXINERAMA dwm.c
cc -c -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os -I/usr/X11R6/include -I/usr/include/freetype2 -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"6.1\" -DXINERAMA util.c
cc -o dwm drw.o dwm.o util.o -L/usr/X11R6/lib -lX11 -lXinerama -lfontconfig -lXft


위처럼 에러가 나지 않았다면 잘 된 것이다. 컴파일이 잘 됐다면 실행을 해봐야 하는데, 실행을 위해 몇 가지 알아야 할 사항이 있다.

  • X11 시스템 위에서 실행되어야 하므로, 현재 X 디스플레이 서버가 실행 중이면 안된다.
  • 실행 파일인 dwm을 그냥 실행해서는 안되고, X 시스템이 구동될 때 자동으로 dwm을 실행시키도록 스크립트를 짜주어야 한다.

이를 편하게 해주는 것이 xinit라는 프로그램이 있다 (이에 대해 설명하기엔 나의 지식이 모자르기 때문에 언급만 하고 넘어간다, 직접 찾아보시길). Ubuntu 사용자라면 이미 본인도 모르게 설치되어 있을 것이다. 무튼 xinit이 설치되어 있다면 본인의 홈 디렉토리에 .xinitrc 라는 파일을 만들어서 아래 한 줄만 경로를 맞추어 써 놓으면 된다.

# ~/.xinitrc
exec /path/to/dwm


그리고는 간단히 아래 명령어를 TTY에서 실행하면 된다.

$ startx


Ubuntu 사용자의 경우, 기본적으로 컴퓨터를 키면 자동적으로 GUI 환경으로 들어가기 때문에 dwm을 실행시킬 수가 없는데, Ctrl+Alt+F1를 누르면 첫 번째 TTY 터미널로 연결이 될 것이다. 여기서 실험해보면 된다. 다시 돌아가고 싶다면 Ctrl+Alt+F7이면 된다.


startx를 실행하면 .xinitrc에 등록된 명령들을 실행해서 dwm이 실행될 것이다. 그 결과로 화면에는 꽤나 허망한 빈 공간이 나온다.

Barebone dwm초기 상태의 dwm


만약 Suckless Terminal을 설치해두었다면 Alt+Shift+Enter를 통해 터미널을 열 수 있다.

Barebone dwm with three terminals (st)세번 Alt+Shift+Enter를 쳐서 3개의 터미널이 떴다.


dwm은 기본적으로 타일링 (tiling) 모드이기 때문에 열리는 창들은 절대 서로 겹치지 않는다. 마우스로 이래 저래 옮겨서 겹치지 않게 할 필요가 없다. 물론 다른 모드도 있지만 나는 타일링 모드에서 거의 모든 작업이 가능한 상황이다. 그리고 Alt+JAlt+K를 이용해서 작업 공간에 열린 창들을 옮겨다닐 수 있다.

상단 표시줄에 1부터 9까지 숫자가 보인다. 이는 현재 dwm이 제공해주는 작업 공간이 9개임을 의미한다. Alt+1 ~ Alt+9 까지 입력해보면 작업 공간이 전환됨을 알 수 있다. 사람마다 호불호가 갈리는 것이겠지만, 나로서는 Ubuntu에서 지원하는 2x2의 작업 공간보다 훨씬 자유롭게 느껴진다. 게다가 dwm이 훨씬 더 가벼운 것은 부정할 수 없는 사실이다.


미세 먼지 만큼의 커스터마이징

config.h를 바꿔보고 다시 컴파일해서 원하는 설정으로 변경이 되는 지 확인해보려고 한다. 소개의 용도로 해보는 것이므로 아주 미미한 부분을 건드릴 것이다.

위에서 본 9개의 작업 공간이 나에게 너무 많다고 느껴졌다. 그래서 4개 정도로 줄이고 각 작업 공간의 이름도 정성스럽게 지어주려고 한다.

변경 전의 config.h가 이렇게 있다.

/* See LICENSE file for copyright and license details. */

/* appearance */
static const unsigned int borderpx  = 1;        /* border pixel of windows */
static const unsigned int snap      = 32;       /* snap pixel */
static const int showbar            = 1;        /* 0 means no bar */
static const int topbar             = 1;        /* 0 means bottom bar */
static const char *fonts[]          = { "monospace:size=10" };
static const char dmenufont[]       = "monospace:size=10";
static const char col_gray1[]       = "#222222";
static const char col_gray2[]       = "#444444";
static const char col_gray3[]       = "#bbbbbb";
static const char col_gray4[]       = "#eeeeee";
static const char col_cyan[]        = "#005577";
static const char *colors[][3]      = {
        /*               fg         bg         border   */
        [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
        [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
};

/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
// 이하 생략

여기서 tagging 부분을 이렇게 바꿔보겠다.

/* tagging */
static const char *tags[] = { "Terminals", "Editors", "Music Player", "Browser" };

그리고 다시 컴파일

$ make clean && make


Alt+Shift+Q를 눌러서 dwm을 종료하고, startx를 실행해서 다시 돌아와보면 제대로 적용이 되었는 지 확인할 수 있다.

Configured dwm with four named workspaces4개의 예쁜 이름을 가진 작업 공간이 보인다!

dmenu와 firefox가 설치되어 있다면, Alt+P를 통해 런쳐를 실행시키고 firefox를 입력하면 파이어폭스 브라우저를 실행시킬 수 있다.

Configured dwm with the Firefox and the terminal"Browser" 작업 공간에서 파이어폭스 브라우저와 터미널 하나를 띄워놓았다, 사랑해요 티스토리



config.h를 둘러보면, 내가 변경할 수 있는 수 많은 설정들을 볼 수 있을 것이다. 여기에 시간을 들이고자 결정하는 것은 당신의 몫이다. 굉장히 쓸데없이 보람찬 작업이 될 것이 분명하다. 또한 많은 사람들이 만들어 낸 멋진 기능들을 가진 패치들도 시도해 볼 만한 가치가 충분히 있다.


여기까지 정말 간단하게 dwm을 체험해보았다. 이 과정을 통해 Suckless 소프트웨어를 어떻게 사용하는 지에 대한 전반적인 설명이 되었으면 좋겠다. dwm을 상세하게 설명하는 것이 목적이 아니었기 때문에, 관심이 있다면 Suckless 사이트에서 다양한 기능과 단축키를 알아보길 추천한다.



Suckless 사람들이 사랑하는 "덜 구린" 가치를 새겨보는 것이 가장 중요하지 않을까.


Suckless 환경과 잘 어울리는 CLI/TUI 프로그램

섹션 제목과 다르게, 내가 사용하고 있는 프로그램들 나열하고 글을 마무리한다.

  • clipmenu: 클립보드 관리자
  • cmus: 음악 재생기
  • mutt: 이메일 클라이언트
  • sxiv: 이미지 뷰어
  • feh: 이미지 뷰어, 배경 화면 설정
  • dunst: X11 notification daemon
  • mupdf, zathura: PDF 뷰어
  • vim: 텍스트 에디터
  • fzy: Fuzzy finder, 매우 강력한 파일 찾기 도구
  • Eye candy 용도로 cmatrix, pipes.sh 같은 것들을 찾아보는 것도 재밌다.




참조 링크

https://suckless.org

Softwares that suck

Desktop Environment vs. Window Manager

(Shameless plug) 공식 상태바 프로그램을 참고해서 어찌저찌 직접 작성한 dwm 상태바 (Shell Script 아니고 C 프로그램이라서 훨씬 효율적)
https://github.com/dgkim5360/xroot-status

(Shameless plug 2) 내가 사용 중인 Linux 환경 설정
https://github.com/dgkim5360/desktop-configurations

  • 2018.08.24 21:55

    비밀댓글입니다

  • 가재군 2019.09.06 17:05

    예전에 자우르스라는 리눅스 PDA에서 요긴하게 사용했던 기억이 나네요.
    우분투 데스크탑에서 그놈쉘을 쓰고 있는데 무슨이유에선지 일정시간이 지나면 CPU점유율이 100을 찍어버려서 대체품을 찾다가 이 글을 발견하게 되었습니다. 잘 보고갑니다

    BlogIcon 동건 2019.09.14 11:51 신고

    뭔지 몰라서 찾아봤는데, 와 멋지네요. 이런 작은 기기에서는 더욱이 suckless 환경이 적합할 수 있겠어요. 댓글 감사합니다 !