Rezygnacja z graficznego menadżera logowania

Kategoria: Artykuły, etykiety: tty, startx, openbox, linuxlogo, dm

Dodany: 2014-02-19 01:32 (zmodyfikowany: 2014-03-20 16:18)
Przez: morfik

Wyświetleń: 9873

Przez parę miesięcy używałem lightdm jako graficzny menadżer logowania ale od paru dni mam z nim trochę problemów. Prawdopodobnie te problemy istniały wcześniej ale rzadko kiedy resetowałem środowisko graficzne przez /etc/init.d/lightdm restart. Problem jest taki, że po wydaniu tego polecenia środowisko graficzne się nie odpala, sam lightdm nie wstaje. Co ciekawe, po resecie maszyny wszystko wraca do normy ale po ponownym restarcie usługi lightdm znów nie można wbić na X-y. Samo startx działa dobrze. Na próbę cofnąłem wersję lightdm do tej ze stable i tam o dziwo lightdm się resetuje, więc to raczej wskazuje na problem z lightdm, choć na dobrą sprawę, to nie mam zielonego pojęcia czemu takie cuda się u mnie dzieją.

W każdym razie, od jakiegoś czasu planowałem przejście na tekstowy tryb odpalania X-ów, przez startx . Jest kilka problemów, które powstają w wyniku zlikwidowania graficznego menadżera logowania, np. problem z inicjacją keyringa gnome, czy odblokowanie go po zalogowaniu się do systemu.

Jak zatem pozbierać to wszystko do kupy by działało jak trza bez większych problemów? Na początek tworzymy plik .xinitrc i wrzucamy do niego poniższą treść:

#!/bin/bash

numlockx &

xrdb /home/morfik/.Xresources

exec ck-launch-session dbus-launch --sh-syntax --exit-with-session openbox-session

Pierwsza linijka odpowiada za aktywację numlocka, potrzebna jest instalacja pakietu numlockx. Druga linijka z kolei wczytuje ustawienia X-ów z pliku .Xresources , bo część aplikacji nie była wyświetlana tak jak być powinna. Ostatnia zaś odpala sesję openboxa.

Jeśli przejdziemy teraz na TTY i zalogujemy się do systemu oraz wpiszemy startx, powinien nam się załadować tryb graficzny. Ale tego typu akcja jest niezbyt poręczna -- trzeba to jakoś zautomatyzować, tak by po zalogowaniu się na TTY, X-y startowały samodzielnie. No jest tylko jeden problem, bo nie chcemy by zalogowanie się na każdej konsoli TTY odpalało X-y, co mogłoby się skończyć tragicznie w przypadku uszkodzenia X-servera. Wydelegujemy do tego celu konsolę 4. Musimy zatem dopisać parę linijek do pliku ~/.profile albo ~/.bash_profile :

if [[ $(tty) = /dev/tty4 ]]; then
    mv ~/.xsession-errors ~/.xsession-errors.old
    exec startx &> ~/.xsession-errors
fi

Warto zauważyć, że przy wydaniu samego polecenia startx, komunikaty będą wyrzucane na konsolę TTY, a graficzne menadżery logowania przekierowują wyjście do pliku .xsession-errors , podobnie robi powyższa linijka.

By zainicjować gnome-keyring dopisujemy do pliku ~/.config/openbox/autostart poniższe linijki:

if [ -z "$(pidof gpg-agent)" ] ; then
    gpg-agent --daemon --enable-ssh-support --write-env-file "${HOME}/.gpg-agent-info"
fi

