부팅시 자동으로 startx를 실행하기

우분투는 기본적으로 lightdm을 DM(Display Manager)로 사용합니다.
그런데 제가 사용하면서 느끼는 것은, lightdm이 가볍긴 한데, 버그가 많고, gdm은 안정적인데 반해 좀 무거운 감이 있죠.
개인적으로 $HOME/.xsession 파일을 만들어서, 가볍게 구동하고 있는데, 창관리자는 fluxbox를 사용 중입니다.
이렇게 커스터마이즈한 X환경으로 로그인 하는 방법을 적어볼까 합니다.

DM 없이 $HOME/.profile 등에, tty를 비교해, startx를 실행하는 방법도 있지만, 모든 계정에 이렇게 설정하는 것도 그렇고,
콘솔에서 로그인 해야 하는 문제가 있으며, /etc/inittab이나 /etc/init/tty1.conf 등에서 getty로 자동 로그인하도록 하는 것도,
이 또한, 터미널을 점유해야 하니까 별로 같습니다.

그래서, DM을 사용하되, 자동로그인만 하는 DM인 nodm에 관해서 적어볼까 합니다.
이 패키지는 universe 저장소에 속하고 설치는,
sudo apt-get install nodm
하시면 됩니다.

[b:4rtzz18h]** nodm 설정 변경하기 **
[/b:4rtzz18h]/etc/default/nodm 파일을 편집

[code:4rtzz18h]

nodm configuration

Set NODM_ENABLED to something different than ‘false’ to enable nodm

#NODM_ENABLED=false
NODM_ENABLED=true

User to autologin for

#NODM_USER=root
NODM_USER=사용자

First vt to try when looking for free VTs

NODM_FIRST_VT=7

X session

#NODM_XSESSION=/etc/X11/Xsession
NODM_XSESSION=/etc/X11/Xsession

Options for the X server

NODM_X_OPTIONS=‘-nolisten tcp’

If an X session will run for less than this time in seconds, nodm will wait an

increasing bit of time before restarting the session.

NODM_MIN_SESSION_TIME=60
[/code:4rtzz18h]
[b:4rtzz18h]
** lightdm 수동 시작으로 변경하기 **
[/b:4rtzz18h]
/etc/init/lightdm.conf에
manual
이것을 추가해 주시면 됩니다.

[b:4rtzz18h]** nodm에 없는 upstart 스크립트 만들기 **
[/b:4rtzz18h]
다음의 내용으로 /etc/init/nodm.conf 파일을 생성

[code:4rtzz18h]

NoDM - Automatic Display Manager

The display manager service manages the X servers running on the

system, providing auto-login services

based on lightdm upstart script and nodm init.d script

description "Automatic Display Manager"
author "Protochoas <protochaos@ubuntu.or.kr>"

start on ((filesystem
and runlevel [!06]
and started dbus
and plymouth-ready)
or runlevel PREVLEVEL=S)

stop on runlevel [016]

emits login-session-start
emits desktop-session-start
emits desktop-shutdown

script
if [ -n "$UPSTART_EVENTS" ]
then
# Check kernel command-line for inhibitors, unless we are being called
# manually
for ARG in $(cat /proc/cmdline); do
if [ "$ARG" = "text" ]; then
plymouth quit || :
stop
exit 0
fi
done

	&#91; ! -f /etc/X11/default-display-manager -o &quot;$(cat /etc/X11/default-display-manager 2&gt;/dev/null)&quot; = &quot;/usr/bin/nodm&quot; -o &quot;$(cat /etc/X11/default-display-manager 2&gt;/dev/null)&quot; = &quot;/usr/sbin/nodm&quot; &#93; || { stop; exit 0; }

	if &#91; &quot;$RUNLEVEL&quot; = S -o &quot;$RUNLEVEL&quot; = 1 &#93;
	then
		# Single-user mode
		plymouth quit || &#58;
		exit 0
	fi
fi

