Процес на стартиране на Debian GNU/Linux

Когато включите компютъра си, първото нещо, което той прави, е да провери дали всичко е наред с хардуера. След това програма, наречена "bootstrap loader", търси boot-sector (сектор за начално зареждане). Boot-секторът е първият сектор от твърдия диск и в него има малка програма, която може да зарежда операционни системи. Тази програма не може да да бъде по-голяма от 512 байта. Boot секторът може също да се намира на дискета или CD. Когато bootstrap-програмата намери boot-сектор, го зарежда в паметта и се изпълнява програмата, която зарежда операционната система. Обикновено, когато на компютъра е инсталиран GNU/Linux, тази програма е LILO (LInux LOader). Debian използва LILO. Освен LILO можете да използвате и по-малко известния grub (друга програма за зареждане на операционни системи).

Когато компютърът зареди boot-сектор на нормална GNU/Linux система, той всъщност зарежда част от LILO, наречена "first stage boot loader (първо ниво)". Неговата работа е да зареди "second stage boot loader (второ ниво)". Второто ниво Ви запитва каква операционна система искате да се зареди.

Ако изберете Linux, се зарежда ядрото (обикновено /vmlinuz).FIXME! Ядрото всъщност е самата операционна система. То отговаря за комуникацията на софтуера с хардуера. Когато ядрото се зареди напълно, първата програма, която изпълнява, е /sbin/init. За подробности може да погледнете init(8) man-страницата. Просто напишете:

$ man 8 init
или само
$ man init

Ако обаче не намери /sbin/init, ядрото (говорим за ядра, версия 2.4.x) търси /etc/init, /bin/init. Ако и тези не съществуват, ядрото изпълнява шел /bin/sh. Ако обаче и /bin/sh не съществува, системата не се стартира, а вместо това виждате следното съобщение: "No init found. Try passing init= option to kernel.".

Ако получите такова съобщение, можете да стартирате ядрото, задавайки следните параметри на LILO:

LILO: Linux init=/bin/bash

По този начин казвате на ядрото да не се изпълнява /sbin/init, а /bin/bash, което ще Ви осигури шел (shell) веднага след зареждане на ядорото в паметта. Имайте предвид, че системата няма да се държи както обикновено (след малко ще разберете защо). Най-простият пример за това е, че не можете да видите процесите на системата (ако се чудите защо -- защото /proc файловата система не е монтирана. За да я монтирате просто напишете:

mount /proc

На практика можете да замените /sbin/init с каквато решите програма, но не е препоръчително, освен ако наистина знаете какво правите :-).

Работата на init е да прочете файла /etc/inittab и в зависиост от съдържанието му да изпълни определени скриптове след зареждане на ядрото, наречени rc скриптове. Те имат за цел да стартират определени услуги (програми) при стартиране на системата (например графичната среда, уебсървъра, демона за водене на отчетни файлове, виртуалните терминали и други) и да ги спират при изключване на системата. Когато се стартират тези скриптове, системата може да премине в различни нива (runlevels), а те са: еднопотребителски режим, многопотребителски режим, спиране на системата или рестартиране. Нивата на изпълнение са описани в /etc/inittab:

# Runlevel 0 is halt. (спиране на системата)
# Runlevel 1 is single-user. (еднопотребителски режим)
# Runlevels 2-5 are multi-user. (многопотребителски режим)
# Runlevel 6 is reboot. (рестартиране на системата)

Ако искате да смените режима, в който системата по принцип влиза при стартиране -- търсете ред в /etc/inittab, подобен на този:

id:ниво:initdefault:

Стойностите на "ниво" могат да бъдат 1, 2, 3, 4 или 5. В противен случай системата няма да се стартира.

Еднопотребителският режим е по-специален. Когато системата се стартира в този режим, тя всъщност иска паролата на root-потребителя и му предоставя шел, ако е вярна. В този режим не се отварят виртуални терминали и никой друг не може да влезе в системата. Този режим се използва главно, когато нещо в системата не е наред и трябва да се оправи или при сериозна промяна в системната конфигурация като реорганизиране на дяловете, форматиране на файлови системи и въобще мащабни операции, а също и при провеждане на тестове върху системата.

Когато една Debian-система се стартира, тя преминава в runlevel 2 (многопотребителски режим). Тогава се изпълняват скриптовете в директория /etc/rc2.d/, които пък сами по себе си са символни връзки (за повече информация прочетете man страницата на ln(1)) към скриптовете в /etc/init.d/. В /etc/init.d/ се намират всички rc скриптове. Различните нива имат директории /etc/rcниво.d/. Така че, ако искате да промените скриптовете, които се изпълняват при стартиране на системата -- отивате в директория /etc/rc2.d/.

За по-любознателните -- кодът, който определя коя програма да се изпълни след зареждане на ядрото, се намира във файла /usr/src/linux/init/main.c (последните няколко реда).



Nikola Antonov 2004-10-31