Misschien is het nu wel handig om te weten wat nu eigenlijk een runlevel is. Een runlevel is een *nix systeem om het service niveau van een machine te bepalen. Per runlevel wordt gedefinieert welke services in dat runlevel aktief zullen zijn. In princiepe kunnen er erg veel runlevels zijn. In de praktijk is dit echter beperkt tot 5:
Een single user runlevel waarin een absoluut minimum aan services draait. Dit runlevel wordt meestal gebruikt voor systeem onderhoud.
Een multi user runlevel waarin alle te bieden services draaien. Deze services kan een http server zijn, e-mail server, SQL server of wat dan ook. Net wat de systeembeheerder (jij dus) wil.
Een multi user runlevel, hetzelfde als het vorige. Echter met een grafishce inlog manager.
Naast deze runlevels zijn er nog 2 bijzondere runlevels:
Een runlevel om het systeem te stoppen.
Een runlevel om het systeem te re-booten.
Indien ik een tree overzicht opvraag van alle processen op mijn bak, dan krijg ik dit:
bilbo@bilbo:~$ pstree init-+-4*[agetty] |-atd |-bash |-bash---startx---xinit-+-X | `-xinitrc-+-bbmail | `-blackbox-+-mozilla-bin---mozilla-bin---4+ | `-rxvt---bash---pstree |-crond |-dhcpcd |-fetchmail |-gpm |-gvim |-httpd---7*[httpd] |-inetd---in.identd---in.identd---5*[in.identd] |-keventd |-khubd |-klogd |-kreiserfsd |-loop0 |-loop1 |-lpd |-mdrecoveryd |-named |-2*[sendmail] `-syslogd bilbo@bilbo:~$ |
Wat hier getoond wordt is een "boomstructuur" van alle processen op mijn machine. Wat opbouw betreft lijkt het een beetje op een directorie structuur. Wat direct opvalt is dat de "root" in dit overzicht "init" is. Init is hier de moeder van alle processen. En dat is geen toeval!
Uit de manpage:
INIT(8) Linux System Administrator's Manual INIT(8) NAME init, telinit - process control initialization SYNOPSIS /sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ] /sbin/telinit [ -t sec ] [ 0123456sSQqabcUu ] DESCRIPTION Init Init is the parent of all processes. Its primary role is to create processes from a script stored in the file /etc/inittab (see inittab(5)). This file usually has entries which cause init to spawn gettys on each line that users can log in. It also controls autonomous processes required by any particular system. |
Hier staan een aantal belangrijke opmerkingen:
Init is de parent van alle processen.
Init start processen van uit een bestand /etc/inittab.
Init beheert autonome processen (daemons).
Maar waarom is init dan de moeder van alle processen?
Uit de manpage (regel 43)
BOOTING After init is invoked as the last step of the kernel boot sequence, it looks for the file /etc/inittab to see if there is an entry of the type initdefault (see inittab(5)). The initdefault entry determines the initial runlevel of the system. If there is no such entry (or no /etc/inittab at all), a runlevel must be entered at the system console. |
Het laatste wat een kernel doet als hij boot is dus init starten. Init zal vervolgens het bestand /etc/inittab gaan verwerken.
Er staan nog veel meer wetenswaardigheden in de man page van init. Voor ons is het echter tijd om verder te gaan met /etc/inittab. Dit is blijkbaar een belangrijk bestand.
Uit de manpage:
INITTAB(5) Linux System Administrator's Manual INITTAB(5) NAME inittab - format of the inittab file used by the sysv-compatible init process DESCRIPTION The inittab file describes which processes are started at bootup and during normal operation (e.g. /etc/init.d/boot, /etc/init.d/rc, gettys...). Init(8) distinguishes multiple run- levels, each of which can have its own set of processes that are started. Valid runlevels are 0-6 plus A, B, and C for ondemand entries. An entry in the inittab file has the following format: id:runlevels:action:process |
Whoha, is dat even schrikken. Daar staat: "used by the sysv-compatible init process". En dit was toch Slackware?
Ja dit is Slackware, en Slackware gebruikt Sys V init. Voor de grap even kijken naar de package description van Slackware?
bilbo@bilbo:~$ head -n 14 /var/log/packages/sysvinit-2.84-i386-18 PACKAGE NAME: sysvinit-2.84-i386-18 COMPRESSED PACKAGE SIZE: 232 K UNCOMPRESSED PACKAGE SIZE: 560 K PACKAGE LOCATION: /var/log/mount/slackware/a/sysvinit-2.84-i386-18.tgz PACKAGE DESCRIPTION: sysvinit: sysvinit (init, the parent of all processes) sysvinit: sysvinit: System V style init programs by Miquel van Smoorenburg that control sysvinit: the booting and shutdown of your system. These support a number of sysvinit: system runlevels, each with a specific set of utilities spawned. sysvinit: For example, the normal system runlevel is 3, which starts agetty sysvinit: on virtual consoles tty1 - tty6. Runlevel 4 starts xdm. sysvinit: Runlevel 0 shuts the system down. sysvinit: bilbo@bilbo:~$ |
Laat je dus nooit meer wijs maken dat Slackware geen Sys V init gebruikt. Het gebruikt Sys V init echter wel in "BSD style".
Genoeg gein.... laten we de format van het bestand eens bekijken:
Weer uit de man page:
id:runlevels:action:process Lines beginning with `#' are ignored. id is a unique sequence of 1-4 characters which iden- tifies an entry in inittab (for versions of sysvinit compiled with libraries < 5.2.18 or a.out libraries the limit is 2 characters). Note: For gettys or other login processes, the id field should be the tty suffix of the corresponding tty, e.g. 1 for tty1. Otherwise, the login accounting might not work correctly. runlevels lists the runlevels for which the specified action should be taken. action describes which action should be taken. process specifies the process to be executed. If the pro- cess field starts with a `+' character, init will not do utmp and wtmp accounting for that process. This is needed for gettys that insist on doing their own utmp/wtmp housekeeping. This is also a historic bug. |
Het bestand bestaat dus uit een aantal regels steeds 4 velden gescheiden door een ":"
id - een identifier voor de regel
runlevels - een lijst met nul 1 of meerdere runlevels waar deze aktie voor moet plaats vinden
action - de aktie die moet plaats vinden, je vind ze opgesomt in de man page van inittab. Ik zal de manpage quoten zodra zze aan de orde komen.
process - het process wat door init gestart zal worden
Complex? Valt wel mee..... hier heb je mijn /etc/inittab
bilbo@bilbo:~$ cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Version: @(#)inittab 2.04 17/05/93 MvS # 2.10 02/10/95 PV # 3.00 02/06/1999 PV # 4.00 04/10/2002 PV # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> # # These are the default runlevels in Slackware: # 0 = halt # 1 = single user mode # 2 = unused (but configured the same as runlevel 3) # 3 = multiuser mode (default Slackware runlevel) # 4 = X11 with KDM/GDM/XDM (session managers) # 5 = unused (but configured the same as runlevel 3) # 6 = reboot # Default runlevel. (Do not set to 0 or 6) id:3:initdefault: # System initialization (runs when system boots). si:S:sysinit:/etc/rc.d/rc.S # Script to run when going single user (runlevel 1). su:1S:wait:/etc/rc.d/rc.K # Script to run when going multi user. rc:2345:wait:/etc/rc.d/rc.M # What to do at the "Three Finger Salute". ca::ctrlaltdel:/sbin/shutdown -t5 -r now # Runlevel 0 halts the system. l0:0:wait:/etc/rc.d/rc.0 # Runlevel 6 reboots the system. l6:6:wait:/etc/rc.d/rc.6 # What to do when power fails. pf::powerfail:/sbin/genpowerfail start # If power is back, cancel the running shutdown. pg::powerokwait:/sbin/genpowerfail stop # These are the standard console login getties in multiuser mode: c1:1235:respawn:/sbin/agetty 38400 tty1 linux c2:1235:respawn:/sbin/agetty 38400 tty2 linux c3:1235:respawn:/sbin/agetty 38400 tty3 linux c4:1235:respawn:/sbin/agetty 38400 tty4 linux c5:1235:respawn:/sbin/agetty 38400 tty5 linux c6:12345:respawn:/sbin/agetty 38400 tty6 linux # Local serial lines: #s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100 #s2:12345:respawn:/sbin/agetty -L ttyS1 9600 vt100 # Dialup lines: #d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100 #d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100 # Runlevel 4 used to be for an X window only system, until we discovered # that it throws init into a loop that keeps your load avg at least 1 all # the time. Thus, there is now one getty opened on tty6. Hopefully no one # will notice. ;^) # It might not be bad to have one text console anyway, in case something # happens to X. x1:4:wait:/etc/rc.d/rc.4 # End of /etc/inittab bilbo@bilbo:~$ |
Het zijn maar 74 regels (net een A4tje (ok foliotje)), zonder de commentaar regels hou je maar 16 regels over! Maar eerlijk gezegt is het commentaar vaak wel het lezen waard.
Ik zal het bestand eens uit splitsen:
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> |
De laatste versie van het script is gemaakt door Miquel van Smoorenburg (lijkt me een nederlander) en het is aangepast voor Slackware door Patrick Volkerding (de samensteller van Slackware (yep Slackware is een one mans job)). Het doet niets, maar hoort erin, GPL aan het werk zullen we maar zeggen.
# These are the default runlevels in Slackware: # 0 = halt # 1 = single user mode # 2 = unused (but configured the same as runlevel 3) # 3 = multiuser mode (default Slackware runlevel) # 4 = X11 with KDM/GDM/XDM (session managers) # 5 = unused (but configured the same as runlevel 3) # 6 = reboot |
Het volgende stuk is weer commentaar. Het doet uiteraard ook niets, maar het maakt dat wat volgt wel een stuk beter te volgen. Je ziet hier 7 runlevels genoemd. Runlevels 2 en 5 worden feitelijk niet gebruikt, je zal straks zien dan voor deze runlevels dezelfde script gebruikt worden als voor respectievelijk runlevels 2 en 3.
# Default runlevel. (Do not set to 0 or 6) id:3:initdefault: |
Dit is voor het eerst dat er daadwerkelijk iets gedaan wordt. Het is een standaard inittab regel; 4 velden gescheiden door een ":". De aktie hier is "initdefault", vlgs de manpage:
initdefault An initdefault entry specifies the runlevel which should be entered after system boot. If none exists, init will ask for a runlevel on the console. The process field is ignored. |
Hier wordt de default runlevel ingesteld. Maar dat stond natuurlijk ook al in het commentaar. De default runlevel voor een Slackware systeem is dus runlevel 3; oftewel een multi-user runlevel met een tekst inlog scherm.
# System initialization (runs when system boots). si:S:sysinit:/etc/rc.d/rc.S |
De aktie hier is "sysinit" en spreekt eigenlijk voor zich, maar laten we toch maar even kijken wat de man page er over te zeggen heeft:
sysinit The process will be executed during system boot. It will be executed before any boot or bootwait entries. The runlevels field is ignored. |
Het runlevel "S" wordt wel genoemd maar wordt dus feitelijk genegeert door init. Het programma wat uitgevoerd zal gaan worden (in dit geval een script) is /etc/rc.d/rc.S. Je zal zien dat alle opstart scripts van Slackware in de directorie /etc/rc.d staan. In /etc/rc.d/rc.S wordt het systeem geinitialiseerd zoals we straks in de bespreking van het script zullen zien.
# Script to run when going single user (runlevel 1). su:1S:wait:/etc/rc.d/rc.K |
De aktie hier is wait:
wait The process will be started once when the specified runlevel is entered and init will wait for its termination. |
Het script (want dat is het) /etc/rc.d/rc.K zal aangeroepen worden bij het binnen gaan van runlevels 1 en S (eerlijk gezegt weet ik niet waarom die S daar staat). De aktie "wait" bepaalt dus dat init zal wachten tot het script klaar is. In /etc/rc.d/rc.K worden de services gestart die nodig zijn voor de singel user runlevel. Zoals we straks zullen zien zijn dit er niet erg veel.
# Script to run when going multi user. rc:2345:wait:/etc/rc.d/rc.M |
De aktie "wait" hebben we net al gezien. Het script /etc/rc.d/rc.M wordt dus aangeroepen voor de runlevels 2, 3, 4 en 5. Dus eigenlijk voor alle runlevels behalve runlevel 1. In /etc/rc.d/rc.M worden de services gestart voor de multi user runlevels. Een veel omvattend script zoals we zo zullen zien.
De regels die we tot nu toe gezien hebben bepalen wat er gebeurt bij het starten van het systeem. In alle gevallen zal init wachten op beeindiging van het gestarte process (een script). De nu volgende regels zijn akties die init neemt in bijzondere gevallen en horen niet echt bij een runlevel.
# What to do at the "Three Finger Salute". ca::ctrlaltdel:/sbin/shutdown -t5 -r now |
Niet alleen MS kent het 3 vinger saluut. Echter bij Linux is de aktie zelf te bepalen. Voor de volledigheid de man page over de aktie:
ctrlaltdel The process will be executed when init receives the SIGINT signal. This means that someone on the system console has pressed the CTRL-ALT-DEL key combination. Typically one wants to execute some sort of shutdown either to get into single-user level or to reboot the machine. |
Bij Slackware wordt dus `/sbin/shutdown -t5 -r now` uitgevoerd.
SHUTDOWN(8) Linux System Administrator's Manual SHUTDOWN(8) NAME shutdown - bring the system down SYNOPSIS /sbin/shutdown [-t sec] [-arkhncfF] time [warning-message] DESCRIPTION shutdown brings the system down in a secure way. All logged-in users are notified that the system is going down, and login(1) is blocked. It is possible to shut the system down immediately or after a specified delay. All processes are first notified that the system is going down by the signal SIGTERM. This gives programs like vi(1) the time to save the file being edited, mail and news process ing programs a chance to exit cleanly, etc. shutdown does its job by signalling the init process, asking it to change the runlevel. Runlevel 0 is used to halt the sys tem, runlevel 6 is used to reboot the system, and runlevel 1 is used to put to system into a state where administra tive tasks can be performed; this is the default if nei ther the -h or -r flag is given to shutdown. To see which actions are taken on halt or reboot see the appropriate entries for these runlevels in the file /etc/inittab. |
De -r wil zeggen dat er een reboot zal plaats vinden door init de opdracht te geven naar runlevel 6 te gaan. De vertraging is 5 seconden na nu. Als je een uptime junkie bent dan kun je natuurlijk iets heel anders laten plaats vinden als reaktie op de 3 vinger saluut.
Het 2e veld voor de runlevels heeft natuurlijk geen zin hier. Init reageert hier op een signaal van buiten af.
# Runlevel 0 halts the system. l0:0:wait:/etc/rc.d/rc.0 |
De aktie is weer wait, init zal dus wachten op het beeindigen van het script. Bij het binnen gaan van runlevel 0 zal dus /etc/rc.d/rc.0 (dat is een nul ;)) dus uitgevoerd worden. Wat dit script doet is alle gestarte processen op een veilige manier down brengen. Niet elk programma vindt het echt leuk als je stekker er uit trekt. Als laatste zal het script poweroff aanroepen en kan de computer uitgezet worden.
# Runlevel 6 reboots the system. l6:6:wait:/etc/rc.d/rc.6 |
De entry is erg vergelijkbaar met de vorige entry. Zo erg zelfs dat /etc/rc.d/rc.0 feitelijk een symbolic link is naar /etc/rc.d/rc.6. Het zijn in weze dezelfde bestanden. De manier waarop het script is aangeroepen bepaalt wat de laatste stap is. In het geval van het binnengaan van runlevel 6 (dit geval dus) zal het laatste commando reboot zijn.
# What to do when power fails. pf::powerfail:/sbin/genpowerfail start # If power is back, cancel the running shutdown. pg::powerokwait:/sbin/genpowerfail stop |
Deze volgende 2 kunnen we in 1 keer behandelen. Ze hebben erg veel met elkaar te maken. De akties zijn de volgende:
powerokwait This process will be executed as soon as init is informormed that the power has been restored. powerfailnow This process will be executed when init is told that the battery of the external UPS is almost empty and the power is failing (provided that the external UPS and the monitoring process are able to detect this condition). |
Beide regels hebben dus te maken met aktie die ondernomen moet worden naar aanleiding van een stroomstoring (of eigenlijk leegraken van de UPS batterijen). `/sbin/genpowerfail start` begint met het down brengen van het syteem, `/sbin/genpowerfail stop` tracht dit process te onderbreken indien de spanning weer terug is. /sbin/genpowerfail is een shell script wat gebruikt maakt van `shutdown`, als je een UPS hebt dan moet je het maar eens nalezen.
We hebben inmiddels het punt bereikt dat het systeem vrijwel operationeel is. Het sysinit script heeft gedraaid. De bij het runlevel behorende script heeft gedraait, /etc/rc.d/rc.K voor het single user runlevel 1 en /etc/rc.d/rc.M voor de multi user runlevel 2,3,4 en 5. Alle daemons draaien. En in het multi user runlevel kan er aangelogt worden met ssh of telnet, mit deze daemons gestart zijn tenminste. Als je een server zou hebben zonder monitor en toetsenbord, dan zou je het hier zelfs bij kunnen laten.
Wat nog niet kan is aanloggen op de computer zelf. En dat is af en toe wel zo gemakkelijk. Dat is de volgende taak van init.
# These are the standard console login getties in multiuser mode: c1:1235:respawn:/sbin/agetty 38400 tty1 linux c2:1235:respawn:/sbin/agetty 38400 tty2 linux c3:1235:respawn:/sbin/agetty 38400 tty3 linux c4:1235:respawn:/sbin/agetty 38400 tty4 linux c5:1235:respawn:/sbin/agetty 38400 tty5 linux c6:12345:respawn:/sbin/agetty 38400 tty6 linux |
En we hebben meteen een nieuwe aktie te pakken, de man page:
respawn The process will be restarted whenever it termi- nates (e.g. getty). |
Het gestarte process, /sbin/agetty, zal dus opnieuw gestart worden als het beeindigt wordt. En schijnbaar worden er agetty's gestart voor de virtual consoles tty1 t/m tty6 voor de runlevels 1, 2, 3 en 5. Dit zijn de runlevels zonder X. Behalve de agetty op tty6, die wordt ook gestart voor runlevel 4. Het runlevel met X.
In de man page kunnen we lezen wat agetty eigenlijk doet.
AGETTY(8) AGETTY(8) NAME agetty - alternative Linux getty SYNOPSIS agetty [-ihLmnw] [-f issue_file] [-l login_program] [-I init] [-t timeout] [-H login_host] port baud_rate,... [term] agetty [-ihLmnw] [-f issue_file] [-l login_program] [-I init] [-t timeout] [-H login_host] baud_rate,... port [term] DESCRIPTION agetty opens a tty port, prompts for a login name and invokes the /bin/login command. It is normally invoked by init(8). |
Agetty wacht dus op een tty poort tot er iemand aanlogt, en start dan /bin/login.
LOGIN(1) LOGIN(1) NAME login - begin session on the system SYNOPSIS login [-p] [username] [ENV=VAR ...] login [-p] [-h host] [-f username] login [-p] -r host DESCRIPTION login is used to establish a new session with the system. It is normally invoked automatically by responding to the login: prompt on the user's terminal. login may be spe- cial to the shell and may not be invoked as a sub-process. Typically, login is treated by the shell as exec login which causes the user to exit from the current shell. Attempting to execute login from any shell but the login shell will produce an error message. |
En met login begint dus een nieuwe sessie op het systeem.
Even terug kijken naar de output van mijn pstree:
bilbo@bilbo:~$ pstree init-+-4*[agetty] |-atd |-bash |-bash---startx---xinit-+-X | `-xinitrc-+-bbmail | `-blackbox-+-mozilla-bin---mozilla-bin---4+ | `-rxvt---bash---pstree |
Fuik! Er zouden toch 6 agetty's moeten zijn?
Klopt! die waren er ooit wel alle 6. Maar schijnbaar heb ik 2x ingelogt op een virtual console. Ik zie tenminste 2x een bash. 1x Zonder dat er verdere programma's gestart zijn, en 1x een bash waaronder startx draait en dan xinit en dan ...., een X sessie dus.
Agetty start pas weer voor een console als ik uitlog, met die respawn. Zou hij eerder al starten, dan zou je de wel vreemde situatie krijgen dat en meerdere mensen kunnen inloggen op een console.
Van oudsher geeft *nix de mogelijkheid om op verschillende manieren verbinding te maken met het systeem. We hebben er inmiddel al 2 gehad.
Via het netwerk - met telnet ssh of iets dergelijks
Via de console - het toetsenbord, monitor e.d. aan de computer
# Local serial lines: #s1:12345:respawn:/sbin/agetty -L ttyS0 9600 vt100 #s2:12345:respawn:/sbin/agetty -L ttyS1 9600 vt100 # Dialup lines: #d1:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS0 vt100 #d2:12345:respawn:/sbin/agetty -mt60 38400,19200,9600,2400,1200 ttyS1 vt100 |
De bovenstaande 2 blokken zijn voorbeelden voor het starten van agetty's voor de serieele poorten (terminals) en voor inbel verbindingen via modems.
En tot slot komt X ook nog een keer kijken voor het grafische runlevel
# Runlevel 4 used to be for an X window only system, until we discovered # that it throws init into a loop that keeps your load avg at least 1 all # the time. Thus, there is now one getty opened on tty6. Hopefully no one # will notice. ;^) # It might not be bad to have one text console anyway, in case something # happens to X. x1:4:wait:/etc/rc.d/rc.4 |
In het commentaar wordt allereerst een verklaring gegeven voor die ene agetty die in runlevel 4 draait op tty6.
Het is een "wait" aktie die /etc/rc.d/rc.4 uitvoert. Dit script zoekt achtereenvolgens naar kdm (de kde inlog manager), gdm (de gnome inlog manager) en als laatste naar xdm (de standaart inlog manager die bij X hoort). De inlog managers zijn vergelijkbaar met agetty in dat ze wachten op het inloggen van een gebruiker en na het uitloggen zichzelf weer starten.
bilbo@bilbo:~$ man kdm No manual entry for kdm bilbo@bilbo:~$ |
Tot zover de man page van kdm (zover zijn ze bij KDE schijnbaar nog niet gekomen)
bilbo@bilbo:~$ man gdm No manual entry for gdm bilbo@bilbo:~$ |
Tot zover de man page van gdm (en Gnome is net zo ver?)
XDM(1) XDM(1) NAME xdm - X Display Manager with support for XDMCP, host chooser SYNOPSIS xdm [ -config configuration_file ] [ -nodaemon ] [ -debug debug_level ] [ -error error_log_file ] [ -resources resource_file ] [ -server server_entry ] [ -session ses- sion_program ] DESCRIPTION Xdm manages a collection of X displays, which may be on the local host or remote servers. The design of xdm was guided by the needs of X terminals as well as The Open Group standard XDMCP, the X Display Manager Control Proto- col. Xdm provides services similar to those provided by init, getty and login on character terminals: prompting for login name and password, authenticating the user, and running a ``session.'' |
En hier die van xdm. Ik kan je er verder weinig van vertellen. Ik zit altijd in runlevel 3, en gebruik dus geen grafische inlog managers.
We hebben gezien dat "init" als moeder van processen de controle over de machine krijgt van de kernal. "Init" zal vervolgens het bestand "/etc/inittab" gaan verwerken. Aan de hand van "inittab" zal "init" achtereenvolgens:
De default runlevel instellen.
Het initialisatie script /etc/rc.d/rc.S draaien, en wachten op z'n beeindiging.
De scipts voor de desbetreffende runlevel bepalen, en wachten op z'n beeindiging als ze draaien.
/etc/rc.d/rc.K voor het single user runlevel 1
/etc/rc.d/rc.M voor de multi user runlevels 2,3,4 en 5
/etc/rc.d/rc.0 voor runlevel 0 (system halt)
/etc/rc.d/rc.6 voor runlevel 6 (system reboot)
Bepalen welke aktie moet plaats vinden in bijzondere situaties; ctrl-alt-del en power faillure.
Voor de runlevels 1, 2, 3 en 5 het programma agetty starten op de consoles zodate gebruiker in kunnen logen. (En 1 voor runlevel 4 op de console 6, maar dat heeft een speciale reden)
Eventueel agetty's starten voor serieele verbindingen.
De grafische inlog manager starten voor runlevel 4.