Hatred's Log Place

DON'T PANIC!

Oct 30, 2009 - 6 minute read - linux

Как запустить...

Комп загружается, и тут встает задача - на разных этапах загрузки, запускать какие-то свои пользовательские программы. Далее бегло попытаюсь посмотреть, как это работает у меня.

Начальная загрузка

Тут относительно просто, и уже все рассмотрено в интернетах, но пару слов скажу.

После того как ядро загрузилось, оно передает (в общем случае) управление пользовательскому процессу init (обычно /sbin/init), который дальше запускает необходимые скрипты, соотвутствующие разным уровням запуска (знаменитые run-levels((0 - останов; 1(S) - однопользовательский режим; 2 - зарезервирован; 3 - многопользовательский режим; 4 - зарезервирован; 5 - запуск графической системы; 6 - перезагрузка))). Какие скрипты будут запускаться, определяется в файле /etc/inittab, там же определяется какой run-level будет использован для запуска, по умолчанию (его можно передать через команду загрузки ядра), в классической схеме, это - 3. В модных дистрибутивах, это - 5.

Hint: man inittab

Скрипты запуска, указанные в конфиге init, обладают своей логикой, в зависимости от дистрибутива, в большинстве своём, реализуют схему загрузки в стиле SysV (Mandriva (ex. Mandrake), Fedora (ex. RedHat), AltLinux, ASPLinux и им подобные) или BSD-like (типа Slackware, ещё примеров не приведу). Часто схему трудно определить, например в моём любимом ArchLinux: вроде просто набор скриптов в /etc/rc.d, но управляются порядком запуска удобно через /etc/rc.conf.

