Ние изследваме процесите. Част 3. Демонът на init

2 август 2005 г.

В последните две части на тази статия (вж. Изследване на процеси: Част 1 и Част 2) научихме как да получим списък на работещите процеси и как да ги управляваме. Днес ще видим как всъщност са започнали всички тези процеси.

Има много интересни неща, които се случват, когато FreeBSD стартира. Тук няма да ги описвам подробно, тъй като има Наръчник на FreeBSD, в който работата по описване на процеса на стартиране вече е извършена.

Вероятно сте забелязали, че по време на процеса на зареждане ядрото на FreeBSD проверява списъка с наличен хардуер и го отпечатва на системната конзола. Когато се събира информация за хардуера, ядрото стартира два процеса: процес 0 (swapper) и процес 1 (init).

Процесът на иницииране е демонът, който е отговорен за инициализирането на системата. Без него никой друг процес не може да започне. По време на зареждане init изпълнява две важни задачи: първо, стартира rc стартовите скриптове и след това инициализира терминалите, така че потребителите да могат да влязат. Нека да разгледаме функциите на init демона, започвайки с rc:

Всъщност тези скриптове се намират в директорията /etc/rc.d/. Обикновено конфигурационните файлове съответстват на страници в раздел 5 от онлайн ръководството, в които можете да намерите описания за правилната промяна на конфигурационните файлове. Ако обаче въведете:

тогава ще получите следното съобщение:

Изглежда малко странно, че информацията за конфигурационните файлове е в осмия раздел на ръководството, който обикновено съдържа информация за команди, участващи в поддръжката на системата или системните операции, като цяло това е раздел за демони. Нека да разгледаме по-отблизо файла/etc/rc и да видим какво има вътре:

(Всъщност нещата са малко по-сложни, тъй като fsck може да бъде деактивиран чрез команди във файла rc.conf - бележка на преводача.)

(Тук свършва/etc/rc.)

Тъй като стигнахме до края на/etc/rc, скриптът rc е готов. За да обобщим случилото се тук: init извиква rc скрипта, който чете няколко конфигурационни файла, за да монтира правилно файловите системи и да подготви средата за стартиране на системните демони. Сега вашата система работи и работи, но в момента няма среда, в която потребителят да комуникира с операционната система. От този момент започва вторият етап от процедурата за иницииране .

Конфигурационният файл/etc/ttys. Файлът/etc/ttys съдържа важна информация за терминалите - кои (и как - бележка на преводача) трябва да бъдат инициализирани. За разлика от/etc/rc, този файл може да бъде редактиран от суперпотребителя, ако е необходимо.

Ако погледнем файла/etc/ttys:

тогава ще видим, че се състои от три части, в зависимост от броя на видовете терминали. Всяка част се състои от четири колони, информацията за които е събрана в таблицата:

Нека да стигнем до дешифрирането на този файл от раздела за виртуални терминали. Моля, обърнете внимание - започва от задаване на параметрите на системната конзола:

Ако fsck срещне фатални грешки на файловата система по време на зареждане, init ще стартира операционната система в еднопотребителски режим, за да може суперпотребителят да се справи с проблема. Ако сте променили настройката на системната конзола от защитената по подразбиране на несигурна, тогава init ще изисква да въведете паролата на суперпотребителя, преди да влезете в режим на един потребител.

Сега нека се преместим по-долу, към раздела на терминалите, обслужващи входящи повиквания към модеми (раздел на комутируемите терминали).

Както виждаме, на моята машина има четири комутируеми терминала, но всички те са изключени. Ако искам потребителите да влязат в моята система с помощта на модем, тогава ще трябва да включа поне един от тези терминали. Също така ще трябва да реша дали тези потребители трябва да могат да влязат като суперпотребител и ако не, тогава ще трябва да променя атрибута secure на несигурен. Може също да сте забелязали, че в редовете, описващи комутируемите терминали, колоната getty включва числото 9600. Това число определя скоростта на предаване на пристанището при 9600 bps. Тъй като повечето съвременни модеми могат да използват много по-високи скорости на предаване, вероятно ще трябва да променя този номер на по-висок номер, например 57600. Накрая ще трябва да прочета раздела FreeBSD Handbook, който описва подробно как да настроите услуга за входящи разговори вижте например от връзката: http://www.freebsd.org/handbook/dialup.html).

Последният раздел на файла/etc/ttys е посветен на описването на мрежови или псевдо терминали. Този файл съдържа описание на много голям брой от тях, по-точно 255. В диапазона от:

Нито един от тях не се активира по подразбиране.

Дори ако станете суперпотребител за редактиране на/etc/ttys, пак трябва да запомните да изпратите HUP сигнал до init, за да приеме промените. За да направите това, напишете:

където -1 е цифровото обозначение на HUP сигнала, а 1 е номерът на началния процес .

Сега нека разберем каква е програмата на getty, която присъства в/etc/ttys. Описанието, взето от ръководството (man 8 getty), ни дава пълна картина:

По този начин init чете/etc/ttys и стартира програмата getty на всеки терминал, посочен в конфигурационния файл. Работата на Гети е да наблюдава постоянно терминала за опити за влизане. Ако някой направи това, getty стартира програмата за вход, за да провери потребителското име и паролата (getty чете потребителското име, а паролата чете login - бележка на преводача). Ако проверката е успешна, тогава login стартира интерпретатора на команди, посочен в потребителския профил и поставя потребителя в домашната му директория. Веднага след като интерпретаторът на команди стане достъпен за потребителя, той може да взаимодейства с операционната система. Сега само интерпретаторът на команди анализира потребителски команди и също така осигурява стартирането на необходимите програми.

Когато потребителят напусне интерпретатора на команди, init незабавно стартира ново копие на getty, което продължава да проследява опитите за влизане.

Нека се опитаме да обвържем целия този процес, като разгледаме изхода на ps в прясно заредена инсталация по подразбиране FreeBSD 4.1. Използвах ключовете -ax, за да включа в изхода на системните демони:

Сега трябва да разпознаете повечето от тези процеси: swapper има PID = 0, а init има PID = 1. Процесите adjkerntz, syslogd, inetd, cron и sendmail бяха успешно стартирани от rc скрипта. За да изпълня командата ps, имах нужда от интерпретатор на команди, в моя случай това беше C-черупка, работеща на ttyv0. Гети процесите изчакват потребителите да влязат във виртуални терминали 1-7. На виртуален терминал номер 8 getty не работи, защото този терминал е деактивиран в/etc/ttys .

В три части на тази статия успяхме да навлезем достатъчно дълбоко във вътрешността на FreeBSD. (За да предизвикате интерес към собственото си изследване - бележка на преводача).