|
Linux Init Process / PC Boot Procedure
|
Этот документ рассматривает процесс загрузки Линукса на фоне инициализации его сервисов.
В основном речь будет идти о Red Hat и Fedora . Другие дистрибутивы подчас используют
иные run level и скриптовые имена .
Также смотрите YoLinux Tutorial на
Recovery and Boot disks.
|
- BIOS: Basic Input/Output System - самый низкий уровень взаимодействия между компьютером и железом.
BIOS выполняет проверку памяти и ищет бут-сектор на флоппи или харде.
- В бут-секторе - MBR - лежит загрузчик.
- Загрузчик - LILO - загружает операционку .
- Первым делом ядро запускает процесс под названием init .
Этот процесс является родителем для всех остальных процессов.
- Следом за init стартует скрипт /etc/rc.d/rc.sysinit
- В зависимости от run-level, запускаются другие скрипты и процессы.
init-процесс имеет идентификатор id = "1".
Init запускает процессы , которые определены в файле /etc/inittab .
Запускается несколько инстансов процесса "getty" , которые опрашивают пользовательскую консоль.
Также init контролирует выгрузку процессов.
init-процесс всегда висит в памяти. Это пользовательский процесс , а не процесс ядра ,
хотя у него и рутовые права .
System Processes:
-
Process ID | Description |
0 | The Scheduler |
1 | The init process |
2 | kflushd |
3 | kupdate |
4 | kpiod |
5 | kswapd |
6 | mdrecoveryd |
В LINUX можно выделить 6 состояний , из которых "0" - это shutdown и "3" и выше - активные
пользовательские состояния .
При загрузке LINUX происходит следующее:
- Запускается /sbin/init .
Этот процесс запускает другие процессы , перечисленные в /etc/inittab .
- Будет запущен тот уровень прав - runlevel - который определен в строке initdefault
файла /etc/inittab .
-
id:5:initdefault:
В данном случае это "5" . Этот уровень запускает графическую оболочку X-Windows.
runlevel "3" (консольный режим) обычно установлен на серверах .
В файле inittab настраивается хитрая комбинация из 3-х клавиш (ctrl-alt-del).
- Один из следующих процессов - это /sbin/rc.
Он запускает скрипты в каталогах /etc/rc.d/rc0.d/, /etc/rc.d/rc1.d/,
/etc/rc.d/rc2.d/, и т.д.
- Скрипты в этих каталогах запускаются на определенных этапах загрузки .
Они начинаются либо с префикса S (startup scripts), либо с префикса K (kill) .
Число , идущее за этим префиксом , указывает на порядок выполнения .
Для того чтобы запустить/остановить какой-то процесс , нужно сделать изменения в каталоге :
- /etc/rc.d/init.d (Red Hat/Fedora )
- /etc/init.d (Debian)
например остановить апач :
- cd /etc/rc.d/init.d
(or /etc/init.d for Debian)
- httpd stop
Команда ps -aux показывает все процессы
Уровень доступа "3" - консольный режим и "5" - графический ( "4" для slackware)
-
Runlevel/Halt | State |
0 | shutdown |
1 | Single user mode |
2 | Multiuser with no network services exported |
3 | Default text start. Full multiuser |
4 | Reserved for local use. Also X-windows (Slackware/BSD) |
5 | XDM X-windows (Redhat/System V) |
6 | Reboot |
s or S | Single user/Maintenance mode (Slackware) |
M | Multiuser mode (Slackware) |
Команда "init #" переключает между уровнями , где # - s,S,0,1,3,5,6.
Скрипты лежат в каталоге /etc/rc.d/rc#.d/
где символ # и есть run level.
TIP: Список запущенных сервисов :
service --status-all | grep running
GUI tool: /usr/X11R6/bin/tksysv
Init Script Activation:
Ручное добавление скрипта в каталог /etc/rc.d/rc#.d/
с префиксом S или K автоматом запустит его при загрузке.
Гибкость настройки процесса загрузки - одна из сильных сторон UNIX.
С помощью этих скриптов можно запустить любой процесс в любой момент времени .
Для этого используются модификаторы start, stop , status .
start/stop/status-скрипты обычно лежат в :
- /etc/rc.d/init.d/ (Red Hat/Fedora)
- /etc/init.d/ (Debian)
Процесс можно удалить из загрузки с помощью командной строки :
chkconfig --del httpd .
Соответственно команда chkconfig --add httpd добавит запуск апача
в /etc/rc.d/init.d/ и в соответствующий каталог /etc/rc.d/rc#.d/.
Смотрите init.
Все это также можно проделать с помощью GUI :
- Red Hat 8.0/9.0: /usr/bin/redhat-config-services
- Fedora/RHEL: /usr/bin/system-config-services
Базовые сервисы:
System Service | Description |
anacron | Run jobs which were scheduled for execution while computer was turned off. Catch up with system duties. |
arpwatch | Keeps track of IP address to MAC address pairings |
atd | Run scheduled batch jobs. |
autofs | automounts file systems on demand. |
crond | Job sheduler for periodic tasks. |
gpm | Allows console terminal cut and paste. (Non X-window consoles) |
https | Apache web server. |
iptables | Firewall rules interface to kernel. |
keytable | Loads selected keyboard map as set in /etc/sysconfig/keyboard |
kudzu | New harware probe/detection during system boot. |
lpd | Network printer services. |
microcode_ctl | Uploads microcode to kernel and ultimately to the Intle Pentium processor. (Hardware specific.) |
mysqld | Database services |
named | DNS name services (Bind) |
network | Active network services during system boot. |
nfs | Network file system. Unix file sharing services. |
nscd | Password and group lookup services for use with network authentication (NIS, LDAP,...). |
ntpd | Network Time Protocol time synchronization services. |
random | Random number generation tool used for encryprion. |
rawdevices | Enables raw IO. Useful for Oracle and software which utilizes this for high speed disk access. |
smb | SAMBA: MS/Windows PC file sharing services |
syslog | System log file facility. |
ypbind | NIS file sharing/authentication infrastructure service. |
yppasswd | NIS file sharing/authentication infrastructure service. |
ypserv | NIS file sharing/authentication infrastructure service. |
xfs | X-Windows font server. |
|
|
Рекомендуемые базовые сервисы : anacron, ard, autofs, crond, gpm, iptables, keytable, kudzu, microcode_ctl (Intel32 hardware only), network, random. syslog
Graphics Workstation : xfs
File Server for PC clients : smb
Print Server : lpd or cups
File server Linux/Unix clients : nfs, netfs, nfslock, portmap, ypbind, yppasswd, ypserv
Web Server : httpd, tux, xinetdi, sshd
Скрипты лежат в каталоге : /etc/rc.d/init.d/script-name (Red Hat/Fedora) или /etc/init.d/script-name (Debian).
Используйте chkconfig .
-
#!/bin/sh
#
# Startup script for program
#
# chkconfig: 345 85 15
#- This statement tells the chkconfig command how to add or delete this process
# to the boot process
# description: Description of program
# processname: process-name
# pidfile: /var/run/process-name.pid
# Source function library.
# This creates the operating environment for the process to be started
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo -n "Starting process-name: "
daemon process-name - Starts only one process of a given name.
echo
touch /var/lock/subsys/process-name
;;
stop)
echo -n "Shutting down process-name: "
killproc process-name
echo
rm -f /var/lock/subsys/process-name
rm -f /var/run/process-name.pid - Only if process generates this file
;;
status)
status process-name
;;
restart)
$0 stop
$0 start
;;
reload)
echo -n "Reloading process-name: "
killproc process-name -HUP
echo
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit 0
|
Функции daemon, killproc и status можно найти в скрипте /etc/rc.d/init.d/functions. (Red Hat/Fedora distributions)
Скрипту надо дать права. (chmod +x script-name).
Его можно использовать для старта и останова :
- /etc/rc.d/init.d/httpd restart
- /etc/rc.d/init.d/httpd stop
- /etc/rc.d/init.d/httpd start
Или:
- service httpd restart
- service httpd stop
- service httpd start
(Red Hat/Fedora/IRIX) chkconfig генерит линки между каталогами
/etc/rc.d/init.d/ и соответственно :
/etc/rc.d/rc[0-6].d/ для контроля запускаемого процесса .
chkconfig [--level <levels>] <name> on | off | reset >
chkconfig --list
chkconfig --list
chkconfig --add <name>
chkconfig --del <name>
chkconfig --level 0123456 <name> off
Примеры:
- chkconfig --level 345 httpd on - апач будет работать под run levels 3, 4 и 5.
- chkconfig --add httpd - запуск апача после загрузки системы.
- chkconfig --del sendmail - не запускать sendmail .
- chkconfig --list - список services.
- chkconfig --list | grep on - список стартовавших сервисов.
-
service | Выводит статус сервиса. Пример: service --status-all Help: service --help |
|
|
|