Обычно скрипты, запускаемые лежат в /etc/rc.d или /etc/init.d, как их запускать в различных ранлевелах, рассказывать не моя задача, хочу сказать, что так или иначе, всегда есть специальный скрипт с именем /etc/rc.local, или /etc/rc.d/local, или /etc/init.d/local или различные вариации на эту тему (интересно для своего дистрибутива - поищите в http://google.com/linux). Этот скрипт нужен, что бы пользователь прописал туда свои команды, которые нужно выполнить при загрузке. В некоторых системах существует скприт rc.local.shutdown, который выполняется при выключении или перезагрузке, поищите его у себя.

Справедливости ради, стоит отметить, что схемой init/SysV/BSD схемы загрузки не ограничиваются, у меня на сервере, допустим, дополнительно используется daemontools для управления автоматическим подключением по pppoe((статья на эту тему: http://hatred.homelinux.net/wiki/zhurnal:2008-10-21_13.26_avtopodkljuchenie_pppoe._perepodkljuchenie_pri_razryve)). Данный механизм относится к асинхронной загрузке + перезапуск сервиса в случае его краха. Кроме того, существуют варианты загрузки с зависимостями (в ArchLinux существуют только базовые средства для определения зависимостей), когда запускаемый процесс определяет, что ему нужно для работы ещё какие-то процессы и автоматически пытается их загрузить. В общем, тут есть что почитать для общего развития, для начала - про свой дистрибутив.

Подытоживая: при начальной загрузке в ArchLinux, пользовательские команды можно прописать в файл /etc/rc.local, команды, выполняемые при выключении/перезагрузки можно прописать в /etc/rc.local.shutdown. Обратите внимание: это файлы можно править только от root’а, и команды из них выполняются только от пользователя root, соответственно, если нужно понизить привилегии, используйте команды:

su - <USER> <COMMAND>

или

sudo -u <USER> <COMMAND>

Вход в систему

Я не буду рассматривать вариант непосредственного запуска в уровень 5 - запуск графической системы. Если случаются какие проблемы, легче их поглядеть для начала в консоли. Но это моя философия.

Итак, вы загрузились, у вас на экране приглашение ввести логин и пароль. Задумываемся, а как сделать так, что бы команды выполнялись после ввода логина и пароля…

Тут немного отвлечемся.

У каждого пользователя или через /etc/passwd или через ldap или ещё какую пень-колоду но задана командная оболочка, в народе - шел((от слова shell)), после успешной проверки имени и пароля, собственно и запускается для пользователя эта его оболочка. В качестве её можно, впринципе, прописать что угодно, есть даже такие команды замечательные: /bin/false или /bin/true, которые можно прописать, и пользователь никогда не войдет в систему (например, ему доступна только почта, удаленно, зачем ему давать локальный файловый доступ?) или rssh - оболочка для ограниченного доступа по ssh, если хотим, что бы пользователь мог заливать себе файлы, но не мог зайти в командный режим (понятно, ога, мне самому не поятно :laughing:)

В общем, при запуске, оболочка считывает настройки и выполняет команды, например bash:

  • выполняет команды из /etc/profile - общесистемный
  • из /etc/profile цепляется файл /etc/profile.bash - для конкретной оболочки
  • далее цепляются скрипты из /etc/profile.d/*.sh
  • после выполняются файлы в домашней директории пользователя:
    • ~/.bash_profile
    • ~/.bash_login (если не обнаружен предыдущий)
    • ~/.profile (если не обнаружен предыдущий)
    • ~/.bashrc (всегда)

Вышеперечисленные файлы, кроме .bashrc, выполняются только когда оболочка bash запускается как login-shell (с параметром -l), т.е. или сразу после ввода логина и пароля, или когда принудительно запущена как ‘bash -l’

.bashrc выполняется каждый раз, когда запускается копия шела, а это происходит, например, когда запускается терминал (xterm, termit, konsole, gnome-terminal и пр.). Удобно сюда запихать вызов команд fortune и celebrat или cowsay наблюдать забавные фортунки и нотификации:

cowsay `date` `uname -a`
echo
celebrat
echo
fortune ru
echo

вот что имеем в итоге:

 ______________________________________ 
/ Fri Oct 30 10:23:42 VLAT 2009 Linux  
| gaz_eeepc 2.6.31-ARCH #1 SMP PREEMPT |
| Fri Oct 23 11:12:58 CEST 2009 i686   |
| Intel(R) Atom(TM) CPU N270 @ 1.60GHz |
  GenuineIntel GNU/Linux               /
 -------------------------------------- 
           ^__^
           (oo)_______
           (__)       )
             ||----w |
             ||     ||

Meeting at the LUG tomorrow.
День военной разведки РФ six days from now.

Рyкописи, может быть, и не горят. Зато диски С отлично форматирyются.

Когда login-shell закрывается (набрали exit или logout) выполняются команды из файла ~/.bash_logout

Загружаемся в X-Window

Теперь дошла очередь до загрузки иксов.

И вновь нам нужно что-то как-то запустить. Я опишу свой случай, когда используется такая связка: staybox + openbox.

Для начала базовый функционал, который предоставляет сами иксы:

  1. прописывать системные команды в /etc/X11/xinit/xinitrc
  2. создавать скрипты в /etc/X11/xinit/xinitrc.d
  3. свои персональные команды в ~/.xinitrc

Первые два игнорируются, когда в домашней директории есть файлик ~/.xinitrc, так что, если вы рулите иксами через него, подцепляйте системные из /etc/X11/xinit/xinitrc.d:

source /etc/X11/xinit/xinitrc.d/*

Если команда не отцепляется от терминала, то обязательно ставьте & в конце команды, некоторые команды можно запускать отложенно при помощи такого фокуса:

(sleep 5; command ) &

В конце файла ~/.xinitrc всегда должна стоять команда bashexec <ваш оконный менеджер или DE> без всяких & в конце.

Пример моего файла, некоторые команды закоментированы (исторически сложилось :))

#!/bin/sh

#
# ~/.xinitrc
#
# Executed by startx (run your window manager from here)
#

# http://www.linux-archive.org/debian-kde/20524-fish-ssh-kioslave-doesnt-work.html
export KDE_FORK_SLAVES=true

xhost +127.0.0.1
xhost +localhost
#kdeinit &
#gnome-settings-daemon &

#asusosd &
#noteo &

xscreensaver -nosplash &
xrdb ~/.Xdefaults

#gkrellm &
#osmo &
#xfce4-power-manager
xbindkeys
#wicd-client
#icewmtray &

(sleep 5; sbxkb) &

#numlockx
#blueman-applet &

# regenerate menu
#mmaker -f -t xfterm icewm &

#nvidia-settings -a InitialPixmapPlacement=2

source /etc/X11/xinit/xinitrc.d/*
#gnome-keyring-daemon -d

exec ck-launch-session staybox-session
#exec openbox-session
#icewm-session
# exec icewm
#exec startkde
# exec blackbox
# exec fluxbox
#exec startxfce4
#exec afterstep
#exec xterm


##################################################################
# For LXDE only
##################################################################

# Корректор клавиатурного ввода, индикатор раскладки
#gxneur &

# Мыльный нотификатор
#mail-notification &
#gnubiff --systemtray --nogui &

#exec startlxde
#exec xterm

#exec /usr/share/antico/antico

Всякие менеджеры сессий, которые являются неотъемлемой частью различных DE: KDE, Gnome, XFCE, LXDE и т.п. или используемый мною Staybox для собственного окружения, так же читают .desktop файлы из директорий:

  1. системные, общие для всех пользователей: /etc/xdg/autostart/
  2. пользовательские: ~/.config/autostart/

Кроме того, у Staybox есть файл ~/.config/staybox/autostart в который можно в специальной форме прописывать команды, так если перед именем команды ставить @, то менеджер будет следить за ним, и, если он рухнет - перезапускать.

У меня в этом файле прописано:

@lxpanel
@pcmanfm -d
dbus-launch nm-applet

Staybox после запускает оконный менеджер, по умолчанию это OpenBox. У него тоже свои средства для запуска приложений, это файл: ~/.config/openbox/autostart.sh

Для оконного менеджера IceWM, файлом запуска будет ~/.icewm/startup

Хочется отметить, что в случае использования xdm/gdm/kdm/slim или им подобным графическим менеджерам входа в систему, стадия пользовательского .xinirc пролетает, и там следует отдельно читать как выполнить свои команды, но я данный подход не использую, поэтому особо и не страдаю.

На этом пожалуй все, если у кого есть что дополнить - комменты ждут.