eval $(/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
# export GNOME_KEYRING_CONTROL GNOME_KEYRING_PID SSH_AUTH_SOCK GPG_AGENT_INFO

if [ -f "${HOME}/.gpg-agent-info" ]; then
    . "${HOME}/.gpg-agent-info"
    export GPG_AGENT_INFO
    export SSH_AUTH_SOCK
fi

Nie wiem czy ten krok jest także wymagany ale na wszelki wypadek lepiej dopisać te dwie linijki do ~/.bashrc :

GPG_TTY=$(tty)
export GPG_TTY

Więcej informacji na ten temat można znaleźć pod tym linkiem.

Powyższe działania nie sprawią jednak, że keyring będzie się automatycznie otwierał ilekroć tylko się zalogujemy do systemu. Tu trzeba dopisać parę linijek do konfiguracji PAM . Musimy zmienić 2 pliki.

Po ostatnim wystąpieniu auth w /etc/pam.d/login dopisujemy poniższą linijkę:

# gnome-keyring
auth optional pam_gnome_keyring.so

W tym samym pliku, tylko tym razem po ostatnim wystąpieniu session dopisujemy:

# gnome-keyring
session optional pam_gnome_keyring.so auto_start

Drugi z plików to /etc/pam.d/passwd i w nim na końcu dopisujemy poniższy kod:

# gnome-keyring
password optional pam_gnome_keyring.so

W tej chwili gnome-keyring powinien być poprawnie inicjowany oraz otwierany automatycznie po zalogowaniu się użytkownika.

Co ciekawe, istnieje narzędzie pam-auth-update , które posiada kilka profili konfiguracji i między innymi jest także opcja dla gnome-keyring:

 PAM profiles to enable:                                  
                                                          
    [ ] encfs encrypted home directories                  
    [*] Unix authentication                               
    [*] Mount volumes for user                            
    [*] GNOME Keyring Daemon - Login keyring management   
    [*] ConsoleKit Session Management  

Każda z opcji uzupełnia odpowiednie pliki o określone linijki i nie trzeba tego robić ręcznie.

Kolejna sprawa z jaką trzeba się rozprawić to wygląd konsoli TTY przed zalogowaniem się do systemu. Przydałoby się ją trochę urozmaicić. Natknąłem się na pakiet zwany linuxlogo -- generuje on loga różnych dystrybucji linuxowy, jest też i logo debiana. Oczywiście nie będziemy dekorować wszystkich konsol TTY, pierwsza (tę z logiem) zostawimy w spokoju, a pozostałym (2-6) dokleimy to logo.

Po zainstalowaniu pakietu, możemy odrobinę skonfigurować wygląd samego loga, dopisując parametry w pliku /etc/linux_logo.conf . Ja chciałem tylko logo debiana bez dodatkowych opcji i u mnie ta linijka wygląda jak poniżej:

-l -L debian_banner_2

Musimy jeszcze w pliku /etc/inittab wskazać alternatywny plik issue dla konsol TTY 2-6:

1:2345:respawn:/sbin/getty -8 38400 --noclear tty1
2:23:respawn:/sbin/getty -8 38400 --issue-file /etc/issue.linuxlogo tty2
3:23:respawn:/sbin/getty -8 38400 --issue-file /etc/issue.linuxlogo tty3
4:23:respawn:/sbin/getty -8 38400 --issue-file /etc/issue.linuxlogo tty4
5:23:respawn:/sbin/getty -8 38400 --issue-file /etc/issue.linuxlogo tty5
6:23:respawn:/sbin/getty -8 38400 --issue-file /etc/issue.linuxlogo tty6

Programik linuxlogo dołącza zawartość podstawowego ppliku /etc/issue gdy generuje plik /etc/issue.linuxlogo . Można w nim sprecyzować kilka opcji, takich jak czas czy data. Mój plik /etc/issue wygląda tak:

Debian GNU/Linux jessie/sid \n \l
Time: \t , Date: \d

Co prawda czas jest aktualizowany tylko przy przejściu do konsoli TTY i nie jest odświeżany ale w przypadku gdy potrzebujemy odczytać aktualną godzinę i nie jesteśmy przy tym zalogowani do systemu, możemy wcisnąć enter mając przed oczami prompt TTY, co spowoduje odświeżenie ekranu.

Jako, że w tym przypadku X-y będą odpalane z konsoli 4, jest wielce prawdopodobne, że zaraz po załadowaniu się systemu trzeba będzie przejść do tej konsoli, co troszeczkę może człowieka denerwować ale można poinstruować system by po załadowaniu wszystkich skryptów startowych automatycznie nas przeniósł na TTY4, gdzie tylko wpiszemy login i hasło i załadują się X-y. Do tego celu posłuży nam chvt . Musimy dopisać poniższą linijkę do /etc/rc.local :

chvt 4

W przypadku gdy nie używa się graficznego narzędzia do odpalania X-ów, w pewnych sytuacjach mogą pojawić się problemy przy wyłączaniu systemu, np. gdy chcemy podejrzeć komunikaty, które są wyrzucane na konsolę. Ja dodatkowo sobie wrzuciłem skrypt do autostartu, który zatrzymuje shutdown, by zobaczyć czy skrypt się poprawnie wykonują przy zamykaniu systemu i ten skrypt zawieszał mi cały system.

Rozwiązaniem tego problemu jest stworzenie aliasów na polecenia, którymi zamykamy system, z reguły są to reboot albo poweroff, w zależności od tego czy chcemy zresetować maszynę czy ją wyłączyć. By stworzyć takie aliasy, edytujemy plik .bashrc roota i dodajemy do niego poniższą zawartość:

alias reboot='openbox --exit && reboot'
alias poweroff='openbox --exit && poweroff'

Kluczowe w tych aliasach jest wywołanie openbox --exit, co wyloguje nas pierw z sesji openboxa, zwalniając tym samym konsolę, na której było wywołane polecenie startx. Dzięki temu komunikaty końcowe będą mogły się tam bez problemu wyświetlić. Jeśli korzystamy z polecenia shutdown z odpowiednimi opcjami, trzeba sprecyzować dodatkowe aliasy.

W przypadku gdy chcemy wyłączać/resetować maszynę z konta zwykłego użytkownika, powyższe aliasy trzeba także dopisać bo pliki .bashrc danego użytkownika. Można to także zrobić globalnie dla wszystkich użytkowników w pliku /etc/bash.bashrc . Dodatkowo trzeba zaprzęgnąć sudo do pomocy i dopisać 2 linijki do jego pliki konfiguracyjnego. Odpalamy zatem visudo i dodajemy poniższą zawartość:

%powerpc   ALL = (root) NOPASSWD: /sbin/poweroff
%powerpc   ALL = (root) NOPASSWD: /sbin/reboot

Musimy także się dodać do grupy powerpc ale domyślnie ona nie istnieje w systemie. Tworzymy ją i dodajemy pożądanych użytkowników do niej:

# groupadd -g 5005 powerpc
# adduser morfik powerpc

I to w zasadzie wszystko. Jeśli ktoś ciekaw jak zatrzymać procedurę shutdownu tuż przed wyłączeniem maszyny, poniżej skrypt, który trzeba dodać do autostartu via update-rc.d :

$ cat /etc/init.d/pause_hook

#! /bin/sh
### BEGIN INIT INFO
# Provides:          pause_hook
# Required-Start:
# Required-Stop:     halt reboot
# Default-Start:
# Default-Stop:      0 6
# X-Stop-After:      umountroot
# X-Interactive:     true
# Short-Description: Pause before halt or reboot
# Description:
### END INIT INFO

do_stop () {
    [ -r /etc/pause_hook.conf ] && . /etc/pause_hook.conf

    [ "$PAUSE_HOOK_ENABLED" = "true" ] && read -p "Press enter to continue" reply
}

case "$1" in
    start)
        # No-op
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        do_stop
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

By było po debianowemu, potrzebny jest jeszcze plik konfiguracyjny /etc/pause_hook.conf o treści:

PAUSE_HOOK_ENABLED="true"

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks