The X Display Manager

    번역 : 권순선 / cessi@kldp.linux-kr.org
    리눅스한글문서 프로젝트 관리자
    http://kldp.linux-kr.org
    by joel McCarty

     

 

Introduction

    이 기사의 목적은 X Display Manager(xdm)의 설정과 사용법에 초점을 맞추는 것입니다.
    X Display Manager 는 호스트 머신에서 데몬 프로세스로 동작하며 원격지에 있거나 혹은 로컬에 있는 다수의 X 디스플레이 관련 사항을 관리해 줄 수 있으며 init 이나 getty, login 등과 관련된 캐릭터 기반의 터미널에서와 비슷한 사용자 세션 관리 기능을 제공해 줍니다.

    또한 xdm은 X 서버가 더 이상 동작하지 않는 쪽에서의 프로세스를 없애줄 수도 있으며 xdm의 특징 중 가장 유용한 기능 중 하나는 호스트와 어카운트 정보에 기반한 액세스 과정을 제어하기 위해 디스플레이 서버 측에서 사용될 수 있는 인증 정보를 생성할 수 있다는 것입니다. 표준 인증 기술을 이용하여 X 세션 로긴 기능을 제공해 줄 수 있기 대문에 xdm 은 한 대의 머신이 서로 다른 설정 상태로 X 세션을 사용하는 다수의 사용자들에게 공유되는 환경에서 이상적으로 이용됩니다.

     

    Scope

    이 기사는 xdm 하에서의 인증에 대해서 간략히 다루고 있는데, X 윈도우의 보안과 관련되는 이슈에 대해서는 다음 달에 더 자세히 다루게 될 것입니다. xdm을 한 대의 독립적인 서버에서 사용하고자 한다면 XDMCP 에 관한 섹션은 읽지 않고 지나가도 괜찮을 겁니다. 게다가 설정 과정도 그다지 복잡하지 않죠. 만약 여러분이 이런 환경(한 대의 독립적인 서버에서 xdm을 사용하는 환경)이라면 약간의 설정 상태만을 체크하고 Running xdm 섹션을 읽어보시면 원하는 것을 얻으실 수 있을 겁니다. 왜냐면 다른 세션들은 주로 네트워크에 연결된 환경에서 X 터미널과 상호작용하는 방법에 대해서 다루고 있기 때문이죠. 또한 X 터미널 설정을 할 수 있도록 요리책처럼 순서대로 차근차근 안내해 주는 그런 정보를 원하신다면 오렐리 사에서 나온 "The X Window System Administrators Guide"를 읽어보시기 바랍니다. 이 기사의 범위를 벗어나는 X 터미널 설정에 관해서 자세히 알 수 있습니다.

     

    Session management under X

    전통적인 tty 로긴 환경에서 세션이란 것은 유저의 로긴 쉘을 의미하지만 xdm 환경 하의 세션은 세션 매니저에 의해 관리됩니다. 왜냐면 윈도우 환경에서는 유저의 로긴 쉘의 프로세스가 꼭 "터미널"의 인터페이스를 가져야 할 필요가 없기 때문입니다. X 윈도우 환경하에서의 세션관리를 위해서 우리는 윈도우 매니저를 세션 매니저로 사용하고 윈도우 매니저 프로세스가 끝나면 사용자의 세션도 함께 끝나게 되는 거죠.

     

    xdm basic concepts

    xdm 은 X 클라이언트로서 사용자 세션으로의 접속, 제어, 상호 작용을 관리합니다. xdm 은 X 서버에 관련된 파일을 읽어들임으로서 어느 X 서버가 접속이 가능한지에 대한 정보를 추적하고 XDMCP 포트를 통해서 다른 X 서버로부터의 요청을 관리합니다. xdm 이 X 서버를 관리하게 되면 xdm 은 서버 측의 디스플레이에 로긴 박스를 뿌려주고 사용자의 입력을 기다립니다. 사용자가 이름과 패스워드를 입력하면 tty 로긴 과정과 꼭 같은 과정을 거쳐 사용자 인증을 받게 됩니다. 그 후 xdm 은 사용자가 원하는 X 클라이언트들을 작동시켜주기 위해서 일련의 쉘스크립트를 작동시킵니다. 그러면 이제 보통의 X 세션이 동작하게 되는 것이고 사용자가 이 세션에서 로그 아웃하면 xdm 은 모든 접속을 끊고 다른 세션을 제공해주기 위해서 로긴을 기다리는 상태로 되돌아갑니다.

     

