Init
init (od ang. initialize) – pierwszy program uruchamiany w systemach uniksowych i uniksopodobnych (np. Linux czy BSD) przez jądro w trakcie procesu uruchamiania systemu operacyjnego. Jest to pierwszy proces obecny w przestrzeni procesów systemu.
Podstawowym zadaniem procesu init jest uruchomienie podstawowych serwisów systemu i przygotowanie środowiska do pracy. Init działa w oparciu o konfigurację zawartą w jednym lub więcej plikach konfiguracyjnych lub/i skryptach startowych. Na tej podstawie init uruchamia pozostałe procesy systemowe tworząc tzw. drzewo procesów[1].
Istnieje wiele różnych implementacji programu init wykorzystywanych przez różne systemy uniksowe, uniksopodobne (w tym dystrybucje Linuksa).
init w wersji Systemu V
Ta wersja procesu init (zwana tu SysVinitem) to historycznie jedna z dwóch najstarszych implementacji programu init (drugą jest init zapoczątkowany w BSD). Działa przez wywołanie skryptu /etc/init
, który następnie uruchamia następne procesy systemowe (najczęściej w postaci demonów)[2]. Ten rodzaj programu inicjalizacyjnego jest wciąż stosowany w niektórych dystrybucjach Linuksa (np. Devuan, Gentoo[3], Slackware).
Działanie
Gdy jakiś proces w systemie zostanie zduplikowany za pomocą wywołania systemowego fork(), proces pierwotny jest nazwany rodzicem (procesem macierzystym) nowego procesu – procesu potomnego. Proces init jest pierwszym procesem uruchamianym po starcie systemu, dlatego zawsze ma PID=1 i jest na szczycie hierarchii, którą tworzą wszystkie inne procesy potomne[4]. Jeżeli jakiś proces macierzysty zakończy działanie przed swoim procesem potomnym, potomek jest automatycznie przejmowany przez proces init (adoptowany).
Proces init steruje poziomami działania oraz określonymi skryptami powiązanymi z każdym z tych poziomów. Te skrypty, najczęściej nazywane skryptami startowymi, sprawdzają integralność systemu, a następnie uruchamiają usługi właściwe dla danego poziomu działania.
Skrypty uruchamiane przez init znajdują się w katalogu /etc/rc.d
lub /etc/init.d
i są uporządkowane według poziomu działania. Zwykłe pliki, znajdujące się w katalogu /etc/rc.d
lub /etc/init.d
, są skryptami startowymi uruchamianymi podczas ładowania systemu. W zależności od dystrybucji nazwy mogą się różnić, ale zwykle są to któreś z poniższych:
rc.sysinit
rc.boot
rc.modules
rc.local
(zawiera ustawienia lokalne i jest uruchamiany po wszystkich innych skryptach startowych)
Z kolei standardową lokalizacją, w której jądro Linux szuka pliku uruchamialnego init jest katalog /sbin
. W przeciwieństwie do innych procesów procesu init nie można zakończyć sygnałem SIGKILL.
Poziomy pracy
Istnieje osiem poziomów pracy w których może być uruchomiony init: 0-6 oraz S lub s. Zarezerwowane są następujące poziomy:
- 0 – służący do zatrzymania systemu,
- 1 – wprowadzający system w tryb pracy jednego użytkownika,
- 6 – uruchamiający system ponownie,
- S lub s – przeznaczony dla skryptów wykonywanych podczas wchodzenia w tryb 1.
Poziomy pracy 2-5 są trybami dla wielu użytkowników i jeden z nich (w zależności od dystrybucji) jest poziomem uruchamianym domyślnie.
Proces init może zostać uruchomiony przez superużytkownika w celu przełączenia systemu na inny poziom działania. Wtedy init uruchomi skrypty, które przełączą system na odpowiedni poziom działania.
W większości systemów użytkownik może sprawdzić poziom pracy poprzez polecenia:
$ runlevel
$ who -r
Aktualny poziom pracy może być zmieniany przez superużytkownika poleceniem telinit
lub init
. Domyślny poziom pracy zapisany jest w pliku /etc/inittab
przy :initdefault:
.
init w wersji BSD
Inną popularną wersją procesu init jest wersja opracowana na potrzeby rodziny systemów BSD. W wersji 4.3BSD proces init działa według skryptu z pliku /etc/rc
. Po przeprowadzeniu inicjacji systemu wczytywany jest plik /etc/ttys
opisujący parametry terminali, które zostaną uruchomione w celu dostępu do systemu operacyjnego (UNIX jest systemem dla wielu użytkowników, stąd systemowe wsparcie dla inicjowania wielu terminali)[5]. Podobny system jest dostępny w otwartoźródłowych wersjach systemu BSD takich jak FreeBSD, NetBSD[6] czy OpenBSD[7] itp.
Inne warianty
Do najpopularniejszych implementacji programu init należą:
- systemd – nowy program inicjalizujący, który podobnie jak upstart, nie jest oparty na zwyczajnym init. Jego nazwa pochodzi od "system daemon". Jest stosowany w większości najpopularniejszych dystrybucji Linuksa.
- upstart – stworzona na potrzeby Ubuntu przez firmę Canonical Ltd.[8][9]
- initng – próba odświeżenia programu init dla systemu Linux.
Przypisy
- ↑ Procesy. W: Robert Love: Linux. Programowanie systemowe. Helion S.A., 2014, s. 37. ISBN 978-83-246-8285-0.
- ↑ 7.9 System boot and the init process. W: Maurice J. Bach: The Design of the UNIX operating system. Prentice-Hall, Inc. ISBN 978-0-13-201799-2.
- ↑ systemd - Gentoo Wiki, wiki.gentoo.org [dostęp 2018-01-11] (ang.).
- ↑ 2.1.4 Process Hierarchies. W: Andrew S. Tannenbaum, Herbert Bos: Modern Operating Systems. Pearson, 2008, s. 91-92. ISBN 978-0-13-359162-0.
- ↑ W. Stevens: Programowanie zastosowań sieciowych w systemie Unix. Wydawnictwa Naukowo-Techniczne, 1995. (pol.), str. 88
- ↑ The rc.d System
- ↑ Strona podręcznika systemowego init
- ↑ Pakiet upstart w dystrybucji Ubuntu
- ↑ Strona projektu Upstart