NAME=nodm
NODM_ENABLED=no
NODM_XINIT=/usr/bin/xinit
NODM_FIRST_VT=7
NODM_XSESSION=/etc/X11/Xsession
NODM_X_OPTIONS=&quot;-nolisten tcp&quot;
NODM_USER=root
NODM_MIN_SESSION_TIME=60
LOG_FILE=/var/log/nodm
&#58;&gt;&quot;$LOG_FILE&quot;
log_msg() {
	echo &quot;$@&quot; &gt; &quot;$LOG_FILE&quot;
}

# Load the VERBOSE setting and other rcS variables
&#46; /lib/init/vars&#46;sh

# Define LSB log_* functions&#46;
&#46; /lib/lsb/init-functions

if &#91; -f /etc/default/$NAME &#93;
then
	&#46; /etc/default/$NAME
fi

export NODM_XINIT NODM_XSESSION NODM_X_OPTIONS NODM_USER NODM_MIN_SESSION_TIME NODM_FIRST_VT

if &#91; &quot;$NODM_ENABLED&quot; = &quot;no&quot; &#93; || &#91; &quot;$NODM_ENABLED&quot; = &quot;false&quot; &#93;
then
	log_msg &quot;Not starting $NAME because NODM_ENABLED is '$NODM_ENABLED' in /etc/default/$NAME&quot; 
	stop; exit 0
fi

if &#91; ! -x /usr/sbin/nodm &#93;
then
	log_msg &quot;Not starting $NAME because /usr/sbin/nodm is not executable&quot;
	stop; exit 0
fi

exec /usr/sbin/nodm --verbose 2&gt;&amp;1 &gt;&gt;&quot;$LOG_FILE&quot;

end script

post-start script
sleep 5
clear > /dev/tty7
end script

post-stop script
if [ "$UPSTART_STOP_EVENTS" = runlevel ]; then
initctl emit desktop-shutdown
fi
end script
[/code:4rtzz18h]

[b:4rtzz18h]** /etc/init.d의 nodm을 사용하지 않고, upstart를 사용하도록 수정하기 **[/b:4rtzz18h]

기본 nodm 시작 스크립트 백업

sudo mv /etc/init.d/nodm /etc/init.d/nodm.orig

시작 스크립트를 upstart로 교체

sudo ln -s /lib/init/upstart-job /etc/init.d/nodm
sudo rm /etc/rc?.d/nodm

윗줄 대신 rcconf를 설치하셔서, 변경하셔도 됩니다.

[b:4rtzz18h]** 기본 화면관리자를 lightdm 대신 nodm으로 바꾸기 **
[/b:4rtzz18h]/etc/X11/default-display-manager 의 내용을 /usr/sbin/nodm으로 수정

[b:4rtzz18h]** startx 했을 때, 실행될 내용 편집하기 **
[/b:4rtzz18h]$HOME/.xsession을 다음과 유사한 내용으로 작성

[code:4rtzz18h]
#로케일 설정
export LANGUAGE="ko_KR:ko:en_GB:en"
export LANG="ko_KR.utf8"
export LC_ALL="ko_KR.utf8"

입력기를 ibus로 설정

#XMODIFIERS=@im=ibus
#GTK_IM_MODULE=ibus
#QT_IM_MODULE=ibus
#XIM_PROGRAM="ibus-daemon -drx"
#ibus-daemon -drx

입력기를 나비로 설정

XMODIFIERS=@im=nabi
GTK_IM_MODULE=xim
QT_IM_MODULE=xim
XIM_PROGRAM="nabi"

입력기를 uim으로 설정

#XMODIFIERS=@im=uim
#GTK_IM_MODULE=uim
#QT_IM_MODULE=uim
#XIM_PROGRAM="uim-xim"

X 기본 설정 포함하기

if [ -f $HOME/.Xdefaults ]; then
xrdb -merge $HOME/.Xdefaults
fi

시작 세션 유형을 넘겨주는 경우

if gnome-session

if [ -f /usr/share/gnome-session/sessions/"$1".session ]; then
exec gnome-session --session=&quot;$1&quot;
elif [ -f /usr/share/xsessions/"$1".desktop ]; then
exec /etc/X11/Xsession "$1"

