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

  1. Procesy. W: Robert Love: Linux. Programowanie systemowe. Helion S.A., 2014, s. 37. ISBN 978-83-246-8285-0.
  2. 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.
  3. systemd - Gentoo Wiki, wiki.gentoo.org [dostęp 2018-01-11] (ang.).
  4. 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.
  5. W. Stevens: Programowanie zastosowań sieciowych w systemie Unix. Wydawnictwa Naukowo-Techniczne, 1995. (pol.), str. 88
  6. The rc.d System
  7. Strona podręcznika systemowego init
  8. Pakiet upstart w dystrybucji Ubuntu
  9. Strona projektu Upstart