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

사용자들이 직접 작성하는 실전팁!

Moderator: Dry8r3aD

Post Reply
protochaos
Posts: 1714
Joined: 2011/05/19 Thu 7:43 pm

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

Post by protochaos » 2014/01/27 Mon 9:02 am

우분투는 기본적으로 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

[ ! -f /etc/X11/default-display-manager -o "$(cat /etc/X11/default-display-manager 2>/dev/null)" = "/usr/bin/nodm" -o "$(cat /etc/X11/default-display-manager 2>/dev/null)" = "/usr/sbin/nodm" ] || { stop; exit 0; }

if [ "$RUNLEVEL" = S -o "$RUNLEVEL" = 1 ]
then
# Single-user mode
plymouth quit || :
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="-nolisten tcp"
NODM_USER=root
NODM_MIN_SESSION_TIME=60
LOG_FILE=/var/log/nodm
:>"$LOG_FILE"
log_msg() {
echo "$@" > "$LOG_FILE"
}

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
. /lib/lsb/init-functions

if [ -f /etc/default/$NAME ]
then
. /etc/default/$NAME
fi

export NODM_XINIT NODM_XSESSION NODM_X_OPTIONS NODM_USER NODM_MIN_SESSION_TIME NODM_FIRST_VT

if [ "$NODM_ENABLED" = "no" ] || [ "$NODM_ENABLED" = "false" ]
then
log_msg "Not starting $NAME because NODM_ENABLED is '$NODM_ENABLED' in /etc/default/$NAME"
stop; exit 0
fi

if [ ! -x /usr/sbin/nodm ]
then
log_msg "Not starting $NAME because /usr/sbin/nodm is not executable"
stop; exit 0
fi

exec /usr/sbin/nodm --verbose 2>&1 >>"$LOG_FILE"

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=\"$1\"
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]

Post Reply