other window manager

elif which "$1" >/dev/null; then
case $1 in
xfce4)
exec startxfce4
;;
icewm)
icewmbg &
icewmtray &
exec icewm
;;
fluxbox)
exec startfluxbox
;;
*)
exec "$1"
;;
esac
fi

기본 X 윈도우 시작환경 설정

sudo service dbus start
sudo service network-manager start
exec startfluxbox

[/code:4rtzz18h]

.xsession과 .xinitrc는 같은 역할이므로, 심볼릭 링크를 사용

ln -s $HOME/.xsession $HOME/.xinitrc

[b:4rtzz18h]** fluxbox 시작 스크립트 수정 **
[/b:4rtzz18h]$HOME/.fluxbox/startup 파일을 원하시는 형태로 작성

[code:4rtzz18h]#!/bin/sh

fluxbox startup-script:

Lines starting with a ‘#’ are ignored.

Change your keymap:

xmodmap "/home/protochaos/.Xmodmap"

Applications you want to run with fluxbox.

MAKE SURE THAT APPS THAT KEEP RUNNING HAVE AN ‘’&‘’ AT THE END.

unclutter -idle 2 &

wmnd &

wmsmixer -w &

idesk &

And last but not least we start fluxbox.

Because it is the last app you have to run it with ‘‘exec’’ before it.

#UBUNTU_MENUPROXY=/usr/lib/gtk-3.0/3.0.0/menuproxies/libappmenu.so
gnome-settings-daemon&
gnome-sound-applet&
nm-applet&
nabi&
#nabi&
#uim-xim&
#uim-toolbar-gtk-systray&

gnome-terminal&

#bbmail -w&
#bbpager -w&
#wmdrawer -w&

exec fluxbox

exec fluxbox -log "/tmp/fluxbox.log"

[/code:4rtzz18h]

[b:4rtzz18h]** 네트워크 설정에 관한 권한 설정 **[/b:4rtzz18h]
우측 상단에 네트워크 설정하는 부분은 nm-applet 이라는 프로그램인데,
무선 네트워크에서 연결 설정을 하려면, 관리자 권한이 필요합니다.
sudo nm-applet& 이렇게 해줘서 관리자로 실행하는 방법도 있지만,
이것보다는 해당 사용자나, 그룹에게 네트웍설정 변경 권한을 부여하는 것이 바람직하겠죠.
이런 임시적 권한 접근에 관련된 것은 polkit(Policy Kit) 입니다.

sudo gedit /etc/polkit-1/localauthority/50-local.d/net-admin.pkla
다음과 같은 내용으로 저장

[code:4rtzz18h][Network Admin]
Identity=unix-group:admin;unix-group:sudo
Action=org.freedesktop.NetworkManager.*
ResultAny=yes
ResultActive=yes
ResultInactive=no
[/code:4rtzz18h]

[b:4rtzz18h]** 관련 내용으로 X 윈도우 시작세션 파일을 만들어 봅시다 **[/b:4rtzz18h]

X세션은 XDM에서 사용하는 것으로, /usr/share/xessions/*.desktop을 사용하여 메뉴를 구성합니다.

#/usr/share/xsessions/fluxbox.desktop

[code:4rtzz18h][Desktop Entry]
Name=Fluxbox
Comment=Highly configurable and low resource X11 Window manager
Exec=/usr/bin/startfluxbox
Terminal=false
TryExec=/usr/bin/startfluxbox
#Type=Application
Type=XSession

[X-Window Manager]
SessionManaged=true

[/code:4rtzz18h]

GNOME 세션은, 우분투에서 일반적으로 사용하는 세션으로, /usr/share/gnome-session/sessions/*.desktop을 이용하여, 메뉴를 구성합니다.

#/usr/share/gnome-session/sessions/fluxbox.desktop

[code:4rtzz18h]
[GNOME Session]
Name=fluxbox
RequiredComponents=gnome-settings-daemon;fluxbox
DefaultProvider-windowmanager=fluxbox
[/code:4rtzz18h]