Why use xdm ?

    보안 관련 사항이나 기능, 편리성 등에 문제가 있어 xinit 은 X 콘소시엄(지금은 Open Group)으로부터 배제되고 지금은 모든 기능들이 xdm 에 추가되고 있는 상태입니다. xdm 은 관리자들이 시스템 차원에서 환경을 설정해줄 수 있게 하는 방법을 제공합니다. 또한 xdm 은 제가 알고 있기로는 새로운 사용자를 위해서 X 서버 프로세스를 재 실행하지 않고도 여러 명의 사용자가 한 대의 머신의 공유할 수 있게 해주는 유일한 방법입니다.

     

Configuration

    xdm 은 보통의 아스키 텍스트 파일로서 관리할 수 있습니다. /usr/lib/X11/xdm 이나 /etc/xdm 디렉토리에 글로벌 설정 파일이 위치하고 개별 사용자의 홈 디렉토리에 개별 사용자 설정 파일이 위치하게 됩니다. 개별 사용자 설정 파일은 홈 디렉토리말고 다른 곳은 갈 데가 없죠. 매우 흥미로운 사실은 xdm을 실행할 때 -config 파라미터를 이용하고 아래에서 살펴보실 xdm-config 설정 파일에서 설정 파일들의 위치를 다른 곳으로 지정하여 줄 수도 있다는 것입니다. 따라서 좀더 쉽게 관리할 수 있는 여지가 생기는 거죠. 아래에 보시는 것은 각각의 설정 파일들의 예입니다.

     

    Global File

    xdm-config

    이 파일은 다른 모든 설정 파일의 위치를 지정하며(디폴트 위치가 아닌 다른 곳에서 설정 파일을 보관할 때) xdm 의 셋업, 시작, 리셋, 기본 스크립트 등과 관련된 명령어들을 설정해 줍니다. 아래 보시게 될 예제에서는 모든 다른 설정 파일들이 /etc/X11/xdm 아래에 위치하게 하여 /usr/lib/X11/xdm 아래에 있는 디폴트 설정 파일들에 손을 대지 않고 그대로 둘 수 있게 하였습니다.

      DisplayManager.errorLogFile : /var/log/xdm-error.log
      DisplayManager.pidFile : /var/run/xdm.pid
      DisplayManager.keyFile : /etc/X11/xdm/xdm-keys
      DisplayManager.servers : /etc/X11/xdm/Xservers
      DisplayManager.accessFile : /etc/X11/xdm/Xaccess
      DisplayManager._0.authorize : true
      DisplayManager._1.authorize : true
      DisplayManager._0.setup : /etc/X11/xdm/Xsetup_0
      DisplayManager._0.startup : /etc/X11/xdm/GiveConsole
      DisplayManager._0.reset : /etc/X11/xdm/TakeConsole
      DisplayManager*resources : /etc/X11/xdm/Xresources
      DisplayManager*session : /etc/X11/xdm/Xsession
      DisplayManager*authComplain : false

     

    Xservers

    xdm에 의해 관리될 X 서버의 리스트를 명시합니다. 최소한 이 파일은 로컬 디스플레이 서버는 명시해야 합니다. 주의할 것은 이 파일은 세션이 끝나거나 혹은 xdm 이 SIGHUP 시그널을 받았을 때만 다시 읽어들여진다는 겁니다. xdm에 SIGHUP 시그널을 보내기 위해서는 xdm의 pid를 찾아내서 그 프로세스를 죽여야 합니다. 예를 들면,

      # ps -a | grep xdm
      2639 ? R 0 : 09 ?usr/bin/X11/xdm
      # kill -9 2639

    아래에 보시게 될 것은 Xservers 파일로서 스탠드얼론 머신에서 사용할 수 있는 설정입니다.

      # ferst line should be the local display

      : 0 local /usr/X11R6/bin/X
      # : 0 specifies console
      # local denotes the X server is running on the locally
      # /usr/X11R6/bin/X executable run at startup

      # the syntax for X terminals is slightly different
      # since they run their X server from another machine
      # ONLY enter X terminals if they DO NOT support XDMCP

      eng1 : 0 foreign NCD xterminal
      # eng1 is the name of the terminal
      # :0 is the display to use on the terminal
      # foreign signifies the X server is running on a different machine
      # NCD xterminal are display class resources specific to this term inal
      # and aren't absolutely neccesary

      eng2 : 0 foreign NCD xterminal
      eng3 : 0 foreign Visual xterminal 

     

    Xsession

    각각의 X 세션에서 사용되는 시작 스크립트

      #!/bin/sh

      # following section enables failsafe logon when neccesary
      # using <CTRL><RETURN> after password activates failsafe mode

      case $# in
      1)
      case $1 in
      failsafe)
      exec xterm -geometry 80x24-0-0
      ;;
      esac
      esac

      # redirect errors to a file in user's home directory
      for errfile in "$HOME/.xsession-errors" "${TMPDIR-/tmp} /xses-$USER" \
      "/tmp/xses-$USER"
      do
      if ( cp /dev/null "$errfile" 2> /dev/null )
      then
      chmod 600 "$errfile"
      exec > "$errfile" 2>&1
      break
      fi
      done

      # use users local .xsession and .Xresources files if they exist
      startup=$HOME/.xsession
      resources=$HOME/.Xresources

      if [ -x "$startup" ]; then
      exec "$startup"
      elif [ -x "$HOME/.Xclients" ]; then
      exec "$HOME/.Xclients"
      elif [ -x /etc/X11/xinit/Xclients ]; then
      exec /etc/X11/xinit/Xclients
      else
      if [-f "$resources"]; then
      xrdb -load "$resources"
      fi
      exec xsm
      fi 

     

    Xresources

    xdm 에 의해 관리될 모든 서버들이 사용할 리소스들을 정의하고 xrdb 에 의해 읽혀집니다.

      # key settings to be used by Xlogin widget

      xlogin*login.translations : #override \
      # Ctrl R stops xdm from managing display
      Ctrl<key>R : abort-display()\n\
      # F1 or Ctrl Return run a failsafe session
      # consisting of a single xterm window
      <key>F1: set-session-argument(failsafe) finish-field()\n\
      Ctr<key>Return : set-session-argument(failsafe) finish-field()\n\
      <key>Return: set-session-argument() finish-field()

      # display setings for Xlogin widget to be displayed by xdm

      Xlogin*borderWidth : 3
      Xlogin*greeting : CLIENTHOST
      Xlogin*namePrompt : login : \040
      Xlogin*fail : Sorry Try Again
      # ifdef COLOR
      Xlogin*greetColor : CadeBlue
      Xlogin*failColor : red
      *Foreground : blak
      *Background : #fffff0
      # else
      Xlogin*Foreground : blak
      Xlogin**Background : white 
      # endif

      # settings for xconsole client which is used when xdm connection on
      # local server is initialized. This keeps console messages sent between
      # logins from going everywhere across the screen

      XConsole.text.geometry : 480x130 
      XConsole.verbose : true 
      XConsole*iconic :true 
      XConsole*font : fixed

      Chooser*geometry : 700x500+300+200
      Chooser*allowShellResize : false 
      Chooser*viewport.forceBars : true 
      Chooser*label.font : *-new century schoolbook-bold-i-normal-*-240-* 
      Chooser*label.label : XDMCP Host Menu from CLIENTHOST 
      Chooser*list.font : -*-*-medium-r-normal-*-*-230-*-*-c-*-iso8859-1 
      Chooser*Command.font : *-new century schoolbook-bold-r-normal-*-180-* 

     

    xdm-pid

    xdm 의 프로세스 아이디를 가지고 있는 파일로서 편집하면 안됩니다.

     

    xdm-errors

    xdm 의 에러 로그 파일

     

    Xaccess

    XDMCP 의 액세스 제어 상태를 설정(X11R5 또는 그 이후 버전)합니다. 이 파일은 XDMCP 쿼리에 대한 액세스 권한만을 정의하고 있는데 관련된 다른 일련의 호스트들을 모아서 그룹화 하는 매크로를 정의할 수 있는 기능도 제공합니다. 서버로의 액세스 제어는 xdm-config 파일의 Display manager*uthorize 리소스에  의해 설정되고 XDMCP 설정과 예제는 아래에 있는 CHOOSER 섹션에서 더 찾아볼 수 있습니다.

     

    GiveConsole

    콘솔의 사용 권한을 유저에게 넘겨주는 쉘 스크립트. 별다른 이유가 없다면 아래에 보이는 디폴트 설정을 그대로 이용하기 바랍니다.

      #!/bin/sh
      # Assign ownership of the console to the invoking user
      # $XConsortium : GiveConsole, v 1.2 93/09/28 14:29:20 gildea Exp $
      #
      # By convention, both xconsole and xterm -c check that the
      # console is owned by the invoking user and is readable before attaching
      # the console output. This way a random user can invoke xterm -c without
      # causing serious grief.
      #
      chown $USER /dev/console

     

    Take Console

    콘솔의 사용권한을 다시 루트에게로 되돌리는 쉘 스크립트입니다. 이 파일도 그냥 그대로 사용하기를 권합니다.

      #!/bin/sh
      # Reassign ownership of the console to root, this should disallow
      # assignment of console output to any random user's xterm
      # $XConsortium : TakeConsole, v 1.2 93/09/28 14:30:29
      #
      chmod 622 /dev/console 
      choen root /dev/console

     

    Xsetup_0

    로컬 콘솔 서버의 셋업 상태를 디스플레이하기 위한 쉘 스크립트. 시스템으로부터 터미널로 전송되는 메시지들을 나타내 주는 xconsole 을 설정합니다.

      #!/bin/sh
      # $XConsortium : Xsetup_0, v 1.3 93/09/28 14:30:31
      /usr/X11R6/bin/xconsole -geometry 480x130-0-0 -daemon -notify -verbose -fn fixed -exitOnFail

     

    Local File

    ~/.xsession

    Xsession 스크립트로부터 호출되는 개별 사용자의 설정을 담고 있는 시작 스크립트. ~/.xinit 과는 달리 이것은 어떤 쉘 스크립트로도 만들 수 있습니다. (~/.xinit 은 본셀 계열의 쉘스크립트만을 사용합니다.)

     

    ~/.Xresources

    Xsession 스크립트로부터 호출되는 개별 사용자의 리소스 설정 정보를 담고 있는 파일.

     

    ~/.xsession-errors

    개별 사용자의 X 세션 에러 로그 파일

     

    ~/.Xauthority

    개별 사용자의 서버 인증 정보를 담고 있습니다.

     

    XDMCP

    X Display Manager Control Protocol 은 X11 릴리즈 4에서 xdm 과 X 터미널 간의 여러 문제점들을 해결하기 위해 처음 소개되었습니다. XDMCP 가 있기 전에는 xdm 이 관리 가능한 서버를 찾아내기 위해서는 오직 Xservers 파일을 읽어들이는 것밖에는 다른 방법이 없었습니다. Xservers  파일은 xdm이 처음 시작할 때에만 읽어들여지기 때문에 X 터미널의 전원이 나갔다가 다시 들어왔을 경우에는 문제가 생깁니다. 기본적으로는 언제든지 X 서버의 전원이 나갔다가 다시 들어왔을 경우에 관리자가 xdm 에 SIGHUP 시그널을 보내서 Xservers 파일을 다시 읽어들이도록 하여야 합니다.

    그런데 XDMCP 는 서버들이 xdm 과 통신하는데 서버의 이전 상태와는 상관없이 통신을 할 수 있도록 해 줍니다. XDMCP 환경하에서는 호스트는 XDMCP 포트로부터 요청을 기다리고 관리 요청이 들어오면 자기 자신의 복사본을 하나 생성하여 터미널의 로그인 스크린으로 보내주게 되는 것이죠.

     

    Communication Modes

    XDMCP 는 세가지 방법을 이용하여 Xservers 파일에 명시적으로 지정되지 않은 방법으로도 관리 요청을 서버로 보낼 수 있습니다. 이 방법은 DIRECT, INDIRECT, BROADCAST 입니다.

    DIRECT 모드는 서버가 네트워크 쪽에 관리 요청을 보내서 그 요청을 받는 첫 번째 xdm 프로세스가 그 서버의 관리자가 되는 것입니다. INDIRECT 모드는 X 터미널이 접속할 수 있는 모든 호스트 목록을 보여주므로 사용자가 관리자가 될 서버를 지정할 수 있습니다. INDIRECT 모드는 특별히 호스트가 많은 환경에서 유용하죠. INDIRECT 모드를 이용하기 위해서는 Xaccess 파일의 리소스를 세팅하는 과정에서 CHOOSER 키워드를 이용하여야 합니다. 또다른 방법은 BROADCAST  모드를 이용하는 것으로서 네트워크의 모든 호스트에 브로드캐스트 메시지를 보내서 사용자에게 그들 중 하나를 선택하도록 하는 것입니다.

     

    Chooser

    시작할 때 호스트 메뉴를 제공하지 않는 X 터미널을 사용할 때는 chooser 프로그램이 BROADCAST 나 INDIRECT 모드와 연동하여 사용될 수 있습니다. chooser 프로그램을 동작하게 하기 위해서는 CHOOSER를 Xaccess 파일의 호스트 리스트에 첫 번째 엔트리로 설정하면 됩니다.

      eng*.odhs.dsd.com CHOOSER BROADCAST

    와 같이 해주면 odhs.dsd.com 도메인 안의 eng 로 시작되는 모든 터미널이 접속 가능한 호스트들을 선택할 수 있는 화면을 제공해줄 수 있습니다. 좀더 그럴 듯한 시나리오는 터미널들이 접속할 수 있는 호스트 목록을 직접 지정해 주는 것입니다. 이것이 바로 INDIRECT 모드를 이용해서 쉽게 구현할 수 있는 기능입니다.

      eng*.odhs.dsd.com CHOOSER dspapps.odhs.dsd.com dbsrv.odhs.dsd.com test.odhs.dsd.com

    위의 세팅은 eng로 시작되는 odhs.dsd.com 도메인 안의 모든 터미널들이 CHOOSER 메뉴를 통해서 dspapps.odhs.dsd.com, dbsrv.odhs.dsd.com, test.odhs.dsd.com 서버로 접근할 수 있다는 것을 의미합니다.

    Xaccess 파일에서는 관련 호스트들을 논리적인 그룹으로 묶을 수 있는 기능도 제공합니다. 다음 예제는 위에서 사용했던 설정을 매크로로 구현한 것입니다.

      %ENGHOSTS dsdapps.odhs.dsd.com dbsrv.odhs.dsd.com test.odhs.dsd.com

      eng*.odhs.dsd.com CHOOSER %ENGHOSTS

    chooser 의 겉모습은 Xresources 파일의 리소스를 바꿔주면 다른 모양으로 만들어 줄 수 있습니다.

     

    Running xdm

    xdm 설정을 리부팅 없이 테스트 해보기 위해서는 콘솔 상태에서

      init 5

    하면 됩니다. 이것은 시스템의 런레벨을 5번으로 바꿔주는데 런레벨 5번에서는 xdm 이 자동으로 실행됩니다. 런레벨 5번으로 전환했는데도 xdm이 시작되지 않으면 /etc/inittab 파일을 한번 살펴보기 바랍니다. 이 파일에는 어느 런레벨에서 xdm을 시작하는지 나와 있습니다.(슬렉웨어의 경우 런레벨 4번에서 xdm을 사용하도록 되어있는 경우가 있습니다만 대부분은 5번을 이용합니다.) 이제 여러분은 로긴을 위해 사용자의 입력을 기다리는 xlogin 위젯을 볼 수 있을 겁니다. 만약 런레벨에 대한 설정을 제대로 해주었는데도 xdm이 작동하지 않는다는 것이 확인되면 아래의 문제 해결 방법들을 참조하십시오. 그렇지 않다면 이 시점에서 여러분은 xdm을 자신이 원하는대로 설정할 수 있을 것입니다. xdm을 설정하고 나면 /etc/inittab 파일을 편집하여 디폴트 런레벨을 5번으로 지정해 줄 수도 있습니다. 제 경우 파일의 다음 내용만을 바꿔주면 되더군요.

      #/etc/inittab
      id : 3 : initdefault :

    부분을

      id : 5: initdefault :

    으로 바꿉니다. 이것은 리눅스 시스템이 부팅될 때 기본적으로 xdm이 작동하는 런레벨 5번으로 시작되게 합니다.

     

    Troubleshooting xdm

    만약 xdm이 생각했던 대로 작동하지 않으면 우선 ~/.xsession-errors파일을 살펴보기 바랍니다. 이 로컬 에러 로그 파일은 사용자 수준에서 생긴 에러를 보여주므로 시스템 수준의 에러보다는 더 유용하게 이용될 수 있습니다. 아래에 몇 가지 가능한 에러와 해결 방법을 보여 드리겠습니다.

     

    로긴 박스가 스크린에 나타나지 않을 때

    이것은 설정 파일에 문제가 있을 경우에 나타나는 현상입니다.

     

    로긴은 잘 되는데 로긴 박스가 다시 나타나게 될 때

    이것은 /.xsession 파일에 실행 퍼미션이 없을 때 나타나는 현상입니다. 로긴을 하고 패스워드를 입력한 후 엔터키를 누르기 전에 엔터키를 누르는 대신 컨트롤 키와 엔터키를 동시에 누르십시오. 이렇게 하면 /.xsession 스크립트를 생략하고 넘어갈 수 있습니다. 이렇게 해서 로긴 한 후 터미널 윈도우에서 다음과 같이 입력하고 다시 시도해 보세요.

      # chmod +x .xsession

     

    로긴 한 후 스크린이 번쩍거리고 로긴 박스가 다시 나타나게 될 때

    위에서 말씀드린 방법으로 일단 로긴하시고 /.xsession 파일에 설정된 명령들 중 마지막에 실행되는 명령이 포그라운드에서 실행되는지 확인하십시오.(역자 주: 보통은 모두 &를 붙여서 백그라운드로 실행하고 맨 마지막 줄에서 윈도우 매니저를 실행할 때 &를 붙이지 않고 포그라운드로 실행하여 윈도우 매니저가 끝나면 세션을 종료하도록 설정한다. 여기서 꼭 윈도우 매니저를 마지막에 포그라운드로 실행하지 않고 다른 특정 어플리케이션을 마지막에 포크라운드로 실행하면 그 어플리케이션이 종료될 때 세션도 함께 종료된다.)

     

    Conclusion

    이 글을 읽고 여러분께서 X Display Manager 의 강력함과 확장성을 확신할 수 있으면 좋겠습니다. 다음 번에는 종종 생략되고 넘어갔던 X 의 보안 문제에 관해서 살펴보도록 하겠습니다. 질문이나 하실 말씀이 있으시면 부담없이 jmccarty@theshop.net 로 메일 주세요.

     

    원문은 LINUX FOCUS(http://www.linuxfocus.org/English/May1998/article14.html)에서 읽으실 수 있습니다.




▲ top

home으로...