Комп загружается, и тут встает задача - на разных этапах загрузки, запускать какие-то свои пользовательские программы. Далее бегло попытаюсь посмотреть, как это работает у меня.
Начальная загрузка
Тут относительно просто, и уже все рассмотрено в интернетах, но пару слов скажу.
После того как ядро загрузилось, оно передает (в общем случае) управление пользовательскому процессу 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.
Для начала базовый функционал, который предоставляет сами иксы:
- прописывать системные команды в /etc/X11/xinit/xinitrc
- создавать скрипты в /etc/X11/xinit/xinitrc.d
- свои персональные команды в ~/.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 файлы из директорий:
- системные, общие для всех пользователей: /etc/xdg/autostart/
- пользовательские: ~/.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 пролетает, и там следует отдельно читать как выполнить свои команды, но я данный подход не использую, поэтому особо и не страдаю.
На этом пожалуй все, если у кого есть что дополнить - комменты ждут.