Operating Systems
Cover
2__Lecture_RAID-LVM-iSCSI.pdf
Summary
# Inleiding tot opslagtechnologieën
Dit gedeelte introduceert de drie primaire opslagtechnologieën: RAID, LVM en iSCSI, die een cruciale rol spelen in datacenteromgevingen door het beheer en de toegankelijkheid van opslag te verbeteren [1](#page=1) [2](#page=2).
### 1.1 Overzicht van de belangrijkste opslagtechnologieën
In dit document worden drie verschillende lagen van opslagtechnologieën besproken: RAID, LVM en iSCSI. Deze technologieën worden in het lab opgezet en bieden oplossingen voor het efficiënt en flexibel gebruiken van opslagapparaten binnen een datacenter [2](#page=2).
#### 1.1.1 RAID
RAID (Redundant Array of Independent Disks) is een oplossing die het mogelijk maakt om meerdere harde schijven gelijktijdig te gebruiken. Het voornaamste doel van RAID is het bieden van redundantie, wat betekent dat gegevens veilig worden opgeslagen in geval van een schijfstoring [2](#page=2).
#### 1.1.2 LVM
LVM (Logical Volume Management) is een technologie die opslagapparaten of opslagarrays groepeert. LVM biedt aanzienlijke flexibiliteit in het beheer van opslagruimte, waardoor het makkelijker wordt om opslag dynamisch aan te passen en te beheren [2](#page=2).
#### 1.1.3 iSCSI
iSCSI (Internet Small Computer System Interface) is een protocol dat blokapparaten toegankelijk maakt over een netwerk. Het primaire doel van iSCSI is het creëren van een SAN (Storage Area Network), wat leidt tot de mogelijkheid om centraal beheerde opslagruimte aan te bieden aan servers [2](#page=2).
> **Tip:** Hoewel "SAN" staat voor "Storage Area Network", verwijzen datacenterbeheerders vaak specifiek naar "De SAN" als de SAN Storage Server zelf [2](#page=2).
---
# RAID (Redundant Array of Independent Disks)
RAID-technologie stelt opslagapparaten in staat om data te distribueren en/of te dupliceren over meerdere schijven voor verbeterde prestaties, redundantie of beide [4](#page=4).
### 2.1 Wat is RAID?
RAID staat voor "Redundant Array of Independent (or Inexpensive) Disks". Het is een methode om data op te slaan op een set van meerdere harde schijven. Naast de verschillende RAID-niveaus, bestaat ook de optie Just a Bunch Of Disks (JBOD), waarbij schijven één voor één worden gevuld en dit wordt niet als ware RAID beschouwd [4](#page=4).
### 2.2 RAID-niveaus
Er zijn verschillende RAID-niveaus, elk met specifieke kenmerken qua capaciteit, redundantie en snelheid.
#### 2.2.1 RAID 0: Striping
* **Werking:** RAID 0, ook wel "striping" genoemd, verdeelt data over twee of meer schijven [5](#page=5).
* **Capaciteit:** De totale capaciteit is de som van de capaciteiten van alle schijven. Bijvoorbeeld, twee schijven van 1 TB in RAID 0 bieden 2 TB aan opslagruimte [5](#page=5).
* **Redundantie:** RAID 0 biedt **geen** redundantie. Het falen van één schijf leidt tot het verlies van alle data [5](#page=5).
* **Snelheid:** Het belangrijkste voordeel van RAID 0 is de snelheid. Zowel lees- als schrijfsnelheden kunnen potentieel verdubbelen, en elke extra schijf kan de snelheid verder verhogen, mits de RAID-controller dit kan ondersteunen [5](#page=5).
> **Tip:** RAID 0 is nuttig wanneer snelheid cruciaal is en databeveiliging minder belangrijk is, of wanneer data elders geback-upt wordt.
#### 2.2.2 RAID 1: Mirroring
* **Werking:** RAID 1, bekend als "mirroring", dupliceert data over twee of meer schijven. Elke schijf bevat een exacte kopie van de data [7](#page=7).
* **Capaciteit:** De totale bruikbare capaciteit is gelijk aan die van de kleinste schijf in de array. Twee schijven van 1 TB in RAID 1 bieden dus 1 TB opslag [7](#page=7).
* **Redundantie:** RAID 1 biedt **volledige** redundantie. Eén schijf mag uitvallen zonder dataverlies. Meerdere schijven verhogen de redundantie, maar niet de capaciteit [7](#page=7).
* **Snelheid:** De leessnelheid kan verdubbelen, mits de RAID-controller dit ondersteunt. Schrijfsnelheden worden meestal niet significant verbeterd, omdat data naar meerdere schijven geschreven moet worden [7](#page=7).
> **Tip:** RAID 1 is een goede keuze voor kritieke data waar beschikbaarheid essentieel is en de capaciteitsbeperking acceptabel is.
#### 2.2.3 RAID 5: Parity
* **Werking:** RAID 5 ("parity") verdeelt data en pariteitsinformatie over drie of meer schijven. Pariteitsinformatie wordt gebruikt om data te reconstrueren in geval van een schijfstoring. De pariteitsberekening maakt gebruik van de XOR-operator [10](#page=10) [9](#page=9).
* **Capaciteit:** De totale capaciteit is de som van de capaciteiten van alle schijven minus de capaciteit van één schijf (voor pariteitsinfo). Bijvoorbeeld, drie schijven van 1 TB in RAID 5 bieden 2 TB aan opslag. Vier schijven van 1 TB bieden 3 TB [9](#page=9).
* **Redundantie:** RAID 5 biedt redundantie voor **één enkele schijfstoring**. Als twee schijven uitvallen, gaat alle data verloren. Het concept van een "hot spare" schijf kan een extra schijf bevatten die automatisch wordt geactiveerd om het reconstructieproces te starten bij een schijfstoring [9](#page=9).
* **Snelheid:** Leessnelheden zijn over het algemeen goed, vergelijkbaar met striping, omdat data van meerdere schijven gelezen kan worden. Schrijfsnelheden kunnen echter trager zijn dan bij RAID 0 of RAID 1 vanwege de overhead van het berekenen en schrijven van pariteitsinformatie [9](#page=9).
> **Tip:** RAID 5 biedt een goede balans tussen opslagcapaciteit, redundantie en prestaties voor veel toepassingen, vooral met drie of meer schijven.
#### 2.2.4 RAID 10: Mirror plus Striping
* **Werking:** RAID 10 (ook wel RAID 1+0 genoemd) combineert de voordelen van RAID 1 (mirroring) en RAID 0 (striping). Eerst worden RAID 1-arrays (spiegels) gecreëerd, en deze worden vervolgens samengevoegd via striping [12](#page=12).
* **Capaciteit:** De totale capaciteit is de helft van de som van de capaciteiten van alle schijven. Bijvoorbeeld, vier schijven van 1 TB in RAID 10 bieden 2 TB aan opslag [12](#page=12).
* **Redundantie:** RAID 10 biedt een hoge mate van redundantie. Een enkele schijf kan uitvallen, en in sommige gevallen zelfs een tweede schijf, mits deze zich in een andere gespiegelde set bevindt [12](#page=12).
* **Snelheid:** Het biedt uitstekende lees- en schrijfsnelheden dankzij de striping, gecombineerd met de redundantie van mirroring [12](#page=12).
> **Tip:** RAID 10 is een populaire keuze voor enterprise-omgevingen die zowel hoge prestaties als goede redundantie vereisen.
#### 2.2.5 RAID 01: Stripe plus Mirroring
* **Werking:** RAID 01 (ook wel RAID 0+1 genoemd) is de omgekeerde combinatie van RAID 10. Eerst worden RAID 0-arrays (stripes) gemaakt, en deze worden vervolgens gespiegeld (RAID 1) [13](#page=13).
* **Capaciteit:** De totale capaciteit is ook hier de helft van de som van de capaciteiten van alle schijven. Bij vier schijven van 1 TB in RAID 01 is dit 2 TB [13](#page=13).
* **Redundantie:** Net als RAID 10 biedt RAID 01 redundantie, waarbij een of twee schijven mogen uitvallen afhankelijk van de specifieke schijf [13](#page=13).
* **Nadeel:** Ondanks de gelijkenissen in capaciteit en redundantie, wordt RAID 01 niet gebruikt door bedrijven. De reden is dat wanneer een schijf uitvalt in een RAID 0-array, de gehele "last" op de andere RAID 0-array komt te liggen, wat het risico op een nieuwe storing vergroot [13](#page=13).
### 2.3 Software RAID versus Hardware RAID
Het belangrijkste verschil tussen software- en hardware-RAID ligt in waar de berekeningen voor de RAID-functionaliteit plaatsvinden [14](#page=14).
* **Hardware RAID:** Gebruikt een speciale RAID-chip, die geïntegreerd kan zijn op het moederbord of als een aparte insteekkaart. Dit ontlast de hoofdprocessor (CPU) van de server [14](#page=14).
* **Software RAID:** Maakt gebruik van de gedeelde processor, meestal de CPU, van het systeem voor de RAID-berekeningen. Bij Direct-Attached Storage (DAS) systemen is hardware RAID minder zinvol, omdat de hoofd-CPU meestal krachtig genoeg is. Software RAID kan over het algemeen eenvoudiger te herstellen zijn [14](#page=14).
* **Intel Rapid Storage Technology (RST):** Dit is een voorbeeld van software-RAID dat geïntegreerd is in veel Intel-chipsets. Het vereist drivers in het besturingssysteem om RAID-arrays te creëren en te gebruiken, en de berekeningen worden door de CPU uitgevoerd [15](#page=15).
> **Tip:** Bij netwerkopslagapparaten zoals NAS-apparaten is er vaak geen keuze; deze beschikken doorgaans over een dedicated hardware RAID-controller met eigen algoritmes [14](#page=14).
### 2.4 RAID is geen Backup!
Het is cruciaal om te onthouden dat RAID geen vervanging is voor een back-upsysteem [16](#page=16).
* **RAID:** Beschermt tegen schijf- of hardwarefouten en zorgt voor data-beschikbaarheid en systeem-uptime [16](#page=16).
* **Backup:** Beschermt tegen dataverlies door accidentele verwijdering, corruptie, rampen of malware. Een back-up maakt het mogelijk om terug te keren naar een eerdere staat van de data, iets wat RAID niet kan [16](#page=16).
---
# LVM (Logical Volume Manager)
Logical Volume Manager (LVM) is een technologie die het mogelijk maakt om fysieke opslag, zoals schijven, RAID-sets en volumes, op te delen in flexibele "apparaten" [19](#page=19).
### 3.1 Opbouw van LVM
LVM werkt met drie hiërarchische lagen om deze flexibiliteit te realiseren [19](#page=19):
* **Physical Volumes (PV)**: Dit zijn de onderliggende fysieke opslagcomponenten. Dit kunnen complete schijven, RAID-sets, of partities zijn die geconfigureerd zijn als een PV [19](#page=19).
* **Volume Groups (VG)**: Meerdere PV's kunnen worden gecombineerd tot één of meerdere Volume Groups. Een VG vormt een pool van opslagruimte [19](#page=19).
* **Logical Volumes (LV)**: Vanuit een VG kunnen vervolgens één of meerdere Logical Volumes worden aangemaakt. Deze LV's gedragen zich als normale partities of apparaten en kunnen worden geformatteerd om data op te slaan [19](#page=19).
### 3.2 Voordelen van LVM
Het belangrijkste voordeel van LVM ten opzichte van traditionele RAID-configuraties is de flexibiliteit bij het beheren van opslagvolumes [20](#page=20).
* **Groei- en krimpbaarheid zonder dataverlies**: In tegenstelling tot RAID, waarbij het vergroten van een array vaak dataverlies impliceert, staat LVM toe om de grootte van logische volumes aan te passen zonder gegevens te verliezen. Dit geldt zowel voor het vergroten als het verkleinen van volumes [20](#page=20).
* **Dynamisch beheer**: Veel LVM-bewerkingen, zoals het vergroten of verplaatsen van volumes, kunnen worden uitgevoerd terwijl de data op de volumes actief wordt benaderd [20](#page=20).
* **Integratie met RAID**: LVM kan een RAID-array transformeren tot een Physical Volume. Dit PV kan vervolgens worden toegevoegd aan een bestaande Volume Group om de bijbehorende Logical Volumes te vergroten, wat de flexibiliteit van LVM combineert met de redundantie van RAID [20](#page=20).
> **Tip:** Stel je voor dat een LV die traag presteert zich op een trage schijf bevindt. Met LVM kun je een snellere SSD toevoegen, een nieuwe VG creëren, en de trage LV naar deze nieuwe VG verplaatsen zonder dat er downtime is. Op dezelfde manier kan een gehele VG naar een nieuwe PV worden verplaatst. Dit geeft een aanzienlijke flexibiliteit zonder de redundantie van RAID te verliezen [20](#page=20).
---
# iSCSI (Internet Small Computer System Interface)
iSCSI is een technologie die wordt gebruikt om een Storage Area Network (SAN) te creëren, waarbij blokgebaseerde opslag over een netwerk wordt geleverd [23](#page=23) [24](#page=24).
### 4.1 De rol van iSCSI in Storage Area Networks (SANs)
Er bestaan twee belangrijke technologieën voor het opzetten van een SAN: Fibre Channel en iSCSI [24](#page=24).
* **Fibre Channel:** Bestaat sinds 1994 en was lange tijd de voorkeursoplossing voor SANs. Vereist echter specifieke hardware en software [24](#page=24) [25](#page=25).
* **iSCSI (internet Small Computer System Interface):** Werd populair rond 2006. Vereist aangepaste software, maar standaard Ethernet-hardware is voldoende [24](#page=24).
iSCSI wordt beschouwd als de meer toegankelijke keuze, met name voor het midden- en kleinbedrijf (MKB), waarbij veel SAN-opstellingen gebruik maken van iSCSI. Het levert blokgebaseerde I/O, vergelijkbaar met traditionele opslagsystemen, maar dan over een netwerk [23](#page=23) [26](#page=26).
### 4.2 Kernterminologie van iSCSI
Om iSCSI te begrijpen, is het belangrijk om de volgende terminologie te kennen [26](#page=26):
* **iSCSI Target:** Dit is de "server" in een iSCSI-configuratie. Het biedt opslag eenheden, bekend als LUNs (Logical Unit Numbers), aan initiators [26](#page=26).
* **iSCSI Initiator:** Dit is de "client" die verbinding maakt met een iSCSI Target. De Initiator krijgt toegang tot de LUNs die door het Target worden aangeboden. iSCSI Initiator-software is vaak ingebouwd in besturingssystemen zoals Windows [26](#page=26).
* **LUN (Logical Unit Number):** Een logische opslageenheid die door een iSCSI Target wordt aangeboden aan Initiators.
### 4.3 iSCSI adressering en identificatie
iSCSI gebruikt IQNs (iSCSI Qualified Names) als een vorm van WWN (World Wide Name) om iSCSI Targets en Initiators uniek te identificeren [27](#page=27).
* Zowel het Target als de Initiator hebben een IQN nodig voor identificatie [27](#page=27).
* Het is mogelijk om meerdere IQNs te configureren op één enkel IP-adres [27](#page=27).
* iSCSI ondersteunt een *n-tot-n* relatie, wat betekent dat meerdere Initiators verbinding kunnen maken met één of meerdere Targets, en toegang kunnen krijgen tot één of meerdere LUNs [27](#page=27).
**Voorbeeld van iSCSI-adressering:**
* **iSCSI target name:** `iqn.1992-08.com.microsoft:stor1-47cf3c25`
* **iSCSI alias:** `stor1`
* **IP address:** `192.168.36.101`
* **iSCSI initiator name:** `iqn.1998-01.com.vmware:train1-64ad4c29`
* **iSCSI alias:** `train1`
* **IP address:** `192.168.36.88`
### 4.4 Uitdagingen met bestandssystemen en gelijktijdige toegang
Een significant probleem met iSCSI (en SANs in het algemeen) is de gelijktijdige toegang van meerdere clients tot dezelfde LUN. Hoewel technisch mogelijk, ligt de uitdaging primair bij de bestandssystemen [28](#page=28).
* **Bestandssystemen zoals NTFS, EXT4, en ZFS zijn niet ontworpen voor gelijktijdig gebruik door meerdere block-level systemen** [28](#page=28).
* Een van de problemen is gerelateerd aan het **cache-mechanisme** van deze bestandssystemen. Schrijfacties naar de schijf worden niet altijd direct verwerkt, maar eerst gecached in het geheugen voordat ze naar de schijf worden geschreven. Dit kan leiden tot inconsistenties wanneer meerdere clients tegelijkertijd proberen te schrijven [28](#page=28).
* Het uitschakelen van de schrijfcache kan weliswaar geconfigureerd worden, maar lost het fundamentele probleem van gelijktijdige SAN-toegang niet op [28](#page=28).
* Virtualisatieoplossingen hebben dit probleem van gelijktijdige LUN-toegang opgelost middels specifieke methoden, zoals later zal worden besproken [28](#page=28).
> **Tip:** Het gedrag van bestandssysteemcaches benadrukt waarom het belangrijk is om opslagapparaten (zoals USB-sticks) altijd veilig te verwijderen, om dataverlies of corruptie te voorkomen [28](#page=28).
---
# Praktische oefening: RAID, LVM en iSCSI
Dit gedeelte beschrijft de praktische oefeningen die studenten zullen uitvoeren om de behandelde opslagtechnologieën te implementeren, inclusief richtlijnen voor het uitvoeren van de labs en het inleveren van het werk [29](#page=29).
### 5.1 Doelstellingen van de oefeningen
De praktische oefeningen hebben als doel om studenten hands-on ervaring te laten opdoen met de implementatie van RAID, LVM en iSCSI. Er wordt gestreefd naar een balans tussen het eenvoudig volgen van instructies en het begrijpen van de uitgevoerde acties [29](#page=29) [30](#page=30).
### 5.2 Uitvoering van de labs
Er worden twee scenario's voorgesteld voor de praktische oefeningen:
* **Scenario 1: Gebruik van een voorgeconfigureerde VM**
* Gebruik een vooraf geconfigureerde virtuele machine (VM) die een Synology NAS emuleert om een RAID-array en iSCSI in te stellen [30](#page=30).
* **Scenario 2: Handmatige configuratie in een eigen VM**
* Creëer een eigen VM.
* Configureer handmatig alle drie de componenten: RAID (tijdens de installatie), LVM en iSCSI [30](#page=30).
> **Tip:** Het is cruciaal om te begrijpen wat elke gebruikte opdracht doet tijdens de labs [30](#page=30).
### 5.3 Documentatie en inlevering
* **Probleemoplossing:** Maak elk lab eigen door eventuele problemen die je tegenkomt zelf op te lossen [30](#page=30).
* **Vragen beantwoorden:** Zorg ervoor dat alle gestelde vragen worden beantwoord, aangezien deze belangrijk kunnen zijn voor het examen [30](#page=30).
* **Inlevering:** Vergeet niet om je lab-rapport, quizzen en/of screenshots in te leveren vóór de deadline [30](#page=30).
* **Evaluatie:** Houd rekening met de evaluatieregels en de cursusdisclaimer [30](#page=30).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| RAID | Een technologie die meerdere harde schijven combineert om redundantie en/of prestatieverbeteringen te bieden voor gegevensopslag. Het staat voor "Redundant Array of Independent Disks". |
| JBOD | "Just a Bunch Of Disks" is een opslagconfiguratie waarbij schijven één voor één worden gevuld, zonder de redundantie of prestatieverbeteringen van ware RAID-niveaus. |
| Striping (RAID 0) | Een RAID-configuratie die gegevens verdeelt over meerdere schijven om de lees- en schrijfsnelheden te verhogen en de totale capaciteit te vergroten. Biedt geen redundantie. |
| Mirroring (RAID 1) | Een RAID-configuratie die identieke kopieën van gegevens op meerdere schijven opslaat, wat zorgt voor volledige redundantie ten koste van de effectieve opslagcapaciteit. |
| Parity (RAID 5) | Een RAID-configuratie die pariteitsinformatie over alle schijven verspreidt om gegevensverlies bij het falen van één schijf te voorkomen. Vereist minimaal drie schijven. |
| XOR | Een logische operatie die wordt gebruikt in RAID 5 om pariteitsinformatie te berekenen. De XOR-operatie vergelijkt bits en retourneert 1 als de bits verschillend zijn, en 0 als ze gelijk zijn. |
| Hot Spare | Een extra schijf die klaarstaat om een defecte schijf in een RAID-array onmiddellijk te vervangen om het rebuild-proces te starten en de redundantie te herstellen. |
| LVM (Logical Volume Manager) | Een opslagmanagementsysteem dat flexibiliteit biedt door fysieke opslagapparaten (zoals schijven of RAID-arrays) te groeperen in volumegroepen, die vervolgens kunnen worden opgedeeld in logische volumes. |
| Fysiek Volume (PV) | Een opslagapparaat (schijf, partitie, RAID-array) dat is geconfigureerd om te worden gebruikt door LVM. |
| Volume Groep (VG) | Een verzameling van één of meer Fysieke Volumes (PV's) in LVM, die samen één grote opslagpool vormen. |
| Logisch Volume (LV) | Een virtuele partitie die is gemaakt binnen een Volume Groep (VG) in LVM. Deze LV's kunnen worden geformatteerd en gebruikt als standaard opslagapparaten. |
| SAN (Storage Area Network) | Een speciaal netwerk dat block-level opslagapparaten aan servers levert. Het wordt vaak gebruikt in bedrijfsomgevingen voor gecentraliseerde opslagtoegang. |
| iSCSI (Internet Small Computer System Interface) | Een netwerkprotocol dat block-level opslagtoegang over een TCP/IP-netwerk mogelijk maakt, waardoor het mogelijk is om een SAN te creëren met standaard Ethernet-hardware. |
| iSCSI Target | De server die iSCSI-opslag (LUNs) aanbiedt aan initiators. |
| iSCSI Initiator | De client die verbinding maakt met een iSCSI Target om toegang te krijgen tot de aangeboden opslag (LUNs). |
| LUN (Logical Unit Number) | Een logisch gedefinieerde opslageenheid die door een iSCSI Target wordt aangeboden aan een iSCSI Initiator. |
| IQN (iSCSI Qualified Name) | Een unieke naamgevingsconventie die wordt gebruikt om iSCSI Targets en Initiators te identificeren, vergelijkbaar met een World Wide Name (WWN). |
| Block I/O | Input/Output operaties die gegevens verwerken in vaste blokken, typisch gebruikt voor directe opslagtoegang op schijfniveau. |
| File I/O | Input/Output operaties die gegevens verwerken op bestandsniveau, waarbij de bestandsstructuur en metadata worden beheerd. |
| DAS (Direct-Attached Storage) | Opslag die rechtstreeks is verbonden met een enkele server, in tegenstelling tot gedeelde opslag via een SAN of NAS. |
| NAS (Network-Attached Storage) | Opslagapparaten die toegang bieden tot bestanden via een netwerkprotocol (zoals NFS of SMB), bedoeld voor file-level toegang. |
| 3-2-1 regel | Een veelgebruikte backup-strategie die stelt dat er minstens drie kopieën van de gegevens moeten zijn, opgeslagen op minstens twee verschillende media, waarvan er minstens één zich op een andere locatie bevindt. |
Cover
7__Lecture_Virtualization-Containers.pdf
Summary
# Introductie tot containerisatie
Dit topic introduceert het concept van containerisatie, waarbij containers worden gedefinieerd als geïsoleerde processen en vergeleken met virtuele machines, met een focus op OS-level virtualisatie en de geschiedenis ervan.
## 1. Introductie tot containerisatie
Containerisatie is een vorm van besturingssysteem-level virtualisatie, wat betekent dat de kernel van een besturingssysteem het mogelijk maakt om meerdere geïsoleerde user-space instanties te creëren. Deze geïsoleerde omgevingen worden containers genoemd en zijn in wezen geïsoleerde processen die binnen het host-besturingssysteem draaien. Dit staat in contrast met traditionele virtuele machines, die een volledige gastbesturingssysteem emulator vereisen [10](#page=10) [3](#page=3).
### 1.1 Wat zijn containers?
Containers worden gedefinieerd als geïsoleerde processen. Dit kan worden geverifieerd doordat ze zichtbaar zijn in de proceslijst van het besturingssysteem, maar met toegevoegde isolatie. Wanneer een proces wordt gecontaineriseerd, "ziet" het slechts een beperkt deel van het besturingssysteem en zijn bronnen, in plaats van het volledige systeem [3](#page=3) [5](#page=5).
> **Tip:** Controleer in het lab hoe containers zich manifesteren in de proceslijst en hoe ze verschillende omgevingen waarnemen [3](#page=3).
### 1.2 OS-level virtualisatie
OS-level virtualisatie is de algemene term voor het creëren van geïsoleerde omgevingen binnen de kernel van een besturingssysteem. Afhankelijk van de specifieke software kan deze technologie verschillende namen hebben [7](#page=7):
* **Containers:** Gebruikt door Docker, Podman, LXC [7](#page=7).
* **Zones:** Gebruikt door Solaris [7](#page=7).
* **Jails:** Gebruikt door chroot of BSD [7](#page=7).
Containerisatie is geen nieuw concept en heeft wortels die teruggaan tot begin jaren 2000. Echter, Docker, gelanceerd in 2013, heeft containerisatie toegankelijker gemaakt met verbeterde tools en een duidelijk doel: het "verschepen" van software met containers. Kubernetes, geïntroduceerd in 2014, heeft geholpen bij het schalen van container-gebaseerde oplossingen, wat heeft geleid tot wijdverbreid gebruik in productieomgevingen [7](#page=7).
> **Tip:** Begrijp dat containers niet nieuw zijn, maar dat tools zoals Docker en orkestratiesystemen zoals Kubernetes hun populariteit en praktisch nut enorm hebben vergroot [7](#page=7).
### 1.3 Containers versus virtuele machines (VMs)
Het fundamentele verschil tussen containers en virtuele machines ligt in hun architectuur en de mate van virtualisatie.
* **Virtuele Machines (VMs):** Virtualiseren de hardware en vereisen een volledig gastbesturingssysteem per VM bovenop een hypervisor. Dit resulteert in hogere overhead, meer resourceverbruik en langere opstarttijden [10](#page=10).
* **Containers:** Virtualiseren het besturingssysteem zelf. Ze delen de kernel van het host-besturingssysteem en isoleren alleen de applicatieprocessen en hun benodigde bibliotheken en dependencies. Dit maakt containers lichter, sneller en efficiënter in resourcegebruik [10](#page=10) [3](#page=3).
> **Voorbeeld:** Stel u voor dat u één server heeft om maximaal te benutten. Vroeger zou u misschien verschillende VMs draaien voor verschillende diensten (webserver, fileserver, etc.). Met containerisatie kunt u op diezelfde server meerdere containers draaien, elk met een specifieke applicatie en zijn dependencies, die allemaal de kernel van het host-besturingssysteem delen [9](#page=9).
### 1.4 De filosofie van Docker
Docker's filosofie draait om het vereenvoudigen en standaardiseren van het proces van softwareontwikkeling en -implementatie. Het wordt vaak omschreven als [12](#page=12):
* "Een chique manier om een commando uit te voeren" [14](#page=14).
* "Applicatiecontainers" [14](#page=14).
* "Het verschepen van software (en al zijn dependencies)" [14](#page=14).
Dit benadrukt het doel om applicaties en hun omgeving samen te verpakken, zodat ze consistent draaien, ongeacht waar ze worden geïmplementeerd [12](#page=12) [14](#page=14).
---
# Docker ecosysteem en concepten
Dit gedeelte biedt een diepgaande blik op de kerncomponenten en architectuur van het Docker ecosysteem, van registraties en images tot de onderliggende technologieën die containers aandrijven [15](#page=15).
### 2.1 Kernconcepten van Docker
Docker wordt gezien als een manier om commando's uit te voeren en wordt toegepast op "application containers", wat helpt bij het "shippen" van software samen met al haar afhankelijkheden. De fundamentele elementen binnen Docker zijn registraties, images en containers, die nauw met elkaar samenhangen [14](#page=14) [15](#page=15).
#### 2.1.1 Registraties, Images en Containers
* **Registratie (Registry):** Een opslagplaats voor Docker images. Voorbeelden hiervan zijn Docker Hub (publiek) of private registraties [15](#page=15).
* **Image:** Een uitvoerbaar pakket dat alles bevat wat nodig is om een applicatie te draaien: code, runtime, systeertools, systeembibliotheken en instellingen. Images zijn immutable (onveranderlijk) [15](#page=15).
* **Container:** Een draaiende instantie van een image. Het is de runtime omgeving waarin de applicatie daadwerkelijk draait. Containers zijn geïsoleerd van de host machine en van andere containers [15](#page=15).
#### 2.1.2 Dockerfile
Een `Dockerfile` is een tekstbestand dat instructies bevat om een Docker image te bouwen. Deze instructies specificeren de basisimage, commando's om software te installeren, bestanden te kopiëren, poorten te openen, en het commando dat moet worden uitgevoerd bij het starten van de container [16](#page=16).
> **Tip:** Het volgen van best practices voor Dockerfiles, zoals die van Microsoft en Docker zelf, is cruciaal voor het optimaliseren van buildtijden en imagegroottes [16](#page=16).
#### 2.1.3 Multi-stage builds
Multi-stage builds in Dockerfiles zijn een techniek om de uiteindelijke container image kleiner en efficiënter te maken. Hierbij worden meerdere stages gedefinieerd binnen één `Dockerfile`. Een typisch scenario is het gebruik van één stage voor het bouwen van de applicatie (bijvoorbeeld met ontwikkeltools) en een tweede stage die enkel de gecompileerde binaire code bevat voor de productie-image. Dit resulteert in een image die geen onnodige build-tools of tussenliggende artefacten bevat [17](#page=17).
> **Tip:** Multi-stage builds helpen bij het scheiden van build-omgevingen van runtime-omgevingen, wat leidt tot veiligere en kleinere images [17](#page=17).
#### 2.1.4 Docker Compose
Docker Compose is een tool voor het definiëren en beheren van applicaties die uit meerdere containers bestaan. De configuratie van de multi-container applicatie wordt vastgelegd in een `docker-compose.yml` bestand, waarna de applicatie eenvoudig kan worden gestart met het commando `docker compose up` [18](#page=18).
> **Voorbeeld:** Een `docker-compose.yml` bestand kan worden gebruikt om een WordPress website te definiëren samen met een bijbehorende database container [18](#page=18).
### 2.2 Docker Engine architectuur
De Docker Engine bestaat uit een server (daemon) en een client die met elkaar communiceren via de Docker Engine API, een REST API. De `docker version` commando toont informatie over de client en de daemon, wat verschilt van `docker --version` dat enkel de clientversie toont [19](#page=19).
#### 2.2.1 Interactie via de Docker Engine API
De Docker Engine API maakt interactie met de Docker daemon mogelijk. Dit kan bijvoorbeeld via een Unix socket, zoals gedemonstreerd met `curl --unix-sock /var/run/docker.sock http://1.43/images/json` om een lijst van images op te vragen, of `curl --unix-sock /var/run/docker.sock http://1.43/containers/json` om een lijst van containers op te vragen [19](#page=19).
#### 2.2.2 Onderliggende componenten: Containerd en runc
Onder de motorkap maakt Docker gebruik van gespecialiseerde componenten om containers te beheren en uit te voeren. De belangrijkste hiervan zijn `containerd` en `runc` [20](#page=20).
* **Containerd:** Een daemon die verantwoordelijk is voor het beheer van de levenscyclus van containers op een host. Het beheert onder andere de image transfers, opslag en het uitvoeren van containers [20](#page=20) [21](#page=21).
* **runc:** Een lichtgewicht, low-level container runtime die is gebaseerd op de Open Container Initiative (OCI) standaard. `runc` is verantwoordelijk voor het daadwerkelijk starten en uitvoeren van de containerprocessen [20](#page=20) [21](#page=21) [23](#page=23).
Technisch gezien, wanneer een container met Docker wordt gestart, communiceert de Docker daemon met `containerd`, die op zijn beurt `runc` aanroept om de container uit te voeren. De systeemservice `docker.service` is te vinden onder `/lib/systemd/system/docker.service` [21](#page=21).
> **Tip:** Begrijpen hoe `containerd` en `runc` samenwerken, helpt bij het dieper doorgronden van de containertechnologie en de interactie met het besturingssysteem [20](#page=20) [21](#page=21) [23](#page=23).
---
# Container standaarden en alternatieven
Dit topic verkent de Open Container Initiative (OCI) standaard die zorgt voor interoperabiliteit tussen containertechnologieën, en bespreekt alternatieve containeromgevingen zoals Podman en LXC/LXD/Incus [24](#page=24).
### 3.1 Open Container Initiative (OCI)
De Open Container Initiative (OCI) is een project dat tot doel heeft een set standaarden te creëren voor het formatteren en uitvoeren van containers, met als belangrijkste doel interoperabiliteit tussen verschillende containertechnologieën te waarborgen [25](#page=25).
* **Kernidee:** De OCI definieert een standaard voor zowel het containerformaat (image-spec) als de runtime-specificatie (runtime-spec). Dit betekent dat een container die volgens de OCI-standaard is gebouwd, door elke container runtime die OCI ondersteunt, kan worden uitgevoerd [25](#page=25).
* **Voordelen:** Door de OCI-standaard wordt vendor lock-in verminderd en kunnen ontwikkelaars en operators de tools en platformen kiezen die het beste bij hun behoeften passen, zonder zich zorgen te maken over compatibiliteit [25](#page=25).
* **Relatie met Docker:** Een Dockerfile is OCI-compliant, wat impliceert dat elke runtime die OCI ondersteunt, containers kan uitvoeren die met behulp van de Dockerfile-syntax zijn gecreëerd [25](#page=25).
### 3.2 Podman
Podman is een daemonless container engine die fungeert als een krachtig alternatief voor Docker, met een sterke focus op veiligheid en flexibiliteit [27](#page=27) [28](#page=28).
* **Daemonless architectuur:** In tegenstelling tot Docker, dat een centrale daemon (`dockerd`) gebruikt, opereert Podman zonder een dergelijke daemon. Dit draagt bij aan een eenvoudigere architectuur en potentieel minder beveiligingsrisico's [28](#page=28).
* **Rootless containers:** Een van de belangrijkste voordelen van Podman is de ingebouwde ondersteuning voor rootless containers. Dit stelt gebruikers in staat containers te draaien zonder root-privileges, wat de beveiliging aanzienlijk verhoogt. Hoewel Docker ook pogingen doet om rootless containers te ondersteunen, is dit een kernkenmerk van Podman [28](#page=28).
* **Gebruiksscenario's:** Podman is uitermate geschikt voor scenario's waar verbeterde beveiliging en flexibiliteit vereist zijn, zoals in development workflows en omgevingen waar root-toegang beperkt is [36](#page=36).
* **OCI-compatibiliteit:** Podman is OCI-compliant en kan containers bouwen en uitvoeren die voldoen aan de OCI-standaarden, vergelijkbaar met Docker-images [36](#page=36).
### 3.3 LXC / LXD / Incus
LXC (LinuX Containers) is een ouder en meer op het besturingssysteem gerichte containertechnologie, die zich onderscheidt van de applicatiecontainers van OCI/Docker. LXD bouwt hierop voort als een uitgebreider beheerplatform, en Incus is een recente fork van LXD [29](#page=29) [31](#page=31) [34](#page=34).
#### 3.3.1 LXC (LinuX Containers)
LXC is een technologie die zich richt op "system containers" in plaats van "application containers" zoals bij Docker en OCI [31](#page=31) [32](#page=32).
* **System containers:** Deze containers bieden een meer volledige Linux-omgeving, vergelijkbaar met een lichtgewicht virtuele machine, maar dan zonder de overhead van een aparte kernel of hardware-emulatie. Ze kunnen een complete Linux-distributie hosten [32](#page=32) [36](#page=36).
* **Kernel features:** LXC maakt gebruik van de containment-features die worden ondersteund door de Linux-kernel, zoals namespaces en cgroups, voor isolatie [31](#page=31) [36](#page=36).
* **Gebruiksscenario's:** LXC is geschikt voor het draaien van volledige Linux-distributies, development- en testomgevingen die een complete OS-omgeving vereisen [36](#page=36).
#### 3.3.2 LXD
LXD is een uitbreiding op LXC die een gebruikersinterface biedt voor het beheren van containers en deze over het netwerk via een REST API kan beheren [31](#page=31).
* **Beheer en API:** LXD voegt een daemonlaag en API toe om het beheer van LXC-containers te vereenvoudigen en schaalbaarder te maken [31](#page=31).
* **LXCFS:** LXD maakt gebruik van LXCFS (Linux Containers File System), een userspace-filesystem (FUSE) dat container-bewuste functionaliteit biedt, vergelijkbaar met hoe `sshfs` werkt [31](#page=31).
* **Commerciële ondersteuning:** Canonical, bekend van Ubuntu, biedt commerciële ondersteuning voor LXD [31](#page=31).
#### 3.3.3 Incus
Incus is een fork van LXD, gelanceerd door het oorspronkelijke Linux Containers upstream-project en bijdragers van andere distributies, na een licentiewijziging van LXD [34](#page=34).
* **Licentiewijziging van LXD:** In december 2023 werd LXD's licentie gewijzigd van Apache 2.0 naar AGPLv3, een copyleft licentie. Dit, samen met de vereiste van het ondertekenen van een Contributor License Agreement (CLA), leidde tot de oprichting van Incus [34](#page=34).
* **Community-onderhoud:** Incus is een community-onderhouden fork die de ontwikkeling en beschikbaarheid van LXD-functionaliteit voor diverse distributies wil waarborgen, met name in reactie op de licentiewijzigingen [34](#page=34).
#### 3.3.4 LXC/LXD/Incus en OCI
Hoewel LXC/LXD oorspronkelijk niet direct geassocieerd waren met de OCI-standaard, is er groeiende ondersteuning om OCI- en Docker-images te gebruiken binnen deze omgevingen vanwege hun populariteit. Dit maakt de migratie en integratie tussen verschillende containertechnologieën mogelijk [33](#page=33).
### 3.4 Vergelijking van containertechnologieën
| Aspect | LXC/LXD/Incus | Docker | Podman |
| :--------------- | :---------------------------------------------- | :------------------------------------------------- | :------------------------------------------------ |
| **Doel** | Systeemcontainers (volledige OS-omgevingen) | Applicatiecontainers (enkele apps/processen) | Applicatiecontainers (enkele apps/processen) |
| **Architectuur** | Gebruikt LXC-bibliotheken; LXD biedt daemon-management | Daemon-gebaseerd (dockerd) | Daemonless |
| **Gebruiksscenario's** | Volledige Linux distro's, development, testing | Microservices, CI/CD, lichtgewicht deployments | Rootless containers, verbeterde beveiliging |
| **Image Formaat** | Custom (rootfs of tarball-gebaseerd) | OCI-compatibel (Docker images) | OCI-compatibel (Docker images) |
| **Netwerk** | Geavanceerder, ondersteunt bridge/VLAN management | Vereenvoudigd standaard | Zoals Docker, met rootless opties |
| **Resourcegebruik** | Hoger (door volledige OS-functionaliteit) | Lager (ontworpen voor enkele apps/processen) | Zoals Docker |
| **Beveiliging** | Sterke isolatie via namespaces en cgroups | Isolatie via namespaces, seccomp, AppArmor | Focus op rootless containers en isolatie |
| **Certificatie** | | | | [36](#page=36).
> **Tip:** Het is cruciaal om het onderscheid tussen "system containers" en "application containers" te begrijpen, aangezien dit de primaire drijfveer is achter de verschillende ontwerpprincipes en gebruiksscenario's van LXC/LXD/Incus versus Docker/OCI/Podman [31](#page=31) [36](#page=36).
>
> **Voorbeeld:** Als u een complete ontwikkelomgeving nodig heeft die exact lijkt op uw productie-Linux-server, dan zou een LXC/LXD/Incus "system container" geschikter kunnen zijn. Als u echter een specifieke webapplicatie wilt isoleren en snel wilt deployen, dan is een OCI-compatibele "application container" (gemaakt met Docker of Podman) waarschijnlijk de betere keuze [36](#page=36).
---
# Praktische toepassing en experimenten
Dit gedeelte beschrijft de praktische uitvoering van containerisatie door middel van een lab-opzet, waarbij de basistaken met Docker, Podman en LXD/LXC worden behandeld, evenals de stappen voor het opzetten van virtuele machines en het installeren van deze technologieën [37](#page=37).
### 4.1 Container lab setup
Het lab-opzet vereist het uitvoeren van specifieke taken met de genoemde containertechnologieën [39](#page=39).
#### 4.1.1 Basis container taken
Met Docker, Podman en LXD/LXC dient men de volgende basistaken te kunnen uitvoeren [38](#page=38):
* Een container creëren [38](#page=38).
* Een container starten en stoppen [38](#page=38).
* Een commando "in" de container uitvoeren [38](#page=38).
* Een shell verkrijgen en "in" de container kunnen navigeren [38](#page=38).
#### 4.1.2 Docker specifieke taken
Voor Docker dienen de volgende specifieke taken beheerst te worden [38](#page=38):
* Een image bouwen op basis van een Dockerfile [38](#page=38).
* Een instantie van een image draaien [38](#page=38).
* Port-forwarding configureren [38](#page=38).
* Informatie opvragen door de container te inspecteren [38](#page=38).
* Volumes mounten [38](#page=38).
* Een container op de achtergrond starten [38](#page=38).
* Docker Compose gebruiken [38](#page=38).
#### 4.1.3 Virtuele machine en installatie stappen
De voorbereiding voor het lab omvat het opzetten van een virtuele machine en de installatie van de containertechnologieën. Dit proces omvat de volgende stappen [39](#page=39):
* Een nieuwe (Debian) virtuele machine creëren [39](#page=39).
* Na de installatie een snapshot van de virtuele machine maken [39](#page=39).
* Docker installeren, enkele vragen beantwoorden en een voorbeeldproject opzetten [39](#page=39).
* Terugkeren naar een eerder gemaakt snapshot (revert) [39](#page=39).
* Podman installeren [39](#page=39).
* Opnieuw gebruikmaken van snapshots om terug te keren [39](#page=39).
* LXD/LXC installeren [39](#page=39).
> **Tip:** Het maken en gebruiken van snapshots is cruciaal om snel terug te kunnen keren naar een werkende staat na experimenten of mislukte installaties. Dit voorkomt tijdverlies bij het herhaaldelijk opnieuw opzetten van de omgeving [39](#page=39).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| Containerisatie | Het proces van het creëren en beheren van geïsoleerde omgevingen op besturingssysteemniveau, waardoor applicaties en hun afhankelijkheden efficiënt kunnen worden verpakt en uitgevoerd. |
| Virtuele machine (VM) | Een gesimuleerde computeromgeving die draait bovenop een fysiek systeem, met een eigen besturingssysteem en hardware-emulatie, wat resulteert in zwaardere overhead dan containers. |
| Operating-system-level virtualization | Een virtualisatietechniek waarbij de kernel van een besturingssysteem meerdere geïsoleerde gebruikersruimte-instanties (containers) toestaat, die dezelfde kernel delen maar hun eigen processen, bestanden en netwerken hebben. |
| Besturingssysteem (OS) | De fundamentele software die de hardware van een computer beheert en basisdiensten levert aan applicaties, zoals geheugenbeheer, procesplanning en bestandsysteemtoegang. |
| Kernel | Het centrale deel van een besturingssysteem dat de hardware van de computer beheert en als tussenlaag fungeert tussen de hardware en de applicatiesoftware. |
| Geïsoleerde processen | Processen die worden uitgevoerd binnen een beperkte omgeving, waardoor ze geen invloed kunnen uitoefenen op andere processen of het gehele systeem en hun eigen bestandssysteem, netwerk en processen hebben. |
| Docker | Een populair platform voor het ontwikkelen, distribueren en draaien van applicaties met behulp van containers, dat een gestandaardiseerde methode biedt om software 'in te schepen' met al zijn afhankelijkheden. |
| Podman | Een daemonless container-engine die fungeert als een alternatief voor Docker, met een focus op rootless containers en verbeterde beveiligingsfuncties, en die ook OCI-compatibele images ondersteunt. |
| LXC (Linux Containers) | Een OS-level virtualisatie-technologie voor Linux die systeemcontainers biedt, vergelijkbaar met lichtgewicht virtuele machines, en die een breed scala aan inkapselingsfuncties van de Linux-kernel benut. |
| LXD (Linux Container Daemon) | Een extensie op LXC die een gebruikersinterface en beheerfunctionaliteit biedt voor containers, inclusief netwerkbeheer en een REST API voor externe interactie. |
| Incus | Een fork van LXD, gelanceerd na een licentiewijziging van LXD, die gemeenschapsgestuurd onderhoud en ontwikkeling nastreeft en compatibiliteit met OCI-images nastreeft. |
| OCI (Open Container Initiative) | Een standaardisatie-initiatief dat industriestandaarden definieert voor containerformaten en runtimes, met als doel interoperabiliteit tussen verschillende containertechnologieën te waarborgen. |
| Registratie (Registry) | Een opslagplaats voor container-images, zoals Docker Hub of een privé-registratie, waar images kunnen worden opgeslagen, gedeeld en gedownload. |
| Image | Een lichtgewicht, uitvoerbaar, stand-alone softwarepakket dat alles bevat wat nodig is om een stuk software te draaien: code, runtime, systeengereedschappen, systeembibliotheken en instellingen. |
| Container | Een draaiende instantie van een image, die een geïsoleerde omgeving biedt waarin de applicatie kan worden uitgevoerd. |
| Dockerfile | Een tekstbestand dat instructies bevat voor het bouwen van een Docker-image, vergelijkbaar met een recept voor het creëren van de applicatieomgeving. |
| Multi-stage dockerfile | Een methode om Dockerfiles te optimaliseren door verschillende bouwfases te gebruiken, waarbij alleen de benodigde artefacten (zoals de gecompileerde applicatie) in de uiteindelijke image worden opgenomen, wat resulteert in kleinere en veiligere images. |
| Docker Compose | Een tool voor het definiëren en beheren van multi-container Docker-applicaties, waarbij de configuratie wordt vastgelegd in een YAML-bestand (`docker-compose.yml`). |
| Containerd | Een industriestandaard container runtime die wordt gebruikt om het levenscyclusbeheer van containers te automatiseren, vaak onderliggend aan hogere-level tools zoals Docker. |
| runc | Een lichtgewicht, cross-platform tool om containers te creëren en te draaien volgens de OCI-specificaties, vaak gebruikt als de lage-niveau runtime door containertechnologieën zoals Docker en Containerd. |
| REST API | Een architectuurstijl voor het ontwerpen van netwerkapplicaties die gebruikmaakt van HTTP-verzoeken om te communiceren tussen een client en een server, vaak gebruikt om container-orchestratietools te beheren. |
| Rootless containers | Containers die worden uitgevoerd zonder dat de gebruiker root-rechten nodig heeft, wat de beveiliging verbetert door het potentiële aanvalsoppervlak te verkleinen. |
| Systeemcontainer | Een container die is ontworpen om een volledig besturingssysteem te emuleren, inclusief meerdere services en processen, vergelijkbaar met een lichtgewicht virtuele machine. |
| Applicatiecontainer | Een container die is ontworpen om een enkele applicatie of een specifieke set processen te huisvesten, geoptimaliseerd voor snelle implementatie en efficiëntie. |
Cover
LinuxEssentials.pdf
Summary
# Inleiding tot Linux en Unix
Dit onderwerp introduceert de oorsprong van Linux en Unix, hun ontwikkeling, en de relatie tussen beide besturingssystemen.
### 1.1 Wat is Linux?
Linux is een populair besturingssysteem dat, hoewel minder zichtbaar op desktops vergeleken met Windows, MacOSX of ChromeOS, dominant is in server-, IoT- en mobiele omgevingen. Het wordt gebruikt in een breed scala aan apparaten, waaronder smartphones, servers, tablets, IoT-apparaten, slimme apparaten, zelfrijdende auto's, modems, routers en spelconsoles zoals de PlayStation. Linux heeft zelfs een eigen mascotte: de pinguïn Tux [2](#page=2).
#### 1.1.1 Statistieken en Feiten over Linux
* De meerderheid van de supercomputers draait op Linux [2](#page=2).
* Populaire cloudinfrastructuurproviders maken veelvuldig gebruik van Linux [2](#page=2).
* Linux-statistieken tonen een brede adoptie en populariteit [2](#page=2).
### 1.2 De Oorsprong van Unix
Unix werd in 1969 gecreëerd door Dennis Ritchie en Ken Thompson. Oorspronkelijk werd de broncode van Unix vrij gedeeld. Het bedrijf AT&T Bell Labs besloot echter om Unix commercieel te gaan verkopen, wat leidde tot de ontwikkeling van verschillende versies. Tegelijkertijd ontwikkelde BSD het besturingssysteem onafhankelijk van Unix, resulterend in [3](#page=3):
* Unix: de commerciële versie.
* BSD Unix: de open source versie [3](#page=3).
In de jaren '80 ontstonden diverse versies van Unix. Vanwege de commercialisering van Unix, werd de broncode herschreven als onderdeel van het GNU-project, met als doel een open source besturingssysteem te creëren waar de gemeenschap aan kon bijdragen. Het GNU-project miste echter nog een kernel [3](#page=3).
### 1.3 De Ontwikkeling van Linux
Linus Torvalds, een student, creëerde in de jaren '90 een eigen besturingssysteem en deelde zijn werk via een nieuwsgroep. De kernel die Torvalds ontwikkelde, wordt nog steeds dagelijks gebruikt en verder ontwikkeld [3](#page=3).
> **Tip:** Begrijpen dat Linux voortbouwt op concepten van Unix en de ontwikkeling van het GNU-project is cruciaal voor het plaatsen van Linux in de technologische geschiedenis [3](#page=3).
### 1.4 Linux Distributies
Linux-distributies, ook wel distro's genoemd, vereenvoudigen het installatieproces van GNU/Linux en bijbehorende applicaties op een computer. Enkele bekende distributies zijn Ubuntu, RedHat, Fedora, CentOS, Debian, Archlinux en Oracle Linux. Vanwege de schaalbaarheid van Linux zijn er ook gespecialiseerde distro's voor specifieke doeleinden, zoals Clonezilla [4](#page=4).
> **Voorbeeld:** Een gebruiker die een stabiel en gebruiksvriendelijk systeem zoekt voor desktopgebruik, kiest wellicht voor Ubuntu, terwijl een systeembeheerder die maximale controle en flexibiliteit wenst, kan kiezen voor Debian of Archlinux [4](#page=4).
---
# Installatie van Ubuntu Server met Virtualisatie
Dit onderdeel behandelt het opzetten van een virtuele machine en het installeren van Ubuntu Server hierop, inclusief de configuratie van virtuele hardware.
### 2.1 De rol van virtualisatie
Virtualisatie is een concept waarbij een computersysteem met een besturingssysteem virtueel op een ander systeem kan draaien. Dit maakt het mogelijk om meerdere gastbesturingssystemen met hun eigen virtuele hardware op één hostsysteem te draaien. In deze cursus wordt virtualisatie gebruikt om een lokale virtuele machine (VM) op te zetten als simulatie van een cloud instance. Dit biedt voordelen, zoals de mogelijkheid om te werken zonder internetverbinding [5](#page=5).
### 2.2 Benodigde software en bestanden
Voor de installatie van Ubuntu Server in een virtuele omgeving is het besturingssysteem **Ubuntu Server** vereist. Dit is een op Debian gebaseerde distributie die gedownload kan worden als een.iso bestand. Een.iso bestand is een exacte kopie van een CD/DVD en wordt gebruikt om het besturingssysteem in de virtuele machine te installeren [5](#page=5).
#### 2.2.1 Virtualisatiesoftware
Er zijn verschillende virtualisatiesoftwarepakketten beschikbaar, waaronder VMware Workstation, Virtualbox en Hyper-V. In deze cursus zal **VMware Workstation** worden gebruikt [6](#page=6).
### 2.3 Het aanmaken van een virtuele machine in VMware Workstation
Het proces voor het aanmaken van een nieuwe VM in VMware Workstation begint via het menu `File > New Virtual Machine` [6](#page=6).
#### 2.3.1 Initiële configuratie
1. **Wizard start:** Selecteer de optie `Typical` [6](#page=6).
2. **Installatie van besturingssysteem:** Kies de optie `I will install the operating system later` [7](#page=7).
3. **Besturingssysteem selectie:** Kies voor `Linux` en in de versiedropdown voor `Ubuntu 64 bit` [7](#page=7).
4. **Naam en opslaglocatie:** Geef de virtuele machine een naam en kies een opslagmap [8](#page=8).
> **Tip:** Sla de VM-bestanden niet op in een map die wordt gesynchroniseerd met cloudopslag (zoals OneDrive, Dropbox of Google Drive), omdat dit kan leiden tot corruptie van de VM [8](#page=8).
5. **Harde schijf configuratie:** Configureer de grootte van de virtuele harde schijf, standaard 20 GB, wat later uitgebreid kan worden [8](#page=8).
#### 2.3.2 Hardware aanpassen
Na het klikken op `Customize Hardware` kunnen verdere configuraties worden doorgevoerd [9](#page=9).
1. **Koppelen van ISO-bestand:** Koppel het gedownloade.iso bestand van Ubuntu Server aan het virtuele cd-rom-station door `New CD/DVD` te selecteren en te bladeren naar het.iso bestand [9](#page=9).
2. **Voltooiing VM aanmaak:** Klik op `Finish` om de virtuele machine aan te maken [10](#page=10).
3. **UEFI BIOS instelling:** Ga naar `Edit virtual machine settings` om het UEFI BIOS in te stellen. Navigeer naar het tabblad `Options`, klik op `Advanced` en selecteer `UEFI`. Hier kunnen ook instellingen voor 'Side channel mitigations' worden gevonden indien er waarschuwingen optreden tijdens het opstarten [11](#page=11) [12](#page=12).
De VM kan nu worden opgestart door op het groene pijltje te klikken [12](#page=12).
### 2.4 Installatie van Ubuntu Server
Na het opstarten van de virtuele machine start het installatieproces van Ubuntu Server [13](#page=13).
> **Tip:** Er is geen muisaanwijzer beschikbaar tijdens de installatie; navigeer met de pijltjestoetsen en Enter [13](#page=13).
#### 2.4.1 Veelvoorkomende problemen en oplossingen
* **Intel VT-x foutmelding:** Als de VM de foutmelding `This host supports Intel VT-x, but Intel VT-x is disabled` geeft, moet de VT-X optie in de BIOS van de laptop worden geactiveerd [13](#page=13).
* **Muis terugkrijgen:** Om de muis terug te krijgen in het hostbesturingssysteem (zoals Windows), druk op `CTRL + ALT` [13](#page=13).
#### 2.4.2 Installatiestappen
1. **Startscherm:** Kies `Try or Install Ubuntu` [13](#page=13).
2. **Taalkeuze:** Selecteer `English` [14](#page=14).
3. **Update installatieprogramma:** Sla de update van het installatieprogramma over indien dit scherm verschijnt [14](#page=14).
4. **Toetsenbordindeling:** Kies de juiste toetsenbordindeling (bijvoorbeeld `Belgian` voor AZERTY, `French (Macintosh)` voor Mac) [15](#page=15).
5. **Netwerk, Proxy en Mirror:** In de volgende 7 stappen worden geen wijzigingen aangebracht; klik op `Done` of `Continue` [16](#page=16).
6. **Gebruikersaccount aanmaken:** Maak een gebruikersaccount aan met de volgende gegevens [20](#page=20):
* Gebruikersnaam: `student`
* Servernaam: `ubserv`
* Wachtwoord: `pxl`
7. **Ubuntu Pro upgrade:** Kies `Skip for now` op de vraag om te upgraden naar Ubuntu Pro [21](#page=21).
8. **Extra pakketten:** Installeer als extra pakket de `OpenSSH server` [22](#page=22).
9. **Installatie voltooid:** Het besturingssysteem wordt nu geïnstalleerd en geconfigureerd. Na voltooiing verschijnt de optie `Reboot now` [24](#page=24).
#### 2.4.3 Na de herstart
1. **CD/DVD ontkoppelen:** Voordat de server opnieuw opstart, is het belangrijk om in de instellingen van de Virtuele Machine de optie om de CD/DVD te verbinden bij het opstarten uit te vinken. Dit voorkomt dat de installatie opnieuw wordt geladen bij elke opstart [24](#page=24).
2. **Bevestigen herstart:** Druk op de `ENTER` toets [24](#page=24) [25](#page=25).
3. **Inloggen:** Na de herstart moet nogmaals op de `enter` toets gedrukt worden om de inlogprompt te zien. Log in met de aangemaakte gebruikersnaam (`student`) en wachtwoord (`pxl`). Het wachtwoord wordt niet zichtbaar getypt [25](#page=25) [26](#page=26).
---
# Werken met de Command Line Interface (CLI)
Dit onderwerp introduceert de command line interface (CLI), een tekstgebaseerde manier om met een besturingssysteem te interageren, inclusief de componenten zoals prompts, commando's, argumenten, opties, het gebruik van manpages en shell history [27](#page=27).
### 3.1 Introductie tot de Command Line Interface (CLI)
De Command Line Interface (CLI) is een interactieve omgeving waarbij invoer uitsluitend via het toetsenbord plaatsvindt, zonder de aanwezigheid van een grafische gebruikersinterface (GUI). Dit wordt vaak toegepast in serveromgevingen om systeembronnen te besparen en het aanvalsoppervlak te verkleinen. CLI's worden als een efficiënte en betrouwbare methode beschouwd voor systeembeheer en automatisering [27](#page=27).
#### 3.1.1 De prompt
Na het inloggen wordt de gebruiker geconfronteerd met een **prompt**, een regel tekst die informatie geeft over het huidige systeem en de gebruiker. De prompt bestaat doorgaans uit de gebruikersnaam, de hostnaam van de server en het huidige werkdirectorypad. Het symbool `~` is een afkorting voor de home directory van de ingelogde gebruiker (bijvoorbeeld `/home/student`). De invoer van de gebruiker begint na het `USD`-teken, wat het einde van de prompt aangeeft [28](#page=28).
> **Tip:** Vergelijk de prompt met het pad `C:\Users\student` in Windows; het geeft aan waar je momenteel in het bestandssysteem bent [28](#page=28).
### 3.2 Commando's, argumenten en opties
Om met een besturingssysteem via de CLI te werken, worden **commando's** gebruikt. Een commando kan bestaan uit [28](#page=28):
* **Commando zelf:** De naam van de opdracht die wordt uitgevoerd (bijv. `echo`, `shutdown`).
* **Argumenten:** Extra informatie die aan het commando wordt meegegeven, zoals een string die moet worden afgedrukt door `echo` [28](#page=28).
* **Opties:** Specifieke vlaggen (meestal voorafgegaan door een koppelteken `-`) die de functionaliteit van een commando aanpassen of uitbreiden [29](#page=29).
#### 3.2.1 Voorbeeld: `echo` en `shutdown`
Het `echo` commando drukt de meegegeven argumenten af [28](#page=28).
```bash
student@linux-ess:~USD echo hello world
hello world
```
Het `shutdown` commando wordt gebruikt om de machine af te sluiten of te herstarten. Het kan een argument bevatten dat aangeeft wanneer de actie moet plaatsvinden, zoals `now` [29](#page=29).
```bash
student@linux-ess:~USD sudo shutdown now
```
#### 3.2.2 `sudo` en beheerdersrechten
Het `sudo` commando (Superuser Do) wordt gebruikt om commando's uit te voeren met beheerdersrechten (als de "root" gebruiker). Dit is noodzakelijk voor bepaalde bewerkingen die standaardrechten overschrijden [29](#page=29).
#### 3.2.3 Opties van commando's
Commando's kunnen diverse opties hebben die hun gedrag beïnvloeden. Bijvoorbeeld, het `shutdown` commando kent opties zoals `-H` voor halt, `-P` voor power-off (standaard), en `-r` voor reboot [29](#page=29).
> **Let op:** Alle commando's, opties, argumenten, en bestands- en mapnamen zijn hoofdlettergevoelig in Linux [30](#page=30).
### 3.3 Manpages: de handleidingen
Linux-systemen voorzien in ingebouwde documentatie voor commando's en systeembestanden, bekend als **manpages** (manual pages). Deze zijn toegankelijk via het `man` commando [30](#page=30).
#### 3.3.1 Navigeren in manpages
* **Opvragen:** Typ `man ` (bv. `man shutdown`) [30](#page=30).
* **Bladeren:** Gebruik de spatiebalk of pijltjestoetsen om door pagina's te navigeren [30](#page=30).
* **Zoeken:** Typ `/` gevolgd door het zoekwoord en druk op Enter. Gebruik `n` voor het volgende resultaat en `N` voor het vorige [30](#page=30).
* **Verlaten:** Druk op `q` om de manpage te sluiten [30](#page=30).
* **Sneltoetsen:**
* `g`: Ga naar de eerste regel [31](#page=31).
* `G`: Ga naar de laatste regel [31](#page=31).
* `h`: Toon helpinformatie binnen de manpage [31](#page=31).
#### 3.3.2 Manpage secties
Sommige sleutelwoorden kunnen verwijzen naar zowel commando's als configuratiebestanden. Manpages zijn onderverdeeld in **secties** om dit te onderscheiden. De getallen tussen haakjes na een sleutelwoord in de uitvoer van `apropos` of `man -k` geven de sectie aan (bv. `passwd ` voor het commando en `passwd ` voor het bestand). Om een specifieke sectie te openen, specificeer je het sectienummer voor het commando (bv. `man 5 passwd`) [1](#page=1) [30](#page=30) [31](#page=31) [5](#page=5).
#### 3.3.3 Zoeken naar commando's en hun locaties
* **`man -k ` of `apropos `:** Zoekt naar commando's waarvan de beschrijving het sleutelwoord bevat [30](#page=30).
* **`whatis `:** Geeft een korte beschrijving van een commando [31](#page=31).
* **`whereis -m `:** Toont de locatie(s) van de manpage-bestanden voor een commando [31](#page=31).
Manpages worden opgeslagen in gecomprimeerde archieven met een `.gz` extensie [32](#page=32).
### 3.4 Shell history
De **shell** in Linux houdt een geschiedenis bij van alle uitgevoerde commando's. Dit maakt het mogelijk om eerder gebruikte commando's snel te herhalen, te bewerken of op te zoeken [32](#page=32).
#### 3.4.1 Gebruik van de history
* **Navigeren:** Gebruik de pijl omhoog en omlaag toetsen om door eerdere commando's te bladeren [32](#page=32).
* **Herhalen laatste commando:** Typ `!!` (bang bang) om het laatst uitgevoerde commando opnieuw uit te voeren. Dit is handig om een commando opnieuw uit te voeren met `sudo` als het de eerste keer faalde vanwege ontbrekende rechten [32](#page=32).
* **Tonen geschiedenis:** Het commando `history` toont de lijst van gebruikte commando's. Je kunt een specifiek aantal commando's tonen met een argument (bv. `history 10`) [32](#page=32) [33](#page=33).
* **Uitvoeren via ID:** Elk commando in de history heeft een uniek ID-nummer. Je kunt een commando uitvoeren door `!n` te typen, waarbij `n` het ID-nummer is (bv. `!261` om commando met ID 261 uit te voeren) [33](#page=33).
#### 3.4.2 Beperkingen van de history
Standaard worden commando's die beginnen met een spatie, of commando's die identiek zijn aan het direct voorgaande commando, mogelijk niet opgeslagen in de geschiedenis [33](#page=33).
#### 3.4.3 Interactief zoeken in history
* **`CTRL-R`:** Start een omgekeerde zoekopdracht (van nieuw naar oud) door de shell history. Typ de zoekterm na het indrukken van `CTRL-R`. Druk opnieuw op `CTRL-R` om naar het volgende overeenkomende commando te zoeken [33](#page=33).
* Pijltjestoetsen kunnen worden gebruikt om de opdrachtregel te bewerken na een zoekopdracht [33](#page=33).
* `CTRL-C` annuleert de zoekopdracht en keert terug naar een lege opdrachtregel [33](#page=33).
* Druk op Enter om het gevonden commando uit te voeren [33](#page=33).
---
# Bestanden en Mappen Beheer
Dit gedeelte van de cursus behandelt de fundamentele principes en commando's voor het beheren van bestanden en mappen in een Linux-omgeving, inclusief navigatie, creatie, verwijdering, kopiëren, verplaatsen en zoeken.
### 4.1 Navigeren door het bestandssysteem
De kern van navigatie in Linux ligt in het begrijpen van de huidige locatie en het kunnen wijzigen daarvan.
#### 4.1.1 Huidige werkmap tonen (pwd)
Het commando `pwd` (print working directory) toont de absolute locatie van de map waarin de gebruiker zich momenteel bevindt. Dit is essentieel om te weten waar commando's worden uitgevoerd [34](#page=34).
> **Tip:** De prompt van de shell bevat vaak informatie over het huidige pad, wat een visuele indicator is van uw locatie [34](#page=34).
#### 4.1.2 Werkmap wijzigen (cd)
Met het commando `cd` (change directory) kan de gebruiker naar een andere map navigeren. Dit commando accepteert een pad als argument [35](#page=35).
* **Absolute paden:** Deze paden beginnen bij de rootdirectory (`/`) en specificeren de volledige hiërarchie naar de gewenste map [39](#page=39).
* **Relatieve paden:** Deze paden specificeren de locatie ten opzichte van de huidige werkmap [39](#page=39).
* **`~` (tilde):** Een shortcut om direct naar de homefolder van de huidige gebruiker te navigeren [35](#page=35) [40](#page=40).
* **`cd` zonder argument:** Navigeert ook naar de homefolder [35](#page=35).
* **`cd -`:** Navigeert terug naar de vorige werkmap [36](#page=36).
> **Tip:** Linux CLI ondersteunt pathcompletion met de Tab-toets, wat typfouten vermindert en de efficiëntie verhoogt [39](#page=39).
#### 4.1.3 Structuur van mappen weergeven (tree)
Het `tree`-commando visualiseert de hiërarchie van mappen en bestanden binnen een opgegeven pad [37](#page=37).
* Met de optie `-a` kunnen verborgen bestanden en mappen (die beginnen met een `.`) worden weergegeven [37](#page=37).
> **Example:** `tree -a /home/student` zal alle bestanden en mappen in de home directory van de student tonen, inclusief verborgen items [38](#page=38).
### 4.2 Padtypes
Het correct gebruiken van paden is cruciaal voor het aansturen van commando's naar de juiste locaties in het bestandssysteem.
#### 4.2.1 Absoluut pad
Een absoluut pad begint altijd met de rootdirectory (`/`) en beschrijft de volledige weg van het hoogste niveau naar het doel [39](#page=39).
> **Example:** `/etc/nginx/sites-available` is een absoluut pad [39](#page=39).
#### 4.2.2 Relatief pad
Een relatief pad definieert de locatie ten opzichte van de huidige werkmap [39](#page=39).
* `.` (één punt): Verwijst naar de huidige map [40](#page=40).
* `..` (twee puntjes): Verwijst naar de bovenliggende map [40](#page=40).
* `~` (tilde): Verwijst naar de thuismap van de huidige gebruiker [40](#page=40).
> **Tip:** Combinaties van `.` en `..` kunnen worden gebruikt om complexere relatieve navigatie uit te voeren, zoals `../../teacher` om twee niveaus omhoog te gaan en vervolgens naar de `teacher`-map te gaan [40](#page=40).
### 4.3 Inhoud van mappen tonen (ls)
Het `ls`-commando wordt gebruikt om de inhoud van een map weer te geven [40](#page=40).
* Zonder argumenten toont het de inhoud van de huidige werkmap [40](#page=40).
* Met een pad als argument toont het de inhoud van die specifieke map [40](#page=40).
Veelgebruikte opties voor `ls`:
* `-a` (all): Toont ook verborgen bestanden en mappen (beginnend met een punt) [41](#page=41).
* `-l` (long listing): Toont gedetailleerde informatie, waaronder machtigingen, eigenaar, groep, grootte en tijdstempel [41](#page=41).
* `-h` (human readable): Toont bestandsgroottes in een leesbaar formaat (bv. KB, MB) [41](#page=41).
> **Example:** `ls -alh` toont een lange lijst van alle bestanden (inclusief verborgen) met leesbare groottes [41](#page=41).
### 4.4 Mappen maken (mkdir)
Het commando `mkdir` (make directory) wordt gebruikt om nieuwe mappen aan te maken [42](#page=42).
* `mkdir ` creëert een map in de huidige werkmap [42](#page=42).
* De optie `-p` (parents) is essentieel bij het aanmaken van mappen met ontbrekende vooroudermappen. Deze optie zorgt ervoor dat alle benodigde tussenliggende mappen ook worden aangemaakt [42](#page=42) [43](#page=43).
> **Example:** `mkdir -p backups/Steam/games/PayDay2` creëert `backups`, `Steam`, `games` en `PayDay2` indien ze nog niet bestaan [43](#page=43).
> **Important:** Linux is hoofdlettergevoelig. `mkdir walkthroughs Walkthroughs` creëert twee afzonderlijke mappen [43](#page=43).
### 4.5 Werken met bestanden
#### 4.5.1 Een leeg bestand maken (touch)
Het `touch`-commando creëert een leeg bestand als het nog niet bestaat. Indien het bestand wel al bestaat, wordt de tijdstempel van de laatste wijziging bijgewerkt [43](#page=43) [44](#page=44).
> **Example:** `touch new_document.txt` maakt een nieuw, leeg bestand met de opgegeven naam [44](#page=44).
#### 4.5.2 Bestanden met spaties in de naam
Bestanden met spaties in hun naam moeten worden ingesloten in dubbele aanhalingstekens (`" "`), enkele aanhalingstekens (`' '`) of de spatie moet worden voorafgegaan door een backslash (`\`) [45](#page=45).
> **Example:** `touch "My Document.txt"` of `touch My\ Document.txt` [45](#page=45).
#### 4.5.3 Bestanden verplaatsen (mv)
Het `mv`-commando wordt gebruikt om bestanden en mappen te verplaatsen of te hernoemen [46](#page=46).
* `mv ` verplaatst het bronbestand of de bronmap naar de doelmap [46](#page=46).
* Als het doel een andere naam is, wordt het bestand of de map hernoemd [47](#page=47).
> **Tip:** `mv` is het standaardcommando voor zowel het verplaatsen als het hernoemen van één bestand of map [48](#page=48).
#### 4.5.4 Bestanden kopiëren (cp)
Het `cp`-commando maakt een kopie van een bestand of map [49](#page=49).
* `cp ` kopieert het bronbestand naar het doel. Dit kan ook een nieuwe naam voor het gekopieerde bestand zijn [49](#page=49).
* Om mappen recursief (inclusief submappen en inhoud) te kopiëren, gebruik de optie `-r` [51](#page=51).
* Standaard overschrijft `cp` bestaande bestanden zonder waarschuwing. De optie `-i` (interactief) vraagt om bevestiging voordat een bestand wordt overschreven [52](#page=52).
> **Example:** `cp -r source_folder destination_folder` kopieert de hele `source_folder` naar `destination_folder` [51](#page=51).
#### 4.5.5 Bestanden hernoemen (rename)
Voor het bulk hernoemen van bestanden, met name met behulp van reguliere expressies (regex), is het `rename`-commando nuttig [52](#page=52).
* Het commando gebruikt een patroon om zoek- en vervangingsoperaties uit te voeren [53](#page=53).
* De wildcard `*` kan worden gebruikt om op meerdere bestanden tegelijk te werken [53](#page=53).
* Reguliere expressies maken complexe bewerkingen mogelijk, zoals het wijzigen van extensies [54](#page=54).
* De optie `-i` kan worden gebruikt voor hoofdletterongevoelig zoeken en vervangen [55](#page=55).
> **Example:** `rename 's/\.txt/\.odt/' *.txt` vervangt de `.txt` extensie door `.odt` voor alle `.txt` bestanden [54](#page=54).
#### 4.5.6 Bestanden identificeren (file)
Omdat Linux geen bestands-extensies vereist, identificeert het `file`-commando het type bestand door de inhoud te analyseren [55](#page=55).
> **Example:** `file /etc/passwd` zal tonen dat het een ASCII tekstbestand is [55](#page=55).
#### 4.5.7 Bestanden en mappen verwijderen (rm)
* `rmdir` kan alleen lege mappen verwijderen [56](#page=56).
* Het `rm`-commando wordt gebruikt om bestanden en mappen te verwijderen [56](#page=56).
* De opties `-r` (recursief) en `-f` (force) worden vaak samen gebruikt als `rm -rf` om mappen en hun inhoud geforceerd te verwijderen [57](#page=57).
> **Caution:** Wees uiterst voorzichtig met `rm -rf`, vooral als root-gebruiker, aangezien verwijderde bestanden niet naar een prullenbak gaan en permanent verdwenen zijn [57](#page=57).
### 4.6 Zoeken naar bestanden
Linux biedt krachtige tools om bestanden te lokaliseren binnen het bestandssysteem.
#### 4.6.1 Zoeken op het bestandssysteem (find)
Het `find`-commando doorzoekt het bestandssysteem op basis van opgegeven criteria, zoals de naam van het bestand en de startmap [58](#page=58).
* Standaard begint de zoekopdracht in de huidige werkmap [58](#page=58).
* De optie `-name` specificeert het zoekpatroon [58](#page=58).
* Om in mappen te zoeken waarvoor de gebruiker geen rechten heeft, kan `sudo` worden gebruikt [59](#page=59) [60](#page=60).
* De optie `-iname` maakt de zoekopdracht hoofdletterongevoelig [60](#page=60).
> **Example:** `find /home/student -name "*log*"` zoekt naar alle bestanden in de home directory die "log" in hun naam bevatten [58](#page=58).
#### 4.6.2 Zoeken in een bestandssysteemdatabase (locate)
Het `locate`-commando doorzoekt een vooraf opgebouwde database van bestanden, wat doorgaans veel sneller is dan `find` [61](#page=61).
* Het is aanbevolen om de database bij te werken met `sudo updatedb` voordat je `locate` gebruikt, om zeker te zijn van de meest actuele informatie [61](#page=61).
* `locate` doorzoekt altijd het gehele bestandssysteem [61](#page=61).
* `sudo locate` toont ook bestanden waarvoor de gebruiker normaal gesproken geen leesrechten heeft [61](#page=61) [62](#page=62).
* De optie `-i` maakt de zoekopdracht hoofdletterongevoelig [62](#page=62).
* De optie `-b` (basename) beperkt de zoekopdracht tot alleen bestandsnamen (niet mapnamen) [62](#page=62).
> **Example:** `sudo locate -i -b modem` zoekt hoofdletterongevoelig naar bestandsnamen die "modem" bevatten [62](#page=62).
---
# Softwarebeheer en Pakingen
Dit onderdeel behandelt het beheren van softwarepakketten op Linux-systemen, inclusief installatie, verwijdering en updates met behulp van package managers zoals `apt`, en introduceert compressietools zoals `gzip` en `tar` [63](#page=63).
### 5.1 Package managers
Package managers zijn tools die het proces van het installeren, verwijderen en updaten van software op een Linux-systeem vereenvoudigen. Ze maken gebruik van databases, genaamd repositories, om beschikbare pakketten te vinden en hun dependencies te beheren [63](#page=63) [64](#page=64).
#### 5.1.1 Apt
`apt` (Advanced Package System) is een veelgebruikte high-level command-line interface voor pakketbeheer op Debian-gebaseerde systemen zoals Ubuntu. Het stelt gebruikers in staat om softwarepakketten te installeren, verwijderen en updaten [64](#page=64).
##### 5.1.1.1 Repositories
Repositories zijn databases die lijsten bevatten van beschikbare softwarepakketten. Om deze te gebruiken, moeten ze eerst naar de lokale machine worden gedownload met het commando `sudo apt update`. De configuratie van repositories is te vinden in `/etc/apt/sources.list` of in bestanden binnen de map `/etc/apt/sources.list.d/` [65](#page=65).
##### 5.1.1.2 Software zoeken
Met `apt search ` kunnen gebruikers zoeken naar beschikbare pakketten. Het is aan te raden om eerst `sudo apt update` uit te voeren om ervoor te zorgen dat de zoekopdracht plaatsvindt in de meest recente repository-lijsten [70](#page=70).
> **Tip:** Gebruik reguliere expressies in de zoekterm voor meer specifieke zoekopdrachten, bijvoorbeeld `\.zip` om letterlijk naar een punt te zoeken [70](#page=70).
##### 5.1.1.3 Software installeren
Software wordt geïnstalleerd met het commando `sudo apt install `. `apt` analyseert de benodigde dependencies en vraagt om bevestiging voordat de installatie plaatsvindt [71](#page=71).
> **Tip:** Als een pakket niet gevonden kan worden, verschijnt de melding "E: Unable to locate package ". Dit kan betekenen dat het pakket niet bestaat, of dat de repository die het pakket bevat niet is toegevoegd [72](#page=72).
##### 5.1.1.4 Software verwijderen
Om software te verwijderen, wordt het commando `sudo apt remove ` gebruikt. Dit commando verwijdert het pakket zelf, maar laat de configuratiebestanden achter. Ongebruikte dependencies kunnen worden opgeruimd met `sudo apt autoremove` [73](#page=73).
Voor het verwijderen van zowel het pakket als de bijbehorende configuratiebestanden, kan `sudo apt purge ` gebruikt worden [73](#page=73).
##### 5.1.1.5 Software bijwerken
Individuele pakketten kunnen worden bijgewerkt door het installatiecommando opnieuw uit te voeren: `sudo apt install `. Om alle geïnstalleerde pakketten op het systeem bij te werken, wordt het commando `sudo apt upgrade` gebruikt [73](#page=73) [74](#page=74).
> **Tip:** Voer altijd eerst `sudo apt update` uit voordat je software bijwerkt of installeert, om zeker te zijn van de meest recente repository-informatie [74](#page=74).
#### 5.1.2 Dpkg
`dpkg` is een oudere pakketbeheerder die de voorloper is van `apt-get` en `apt`. Het werkt met `.deb`-bestanden en maakt geen gebruik van repositories. Dependencies moeten handmatig worden geïnstalleerd, wat historisch tot "dependency hell" kon leiden [78](#page=78).
* Installeren: `sudo dpkg -i .deb` [78](#page=78).
* Herconfigureren: `sudo dpkg-reconfigure ` [78](#page=78).
#### 5.1.3 Snap
Snaps zijn zelfstandige softwarebundels die alle dependencies bevatten en in een geïsoleerde omgeving draaien. Dit maakt het mogelijk om meerdere versies van dezelfde software naast elkaar te installeren en te gebruiken. Snaps zijn distro-onafhankelijk en te vinden in de Snap Store of te zoeken met `snap search` [78](#page=78).
Belangrijke `snap` commando's:
* `snap search `: Zoeken naar snaps [79](#page=79).
* `snap list`: Toont geïnstalleerde apps [78](#page=78).
* `snap list --all`: Toont alle geïnstalleerde versies [78](#page=78).
* `snap install `: Installeren van een snap [79](#page=79).
* `snap remove `: Verwijderen van een snap [78](#page=78).
* `snap refresh`: Upgraden van snaps (gebeurt automatisch) [78](#page=78).
* `snap revert --revision `: Teruggaan naar een eerdere versie [78](#page=78).
> **Tip:** Het commando `snap update` bestaat niet; snaps worden automatisch gecontroleerd op updates door de snap daemon [79](#page=79).
### 5.2 Compressietools
Compressietools worden gebruikt om de bestandsgrootte te verkleinen, wat handig is voor opslag en gegevensoverdracht [74](#page=74).
#### 5.2.1 Gzip
`gzip` is een tool voor het comprimeren van individuele bestanden. Het creëert een gecomprimeerd bestand met de extensie `.gz`. Het originele bestand verdwijnt na compressie [74](#page=74).
* Comprimeren: `gzip ` [74](#page=74).
* Decomprimeren: `gunzip .gz` [74](#page=74).
#### 5.2.2 Tar
`tar` (Tape Archive) wordt gebruikt om meerdere bestanden en mappen samen te voegen tot één enkel archiefbestand (een tarball). `tar` behoudt ook bestandsrechten en eigenaren [75](#page=75) [81](#page=81).
* Een tar-bestand maken: `tar -cf .tar ` [75](#page=75).
* Inhoud van een tar-bestand bekijken: `tar -tf .tar` [75](#page=75).
* Een tar-bestand maken en direct comprimeren met gzip (tarball): `tar -czf .tar.gz ` [75](#page=75).
* Inhoud van een tarball bekijken: `tar -tzf .tar.gz` [75](#page=75).
* Een tar-bestand uitpakken: `tar -xf .tar` [76](#page=76).
* Een gecomprimeerde tarball uitpakken: `tar -xzf .tar.gz` [76](#page=76).
* Uitpakken naar een specifieke map: Gebruik de `-C
Glossary
| Term | Definition |
|------|------------|
| Besturingssysteem | Een besturingssysteem (OS) is software die een computer beheert en de interactie tussen de gebruiker en de hardware faciliteert. |
| Kernel | De kernel is het centrale deel van een besturingssysteem dat direct met de hardware communiceert en de basisfunctionaliteit van het systeem beheert. |
| Distributie | Een Linux-distributie is een compleet besturingssysteem dat is opgebouwd rond de Linux-kernel, samen met een selectie van softwarepakketten en een gebruikersinterface. |
| Virtualisatie | Virtualisatie is een technologie die het mogelijk maakt om meerdere virtuele computersystemen op één fysieke hardware te creëren en te beheren, elk met hun eigen besturingssysteem en resources. |
| Virtuele Machine (VM) | Een virtuele machine is een softwarematige emulatie van een fysiek computersysteem, waarop een besturingssysteem kan worden geïnstalleerd en uitgevoerd. |
| Host Systeem | Het host systeem is de fysieke computer waarop virtualisatiesoftware draait en virtuele machines worden gecreëerd. |
| Gast Besturingssysteem | Het gast besturingssysteem is het besturingssysteem dat binnen een virtuele machine draait. |
| Command Line Interface (CLI) | Een command line interface is een tekstgebaseerde interface waarmee gebruikers commando's aan de computer kunnen geven. |
| Graphical User Interface (GUI) | Een graphical user interface is een visuele interface die grafische elementen zoals iconen, vensters en knoppen gebruikt om interactie met de computer mogelijk te maken. |
| Prompt | De prompt is een tekstuele indicator in een command line interface die aangeeft dat het systeem klaar is om een commando te ontvangen. |
| Commando | Een commando is een instructie die aan de computer wordt gegeven om een specifieke taak uit te voeren. |
| Argument | Een argument is een waarde die aan een commando wordt meegegeven om de functionaliteit ervan te specificeren of te beïnvloeden. |
| Optie | Een optie is een speciaal argument dat begint met een koppelteken (-) en de gedragingen van een commando aanpast. |
| Sudo | Sudo (super user do) is een commando waarmee een gebruiker tijdelijk verhoogde rechten (zoals root-rechten) kan verkrijgen om systeembeheertaken uit te voeren. |
| Root | De root-gebruiker is de superuser in een Linux-systeem met volledige administratieve rechten. |
| Manpages | Manpages (manual pages) zijn de ingebouwde helpbestanden in een Linux-systeem die gedetailleerde informatie geven over commando's, bestanden en programma's. |
| Shell | Een shell is een command-line interpreter die gebruikersinteractie met het besturingssysteem mogelijk maakt, zoals Bash. |
| Bestandssysteem | Het bestandssysteem is de structuur en methode waarmee bestanden en mappen op een opslagmedium worden georganiseerd en beheerd. |
| Root Directory | De root directory (aangeduid met '/') is het hoogste niveau in de hiërarchie van een bestandssysteem, waaruit alle andere mappen en bestanden zijn afgeleid. |
| Home Folder | De home folder is de persoonlijke map van een gebruiker, meestal gelegen in /home/gebruikersnaam, waar persoonlijke bestanden worden opgeslagen. |
| Pad | Een pad is een reeks directory's die de locatie van een bestand of map in het bestandssysteem aangeeft. |
| Absoluut Pad | Een absoluut pad begint vanaf de root directory ('/') en specificeert de volledige locatie van een bestand of map. |
| Relatief Pad | Een relatief pad geeft de locatie van een bestand of map aan ten opzichte van de huidige werkdirectory. |
| Pipe (|) | Een pipe is een mechanisme dat de standaard uitvoer (stdout) van het ene commando doorstuurt als standaard invoer (stdin) naar het volgende commando. |
| Standaard Uitvoer (stdout) | De standaard uitvoer is de output die een commando normaal gesproken genereert, meestal weergegeven op het scherm. |
| Standaard Invoer (stdin) | De standaard invoer is de input die een commando verwacht, meestal afkomstig van het toetsenbord. |
| Standaard Fout (stderr) | De standaard fout is de uitvoer die foutmeldingen van een commando bevat. |
| Redirection (>) | Redirection is het omleiden van de uitvoer van een commando naar een bestand in plaats van naar het scherm. |
| Gzip | Gzip is een commando voor bestandscompressie dat bestanden comprimeert tot een kleiner formaat, meestal met de extensie .gz. |
| Tar | Tar (tape archive) is een commando dat meerdere bestanden en mappen samenvoegt tot één archiefbestand, meestal met de extensie .tar. |
| Package Manager | Een package manager is een softwaretool die het installeren, bijwerken, configureren en verwijderen van softwarepakketten op een besturingssysteem vereenvoudigt. |
| Apt | Apt (Advanced Package Tool) is een package manager die wordt gebruikt in Debian-gebaseerde Linux-distributies zoals Ubuntu. |
| Repository | Een repository is een opslagplaats voor softwarepakketten die door een package manager kan worden gebruikt om software te downloaden en te installeren. |
| Umask | Umask (user file-creation mode mask) is een commando dat de standaardrechten bepaalt voor nieuw aangemaakte bestanden en mappen. |
| Setuid | De setuid-bit is een speciale permissie die, wanneer toegepast op een uitvoerbaar bestand, ervoor zorgt dat het bestand wordt uitgevoerd met de rechten van de bestandseigenaar, niet die van de gebruiker die het uitvoert. |
| Setgid | De setgid-bit is een speciale permissie die, wanneer toegepast op een map, ervoor zorgt dat bestanden en submappen die in die map worden aangemaakt, dezelfde groepseigenaar krijgen als de map zelf. |
| Sticky Bit | De sticky bit is een speciale permissie die, wanneer toegepast op een map, voorkomt dat gebruikers bestanden of submappen in die map kunnen verwijderen of hernoemen, tenzij ze de eigenaar zijn van het bestand of de map. |
| Access Control Lists (ACL) | Access Control Lists bieden een fijnmaziger mechanisme voor toegangscontrole dan de standaard Unix-permissies, waardoor specifieke rechten voor individuele gebruikers en groepen kunnen worden ingesteld. |
| Bash | Bash (Bourne Again SHell) is de standaard command-line interpreter (shell) die in veel Linux-distributies wordt gebruikt. |
| Shebang | De shebang is de eerste regel in een scriptbestand, beginnend met `#!`, die aangeeft welke interpreter moet worden gebruikt om het script uit te voeren. |
| Variabele | Een variabele is een naam die wordt gebruikt om een waarde op te slaan die kan worden hergebruikt in een script of shell-sessie. |
| Shell Embedding | Shell embedding is het proces waarbij de uitvoer van een commando binnen een ander commando wordt ingevoegd, meestal met behulp van `$(commando)`. |
| Regular Expression (Regex) | Een reguliere expressie is een reeks tekens die een zoekpatroon definieert dat kan worden gebruikt om tekst te matchen en te manipuleren. |
| Filter | Een filter is een commando of programma dat gegevens verwerkt en doorgeeft aan een ander commando, vaak om de uitvoer te manipuleren of te selecteren. |
| Pipe | Een pipe is een mechanisme dat de standaard uitvoer (stdout) van het ene commando doorstuurt als standaard invoer (stdin) naar het volgende commando. |
| Crontab | Crontab is een systeem dat het plannen van commando's en scripts mogelijk maakt om op regelmatige tijden te worden uitgevoerd. |
| Umask | Umask (user file-creation mode mask) is een commando dat de standaardrechten bepaalt voor nieuw aangemaakte bestanden en mappen. |
Cover
LSS - Lecture III - systemd.pdf
Summary
# Introductie tot systemd
Dit gedeelte introduceert systemd als de moderne opvolger van traditionele init-systemen, waarbij de basisconcepten, commando's en voordelen worden uitgelegd [2](#page=2) [5](#page=5).
## 1.1 Wat is systemd?
systemd is een systeem- en servicebeheerder voor Linux-besturingssystemen. Het is ontworpen als een moderne vervanging voor oudere init-systemen zoals System V init, die gebaseerd waren op een daemon met veel kleine initialisatiescripts en 'runlevels'. systemd werkt als een monolithisch programma dat gebruik maakt van 'units'. Het draait als proces met PID 1 en wordt vaak geïnitieerd als '/sbin/init' [4](#page=4) [5](#page=5).
### 1.1.1 De rol van PID 1
Het proces met Process ID (PID) 1 is het allereerste proces dat wordt gestart na de kernel tijdens het opstarten van het systeem. Van oudsher was dit de init daemon. Met systemd is dit proces ook de systemd-manager [4](#page=4) [5](#page=5).
### 1.1.2 Verschil met System V init
systemd wijkt af van de traditionele Linux-filosofie van veel kleine, gespecialiseerde programma's, wat soms kritiek oplevert [5](#page=5).
### 1.1.3 Voordelen van systemd ten opzichte van System V init
systemd biedt diverse verbeteringen ten opzichte van oudere init-systemen:
* **Eenvoudigere en logischere configuratie** [6](#page=6).
* **Expliciete afhankelijkheden tussen services** [6](#page=6).
* **Makkelijk instellen van permissies en resource limieten per service** [6](#page=6).
* **Monitoring en automatische herstart van services** [6](#page=6).
* **Watchdogs** voor zowel services als systemd zelf [6](#page=6).
* **Parallel starten van services**, wat de opstarttijd verkort [6](#page=6).
### 1.1.4 systemctl vs. sysctl
Het is belangrijk om `systemctl` niet te verwarren met `sysctl`.
* `systemctl` wordt gebruikt om systemd te beheren [8](#page=8).
* `sysctl` wordt gebruikt om de attributen van de Linux kernel te lezen en aan te passen, zoals eerder gezien bij `net.ipv4.ip_forward` [8](#page=8).
### 1.1.5 systemd in distributies
De meeste gangbare Linux-distributies gebruiken tegenwoordig systemd als standaard init-systeem. Voorbeelden hiervan zijn [9](#page=9):
* Fedora 15 (mei 2011) [9](#page=9).
* Red Hat Enterprise Linux 7 (juni 2014) [9](#page=9).
* SUSE Linux Enterprise Server 12 (oktober 2014) [9](#page=9).
* Debian 8 (april 2015) [9](#page=9).
* Ubuntu 15.04 (april 2015) [9](#page=9).
## 1.2 systemd units
Een systemd 'unit' definieert een service of een actie op het systeem. Een unit bestaat uit [10](#page=10) [14](#page=14) [15](#page=15) [16](#page=16) [17](#page=17) [18](#page=18) [20](#page=20) [21](#page=21) [23](#page=23):
* Een naam [10](#page=10).
* Een type [10](#page=10).
* Een configuratiebestand [10](#page=10).
Systemd identificeert units met de notatie `naam.type`, bijvoorbeeld `ssh.service` [15](#page=15) [20](#page=20) [21](#page=21).
### 1.2.1 Unit types
Er zijn diverse types systemd units, waaronder [16](#page=16) [17](#page=17) [18](#page=18):
* `automount` [16](#page=16).
* `device` [16](#page=16).
* `mount` [16](#page=16).
* `path` [16](#page=16).
* `service`: wordt gebruikt om daemons op het Linux-systeem te beheren, zoals `ssh.service` [17](#page=17).
* `snapshot` [16](#page=16).
* `socket` [16](#page=16).
* `target`: groepeert meerdere units die tegelijkertijd gestart kunnen worden, zoals `network.target` [18](#page=18).
### 1.2.2 systemd unit configuratiebestanden
De configuratiebestanden voor systemd units zijn te vinden in specifieke directory's. Systemd doorzoekt deze in de volgende volgorde [29](#page=29):
* `/etc/systemd/system`: Lokale configuratie (aanbevolen voor aangepaste en permanente configuraties) [29](#page=29).
* `/run/systemd/system`: Runtime configuratie [29](#page=29).
* `/lib/systemd/system`: Configuratie specifiek voor de distributie [29](#page=29).
Systemd stopt met zoeken zodra een overeenkomst is gevonden [29](#page=29).
#### 1.2.2.1 Sectie [Service
Deze sectie bevat configuraties specifiek voor service-type units. Belangrijke parameters zijn [22](#page=22):
* `ExecStart`: Het commando dat moet worden uitgevoerd om de service te starten [22](#page=22).
* `Restart`: Specificeert wanneer de service automatisch opnieuw moet worden gestart [22](#page=22).
#### 1.2.2.2 Sectie [Unit
Deze sectie is van toepassing op zowel target als service units en definieert afhankelijkheden. Belangrijke parameters zijn [23](#page=23):
* `After` / `Before`: Bepaalt welke units voor of na deze unit moeten draaien [23](#page=23).
* `Requires` / `Wants` / `Conflicts` / `Requisite`: Definieert expliciete afhankelijkheden tussen units [23](#page=23).
##### 1.2.2.2.1 Verschillende soorten afhankelijkheden in de [Unit sectie
| [Unit van A.service | Beschrijving | Wanneer/welke storing? |
| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Requires=B.service` | Strikte afhankelijkheden. Bij activering van A.service, wordt B.service ook geactiveerd. Als B.service faalt, wordt A.service gedeactiveerd. | Als B.service faalt, faalt A.service ook. |
| `Wants=C.service` | Afhankelijkheden voor activering. Bij activering van A.service, wordt C.service ook geactiveerd. Als C.service faalt, heeft dit geen invloed op A.service. | Als C.service faalt, heeft systemd hier geen problemen mee. |
| `Requisite=D.service`| Units die reeds actief moeten zijn. Voor activering van A.service, controleert systemd D.service. Als D.service niet actief is, faalt de activering van A.service. | Als D.service niet actief is, faalt A.service. |
| `Conflicts=E.service`| Negatieve afhankelijkheden. Bij activering van A.service, wordt E.service gedeactiveerd. Gelijktijdige activering van twee conflicterende units faalt. | Gelijktijdige activering van A.service en E.service faalt. |
**Tip:** De `Wants` dependency type propageert storingen niet naar andere units. De systemd documentatie geeft aan dat dit de voorkeursmanier is om afhankelijkheden te specificeren indien mogelijk [24](#page=24).
Je kunt de afhankelijkheden van een unit bekijken met `systemctl list-dependencies .service` of `systemctl list-dependencies .service --reverse` [24](#page=24).
#### 1.2.2.3 Sectie [Install
Deze sectie bevat configuraties die relevant zijn bij het inschakelen (enabling) van een unit. Belangrijke parameters zijn [26](#page=26):
* `WantedBy` / `RequiredBy`: Specificeert tot welk 'target level' het systeem moet behoren wanneer deze unit wordt ingeschakeld [26](#page=26).
### 1.2.3 Afhankelijkheden 'in reverse'
Afhankelijkheden kunnen ook 'in reverse' worden ingesteld. In plaats van de `Wants` in de configuratie van Unit B te zetten om Unit A als dependency toe te voegen, kun je dit in Unit A's configuratie doen met `WantedBy`. Dit maakt dynamische activering en deactivering mogelijk via `systemctl enable A.service` en `systemctl disable A.service`. Dit creëert of verwijdert symlinks in de `/etc/systemd/system/B.service.wants/` directory [25](#page=25).
Je kunt de afhankelijkheden van een unit bekijken met `systemctl show -p Wants B.service` [25](#page=25).
### 1.2.4 Het 'Default Target'
Het `default.target` bestand (vaak een symbolische link naar een specifiek target) is het bestand waarnaar systemd zoekt bij het opstarten van het systeem [27](#page=27).
## 1.3 Het opstartproces met systemd
Wanneer het systeem opstart met systemd, gebeurt het volgende [28](#page=28):
1. systemd laadt zijn configuratie [28](#page=28).
2. systemd bepaalt het 'boot goal', wat meestal `default.target` is [28](#page=28).
3. systemd bepaalt alle afhankelijkheden van het `default.target`, de afhankelijkheden van deze afhankelijkheden, enzovoort (via `Wants`, `Requires`, `Conflicts`, etc.) [28](#page=28).
4. systemd activeert de afhankelijkheden en het `default.target` [28](#page=28).
5. Na het opstarten kan systemd reageren op systeemgebeurtenissen en aanvullende componenten activeren [28](#page=28).
## 1.4 Veelgebruikte `systemctl` commando's
`systemctl` is het commando om systemd te beheren [7](#page=7).
### 1.4.1 Controleren van service en target units
| Commando | Beschrijving |
| :-------------------------------------- | :------------------------------------------------------------------------ |
| `systemctl status ` | Toont de status van de opgegeven unit. | .
| `systemctl start ` | Start de opgegeven unit. | .
| `systemctl stop ` | Stopt de opgegeven unit. | .
| `systemctl restart ` | Herstart de opgegeven unit. | .
| `systemctl daemon-reload` | Herlaadt de configuratie van de systemd manager (alle unit files). | .
| `systemctl enable ` | Configureert de unit om automatisch te starten met andere geselecteerde units. | .
| `systemctl disable ` | Configureert de unit om **niet** automatisch te starten. | .
| `systemctl mask ` | Markert een unit als volledig onstartbaar, automatisch of handmatig. | .
| `systemctl unmask ` | Verwijdert de masking. | .
| `systemctl list-units` | Toont de huidige status van alle geconfigureerde units. | [11](#page=11) .
| `systemctl --failed` | Toont mislukte units. | .
| `systemctl isolate ` | Start de opgegeven unit en stopt alle andere units. | .
| `systemctl default` | Schakelt over naar de standaard target unit. | .
| `systemctl cat ` | Toont de inhoud van het systemd configuratiebestand van de unit. | .
#### 1.4.1.1 Starten versus inschakelen (`enable`)
* `systemctl start` start de service zelf, maar creëert geen afhankelijkheden zoals gedefinieerd in de `[Install]` sectie .
* `systemctl enable` koppelt de unit aan de juiste plaatsen om ervoor te zorgen dat deze automatisch start met andere units. Het start de unit **niet** direct. Bijvoorbeeld, `systemctl enable A.service` met `WantedBy=B.target` in de `[Install]` sectie creëert een symlink `/etc/systemd/system/B.target.wants/A.service` .
* Om beide acties te combineren, gebruik je `systemctl enable --now` .
#### 1.4.1.2 Stoppen versus uitschakelen (`disable`) versus maskeren (`mask`)
* `systemctl stop` stopt een service als deze actief is [33](#page=33).
* `systemctl disable` voorkomt dat een service automatisch start. Het stopt de momenteel actieve unit **niet**. Als een andere service echter een afhankelijkheid heeft van de uitgeschakelde service, zal deze proberen deze te starten [33](#page=33).
* `systemctl mask` voorkomt dat een service ooit nog draait door een symbolische link naar `/dev/null` te creëren [33](#page=33).
### 1.4.2 Voorbeelden van `systemctl` commando's
* Controleren van de status van de SSH-service:
```bash
sudo systemctl status ssh.service
```
Dit toont details zoals of de service actief is, het proces-ID, geheugengebruik, etc. [7](#page=7).
* De `shutdown` en `reboot` commando's zijn vaak symbolische links naar `/bin/systemctl` [3](#page=3).
systemd is meer dan alleen een vervanging voor `init.d` [34](#page=34).
---
# Systemd unit types en configuratie
Dit deel behandelt de verschillende soorten 'units' die systemd gebruikt om taken en services te beheren, alsook de structuur van hun configuratiebestanden [10](#page=10) [13](#page=13).
## 2.1 Wat is een systemd unit?
Een systemd 'unit' definieert een service of een actie op het systeem. Elke unit bestaat uit de volgende componenten [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) :
* **Naam:** De unieke identificatie van de unit [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) .
* **Type:** Geeft aan wat voor soort unit het is (bijvoorbeeld `service`, `target`, `device`) [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) .
* **Configuratiebestand:** Het pad naar het bestand dat de instellingen van de unit bevat [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) .
Systemd identificeert units met de notatie `naam.type`, zoals `ssh.service` [15](#page=15) [20](#page=20) [21](#page=21).
> **Tip:** Een unit configuratiebestand zoals `/lib/systemd/system/ssh.service` is strikt gescheiden van de daadwerkelijke service configuratiebestanden zoals `/etc/ssh/sshd_config` [21](#page=21).
## 2.2 Systemd unit types
Systemd ondersteunt diverse unit types, waaronder [16](#page=16) [17](#page=17) [18](#page=18) [39](#page=39) :
* `automount`: Beheert automount points [16](#page=16) [39](#page=39) .
* `device`: Representeert een kernel device zoals gerapporteerd door udev (bijv. `/dev/sda`). Systemd genereert deze units automatisch, bijvoorbeeld `dev-sda.device`. Andere units kunnen afhankelijk zijn van devices, bijvoorbeeld via `After=dev-sda.device` [16](#page=16) [39](#page=39) .
* `mount`: Vertegenwoordigt een gemounte filesystem (bijv. `boot.mount` voor `/boot` of `-.mount` voor `/`). Systemd leest hiervoor `/etc/fstab` [16](#page=16) [42](#page=42) .
* `path`: Monitort bestandspadactiviteiten [16](#page=16) [39](#page=39) .
* `service`: Wordt gebruikt om daemons en services op het Linux-systeem te beheren, zoals `ssh.service` [16](#page=16) [17](#page=17) [39](#page=39) .
* `snapshot`: Een snapshot van de system state [16](#page=16) [39](#page=39) .
* `socket`: Beheert netwerk sockets [16](#page=16) [39](#page=39) .
* `target`: Groepeert meerdere units zodat ze tegelijkertijd kunnen worden gestart, zoals `network.target` [16](#page=16) [18](#page=18) [39](#page=39) .
## 2.3 Systemd unit configuratiebestanden
Configuratiebestanden voor systemd units zijn tekstbestanden die gestructureerd zijn in secties [19](#page=19) [22](#page=22) [23](#page=23) [26](#page=26).
### 2.3.1 Algemene structuur en secties
Elk configuratiebestand bevat minimaal één sectie, meestal `[Unit]`, `[Service]` en/of `[Install]` [22](#page=22) [23](#page=23) [26](#page=26).
* **`[Unit]` sectie:**
Deze sectie bevat metagegevens over de unit en definieert afhankelijkheden tussen units [23](#page=23) [26](#page=26).
* `After=`: Definieert dat deze unit pas mag starten nadat de gespecificeerde units zijn gestart [23](#page=23).
* `Before=`: Definieert dat deze unit moet stoppen voordat de gespecificeerde units mogen starten [23](#page=23).
* `Requires=`: Strikte afhankelijkheden. Als de vereiste unit faalt, faalt ook deze unit [24](#page=24).
* `Wants=`: Afhankelijkheden voor activering. Als de gewenste unit faalt, heeft dit geen invloed op deze unit. Dit is de aanbevolen manier om afhankelijkheden te specificeren indien mogelijk [24](#page=24).
* `Conflicts=`: Negatieve afhankelijkheden. Het activeren van deze unit zorgt voor het deactiveren van de conflictuerende unit. Gelijktijdige activering van conflicterende units mislukt [24](#page=24).
* `Requisite=`: Units die al actief moeten zijn voordat deze unit geactiveerd kan worden [24](#page=24).
* **`[Service]` sectie:**
Deze sectie is specifiek voor `service`-type units en definieert hoe de service uitgevoerd moet worden [22](#page=22).
* `ExecStart=`: Het commando of programma dat gestart moet worden [22](#page=22).
* `Restart=`: Geeft aan wanneer de service automatisch opnieuw gestart moet worden [22](#page=22).
* **`[Install]` sectie:**
Deze sectie definieert hoe de unit geïnstalleerd en geactiveerd kan worden tijdens het opstarten van het systeem [26](#page=26).
* `WantedBy=`: Specificeert de target level waarin het systeem moet zijn om deze unit te activeren. Dit wordt vaak gebruikt om een unit te koppelen aan een `target` unit, bijvoorbeeld `multi-user.target` [26](#page=26).
* `RequiredBy=`: Vergelijkbaar met `WantedBy`, maar met een striktere afhankelijkheid [26](#page=26).
### 2.3.2 Afhankelijkheden "in reverse"
Afhankelijkheden kunnen ook "in reverse" worden geconfigureerd. In plaats van `Wants=` toe te voegen aan de configuratie van unit B om naar unit A te verwijzen, kan men in de configuratie van unit A `WantedBy=` toevoegen. Dit creëert symbolische links in de `/etc/systemd/system/` directory [25](#page=25).
Deze dynamische activering en deactivering van afhankelijkheden kan worden beheerd met de commando's `systemctl enable A.service` en `systemctl disable A.service` [25](#page=25).
De afhankelijkheden van een unit kunnen worden opgevraagd met `systemctl show -p Wants B.service` [25](#page=25).
### 2.3.3 Locatie van configuratiebestanden
Unit configuratiebestanden zijn op verschillende locaties te vinden, waarbij systemd de volgende volgorde hanteert [29](#page=29):
1. `/etc/systemd/system`: Lokale, aangepaste en meer permanente configuraties die niet verloren gaan bij pakketupdates [29](#page=29).
2. `/run/systemd/system`: Configuratiebestanden die tijdens de runtime worden aangemaakt [29](#page=29).
3. `/lib/systemd/system`: Configuratiebestanden die door de distributie worden geleverd [29](#page=29).
Systemd stopt met zoeken zodra het een overeenkomst vindt, wat betekent dat configuraties in `/etc/systemd/system` voorrang hebben [29](#page=29).
## 2.4 Wat gebeurt er tijdens het opstarten?
Bij het opstarten van het systeem doorloopt systemd de volgende stappen [32](#page=32):
1. Systemd laadt zijn configuratie [32](#page=32).
2. Systemd bepaalt het bootdoel, meestal genaamd `default.target` [32](#page=32).
3. Systemd bepaalt alle afhankelijkheden van het `default.target`, en de afhankelijkheden van die afhankelijkheden, recursief [32](#page=32).
4. Systemd activeert de afhankelijkheden en het bootdoel [32](#page=32).
5. Na het opstarten kan systemd reageren op systeemgebeurtenissen en additionele componenten activeren [32](#page=32).
Het bestand `/lib/systemd/system/default.target` (vaak een symbolische link) bepaalt het primaire opstartdoel van het systeem [27](#page=27).
> **Tip:** Begrijp de hiërarchie van `target`-units en hun afhankelijkheden (`Requires`, `Wants`, etc.) om te doorgronden hoe het systeem opstart en welke services wanneer worden geladen [24](#page=24) [28](#page=28).
## 2.5 Commando's voor unitbeheer
Enkele nuttige `systemctl` commando's gerelateerd aan units:
* `systemctl list-units --type=device --all`: Toont alle device units, actief en inactief [40](#page=40).
* `systemctl list-dependencies A.service`: Toont de afhankelijkheden van de unit `A.service` [24](#page=24).
* `systemctl list-dependencies A.service --reverse`: Toont de units die afhankelijk zijn van `A.service` [24](#page=24).
* `systemctl show -p Wants B.service`: Toont de 'Wants' afhankelijkheden van `B.service` [25](#page=25).
* `systemctl enable A.service`: Activeert `A.service` bij het opstarten door symlinks te creëren [25](#page=25).
* `systemctl disable A.service`: Deactiveert `A.service` bij het opstarten door symlinks te verwijderen [25](#page=25).
---
# Systemd commando's en analyse
Dit gedeelte behandelt de essentiële commando's voor het beheer van systemd, waaronder `systemctl` en `journalctl`, en de analysemogelijkheden van `systemd-analyze`.
### 3.1 Systemd beheer met `systemctl`
`systemctl` is het primaire commando voor het beheren van systemd-services en andere eenheden (units) op het systeem [30](#page=30) [31](#page=31) [7](#page=7).
#### 3.1.1 Status en overzicht van units
* `systemctl status `: Geeft de status van de opgegeven unit weer. Dit commando toont informatie zoals of de unit actief is, geladen is, en details over het proces [12](#page=12) [31](#page=31) [7](#page=7).
* `systemctl list-units`: Toont de huidige status van alle geconfigureerde units [11](#page=11) [31](#page=31).
* `systemctl list-unit-files`: Geeft een overzicht van alle beschikbare unit-bestanden en hun status (enabled/disabled) [11](#page=11).
* `systemctl --failed`: Toont een lijst van units die mislukt zijn [31](#page=31).
#### 3.1.2 Starten, stoppen en herstarten van units
* `systemctl start `: Start de opgegeven unit. Belangrijk om te weten is dat `start` de service zelf start, maar niet noodzakelijk de afhankelijkheden zoals gedefinieerd in de `[Install]` sectie van de unit-configuratie [31](#page=31) [32](#page=32).
* `systemctl stop `: Stopt de opgegeven unit indien deze actief is [31](#page=31) [33](#page=33).
* `systemctl restart `: Zorgt ervoor dat de opgegeven unit wordt afgesloten en opnieuw wordt gestart [31](#page=31).
* `systemctl isolate `: Start de opgegeven unit en stopt alle andere actieve units [31](#page=31).
#### 3.1.3 Configuratie en inschakelen van units
* `systemctl enable `: Configureert de unit om automatisch te starten met andere geselecteerde units. `enable` koppelt de unit aan verschillende plaatsen zodat deze automatisch start met andere units, maar start de unit zelf niet. Een voorbeeld hiervan is het aanmaken van een symbolische link in `/etc/systemd/system/B.target.wants/A.service` als `A.service` `WantedBy=B.target` heeft in zijn `[Install]` sectie, wat ervoor zorgt dat `A.service` start wanneer `B.target` start [31](#page=31) [32](#page=32).
* `systemctl disable `: Configureert de unit om niet automatisch te starten met andere units. `disable` voorkomt dat een service zelfstandig start, maar stopt de momenteel actieve unit niet. Als een andere service `A.service` als afhankelijkheid heeft, zal die andere service `A.service` proberen te starten wanneer deze zelf start [31](#page=31) [33](#page=33).
* `systemctl daemon-reload`: Herlaadt de systeemd-managerconfiguratie, inclusief alle unit-bestanden [31](#page=31).
* `systemctl enable --now`: Combineert het inschakelen en starten van een unit in één commando [32](#page=32).
#### 3.1.4 Maskeren en unmasken van units
* `systemctl mask `: Markeer een unit als volledig niet-startbaar, automatisch of handmatig. Maskeren zorgt ervoor dat de unit helemaal niet meer kan draaien, door een symbolische link naar `/dev/null` te creëren voor die service [31](#page=31) [33](#page=33).
* `systemctl unmask `: Ongedaan maken van het maskeren [31](#page=31).
#### 3.1.5 Andere `systemctl` commando's
* `systemctl default`: Wijzigt naar de standaard target unit [31](#page=31).
* `systemctl cat `: Print het systemd-configuratiebestand van de opgegeven unit [31](#page=31).
> **Tip:** Het starten en inschakelen van units zijn orthogonale bewerkingen. Een unit kan ingeschakeld zijn zonder gestart te zijn, en gestart zijn zonder ingeschakeld te zijn [32](#page=32).
### 3.2 Loganalyse met `journalctl`
`journalctl` is het commando om de logs van systemd te bekijken [35](#page=35).
* `journalctl -xe`: Gaat naar het einde van de log (`-e`) en geeft uitleg (`-x`) voor foutmeldingen [35](#page=35).
* `journalctl -xef`: Gaat naar het einde van de log, geeft uitleg, en blijft nieuwe logvermeldingen volgen (`-f`) [35](#page=35).
* `journalctl -xef -u `: Volgt nieuwe logvermeldingen en toont alleen logs voor de opgegeven unit `` [35](#page=35).
* `journalctl -b -1`: Toont alleen berichten van de laatste systeemopstart [35](#page=35).
* `journalctl -k`: Toont alleen kernelberichten [35](#page=35).
* `journalctl --no-pager`: Gebruikt voor het parsen van output op stdout [35](#page=35).
* `journalctl -u nginx -o json-pretty`: Output de logs in een mooie JSON-structuur [35](#page=35).
* `journalctl --since yesterday`: Filtert op logs vanaf gisteren [35](#page=35).
* `--since "YYYY-MM-DD" --until "YYYY-MM-DD"`: Filtert op een start- en einddatum, waarbij ook tijd kan worden gespecificeerd [35](#page=35).
> **Tip:** Voor het zien van bepaalde logvermeldingen zijn verhoogde permissies (zoals `sudo`) vereist [35](#page=35).
### 3.3 Systeemprofielering met `systemd-analyze`
`systemd-analyze` biedt tools om de opstarttijd en andere aspecten van het systeem te analyseren [36](#page=36) [37](#page=37).
* `systemd-analyze time`: Analyseert de totale opstarttijd van het systeem [36](#page=36).
* `systemd-analyze blame`: Toont een lijst van alle units en de tijd die ze nodig hadden om te initialiseren, gesorteerd van langste naar kortste tijd [36](#page=36).
* `systemd-analyze critical-chain`: Toont de kritieke keten van units die de totale opstarttijd bepalen [36](#page=36).
* `systemd-analyze plot > file.svg`: Genereert een SVG-afbeelding die de opstartvolgorde en afhankelijkheden visualiseert [36](#page=36).
* `systemd-analyze security`: Analyseert de beveiligingsfuncties die systemd zelf implementeert voor services [37](#page=37).
> **Let op bij `systemd-analyze security`:** Deze analyse kijkt enkel naar de beveiligingsmechanismen die *systemd zelf* implementeert per service. Extra beveiligingsmaatregelen die de servicecode zelf toepast, worden niet meegerekend. Hoge blootstellingsniveaus duiden er echter wel op dat de service waarschijnlijk baat kan hebben bij aanvullende beveiligingsinstellingen [37](#page=37).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| systemd | systemd is een systeem- en servicebeheerder voor Linux-besturingssystemen die als opvolger van de traditionele init-daemon fungeert en een breed scala aan systeembeheertaken afhandelt, waaronder het starten, stoppen en monitoren van services en het beheren van systeemconfiguraties. |
| unit | Een systemd 'unit' vertegenwoordigt een configuratiebestand dat een service, apparaat, mountpoint, socket, of een groep van andere units definieert, en gedefinieerd wordt door een naam, type en configuratiebestand. |
| service unit | Een 'service unit' binnen systemd wordt gebruikt om daemonprocessen op een Linux-systeem te beheren, zoals de OpenSSH-server (ssh.service), en bevat configuratieopties voor het starten en herstarten van de betreffende service. |
| target unit | Een 'target unit' in systemd is een manier om meerdere units te groeperen die tegelijkertijd gestart kunnen worden, vergelijkbaar met "runlevels" in oudere init-systemen, zoals de 'network.target' die netwerkgerelateerde services activeert. |
| systeem kernel | De systeem kernel is het centrale deel van een besturingssysteem dat alle andere delen van het systeem beheert en direct communiceert met de hardware, waarbij het de basisfunctionaliteit voor geheugenbeheer, procesbeheer en apparaatstuurprogramma's biedt. |
| cgroup | Cgroups (control groups) zijn een Linux-kernelmechanisme dat processen organiseert in hiërarchische groepen, waardoor bronnen zoals CPU-tijd, geheugen en I/O-bandbreedte effectief kunnen worden beheerd en beperkt voor individuele processen of groepen. |
| dependencies | In de context van systemd verwijzen dependencies naar expliciete relaties tussen units, waarbij de activering van de ene unit afhankelijk is van de status of beschikbaarheid van een andere unit, gespecificeerd via secties als Requires, Wants, Requisite en Conflicts. |
| init daemon | De init daemon, vaak geïdentificeerd als PID 1, is het eerste proces dat start wanneer een Linux-systeem opstart en is verantwoordelijk voor het initialiseren van de rest van het systeem, inclusief het starten van andere services en het beheren van de systeemstatus. |
| runlevel | Een runlevel is een modus van een Unix-achtig besturingssysteem die bepaalt welke processen actief zijn, vaak geassocieerd met de traditionele SysVinit-systeembeheerder, waarbij verschillende runlevels corresponderen met verschillende systeemtoestanden zoals normale bewerking of onderhoudsmodus. |
| journalctl | journalctl is een command-line utility in Linux die wordt gebruikt om logboeken te bekijken en te beheren die door de systemd journal worden opgeslagen, en biedt functionaliteit voor het filteren, weergeven en analyseren van systeemgebeurtenissen. |
| systemd-analyze | systemd-analyze is een commando in Linux dat wordt gebruikt om de opstarttijd van het systeem te analyseren, afzonderlijke units te beoordelen op hun bijdrage aan de opstarttijd, en gedetailleerde informatie te verstrekken over de opstartvolgorde en prestaties. |
Cover
LSS - Lecture III - systemd.pdf
Summary
# Introductie tot systemd en zijn rol
Dit topic introduceert systemd als de moderne opvolger van het SysV init systeem, waarbij de basisprincipes, de command-line interface en de verschillen met oudere methoden worden besproken.
## 1. Introductie tot systemd en zijn rol
systemd is een modern init systeem en service manager voor Linux-besturingssystemen, ontworpen als opvolger van het traditionele System V init systeem. Het primaire doel van systemd is om de initiële proces-ID 1 te zijn en het opstarten van het systeem te beheren. In tegenstelling tot het oudere SysV init dat gebruik maakte van scripts en 'runlevels', hanteert systemd een meer monolithische aanpak met 'units'. Deze modernisering heeft geleid tot kritiek, maar biedt ook significante voordelen in termen van configuratie, service management en opstarttijd [4](#page=4) [5](#page=5) [6](#page=6).
### 1.1 De evolutie van init systemen
#### 1.1.1 System V init
Het traditionele System V init systeem maakte gebruik van een reeks scripts, voornamelijk geplaatst in `/etc/init.d/`, om services te starten, stoppen en herladen. Dit systeem werkte met 'runlevels', die verschillende staten van het systeem vertegenwoordigden (bijvoorbeeld multi-user mode, graphical mode). Het beheren van afhankelijkheden tussen services was vaak complex en foutgevoelig met dit model [5](#page=5) [6](#page=6).
#### 1.1.2 systemd als opvolger
systemd neemt de rol van PID 1 over van het oude init proces. Het is ontworpen om efficiënter, flexibeler en makkelijker te beheren te zijn. De kernconcepten van systemd zijn gebaseerd op 'units', die een brede reeks systeemcomponenten en acties kunnen vertegenwoordigen [10](#page=10) [4](#page=4) [6](#page=6).
> **Tip:** Begrijpen hoe systemd verschilt van oudere init-systemen is cruciaal voor het effectief beheren van moderne Linux-systemen.
### 1.2 Kernconcepten van systemd
#### 1.2.1 Systemd units
Een systemd 'unit' is een fundamenteel concept dat een service, een actie, of een systeemcomponent definieert. Elke unit bestaat uit [10](#page=10) [13](#page=13) [14](#page=14) [15](#page=15) [16](#page=16) [17](#page=17) [18](#page=18) [19](#page=19) [20](#page=20) [21](#page=21) [22](#page=22) [23](#page=23) [26](#page=26) [38](#page=38) [39](#page=39) [42](#page=42) [44](#page=44):
* **Naam:** De identificatie van de unit (bv. `ssh`).
* **Type:** Het soort component dat de unit vertegenwoordigt (bv. `service`, `target`).
* **Configuratiebestand:** Het bestand dat de parameters en gedragingen van de unit definieert.
De naamgeving van units volgt het formaat `naam.type` [15](#page=15) [20](#page=20) [21](#page=21).
#### 1.2.2 Unit types
systemd ondersteunt verschillende types units, elk met een specifiek doel [16](#page=16):
* `.automount`: Voor het beheren van automounts [16](#page=16).
* `.device`: Representeert een kernel device zoals gerapporteerd door udev, bv. `dev-sda.device` [39](#page=39).
* `.mount`: Representeert een gemount bestandssysteem, bv. `boot.mount` voor `/boot` of `-.mount` voor `/` [42](#page=42).
* `.path`: Units die geactiveerd worden wanneer een bepaald pad verandert of bestaat [16](#page=16).
* `.service`: Wordt gebruikt om daemons en services op het Linux-systeem te beheren, bv. `ssh.service` [17](#page=17).
* `.snapshot`: Een snapshot van de huidige systeemtoestand [16](#page=16).
* `.socket`: Voor het beheren van socket-activatie [16](#page=16).
* `.target`: Groepeert meerdere units samen zodat ze tegelijkertijd kunnen worden gestart. Ze worden vaak gebruikt om de opstart- of shutdown-status van het systeem te definiëren, bv. `network.target` [18](#page=18).
#### 1.2.3 Configuratiebestanden
Unit configuratiebestanden specificeren het gedrag van units. Deze bestanden bevinden zich op verschillende locaties:
* `/etc/systemd/system`: Voor lokale en permanente aangepaste configuraties [33](#page=33).
* `/run/systemd/system`: Voor runtime configuraties die dynamisch worden gegenereerd [33](#page=33).
* `/lib/systemd/system`: Voor distributie-brede standaardconfiguraties [33](#page=33).
systemd zoekt in deze directories in de genoemde volgorde en stopt bij de eerste match [33](#page=33).
Belangrijke secties in configuratiebestanden zijn:
* `[Unit]`: Bevat informatie over de unit zelf en afhankelijkheden. Secties zoals `After`, `Before`, `Requires`, `Wants`, `Conflicts`, en `Requisite` definiëren expliciete relaties tussen units [23](#page=23) [24](#page=24).
* `Requires`: Strikte afhankelijkheden. Als de vereiste unit faalt, faalt de huidige unit ook [24](#page=24).
* `Wants`: Afhankelijkheden voor activering. Als de gewenste unit faalt, heeft dat geen invloed op de huidige unit. Dit is de aanbevolen manier om afhankelijkheden te specificeren [24](#page=24).
* `Requisite`: Units die reeds actief moeten zijn voor activering [24](#page=24).
* `Conflicts`: Negatieve afhankelijkheden. Activering van de ene unit deactiveert de andere unit, en omgekeerd [24](#page=24).
* `[Service]`: Specificeert hoe een service unit moet worden beheerd. Belangrijke parameters zijn `ExecStart` (het programma dat gestart moet worden) en `Restart` (wanneer de service automatisch herstart moet worden) [22](#page=22).
* `[Install]`: Bevat informatie over hoe de unit geïnstalleerd en geactiveerd moet worden, met name parameters zoals `WantedBy` en `RequiredBy` [26](#page=26).
#### 1.2.4 Afhankelijkheden "in reverse"
Afhankelijkheden kunnen ook "omgekeerd" worden geconfigureerd. Een unit A kan bijvoorbeeld een `Wants` afhankelijkheid zijn voor unit B. Dit kan worden ingesteld door in de configuratie van unit A een `WantedBy` sectie te hebben die verwijst naar B.service. Dit stelt gebruikers in staat om afhankelijkheden dynamisch te activeren of deactiveren met commando's als `systemctl enable A.service` en `systemctl disable A.service`. Dit creëert of verwijdert symbolische links in directories zoals `/etc/systemd/system/B.service.wants/` [25](#page=25).
#### 1.2.5 Default Target
De `default.target` unit bepaalt het "doel" waar het systeem naartoe moet opstarten. Dit is vaak een symbolische link naar een specifiekere target unit, zoals `multi-user.target` of `graphical.target` [27](#page=27).
#### 1.2.6 Het opstartproces met systemd
Bij het opstarten van het systeem doorloopt systemd de volgende stappen [32](#page=32):
1. systemd laadt zijn configuratie.
2. systemd bepaalt het boot-doel, meestal `default.target`.
3. systemd analyseert alle afhankelijkheden van het `default.target`, en vervolgens de afhankelijkheden van die afhankelijkheden, recursief.
4. systemd activeert de benodigde dependencies en het uiteindelijke doel.
5. Na het opstarten kan systemd reageren op systeemgebeurtenissen en additionele componenten activeren [32](#page=32).
### 1.3 De command-line interface: `systemctl`
`systemctl` is het primaire commando voor het beheren van systemd en zijn units. Het is belangrijk om `systemctl` niet te verwarren met `sysctl`, dat wordt gebruikt om kernel-attributen te lezen en te wijzigen [10](#page=10) [8](#page=8).
#### 1.3.1 Belangrijke `systemctl` commando's
* `systemctl status `: Toont de status van een specifieke unit [31](#page=31) [7](#page=7).
* `systemctl start `: Start een unit. Dit start de service maar creëert geen dependencies zoals gedefinieerd in de `[Install]` sectie [31](#page=31) [32](#page=32).
* `systemctl stop `: Stopt een actieve unit [31](#page=31) [33](#page=33).
* `systemctl restart `: Herstart een unit [31](#page=31).
* `systemctl daemon-reload`: Herlaadt de systemd manager configuratie, inclusief alle unit files [31](#page=31).
* `systemctl enable `: Configureert de unit om automatisch te starten met andere geselecteerde units. Dit creëert symbolische links in de `wants` directory van de target unit en start de unit *niet* direct [31](#page=31) [32](#page=32).
* `systemctl disable `: Verwijdert de configuratie die ervoor zorgt dat een unit automatisch start. Dit stopt de unit niet als deze actief is [31](#page=31) [33](#page=33).
* `systemctl mask `: Blokkeert een unit zodat deze niet gestart kan worden, handmatig of automatisch. Dit gebeurt door een symbolische link naar `/dev/null` te creëren [31](#page=31) [33](#page=33).
* `systemctl unmask `: Hef de maskering van een unit op [31](#page=31).
* `systemctl list-units`: Toont de huidige status van alle geconfigureerde units [11](#page=11) [31](#page=31).
* `systemctl --failed`: Toont alleen de units die gefaald zijn [31](#page=31).
* `systemctl isolate `: Start de gespecificeerde unit en stopt alle andere [31](#page=31).
* `systemctl default`: Schakelt over naar de default target unit [31](#page=31).
* `systemctl cat `: Toont de inhoud van het configuratiebestand van een unit [31](#page=31).
#### 1.3.2 Starten vs. Enable
Het is essentieel om het verschil te begrijpen tussen `start` en `enable`:
* `systemctl start`: Start de service onmiddellijk, maar negeert de installatie-afhankelijkheden [32](#page=32).
* `systemctl enable`: Zorgt ervoor dat de unit automatisch wordt gestart bij toekomstige boots, maar start de unit niet direct [32](#page=32).
Om een unit zowel te starten als in te schakelen, kan `--now` worden gebruikt: `systemctl enable --now ` [32](#page=32).
#### 1.3.3 Stoppen, Disablen en Masken
* `systemctl stop`: Stopt een actieve service [33](#page=33).
* `systemctl disable`: Voorkomt dat een service automatisch start bij toekomstige boots, maar stopt deze niet als deze al draait [33](#page=33).
* `systemctl mask`: Voorkomt dat een service ooit nog draait, door deze te koppelen aan `/dev/null` [33](#page=33).
### 1.4 Systeembeheer met systemd
#### 1.4.1 `shutdown` en `reboot` commando's
Op moderne systemen die systemd gebruiken, zijn de `shutdown` en `reboot` commando's vaak symbolische links naar `systemctl`. Dit betekent dat deze commando's nu worden afgehandeld door systemd's unit management systeem [3](#page=3).
#### 1.4.2 Logs bekijken met `journalctl`
`journalctl` is het commando voor het inzien van de logs beheerd door systemd's journal. Enkele nuttige opties zijn [35](#page=35):
* `journalctl -xe`: Ga naar het einde van de log en geef uitleg over de fouten (-x) [35](#page=35).
* `journalctl -xef`: Blijf nieuwe log-items volgen (-f) [35](#page=35).
* `journalctl -xef -u `: Toon logs alleen voor een specifieke unit [35](#page=35).
* `journalctl -b -1`: Toon berichten van de vorige systeem boot [35](#page=35).
* `journalctl -k`: Toon alleen kernelberichten [35](#page=35).
* `journalctl --since yesterday`: Filter berichten vanaf gisteren [35](#page=35).
* `journalctl --since "YYYY-MM-DD" --until "YYYY-MM-DD"`: Filter op een tijdsinterval [35](#page=35).
#### 1.4.3 Systeem analyse met `systemd-analyze`
`systemd-analyze` biedt hulpmiddelen voor het analyseren van het systeem en de opstarttijd [44](#page=44):
* `systemd-analyze time`: Geeft de totale opstarttijd weer [44](#page=44).
* `systemd-analyze blame`: Toont een lijst van units gesorteerd op de tijd die ze nodig hadden om te initialiseren [44](#page=44).
* `systemd-analyze critical-chain`: Visualiseert de kritieke keten van units tijdens het opstarten [44](#page=44).
* `systemd-analyze plot > file.svg`: Genereert een SVG-bestand dat de opstart-volgorde visualiseert [44](#page=44).
* `systemd-analyze security`: Analyseert de beveiligingsgerelateerde instellingen van systemd-managed services .
### 1.5 De adoptie van systemd in Linux distributies
De meeste mainstream Linux-distributies gebruiken systemd standaard. Enkele voorbeelden zijn [12](#page=12):
* Fedora (vanaf versie 15) [12](#page=12).
* Red Hat Enterprise Linux 7 [12](#page=12).
* SUSE Linux Enterprise Server 12 [12](#page=12).
* Debian 8 [12](#page=12).
* Ubuntu 15.04 [12](#page=12).
systemd wordt beschouwd als meer dan alleen een vervanging voor `init.d` [40](#page=40).
> **Tip:** Raadpleeg de man-pagina's (`man systemd.unit`, `man systemd.service`, `man systemd.target`) voor gedetailleerde informatie over systemd units en hun configuratie.
---
# Systemd unit types en configuratie
Dit topic behandelt de verschillende types systemd units, zoals services, targets en devices, en hoe deze units worden geconfigureerd via specifieke configuratiebestanden [10](#page=10) [13](#page=13) [14](#page=14) [15](#page=15) [16](#page=16) [17](#page=17) [18](#page=18) [19](#page=19) [20](#page=20) [21](#page=21) [22](#page=22) [23](#page=23) [24](#page=24) [25](#page=25) [26](#page=26) [27](#page=27) [29](#page=29) [38](#page=38) [39](#page=39) [42](#page=42).
### 2.1 Systemd units: de basis
Een systemd ‘unit’ definieert een service of actie op het systeem. Een unit bestaat uit [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) [39](#page=39) [42](#page=42):
* Een naam [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) [39](#page=39) [42](#page=42).
* Een type [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) [39](#page=39) [42](#page=42).
* Een configuratiebestand [10](#page=10) [14](#page=14) [15](#page=15) [20](#page=20) [21](#page=21) [39](#page=39) [42](#page=42).
Systemd identificeert units door hun naam en type met de notatie ‘naam.type’. Een voorbeeld hiervan is `ssh.service` [15](#page=15) [20](#page=20) [21](#page=21).
#### 2.1.1 Verschillende unit types
Er zijn diverse typen systemd units, waaronder [16](#page=16) [17](#page=17) [18](#page=18) [39](#page=39) [42](#page=42):
* `automount`: voor het automatisch mounten van filesystems.
* `device`: representeert een kernel device, zoals gerapporteerd door udev (bv. `/dev/sda`). Systemd genereert deze units automatisch, bijvoorbeeld `dev-sda.device`. Andere units kunnen afhankelijk zijn van devices via `After=dev-sda.device` [39](#page=39).
* `mount`: representeert een gemounte filesystem, gebaseerd op de `/etc/fstab` configuratie. Voorbeelden zijn `boot.mount` voor `/boot` en `-.mount` voor de root filesystem `/` [42](#page=42).
* `path`: gerelateerd aan bestandsgebaseerde activatie.
* `service`: gebruikt om daemons op het Linux systeem te beheren. Een voorbeeld is `ssh.service` [17](#page=17).
* `snapshot`: voor het maken van systeem snapshots.
* `socket`: voor het beheren van netwerk sockets.
* `target`: gebruikt om meerdere units te groeperen, zodat ze tegelijkertijd gestart kunnen worden. Een voorbeeld is `network.target` [18](#page=18).
#### 2.1.2 De ‘Default Target’
Het `/lib/systemd/system/default.target` bestand bepaalt welk target het systeem opstart. Dit bestand is vaak een symbolische link naar een specifiek target [27](#page=27).
### 2.2 Configuratie van systemd units
De configuratiebestanden voor systemd units bepalen hoe deze units zich gedragen [19](#page=19).
#### 2.2.1 Locatie van configuratiebestanden
Systemd zoekt naar configuratiebestanden in de volgende directories, in deze volgorde [29](#page=29):
1. `/etc/systemd/system`: Voor lokale en permanente configuraties. Deze configuraties worden niet overschreven door pakketupdates [29](#page=29).
2. `/run/systemd/system`: Voor runtime configuratie.
3. `/lib/systemd/system`: Voor distributie-brede configuratie.
Systemd stopt met zoeken zodra het een overeenkomend bestand vindt. Het wordt aangeraden om aangepaste en/of permanentere configuraties in `/etc/systemd/system` te plaatsen [29](#page=29).
#### 2.2.2 Configuratie secties en opties
Configuratiebestanden van systemd units bevatten verschillende secties die het gedrag van de unit bepalen.
##### 2.2.2.1 De `[Service]` sectie
Deze sectie is specifiek voor `service`-type units. Belangrijke opties zijn [22](#page=22) [25](#page=25):
* `ExecStart`: Definieert het commando dat gestart moet worden wanneer de service actief wordt [22](#page=22).
* `Restart`: Bepaalt wanneer de service automatisch herstart moet worden [22](#page=22).
##### 2.2.2.2 De `[Unit]` sectie
Deze sectie is van toepassing op alle unit types, inclusief `target` en `service` units. Opties hierin definiëren dependencies [23](#page=23) [24](#page=24):
* `After` / `Before`: Specificeert welke units moeten draaien vóór of ná de huidige unit [23](#page=23).
* `Requires` / `Wants` / `Conflicts` / `Requisite`: Definieert expliciete dependencies [23](#page=23).
**Tabel 2.1: Verschillende types dependencies in de `[Unit]` sectie** [24](#page=24).
| Dependency Type | Beschrijving | Wanneer/welke falen? |
| :-------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `Requires=B.service` | Strikte dependencies. Bij het activeren van A.service, activeert systemd ook B.service. Als B.service faalt, deactiveert systemd A.service. | Als B.service faalt, faalt A.service. |
| `Wants=C.service` | Dependencies voor activatie alleen. Bij het activeren van A.service, activeert systemd ook C.service. Als C.service faalt, heeft dit geen invloed op A.service. | Als C.service faalt, heeft dit geen invloed op A.service. **Tip:** Systemd documentatie stelt dat dit de voorkeursmanier is om dependencies te specificeren indien mogelijk, omdat het falen niet doorgegeven wordt aan andere units. | [24](#page=24).
| `Requisite=D.service`| Units die al actief moeten zijn. Vóór het activeren van A.service, controleert systemd D.service. Als D.service niet actief is, faalt de activatie van A.service. | Als D.service niet actief is, faalt de activatie van A.service. |
| `Conflicts=E.service`| Negatieve dependencies. Bij het activeren van A.service, deactiveert systemd E.service. Gelijktijdige activatie van twee conflicterende units faalt. | Gelijktijdige activatie van conflicterende units faalt. |
Men kan dependencies ook "in reverse" toevoegen. Bijvoorbeeld, om Unit A toe te voegen als `Wants`-dependency aan Unit B, hoeft de `Wants`-declaratie niet in Unit B's configuratie te staan. In plaats daarvan kan men `WantedBy` in Unit A's configuratie gebruiken (vergelijkbaar voor `RequiredBy`). Deze dependency kan dynamisch geactiveerd of gedeactiveerd worden met `# systemctl enable A.service` en `# systemctl disable A.service`. Dit creëert/verwijderd symbolische links in de `/etc/systemd/system/B.service.wants/` directory naar `A.service` [25](#page=25).
Men kan de dependencies van een unit bekijken met het `systemctl` commando, bijvoorbeeld: `# systemctl list-dependencies A.service` of `# systemctl list-dependencies A.service --reverse` en `# systemctl show -p Wants B.service` [24](#page=24) [25](#page=25).
##### 2.2.2.3 De `[Install]` sectie
Deze sectie wordt gebruikt om installatie-informatie te specificeren voor units, vaak in combinatie met `target` en `service` units [26](#page=26).
* `WantedBy` / `RequiredBy`: Specificeert het target level waarin het systeem moet zijn om deze unit te activeren. Dit wordt gebruikt in combinatie met de `enable` en `disable` commando's om dependencies dynamisch te beheren [25](#page=25) [26](#page=26).
---
# Besturing en analyse van systemd
Dit topic behandelt de commando's voor het beheren van systemd-units en het analyseren van systeemprestaties [30](#page=30).
### 3.1 Beheer van units met systemctl
`systemctl` is het primaire commando voor het beheren van systemd-service en target units [31](#page=31).
#### 3.1.1 Unit status en informatie
* `systemctl status `: Toont de status van de gespecificeerde unit [31](#page=31).
* `systemctl list-units`: Geeft de huidige status van alle geconfigureerde units weer [11](#page=11) [31](#page=31).
* `systemctl list-unit-files`: Toont de status van alle unit-bestanden [11](#page=11).
* `systemctl --failed`: Geeft een lijst van mislukte units weer [31](#page=31).
* `systemctl cat `: Print het systemd configuratiebestand van de gespecificeerde unit [31](#page=31).
#### 3.1.2 Services starten, stoppen en herladen
* `systemctl start `: Start de gespecificeerde unit. Dit start de service zelf, maar creëert geen dependencies zoals gedefinieerd in de `[Install]` sectie [31](#page=31) [32](#page=32).
* `systemctl stop `: Stopt een actieve service [31](#page=31) [33](#page=33).
* `systemctl restart `: Schakelt de unit uit en start deze opnieuw [31](#page=31).
* `systemctl daemon-reload`: Herlaadt de systemd manager configuratie en alle unit-bestanden [31](#page=31).
#### 3.1.3 Units inschakelen en uitschakelen
* `systemctl enable `: Configureert de unit om automatisch te starten met andere geselecteerde units. Dit koppelt de unit aan verschillende plekken om ervoor te zorgen dat deze automatisch opstart met andere units, maar start de unit zelf niet. Bijvoorbeeld, als `A.service` een `WantedBy=B.target` heeft in zijn configuratie, zal `systemctl enable A.service` een symlink creëren in `/etc/systemd/system/B.target.wants/` [31](#page=31) [32](#page=32).
* `systemctl disable `: Configureert de unit om niet automatisch te starten met andere units. Dit voorkomt dat een service, zoals `A.service`, zelfstandig start, maar stopt de momenteel actieve unit niet [31](#page=31) [33](#page=33).
#### 3.1.4 Maskeren van units
* `systemctl mask `: Markeer een unit als volledig onstartbaar, zowel automatisch als handmatig. Dit voorkomt dat een service ooit op het systeem draait door een symbolische link naar `/dev/null` aan te maken [31](#page=31) [33](#page=33).
* `systemctl unmask `: Maakt het maskeren ongedaan [31](#page=31).
#### 3.1.5 Gecombineerd starten en inschakelen
* `systemctl enable --now`: Combineert het inschakelen en starten van een unit [32](#page=32).
> **Tip:** Starten en inschakelen zijn orthogonaal: units kunnen ingeschakeld zijn zonder te starten, en gestart zijn zonder ingeschakeld te zijn [32](#page=32).
#### 3.1.6 Isoleren en defaults
* `systemctl isolate `: Start de gespecificeerde unit en stopt alle andere [31](#page=31).
* `systemctl default`: Wijzigt naar de standaard target unit [31](#page=31).
#### 3.1.7 Dependencies beheren
Dependencies kunnen ook "omgekeerd" worden toegevoegd. Om Unit A toe te voegen als een `Wants` dependency aan Unit B, hoeft de `Wants` niet in de configuratie van Unit B te worden toegevoegd. Dit kan worden gedaan via `systemctl enable A.service`, wat symlinks creëert in `/etc/systemd/system/B.service.wants/` [25](#page=25).
* `systemctl show -p Wants B.service`: Geeft de dependencies van een unit weer [25](#page=25).
### 3.2 Systeemanalyse met systemd-analyze
`systemd-analyze` wordt gebruikt om systeemprestaties en opstarttijden te analyseren [36](#page=36).
* `systemd-analyze time`: Analyseert de opstarttijd van het systeem [36](#page=36).
* `systemd-analyze blame`: Toont een lijst van units gesorteerd op hun opstarttijd, om zo de meest tijdrovende units te identificeren [36](#page=36).
* `systemd-analyze critical-chain`: Toont de kritieke keten van units die nodig zijn voor het opstarten van een specifieke unit, met hun opstarttijden [36](#page=36).
* `systemd-analyze plot > file.svg`: Genereert een SVG-afbeelding van de opstartketen, wat visueel inzicht geeft in het opstartproces [36](#page=36).
* `systemd-analyze security`: Analyseert de per-service beveiligingsfuncties die systemd implementeert. Hoge blootstellingsniveaus kunnen duiden op een potentiële behoefte aan aanvullende beveiligingsinstellingen [37](#page=37).
### 3.3 Logboekweergave met journalctl
`journalctl` wordt gebruikt om de logboeken van systemd te bekijken [35](#page=35).
* `journalctl -xe`: Gaat naar het einde van het logboek en geeft uitleg [35](#page=35).
* `journalctl -xef`: Blijft nieuwe logboekvermeldingen volgen [35](#page=35).
* `journalctl -xef -u `: Toont alleen logboeken voor de gespecificeerde unit [35](#page=35).
* `journalctl -b -1`: Toont berichten van de laatste systeemopstart [35](#page=35).
* `journalctl -k`: Toont alleen kernelberichten [35](#page=35).
* `journalctl --no-pager`: Handig voor parsing op stdout [35](#page=35).
* `journalctl -u nginx -o json-pretty`: Output in JSON-formaat [35](#page=35).
* `journalctl --since yesterday`: Filtert op gegevens vanaf gisteren [35](#page=35).
* `--since “2019-01-10” --until “…”`: Filtert op een start- en einddatum (tijd kan worden opgenomen) [35](#page=35).
> **Tip:** Verhoogde permissies kunnen vereist zijn om bepaalde logboekvermeldingen te zien [35](#page=35).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| systemd | systemd is een systeem- en servicebeheerder voor Linux-besturingssystemen, bedoeld om een alternatief te bieden voor de traditionele init-daemon en om de systeeminitialisatie en servicebeheer te moderniseren. |
| init daemon | De init daemon (initialization daemon) is het eerste proces dat op het besturingssysteem wordt gestart na de kernel. Het is verantwoordelijk voor het starten en beheren van andere processen en services tijdens het opstarten van het systeem. |
| runlevels | Runlevels zijn modi waarin een Unix-achtig besturingssysteem kan opereren. Elk runlevel is geassocieerd met een specifieke set draaiende services en processen. |
| unit | Een systemd-unit is een basisbouwsteen die een systeemcomponent zoals een service, device, mount point, of target vertegenwoordigt. Elke unit wordt gedefinieerd door een configuratiebestand. |
| service | Een systemd-service unit beheert een daemon of applicatie die op de achtergrond draait. Het definieert hoe de service gestart, gestopt en herstart moet worden. |
| target | Een systemd-target unit is vergelijkbaar met runlevels in oudere init-systemen. Het groepeert meerdere units die samen opgestart moeten worden om een bepaalde systeemtoestand te bereiken, zoals "graphical.target" voor de grafische omgeving. |
| automount unit | Een automount unit in systemd beheert het automatisch mounten van bestandssystemen wanneer deze nodig zijn, vaak geassocieerd met de /etc/fstab-configuratie. |
| device unit | Een device unit in systemd vertegenwoordigt een kernelapparaat dat door udev wordt gerapporteerd, zoals `/dev/sda`. Andere units kunnen afhankelijkheden hebben van deze device units. |
| mount unit | Een mount unit in systemd vertegenwoordigt een gemount bestandssysteem, zoals de root (/) of /boot. systemd leest configuratie uit /etc/fstab om deze units te creëren. |
| path unit | Een path unit in systemd reageert op gebeurtenissen op bestandssysteemobjecten, zoals het aanmaken, wijzigen of verwijderen van bestanden of mappen. |
| socket unit | Een socket unit in systemd beheert netwerk- of Unix domain sockets. Het kan worden gebruikt om services te starten wanneer er een verbinding binnenkomt op een specifieke socket. |
| snapshot unit | Een snapshot unit in systemd bevriest de huidige systeemtoestand, waardoor het mogelijk is om terug te keren naar die toestand. |
| systemctl | systemctl is het primaire commando-regelprogramma voor het beheren van systemd. Het wordt gebruikt om units te starten, stoppen, inschakelen, uitschakelen en hun status te controleren. |
| sysctl | sysctl is een commando dat wordt gebruikt om de attributen van de Linux-kernel tijdens het draaien te lezen en aan te passen, zoals netwerkinstellingen. |
| journalctl | journalctl is een commando-regelprogramma voor het bekijken en filteren van logs die door systemd's journal worden verzameld. Het biedt gedetailleerde informatie over systeemgebeurtenissen. |
| systemd-analyze | systemd-analyze is een tool binnen systemd die wordt gebruikt om de opstarttijd van het systeem en individuele units te analyseren, en om beveiligingsaspecten van services te evalueren. |
Cover
LSS - Lecture II - shells.pdf
Summary
# Terminal en shell concepten
Dit onderwerp verklaart het fundamentele verschil tussen een terminal emulator en een shell, introduceert de concepten van virtuele en pseudo-terminal sessies, en beschrijft tools voor terminal multiplexing [3](#page=3).
### 1.1 Terminal emulator versus shell
#### 1.1.1 De terminal emulator
Een terminal emulator is de interface die tekstinvoer en -uitvoer mogelijk maakt. Het fungeert als een venster of scherm waarmee een gebruiker communiceert met de computer. Historisch gezien emuleren deze moderne terminal programma's fysieke terminals die bestonden uit een toetsenbord en scherm, rechtstreeks verbonden met een mainframe computer. Er zijn verschillende terminal emulators beschikbaar die dezelfde shell kunnen draaien, wat illustreert dat de emulator slechts de weergave is, terwijl de shell de actieve command-line interpreter is [3](#page=3) [4](#page=4) [5](#page=5) [6](#page=6).
#### 1.1.2 De shell
De shell is een programma dat fungeert als tussenpersoon tussen de gebruiker en de kernel van het besturingssysteem. Het is verantwoordelijk voor het vertalen van commando's die door de gebruiker worden ingevoerd naar acties die het systeem kan uitvoeren. Concreet is de terminal de interface (het venster), terwijl de shell het programma is dat de ingevoerde commando's uitvoert [3](#page=3).
### 1.2 Virtuele en pseudo-terminal sessies
#### 1.2.1 Virtuele terminals
Een virtuele terminal (ook wel bekend als TTY) wordt gebruikt om meerdere tekstgebaseerde interface sessies te beheren zonder gebruik te maken van een grafische gebruikersinterface (GUI). Deze virtuele terminals zijn altijd beschikbaar en worden vaak aangeduid als 'tty1', 'tty2', enzovoort. Ze kunnen doorgaans worden benaderd via sneltoetsen zoals ALT+F1, ALT+F2, etc. [7](#page=7).
#### 1.2.2 Pseudo-terminals
Pseudo-terminals (of PTY's) worden dynamisch aangemaakt wanneer een nieuwe terminal emulator wordt geopend binnen een grafische omgeving of wanneer er een netwerkverbinding wordt gemaakt, zoals via SSH. Ze bieden een interface die lijkt op een echte terminal, maar zijn niet direct gekoppeld aan de fysieke hardware [7](#page=7).
### 1.3 Tools voor terminal multiplexing
Terminal multiplexers zijn programma's die geavanceerde functionaliteit bieden binnen één terminalvenster, zoals het beheren van meerdere vensters en gesplitste weergaven (panes). Een belangrijk kenmerk is dat ze sessies kunnen behouden, waardoor gebruikers een sessie kunnen verlaten (detacheren) en later kunnen hervatten (opnieuw koppelen) [8](#page=8) [9](#page=9).
#### 1.3.1 tmux
`tmux` (Terminal Multiplexer) is een populaire tool voor terminal multiplexing. Met `tmux` kun je binnen één terminalvenster meerdere vensters en gesplitste weergaven (panes) openen. Het belangrijkste voordeel is de mogelijkheid om sessies te detacheren en opnieuw te koppelen, zodat je werk behouden blijft, zelfs als je de terminal sluit of de verbinding verliest [8](#page=8) [9](#page=9).
**Veelgebruikte `tmux` commando's:**
* `tmux new -s myname`: Start een nieuwe `tmux` sessie met de naam `myname` [11](#page=11).
* `ctrl-b d`: Koppel los van de huidige `tmux` sessie (detach) [11](#page=11).
* `tmux ls`: Toon een lijst van beschikbare `tmux` sessies [11](#page=11).
* `tmux attach -t myname`: Hernieuw de koppeling aan een specifieke `tmux` sessie [11](#page=11).
* `ctrl-b %`: Verdeel het huidige paneel verticaal [11](#page=11).
* `ctrl-b "`: Verdeel het huidige paneel horizontaal [11](#page=11).
* `ctrl-b c`: Creëer een nieuw venster [11](#page=11).
* `ctrl-b p`: Ga naar het vorige venster [11](#page=11).
* `ctrl-b n`: Ga naar het volgende venster [11](#page=11).
> **Tip:** `tmux` commando's worden vaak voorafgegaan door een "prefix key" (standaard `ctrl-b`). Na het indrukken van de prefix key, druk je de daaropvolgende toets in voor de actie [11](#page=11).
#### 1.3.2 Zellij
Zellij is een andere moderne terminal multiplexer die wordt vergeleken met `vim` en `nano` in de context van het ecosysteem van tekstgebaseerde tools. Het biedt vergelijkbare functies voor venster- en paneelbeheer en sessiebehoud [8](#page=8).
> **Voorbeeld:** Zellij kan direct worden uitgeprobeerd zonder installatie door de volgende commando uit te voeren: `bash <(curl -L zellij.dev/launch)` .
Andere genoemde tools voor multiplexing of geavanceerd terminalgebruik zijn `screen`, `tmate`, `terminator` en `tilix` [8](#page=8).
---
# Shell commando's en expansie
De shell speelt een cruciale rol in het verwerken van commando's door verschillende expansiemechanismen toe te passen voordat het uiteindelijke commando wordt uitgevoerd. Deze expansies, zoals bestandsnaamexpansie, brace expansie, command substitution en rekenkundige expansie, stellen gebruikers in staat om flexibele en krachtige commando's te construeren [15](#page=15) [16](#page=16) [17](#page=17) [19](#page=19) [20](#page=20).
### 2.1 Bestandsnaamexpansie (filename expansion)
Bestandsnaamexpansie, ook wel globbing genoemd, wordt gebruikt om patronen in bestandsnamen te matchen. De shell zoekt naar bestaande bestanden die overeenkomen met het opgegeven patroon. Als er geen overeenkomst wordt gevonden, wordt het patroon behandeld als een gewone string [16](#page=16).
#### 2.1.1 Symbolen voor bestandsnaamexpansie
* `*`: Komt overeen met nul of meer tekens [16](#page=16).
* `?`: Komt overeen met exact één teken [16](#page=16).
* `[abcd]`: Komt overeen met exact één teken dat voorkomt in de lijst (hier: 'a', 'b', 'c' of 'd') [16](#page=16).
* `[a-d]`: Komt overeen met exact één teken dat binnen het opgegeven bereik valt (hier: 'a' tot 'd') [16](#page=16).
* `[^ab]` of `[!ab]`: Komt overeen met exact één teken dat *niet* voorkomt in de lijst (hier: niet 'a' of 'b') [16](#page=16).
> **Voorbeeld:** Het commando `find. -name h*` zoekt naar alle bestanden in de huidige directory (`.`) en subdirectories waarvan de naam begint met de letter 'h' [14](#page=14).
### 2.2 Brace expansie (brace expansion)
Brace expansie biedt een manier om reeksen van strings te genereren zonder afhankelijk te zijn van bestaande bestandsnamen [17](#page=17).
#### 2.2.1 Symbolen voor brace expansie
* `{a,b,c}`: Genereert elke opgegeven string (hier: 'a', 'b', 'c') [17](#page=17).
* `{0..6}`: Genereert een reeks getallen binnen het opgegeven bereik (hier: '0', '1', '2', '3', '4', '5', '6') [17](#page=17).
* `{0..6..2}`: Genereert een reeks getallen binnen het opgegeven bereik met een specifieke stapgrootte (hier: '0', '2', '4', '6') [17](#page=17).
### 2.3 Command substitution
Command substitution maakt het mogelijk om de uitvoer van een commando te gebruiken als een argument voor een ander commando. De moderne en aanbevolen methode hiervoor is het gebruik van `USD( )`. De oudere methode met backticks (`` ` ``) is verouderd [19](#page=19).
> **Voorbeeld:** Het commando `du /usr/bin > log-USD(date +%Y-%m-%d)` maakt een bestand aan genaamd `log-YYYY-MM-DD` (waarbij YYYY, MM, DD de huidige datum zijn) en schrijft de schijfgebruiksstatistieken van `/usr/bin` naar dit bestand [19](#page=19).
### 2.4 Rekenkundige expansie (arithmetic expansion)
Rekenkundige expansie stelt de shell in staat om rekenkundige bewerkingen uit te voeren met behulp van `$(($expression))` [20](#page=20).
> **Voorbeeld:** Als variabelen `a` is ingesteld op 5 en `b` op 4, zal `echo De som is USD((a+b))` de output "De som is 9" produceren [20](#page=20).
### 2.5 Andere stappen in commando-verwerking
Naast de hierboven genoemde expansies doorloopt de shell nog andere stappen bij het verwerken van commando's:
* **Splitsen in tokens (Word splitting)**: De input wordt opgesplitst in tokens op basis van meta-karakters zoals spatie, tab, newline, `;`, `(`, `)`, `<`, `>`, `|`, en `&`. De uiteindelijke woordopsplitsing is gebaseerd op de waarde van de variabele `USDIFS` (Internal Field Separator) [21](#page=21).
* **Parameter expansie**: Dit omvat het uitbreiden van variabelen (ook wel parameters genoemd) [21](#page=21).
> **Tip:** Het commando `info bash` biedt uitgebreide documentatie over de bash shell, inclusief details over expansiemechanismen. Het installeren van `info` en `bash-doc` kan hierbij helpen [18](#page=18).
>
> Een handige online tool om de werking van shell commando's te analyseren is [https://explainshell.com/](https://explainshell.com/) [26](#page=26).
---
# Verschillende shells en hun gebruik
Dit hoofdstuk biedt een overzicht van diverse command-line shells, hun kenmerken en hoe ze worden ingezet in zowel interactieve als niet-interactieve sessies.
### 3.1 Overzicht van gangbare shells
Verschillende shells bieden unieke functionaliteiten en worden gebruikt afhankelijk van de vereisten van de gebruiker of het systeem. De belangrijkste hiervan zijn:
* **sh (Bourne shell)**: Ontwikkeld door Stephen Bourne in de jaren '70 bij AT&T Bell Labs.
* **bash (Bourne-Again Shell)**: Uitgebracht in 1989 als een uitbreiding op `sh`, met extra functies zoals command completion en geschiedenisbeheer [28](#page=28).
* **tcsh**: Heeft een syntax die meer lijkt op de C-programmeertaal en is een afgeleide van de originele C shell (csh) van Berkeley Unix [28](#page=28).
* **dash (Debian Almquist Shell)**: Ontworpen om zo klein mogelijk te zijn, wat resulteert in hogere snelheden. Het is de standaard non-interactieve shell in Ubuntu en Debian [28](#page=28).
* **zsh (Z shell)**: Een uitgebreide Bourne shell en de standaard shell in macOS Catalina en Kali 2020.4 [28](#page=28).
* **ksh (Korn shell)**: Een andere variant die geavanceerde functies biedt.
* **fish (Friendly Interactive Shell)**: Bekend om zijn gebruiksvriendelijke interface en interactieve functies.
### 3.2 Shells in niet-interactieve sessies
In niet-interactieve sessies worden commando's uitgevoerd die uit een bestand worden gelezen, zoals scripts [29](#page=29).
* **Shebang (`#!`)**: In scripts verwijst de shebang vaak naar `/bin/sh` of `/usr/bin/sh` om aan te geven welke shell gebruikt moet worden voor de uitvoering van het script [29](#page=29).
* **`/bin/sh` als symlink**: Op moderne Linux-distributies, zoals Debian, is `/bin/sh` vaak een symbolische link naar een andere shell, zoals `dash`, om de compatibiliteit te waarborgen [30](#page=30).
> **Tip:** Het gebruik van `/bin/sh` in scripts is een gangbare praktijk voor maximale compatibiliteit, omdat veel shells hiernaar linken.
### 3.3 Shells in interactieve login sessies
Een interactieve login shell is de shell waarmee een gebruiker direct communiceert na het inloggen op een systeem.
* **Beschikbare shells**: Een overzicht van geïnstalleerde shells die als login shell kunnen dienen, is te vinden in het bestand `/etc/shells` [31](#page=31).
* Voorbeelden van inhoud van `/etc/shells`: `/bin/sh`, `/bin/bash`, `/usr/bin/bash`, `/bin/rbash`, `/usr/bin/rbash`, `/bin/dash`, `/usr/bin/dash` [31](#page=31).
* **Standaard login shell**:
* Voor nieuwe gebruikers wordt de standaard login shell ingesteld via configuratiebestanden zoals `/etc/adduser.conf` (bij het `adduser` commando in Debian) of `/etc/default/useradd` (bij het `useradd` commando in Debian/RHEL) [32](#page=32).
* De login shell van elke specifieke gebruiker wordt gedefinieerd in het `/etc/passwd` bestand [32](#page=32).
* **Wijzigen van de login shell**: De login shell van een gebruiker kan worden gewijzigd met het `chsh` commando of via `usermod --shell ` [32](#page=32).
> **Voorbeeld:** Een gebruiker kan zijn shell wijzigen door `chsh` uit te voeren en na te vragen naar de nieuwe login shell, waarna de gewenste shell (bijvoorbeeld `/bin/zsh`) wordt ingevoerd [32](#page=32).
### 3.4 Bepalen van de actieve shell
Om te achterhalen welke shell momenteel actief is, kunnen de volgende methoden worden gebruikt:
* **`ps -p $$`**: Dit commando toont de proces-ID (PID) van de huidige shell, aangezien `$$` de PID van het lopende proces vertegenwoordigt [33](#page=33).
* **`echo $0`**: De variabele `$0` bevat de naam van het commando dat is uitgevoerd, wat in dit geval de shell zelf is (mogelijk met een streepje ervoor, zoals `-bash`) [33](#page=33).
* **`USDSHELL` variabele**: Deze variabele verwijst naar de *standaard* login shell van de gebruiker, niet noodzakelijk naar de shell die momenteel actief is [33](#page=33).
> **Voorbeeld:** Na het uitvoeren van `ps -p $$` en `echo $0` kan duidelijk worden dat de huidige shell `bash` is, zelfs als `$SHELL` ook naar `/bin/bash` verwijst [33](#page=33).
### 3.5 Demo: Installeren en wisselen van shell
Het installeren en testen van een nieuwe shell zoals `zsh` kan als volgt worden uitgevoerd:
1. Installeer `zsh` met de pakketbeheerder (bijvoorbeeld `apt install zsh`) [34](#page=34).
2. Controleer de lijst van geldige shells in `/etc/shells` [34](#page=34).
3. Bepaal de actieve shell met `ps -p $$` en `echo USD 0` [34](#page=34).
4. Wissel naar `zsh` en controleer opnieuw met `ps -p USDUSD` en `echo USD 0` [34](#page=34).
5. Vergelijk de output van `echo USDSHELL` [34](#page=34).
### 3.6 Restricted shells: `rbash`
`rbash` (Restricted Bash) is een beperkte versie van `bash`, die kan worden gestart met de optie `-r` of als een aparte link `rbash` [35](#page=35).
* **Doel**: `rbash` beperkt de mogelijkheden van de gebruiker, bijvoorbeeld door het uitvoeren van commando's in bepaalde directories te verbieden of het wijzigen van bepaalde omgevingsvariabelen te blokkeren [35](#page=35).
* **Lijst in `/etc/shells`**: `rbash` staat vaak geregistreerd in `/etc/shells` als een geldige login shell [35](#page=35).
* **Kwetsbaarheid**: Het is belangrijk te weten dat `rbash` relatief eenvoudig te omzeilen is, met bekende technieken voor bypasses beschikbaar [37](#page=37).
> **Tip:** Restricted shells zijn nuttig voor het bieden van beperkte toegang aan gebruikers die specifieke taken moeten uitvoeren zonder het volledige systeem te kunnen benaderen.
### 3.7 `/usr/sbin/nologin`
Het commando `/usr/sbin/nologin` wordt gebruikt om gebruikers te verhinderen een interactieve shell sessie te starten.
* **Functionaliteit**: Wanneer dit als standaard shell is ingesteld voor een gebruiker, kan deze geen interactieve sessie starten. Dit is nuttig voor gebruikersaccounts die wel een wachtwoord moeten hebben (bijvoorbeeld voor FTP/SFTP toegang) maar geen directe shelltoegang nodig hebben [38](#page=38).
* **Verschil met `/etc/nologin`**: `/usr/sbin/nologin` is een commando dat een gebruiker afsluit. Het bestand `/etc/nologin` (of `/var/run/nologin`) heeft een andere functie: indien dit bestand bestaat en leesbaar is, wordt alleen root-toegang toegestaan en krijgen andere gebruikers een melding, wat dient om tijdelijk alle niet-bevoegde logins te deactiveren [39](#page=39).
---
# Superuser-rechten en shell tools
Dit onderwerp behandelt strategieën voor het verkrijgen van root-toegang via de shell en introduceert essentiële shell commando's en hulpprogramma's voor systeembeheer en probleemoplossing.
### 4.1 Superuser-rechten: su en sudo
Het verkrijgen van superuser-rechten, vaak aangeduid als "root" of "superuser", is cruciaal voor het uitvoeren van systeemwijzigingen, het installeren van software en het beheren van gebruikersrechten. De shell biedt twee primaire methoden om dit te doen: `su` en `sudo` [41](#page=41).
#### 4.1.1 su (substitute user)
Het `su`-commando stelt gebruikers in staat om als een andere gebruiker te handelen, standaard als de root-gebruiker. Dit vereist het root-wachtwoord.
* **`su`**: Schakelt over naar de root-gebruiker, maar behoudt de omgeving van de huidige gebruiker [42](#page=42).
* **`su -`** of **`su --login`**: Schakelt over naar de root-gebruiker en laadt de root-omgeving volledig, inclusief paden en omgevingsvariabelen. Dit wordt vaak beschouwd als de veiligste methode om tijdelijk root-rechten te verkrijgen met `su` [42](#page=42).
#### 4.1.2 sudo (superuser do)
Het `sudo`-commando biedt een meer gedetailleerde en veilige manier om commando's als een andere gebruiker (standaard root) uit te voeren zonder dat het root-wachtwoord direct nodig is; het gebruikt het wachtwoord van de huidige gebruiker na authenticatie. `sudo` kan worden geconfigureerd om specifieke commando's toe te staan aan specifieke gebruikers [42](#page=42).
* **`sudo -s`** of **`sudo --shell`**: Start een nieuwe shell als de root-gebruiker, maar behoudt de omgeving van de huidige gebruiker. Dit vereist geen root-wachtwoord, maar het wachtwoord van de huidige gebruiker [42](#page=42).
* **`sudo su -`** of **`sudo su --login`**: Start een nieuwe shell als de root-gebruiker en laadt de root-omgeving volledig. Net als `sudo -s` gebruikt dit het wachtwoord van de huidige gebruiker voor authenticatie [42](#page=42).
* **`sudo -i`** of **`sudo --login`**: Gedraagt zich als `su -` en start een interactieve login-shell als root, waarbij de root-omgeving volledig wordt geladen. Dit is een zeer gebruikelijke en veilige methode om tijdelijk root-rechten te verkrijgen [42](#page=42).
> **Tip:** `sudo` is over het algemeen de voorkeursmethode voor het uitvoeren van beheerderstaken omdat het betere audittrails biedt en minder kans geeft op het per ongeluk achterlaten van een root-shell open.
### 4.2 Shell commando's en hulpprogramma's
De shell (zoals bash) biedt een breed scala aan commando's en hulpprogramma's voor systeembeheer, bestandsmanipulatie en informatieverzameling.
#### 4.2.1 Nuttige shell commando's
Hieronder volgt een niet-limitatieve lijst van veelgebruikte commando's [45](#page=45):
* **Bestandsbeheer:**
* `pwd`: Toon de huidige werkdirectory [45](#page=45).
* `cd`: Verander van directory [45](#page=45).
* `ls`: List directory contents [45](#page=45).
* `rm`: Verwijder bestanden of directories [45](#page=45).
* `cp`: Kopieer bestanden of directories [45](#page=45).
* `mv`: Verplaats of hernoem bestanden of directories [45](#page=45).
* **Tekstverwerking en zoeken:**
* `cat`: Concateneer en toon bestandsinhoud [45](#page=45).
* `less`, `more`: Pagina-voor-pagina bekijken van bestandsinhoud [45](#page=45).
* `grep`: Zoek naar patronen in tekst [45](#page=45).
* `wc`: Tel regels, woorden en karakters [45](#page=45).
* `cut`: Verwijder secties van regels [45](#page=45).
* `sort`: Sorteer regels van tekstbestanden [45](#page=45).
* `head`: Toon het begin van een bestand [45](#page=45).
* `tail`: Toon het einde van een bestand [45](#page=45).
* **Procesbeheer:**
* `ps`: Toon lopende processen [45](#page=45).
* `kill`: Stuur signalen naar processen (vaak om ze te beëindigen) [45](#page=45).
* `bg`: Zet een gestopt proces voort op de achtergrond [45](#page=45).
* `fg`: Breng een proces van de achtergrond naar de voorgrond [45](#page=45).
* `jobs`: Toon lopende jobs in de huidige shell [45](#page=45).
* **Netwerk en schijfruimte:**
* `wget`: Download bestanden van het web [45](#page=45).
* `netstat` / `ss`: Toon netwerkverbindingen en statistieken [45](#page=45).
* `df`: Rapporteer schijfruimtegebruik [45](#page=45).
* `du`: Schat schijfgebruik van bestanden en directories [45](#page=45).
* **Zoeken in bestanden:**
* `find`: Zoek bestanden in een directoryhiërarchie. Dit commando is zeer krachtig en kan zoeken op naam, tijdstempel, permissies, bestandsgrootte en meer [45](#page=45) [49](#page=49).
* `locate`: Zoek bestanden snel via een geïndexeerde database (vereist `updatedb` om te updaten) [45](#page=45) [49](#page=49).
* **Bestandspermissies en eigendom:**
* `chmod`: Wijzig bestandspermissies [45](#page=45).
* `chown`: Wijzig de eigenaar van bestanden [45](#page=45).
#### 4.2.2 Shell shortcuts
Efficiënt gebruik van de shell wordt sterk verbeterd door het kennen van toetsenbord-shortcuts. Deze werken vaak in meerdere command-line programma's [44](#page=44).
* `CTRL + A`: Ga naar het begin van de regel [44](#page=44).
* `CTRL + E`: Ga naar het einde van de regel [44](#page=44).
* `CTRL + L`: Wis het scherm (vergelijkbaar met `clear` of `cls`, maar behoudt de huidige regel) [44](#page=44).
* `CTRL + W`: Wis het vorige woord [44](#page=44).
* `CTRL + left/right`: Spring over woorden (werkt in de meeste programma's) [44](#page=44).
* `CTRL + R`: Omgekeerd zoeken in de commando-geschiedenis. Dit is een zeer nuttige functie om eerder gebruikte commando's snel terug te vinden [44](#page=44).
> **Tip:** Oefen deze shortcuts regelmatig. Ze kunnen je productiviteit aanzienlijk verhogen bij het werken in de terminal.
#### 4.2.3 Man- en info-pagina's
Om de functionaliteit en syntaxis van commando's te begrijpen, zijn de `man`- (manual) en `info`-pagina's onmisbare hulpmiddelen.
* **`man`**: De primaire bron voor documentatie in Unix-achtige systemen [46](#page=46).
* `man `: Toont de handleiding voor een specifiek commando [48](#page=48).
* `man -k ` of `apropos `: Zoekt naar commando's die overeenkomen met een bepaalde zoekterm in hun beschrijving [46](#page=46).
* `man -f ` of `whatis `: Geeft een korte beschrijving van een commando [46](#page=46).
* De `man`-pagina's zijn opgedeeld in secties. Bijvoorbeeld, `man 1 passwd` documenteert het `passwd`-commando als een gebruikerscommando, terwijl `man 5 passwd` de `passwd`-bestandsindeling documenteert [47](#page=47).
* **`info`**: Een ander documentatiesysteem dat vaak gedetailleerdere en meer gestructureerde informatie biedt dan `man`-pagina's. De navigatie in `info` is anders dan in `man` en maakt gebruik van hyperlinks [45](#page=45).
> **Tip:** Als een commando een `permission denied`-fout geeft, kan het zijn dat je `sudo` ervoor moet plaatsen, zoals in `sudo apt update` [46](#page=46).
#### 4.2.4 Shell geschiedenis en timestamping
De shell houdt een geschiedenis bij van de uitgevoerde commando's. Met `HISTTIMEFORMAT` kan de shell worden geconfigureerd om timestamps toe te voegen aan de geschiedenis, wat zeer nuttig kan zijn voor het traceren van activiteiten [40](#page=40).
* `HISTTIMEFORMAT` is een omgevingsvariabele die kan worden ingesteld om het formaat van de timestamp te bepalen. Een veelgebruikte instelling is bijvoorbeeld `export HISTTIMEFORMAT='%F %T '` [40](#page=40).
#### 4.2.5 Shell fun
Naast de functionele commando's zijn er ook diverse "leuke" commando's die voor vermaak kunnen zorgen of visueel aantrekkelijke output genereren. Voorbeelden zijn [50](#page=50):
* `sl`: Een ASCII-trein die over het scherm rijdt.
* `lolcat`: Kleurt de output van andere commando's in regenboogkleuren.
* `cowsay`: Genereert een ASCII-koe (of ander dier) die tekst uitspreekt.
* `hollywood`: Verandert de terminal in een "hacker"-achtige interface.
* `curl wttr.in/Bruges`: Toont een weersvoorspelling voor de opgegeven locatie [50](#page=50).
* `telnet mapscii.me`: Toont ASCII-kaarten [50](#page=50).
---
# Secure Shell (SSH) en tunneling
Secure Shell (SSH) is een protocol dat is ontworpen om veilige netwerkdiensten te bieden over onbeveiligde netwerken, waaronder veilige externe login en bestandsoverdrachten [53](#page=53).
### 5.1 Het SSH-protocol
SSH is in de eerste plaats een applicatie- en transportprotocol, gedefinieerd in RFC 4251. Het primaire doel is het beveiligen van netwerkcommunicatie, wat onder andere het mogelijk maakt voor [53](#page=53):
* Veilige externe logins [53](#page=53).
* Veilige bestandsoverdrachten via het Secure Copy Protocol (SCP) en het SSH File Transfer Protocol (SFTP) [53](#page=53).
Er zijn twee belangrijke versies van het protocol:
* **SSH-1**: Sinds 1995, wordt niet meer ondersteund in veel implementaties [53](#page=53).
* **SSH-2**: Sinds 2006, is de momenteel gebruikte versie en is niet compatibel met SSH-1 [53](#page=53).
#### 5.1.1 Implementaties en configuratie
OpenSSH is een veelgebruikte implementatie van het SSH-protocol. Hoewel SSH de naam van het protocol is, wordt `ssh` ook gebruikt als de naam van het OpenSSH clientprogramma [54](#page=54).
De belangrijkste pakketten voor OpenSSH op Linux zijn:
* `openssh-client`
* `openssh-server`
De configuratiebestanden bevinden zich op de volgende locaties:
* Clientconfiguratie: `/etc/ssh/ssh_config` [54](#page=54).
* Serverconfiguratie (daemon): `/etc/ssh/sshd_config` [54](#page=54).
Op Windows worden de executables, inclusief het `sshd_config`-bestand indien de server is geïnstalleerd, doorgaans opgeslagen in `C:\Windows\System32\OpenSSH` [55](#page=55).
### 5.2 SSH-sleutels voor authenticatie
SSH maakt gebruik van sleutelparen voor authenticatie, wat een veiligere methode is dan wachtwoordgebaseerde logins, vooral omdat het minder vatbaar is voor man-in-the-middle (MITM) aanvallen bij correct gebruik [59](#page=59).
#### 5.2.1 Server host keys
Om de identiteit van de server te verifiëren, worden server host keys gebruikt. Deze bevinden zich meestal in `/etc/ssh/ssh_host_*_key` en komen in verschillende formaten, zoals RSA, ECDSA en ED25519 [56](#page=56).
Wanneer een client voor het eerst verbinding maakt met een server, stuurt de server zijn host key naar de client. De client onthoudt deze servers die hij vertrouwt in het `known_hosts`-bestand. Op Linux is dit het `~/.ssh/known_hosts`-bestand, en op Windows is het `%UserProfile%\.ssh\known_hosts` [57](#page=57).
Bij volgende verbindingen controleert de client of de server bekend is aan de hand van de publieke sleutelfingerprint van de server (een unieke checksum). Als deze gegevens niet overeenkomen, weigert de client de verbinding, wat aangeeft dat de verbinding mogelijk niet met de bedoelde host is [57](#page=57) [58](#page=58).
#### 5.2.2 Client login keys
Voor client logins kunnen SSH-sleutels handmatig worden gegenereerd, wat automatische logins mogelijk maakt. De publieke sleutels van vertrouwde clients om in te loggen worden opgeslagen in het `~/.ssh/authorized_keys`-bestand op de server [56](#page=56) [59](#page=59).
> **Tip:** Bij SSH-sleutels wordt aangeraden om de server fingerprint waarschuwingen niet te negeren om MITM aanvallen te voorkomen [59](#page=59).
### 5.3 SSH tunneling (port forwarding)
SSH tunneling, ook wel port forwarding genoemd, is een krachtige techniek om netwerkverkeer veilig te leiden over een bestaande SSH-verbinding. Dit kan worden gebruikt om onbeveiligde protocollen te beveiligen of om toegang te krijgen tot diensten die anders niet direct bereikbaar zouden zijn [60](#page=60).
#### 5.3.1 Local port forwarding
Met lokale port forwarding wordt een poort op de lokale machine doorgestuurd naar een specifieke host en poort aan de remote kant. Verkeer dat naar de lokale poort wordt gestuurd, wordt via de SSH-verbinding naar de opgegeven remote host en poort getunneld [61](#page=61).
De syntaxis is:
`ssh -L :: @` [61](#page=61).
**Voorbeeld:**
`ssh -L 8080:reddit.com:80 sshuser@172.21.18.53`
Dit stuurt al het verkeer dat naar `localhost:8080` op de lokale machine gaat, door de SSH-verbinding naar `reddit.com` op poort 80 [61](#page=61).
> **Tip:** Lokale port forwarding werkt doorgaans "out of the box" [61](#page=61).
#### 5.3.2 Reverse port forwarding
Bij reverse port forwarding wordt een poort op de remote machine doorgestuurd naar een specifieke host en poort op de lokale machine. Dit is nuttig wanneer je vanaf een externe locatie toegang wilt krijgen tot een dienst die lokaal draait, bijvoorbeeld achter een NAT-router [62](#page=62).
De syntaxis is:
`ssh -R :: @` [62](#page=62).
**Voorbeeld:**
`ssh -R 8888:localhost:8000 sshuser@172.21.18.53`
Dit zorgt ervoor dat verkeer dat naar poort 8888 op de SSH-server (IP 172.21.18.53) gaat, wordt doorgestuurd naar `localhost:8000` op de machine waar de SSH-client draait [62](#page=62).
> **Nadeel:** Voor reverse port forwarding moet mogelijk de `GatewayPorts yes` optie worden ingesteld in `/etc/ssh/sshd_config` en moet de `sshd`-daemon worden herstart [62](#page=62).
#### 5.3.3 Gebruik en onthouden van opties
De opties `-L` en `-R` kunnen als volgt worden onthouden:
* `ssh -L` → "local to remote" [63](#page=63).
* `ssh -R` → "remote to local" [63](#page=63).
Een veelvoorkomend gebruiksscenario voor port forwarding is toegang krijgen tot een database die beveiligingsredenen enkel lokale verbindingen toestaat. Als je via SSH verbinding hebt met de server en de database draait op poort 5432, kun je lokale port forwarding gebruiken:
`ssh -L 9000:localhost:5432 user@IP`
Je kunt dan vanaf je lokale machine verbinden met `localhost:9000` om de database te bereiken [64](#page=64).
Een ander scenario is wanneer je thuis achter NAT werkt en een applicatie op poort 8000 draait, en collega's hiermee willen testen. Je kunt reverse port forwarding gebruiken:
`ssh -R 8888:localhost:8000 user@IP`
Je collega's kunnen dan verbinden met `IP:8888` om toegang te krijgen tot jouw lokale applicatie [65](#page=65).
### 5.4 Andere SSH-functies
Naast beveiligde toegang en tunneling biedt SSH nog diverse andere handige functionaliteiten:
#### 5.4.1 Commando's uitvoeren zonder login
Het is mogelijk om een commando uit te voeren op een remote machine zonder een interactieve shell-sessie te starten [67](#page=67).
**Voorbeeld:**
`ssh student@172.21.19.1 cat /home/student/file.txt`
Dit commando haalt de inhoud van `file.txt` op van de remote machine en toont deze op de lokale console [67](#page=67).
Een ander voorbeeld met root privileges (indien toegestaan):
`ssh root@192.168.32.136 tcpdump -i ens33` [67](#page=67).
#### 5.4.2 GUI-programma's uitvoeren
Met X11 Forwarding (`-fX`) kunnen grafische programma's op de remote server worden uitgevoerd en lokaal worden weergegeven [67](#page=67).
**Syntaxis:**
`ssh -fX @ ` [67](#page=67).
#### 5.4.3 Remote directories mounten
Remote directories kunnen lokaal worden gemount met behulp van `sshfs`. Dit maakt het mogelijk om bestanden op de remote server te benaderen alsof ze zich op de lokale machine bevinden [67](#page=67).
**Voorbeeld:**
`sshfs user@IP:/media/data ~/server/` [67](#page=67).
#### 5.4.4 Springen via jump hosts
SSH maakt het mogelijk om via meerdere intermediate hosts (jump hosts) verbinding te maken met een eindbestemming. De verbinding van de lokale machine tot de eindhost blijft hierbij end-to-end versleuteld [68](#page=68).
**Syntaxis:**
`ssh -J host1,host2,host3 user@host4` [68](#page=68).
#### 5.4.5 Port forwarding binnen een sessie aanpassen
Binnen een actieve SSH-sessie kan via een speciale controle-escape-sequentie (`~C`) de verbinding worden aangepast, inclusief het toevoegen van nieuwe port forwards. Door op "enter" te drukken en daarna `~C` te typen, activeer je deze modus [68](#page=68).
> **Tip:** Raadpleeg de handleiding (`man ssh`) voor gedetailleerde informatie over opties zoals `-L` en `-R`. Een lab-oefening kan bijvoorbeeld bestaan uit het creëren van een SSH-tunnel naar een VM op een Howest server [63](#page=63) [69](#page=69).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| Terminal emulator | Een applicatie die een interface biedt voor tekstinvoer en -uitvoer, waardoor gebruikers kunnen communiceren met het besturingssysteem via een grafische omgeving. Het emuleert oudere fysieke terminals. |
| Shell | Een programma dat fungeert als tussenpersoon tussen de gebruiker en de kernel van het besturingssysteem. Het vertaalt commando's van de gebruiker naar acties die het systeem kan uitvoeren. |
| Command-line interface (CLI) | Een tekstgebaseerde interface voor het besturingssysteem, waarbij gebruikers commando's typen in een terminal om taken uit te voeren. |
| Virtual terminal (TTY) | Een tekstgebaseerde sessie die wordt gebruikt om meerdere systeeminteracties te beheren zonder grafische interface. Deze zijn altijd beschikbaar en toegankelijk via sneltoetsen zoals ALT+F1. |
| Pseudo-terminal | Een terminal die dynamisch wordt gecreëerd wanneer een nieuwe terminalemulator wordt geopend in een grafische omgeving of via een netwerkverbinding, zoals SSH. |
| Terminal multiplexer | Een tool die het mogelijk maakt om binnen één terminalvenster meerdere vensters en gesplitste weergaven (panes) te beheren. Het behoudt sessies, zodat deze op elk moment kunnen worden hervat (detacheren en (her)aanhaken). |
| Filename expansion (Globbing) | Het proces waarbij de shell wildcard-tekens zoals `*` en `?` vervangt door overeenkomende bestandsnamen in de huidige directory voordat het commando wordt uitgevoerd. |
| Brace expansion | Een shellfunctie die tekstpatronen genereert op basis van opgegeven reeksen of lijsten tussen accolades, zoals `{a,b,c}` of `{0..5}`. |
| Command substitution | Een functie waarbij de uitvoer van een commando wordt gebruikt als onderdeel van een ander commando. Dit wordt meestal bereikt met `$(commando)` of (verouderd) met backticks `` `commando` ``. |
| Arithmetic Expansion | Een shellfunctie die rekenkundige expressies evalueert. Dit wordt aangegeven door dubbele haakjes met een dollarteken ervoor, zoals `$((a + b))`. |
| Tokens | De basiseenheden waarin een commando wordt opgedeeld door de shell, gescheiden door spaties of andere meta-tekens, voordat verdere verwerking plaatsvindt. |
| Word splitting | Het proces waarbij de shell een regel tekst opdeelt in afzonderlijke woorden, gebaseerd op de waarde van de interne variabele `$IFS` (Internal Field Separator). |
| Parameter expansion | Het proces waarbij shellvariabelen worden uitgebreid naar hun waarden. Variabelen worden voorafgegaan door een dollarteken, zoals `$USER`. |
| Piping (|) | Een mechanisme dat de standaarduitvoer van het ene commando doorstuurt als standaardinvoer naar het volgende commando in een reeks. Dit maakt het mogelijk om commando's te combineren voor complexe taken. |
| Redirection | Het proces waarbij de standaardinvoer, standaarduitvoer of standaardfout van een commando wordt omgeleid naar of van een bestand, of naar een ander commando. Symbolen zoals `>`, `>>`, `<` en `2>` worden gebruikt. |
| Standard Output (stdout) | De standaarduitvoerstream van een commando, waar de normale resultaten van de uitvoering worden geschreven. |
| Standard Error (stderr) | De standaardfoutstream van een commando, waar foutmeldingen en diagnostische informatie worden geschreven. |
| /etc/shells | Een configuratiebestand dat een lijst bevat van alle geldige shell-programma's die als login shell kunnen worden gebruikt op een Unix-achtig systeem. |
| nologin | Een speciaal programma dat, wanneer ingesteld als de login shell van een gebruiker, voorkomt dat de gebruiker interactief kan inloggen op het systeem, terwijl het wel andere diensten (zoals SFTP) kan toestaan. |
| Shell history | Een functie van de shell die de commando's opslaat die door de gebruiker zijn ingevoerd, zodat deze opnieuw kunnen worden uitgevoerd of bewerkt. |
| su | Een commando dat wordt gebruikt om tijdelijk de identiteit van een andere gebruiker aan te nemen, meestal om root-rechten te verkrijgen (standaard de superuser). |
| sudo | Een commando dat gebruikers in staat stelt om commando's uit te voeren met de beveiligingsrechten van een andere gebruiker (standaard root), na verificatie van hun eigen wachtwoord. |
| man pages | De handleidingen van Unix/Linux commando's en functies, die informatie bevatten over hun gebruik, opties en syntax. Opgehaald met het `man` commando. |
| info pages | Een ander documentatiesysteem op Unix-achtige systemen, dat gedetailleerdere en gestructureerde informatie biedt dan man pages. Opgehaald met het `info` commando. |
| SSH (Secure Shell) | Een cryptografisch netwerkprotocol voor het veilig laten verlopen van bewerkingen tussen twee computers. Het wordt voornamelijk gebruikt voor externe login, bestandsbeheer en commando-uitvoering op afstand. |
| SCP (Secure Copy Protocol) | Een protocol en commando dat wordt gebruikt om bestanden veilig over een netwerk te kopiëren tussen computers, meestal via SSH. |
| SSH-sleutels | Een paar cryptografische sleutels (publieke en private) die worden gebruikt voor veilige authenticatie bij SSH-verbindingen, ter vervanging van wachtwoorden. |
| SSH tunneling (Port Forwarding) | Een techniek die gebruikmaakt van SSH om netwerkverkeer van een onbeveiligde verbinding te versleutelen en te transporteren via een beveiligde SSH-verbinding. |
| Local port forwarding | Het doorsturen van een lokale poort naar een specifieke poort op een externe host via een SSH-verbinding. Verkeer naar de lokale poort wordt omgeleid naar de externe poort. |
| Reverse port forwarding | Het doorsturen van een poort op een externe SSH-server naar een lokale poort op de clientmachine. Verkeer naar de externe poort wordt omgeleid naar de lokale poort. |
| Jump host | Een server die fungeert als een tussenstop om toegang te krijgen tot andere servers in een beveiligd netwerk. SSH kan worden gebruikt om "over" jump hosts te springen. |
| X11 Forwarding | Een functie van SSH die het mogelijk maakt om grafische applicaties die op een externe server draaien, lokaal weer te geven. |
| SSHFS | Een bestandssysteem gebaseerd op FUSE (Filesystem in Userspace) dat het mogelijk maakt om een externe directory via SSH te koppelen, zodat deze als een lokale map kan worden benaderd. |
Cover
LSS - Lecture VIIIa - Linux logging.pdf
Summary
# Authenticatie- en sessielogbestanden
Authenticatie- en sessielogbestanden bieden inzicht in gebruikersinteracties en beveiligingsgebeurtenissen op een systeem [2](#page=2).
## 1. Authenticatie logbestanden
Authenticatielogbestanden registreren gebruikersauthenticatie-activiteiten, zoals logins en sudo-aanvragen [3](#page=3).
### 1.1 Locaties van authenticatielogboeken
De locaties van deze logbestanden variëren per distributie:
* **Debian en afgeleiden:** `/var/log/auth.log`. Sinds Debian 12 wordt dit vervangen door `systemd-journald` (toegankelijk via `journalctl`), maar kan nog steeds aanwezig zijn als `rsyslog` geïnstalleerd is [3](#page=3).
* **RHEL en afgeleiden:** `/var/log/secure`. Deze logboeken zijn ook toegankelijk via `journalctl` [15](#page=15).
### 1.2 Loggen van `sudo` activiteiten
`sudo`-activiteiten worden gelogd, inclusief correcte en incorrecte wachtwoordpogingen, en de activering en sluiting van sessies. Wanneer een gebruiker niet in het `sudoers`-bestand staat of niet tot de `wheel`-groep behoort, wordt dit gelogd met de melding "This incident will be reported" [14](#page=14) [16](#page=16).
### 1.3 Loggen van `su` activiteiten
Het gebruik van `su` om superuser-rechten te verkrijgen wordt ook gelogd. De logs lijken op `sudo`-logs, maar er wordt nog geen "session closed" geregistreerd omdat de sessie als root actief blijft. Het `pam_unix`-module wordt gebruikt in de sessiestapel voor `su` [17](#page=17).
### 1.4 Loggen van SSH authenticatiepogingen
Zowel mislukte als succesvolle SSH loginpogingen worden geregistreerd. Mislukte pogingen bevatten informatie over de externe host (IP-adres). Succesvolle logins en logouts worden gelogd met tijdstempels, wat sessietracking mogelijk maakt en kan worden geanalyseerd met tools zoals `last` en `lastb` [18](#page=18) [19](#page=19).
## 2. Sessielogbestanden
Sessielogbestanden registreren informatie over gebruikerssessies, inclusief succesvolle en mislukte logins, en actieve gebruikerssessies [20](#page=20).
### 2.1 `/var/log/lastlog`
Dit bestand bevat de meest recente login-informatie voor gebruikers. Het is standaard ingeschakeld op de meeste distributies, maar is in binair formaat. De log kan worden gelezen met de commando's `lastlog` of `lslogins`. Standaard toont het alleen gebruikers die in `/etc/passwd` vermeld staan; verwijderde of niet-lokale gebruikers worden mogelijk niet weergegeven, tenzij specifiek opgevraagd [21](#page=21).
### 2.2 `/var/log/btmp`
Dit bestand registreert de laatste mislukte loginpogingen (bad logins). Het is standaard ingeschakeld en wordt opgeslagen in binair formaat. Lezen kan via `lastb` of `lslogins --failed`. Net als bij `lastlog`, worden verwijderde of niet-lokale gebruikers standaard niet weergegeven. Op een niet-live systeem kan het bestand worden gelezen met `lastb -f ` [23](#page=23) [24](#page=24).
### 2.3 Y2K38 bug
De Y2K38 bug is een probleem gerelateerd aan de tijdrepresentatie in systemen, wat potentiële problemen kan veroorzaken met timestamps in logbestanden en andere gegevens [25](#page=25).
### 2.4 `/var/log/faillog`
Dit logbestand wordt beheerd door `pam_faillock.so` en registreert mislukte authenticatiepogingen per gebruiker binnen een gespecificeerd interval. Als het aantal opeenvolgende mislukte pogingen een ingestelde drempel ("deny") overschrijdt, wordt het account vergrendeld. Het is niet standaard ingeschakeld op Debian/RHEL en wordt in binair formaat opgeslagen, leesbaar met het commando `faillog` [26](#page=26).
### 2.5 `/var/log/wtmp`
Dit bestand bevat records van alle succesvolle logins en logouts, evenals systeemherstarts. Het is standaard ingeschakeld en in binair formaat. Het kan worden gelezen met het commando `last`. In tegenstelling tot `lastlog` en `lastb`, worden ook verwijderde en niet-lokale gebruikers hier vermeld. Op een niet-live systeem kan het bestand worden gelezen met `last -f ` [27](#page=27) [28](#page=28).
### 2.6 `/run/utmp`
Dit bestand bevat informatie over gebruikers die momenteel op het systeem zijn ingelogd. Het is standaard ingeschakeld en in binair formaat. De informatie kan worden opgevraagd met de commando's `who` of `w`. Het `w`-commando biedt aanvullende details over de actieve processen en CPU-tijd in vergelijking met `who` [29](#page=29).
### 2.7 Samenvatting van sessie-gerelateerde commando's
De volgende commando's kunnen worden gebruikt om verschillende sessielogbestanden te analyseren:
* `who`: Toont wie er is ingelogd [31](#page=31).
* `w`: Toont wie er is ingelogd en wat ze momenteel doen [31](#page=31).
* `last`: Rapporteert de meest recente logins en opstarttijden [31](#page=31).
* `lastb` / `lslogins --failed`: Toont een lijst van de laatste mislukte logins [31](#page=31).
* `lastlog` / `lslogins`: Toont de laatste login tijdstippen van gebruikers [31](#page=31).
* `faillog`: Toont het aantal mislukte logins per gebruiker vóór een vergrendeling (indien ingeschakeld) [31](#page=31).
---
# Systemd journal en logboekbeheer
Dit studieonderwerp behandelt de werking en beveiliging van het systemd journal, inclusief cryptografische authenticatie van logboekvermeldingen, en verkent traditionele logboekbeheerhulpmiddelen zoals rsyslog en logrotate, met aandacht voor hun configuratie en retentiebeleid.
## 2 Systemd journal en logboekbeheer
Het systemd journal biedt een significant beveiligingsvoordeel ten opzichte van traditionele platte tekst logbestanden door middel van cryptografische hashing van logboekvermeldingen. In tegenstelling tot klassieke syslog, waar logbestanden gemakkelijk gemanipuleerd kunnen worden zonder sporen achter te laten, creëert het journal een ketting van cryptografisch geauthenticeerde vermeldingen. Elke vermelding bevat een hash van de voorgaande vermelding, waardoor de integriteit van de gehele logboekketen behouden blijft. Door de top-most hash op te slaan op een veilige, write-once locatie, kan elke manipulatie door een aanvaller eenvoudig worden gedetecteerd [5](#page=5).
### 2.1 De systemd-journald service
Het beheer van het systemd journal wordt verzorgd door de `systemd-journald` service, geconfigureerd via het bestand `journald.conf`, dat doorgaans te vinden is in `/etc/systemd/` [6](#page=6).
### 2.2 Verschil tussen systemd Journal en filesystem Journal
Het is belangrijk om onderscheid te maken tussen het *systemd Journal* en een *filesystem Journal*. Het *systemd Journal* bestaat uit bestanden die logboekvermeldingen over systeemgebeurtenissen bevatten en worden verwerkt en opgeslagen via systemd, meestal in `/var/log/journal/`. Deze bestanden zijn toegankelijk via het commando `journalctl`. Een *filesystem Journal* daarentegen is een interne functie van een bestandssysteem om dit in een consistente staat te houden en is bruikbaar voor forensisch onderzoek, maar niet direct toegankelijk via reguliere bestandsnamen [7](#page=7).
Het systemd journal wordt opgeslagen als binaire bestanden [8](#page=8).
### 2.3 Eigenschappen van Journal bestanden
De journalbestanden bevinden zich in de subdirectory `journal` binnen `/var/log/` en zijn eigendom van root. Ze behoren echter tot de groep `systemd-journal`, wat speciale permissies met zich meebrengt [9](#page=9).
* **`drwxr-sr-x+`**: Het `setgid` (set group ID) bit zorgt ervoor dat alles wat in deze map wordt aangemaakt, de groep `systemd-journal` krijgt. Leden van deze groep hebben volledige toegang tot de logbestanden zonder `sudo` permissies nodig te hebben [9](#page=9).
* **Extended permissions (ACLs)**: Naast `setgid` kunnen er ook extended permissions aanwezig zijn via Access Control Lists (ACLs). Deze ACLs worden opgeslagen in zogenaamde 'extended attributes' (xattr) binnen de `system` namespace van het bestand [10](#page=10) [11](#page=11).
Opmerking: In veel Linux-distributies hebben leden van de `adm` groep ook volledige toegang tot logbestanden, wat vergelijkbaar is met de `systemd-journal` groep [10](#page=10).
#### 2.3.1 Journal in RHEL
In Red Hat Enterprise Linux (RHEL) wordt ook systemd gebruikt, waardoor het systemd journal beveiligingsberichten en andere gebeurtenissen bevat die men normaal in `/var/log/secure` zou vinden. Het systemd journal is in RHEL standaard niet persistent en bevindt zich in `/run/log/journal/`, maar kan persistent gemaakt worden via `journald.conf` [12](#page=12).
Andere verschillen in RHEL zijn:
* Leden van de `wheel` groep hebben leesrechten op alle bestanden, waardoor `sudo` niet nodig is om alle logboekvermeldingen te bekijken [13](#page=13).
* Journalbestanden hebben extended attributes voor ACLs en SELinux [13](#page=13).
### 2.4 Logboekbeheer met rsyslog
`rsyslog` is een populaire implementatie van het syslog-protocol, dat wordt gebruikt om logboekberichten te scheiden van de software die ze genereert en de software die ze analyseert. Het syslog-protocol is tegenwoordig gestandaardiseerd in RFC 5424. Er zijn verschillende implementaties van syslog [45](#page=45):
* **1980s: syslog**: De oorspronkelijke implementatie die in UNIX-systemen werd geïntroduceerd om berichten van de kernel en applicaties te loggen [45](#page=45).
* **1998: syslog-ng**: Een uitbreiding op syslog met filtering, custom formatting, etc [45](#page=45).
* **2004: rsyslog**: Voegt features toe zoals high-performance logging en database-integratie. De 'r' staat voor 'rocket fast' en 'remote log shipping' [45](#page=45).
#### 2.4.1 Rsyslog installatie en beschikbaarheid
* **Debian**: Vanaf Debian 12 wordt rsyslog niet meer standaard geïnstalleerd. Basis lokaal loggen gebeurt via `systemd-journald`, waardoor `rsyslog` voor deze taak overbodig is geworden. Het kan echter nog steeds worden geïnstalleerd en is volledig ondersteund voor remote syslog behoeften of voor software die het nog vereist [46](#page=46).
* **RHEL**: Rsyslog is standaard beschikbaar op RHEL [46](#page=46).
De `rsyslog` daemon draait op de achtergrond om logberichten te verwerken. De configuratie van rsyslog vindt plaats in `/etc/rsyslog.conf` [47](#page=47) [48](#page=48).
#### 2.4.2 Faciliteitcodes en ernstniveaus in rsyslog
Rsyslog gebruikt faciliteitcodes (facility codes) en ernstniveaus (severity levels) om logboekberichten te categoriseren en prioriteren [49](#page=49).
* **Facility**: Specificeert de bron van het logbericht [49](#page=49).
* **Severity**: Geeft het belang van het logbericht aan [49](#page=49).
Deze codes en niveaus worden gebruikt voor het filteren, routeren en beheren van logboeken. Voor een uitgebreide lijst van faciliteitcodes en ernstniveaus, zie de Wikipedia-pagina over Syslog [49](#page=49) [50](#page=50).
### 2.5 Logboekbeheer met logrotate
`logrotate` is een tool die wordt gebruikt om platte logbestanden te beheren (niet het systemd Journal). De functionaliteit omvat [52](#page=52):
* Het starten van een nieuw logbestand na een bepaalde periode ('roteren') [52](#page=52).
* Optionele compressie van oude logbestanden [52](#page=52).
* Het verwijderen van oude logs op basis van retentiebeleid [52](#page=52).
`logrotate` wordt meestal dagelijks uitgevoerd via cron of een systemd timer. De configuratie van `logrotate` is te vinden in `/etc/logrotate.conf` en in bestanden binnen de `/etc/logrotate.d/` directory [52](#page=52).
* `/etc/logrotate.conf`: Bevat standaardinstellingen, zoals wekelijkse rotatie en een retentieperiode van 4 weken [55](#page=55).
* `/etc/logrotate.d/*`: Hierin worden specifieke instellingen gedefinieerd voor individuele logbestanden, bijvoorbeeld voor `/var/log/btmp` bestanden [56](#page=56).
### 2.6 Logboekbeheer met systemd-journald
Het systemd Journal maakt geen gebruik van platte tekstbestanden en is onafhankelijk van `rsyslog` en `logrotate`. De instellingen voor het roteren van het journal zijn te vinden in `/etc/systemd/journald.conf` [57](#page=57) [58](#page=58).
Logrotatie kan ook getriggerd worden door abrupte (backward) tijdswijzigingen, bijvoorbeeld bij het starten van virtuele machines waarbij de kloksynchronisatie met het hostsysteem plaatsvindt. Dit zorgt ervoor dat logs in aparte bestanden worden opgeslagen om problemen met logboekvermeldingen die buiten volgorde vallen te voorkomen, wat de integriteit van de logboekketen ten goede komt [59](#page=59).
---
# Systeem- en kernelgebeurtenislogboeken
Dit deel behandelt de algemene systeemlogboeken en de kernelringbuffer, die informatie vastleggen over systeemgebeurtenissen, hardware-initialisatie en bootprocessen [32](#page=32) [36](#page=36).
### 3.1 Algemene systeemlogboeken
Systeemlogboeken zijn essentiële hulpmiddelen voor het vastleggen van gebeurtenissen die plaatsvinden op een besturingssysteem. De locatie en het beheer van deze logboeken kunnen per distributie verschillen [33](#page=33).
#### 3.1.1 Logboekbestanden per distributie
* **Debian en afgeleiden:**
* Historisch gezien werd `/var/log/syslog` gebruikt [33](#page=33).
* Vanaf Debian 12 wordt dit vervangen door `systemd-journald`, toegankelijk via `journalctl` [33](#page=33).
* Het is belangrijk om het `syslog` logboekbestand niet te verwarren met de `(r)syslog` daemon zelf [33](#page=33).
* **RHEL en afgeleiden:**
* Hier wordt doorgaans het bestand `/var/log/messages` gebruikt voor algemene systeemberichten [33](#page=33) [34](#page=34).
### 3.2 Kernelringbuffer
De kernelringbuffer is cruciaal voor het vastleggen van gebeurtenissen tijdens het opstarten van het systeem op een laag niveau [36](#page=36).
#### 3.2.1 Doel en functionaliteit
* Tijdens het bootproces biedt de console veel belangrijke informatie over de initiële fase van de systeemstart. Dit omvat hardwaregebeurtenissen, driverinitialisatie, bootprocessen en andere systeemgebeurtenissen die op een laag niveau plaatsvinden [36](#page=36).
* Om verlies van vroege berichten te voorkomen, maakt de kernel gebruik van een zogenaamde **ringbuffer** [36](#page=36).
* Deze buffer slaat alle berichten op, inclusief bootberichten, die worden gegenereerd door de `printk()` functie binnen de kernelcode [36](#page=36).
* Het "ring"-aspect verwijst naar het feit dat de buffer een cyclische datastructuur is met een vaste grootte. Wanneer de ringbuffer vol is, overschrijft nieuwe data de oudere data [36](#page=36).
#### 3.2.2 Toegang en tools
* De kernelringbuffer is beschikbaar als een karakterapparaat met de naam `/dev/kmsg` [37](#page=37) [39](#page=39).
* Oudere distributies maakten mogelijk gebruik van bestanden zoals `/var/log/dmesg` of `/var/log/kern.log` [37](#page=37).
* Er zijn verschillende tools om de kernelringbuffer uit te lezen:
* `dmesg` (staat voor ‘diagnostic message’) [37](#page=37) [38](#page=38).
* `journalctl -k`
* `journalctl --dmesg`
> **Tip:** De `dmesg` commando is een veelgebruikte en snelle manier om de kernelberichten te bekijken, vooral nuttig na het opstarten van het systeem of na hardwarewijzigingen [37](#page=37).
---
# Applicatielogboeken
Applicaties, zoals webservers en andere diensten, genereren doorgaans hun eigen logbestanden om informatie over hun werking en gebeurtenissen vast te leggen [40](#page=40).
### 4.1 Locatie van applicatielogboeken
Applicaties loggen hun informatie veelal in de directory `/var/log`. De specifieke locatie binnen deze directory kan variëren afhankelijk van de applicatie [41](#page=41) [43](#page=43).
#### 4.1.1 Veelvoorkomende loglocaties
* **Apache2 webserver:**
* Op Red Hat Enterprise Linux (RHEL) systemen: `/var/log/httpd/*` [41](#page=41).
* Op Debian-gebaseerde systemen: `/var/log/apache2/*` [41](#page=41).
* **NGINX webserver:** `/var/log/nginx/*` [41](#page=41).
* **Fail2Ban:** `/var/log/fail2ban.log` [41](#page=41).
* **Uncomplicated Firewall (ufw):** `/var/log/ufw.log` [41](#page=41).
Een voorbeeld van een specifiek toegangslogbestand voor de Apache webserver is `/var/log/httpd/access.log` [42](#page=42).
#### 4.1.2 Alternatieve loglocaties
Naast de standaard `/var/log` map, kunnen applicaties ook op andere locaties logbestanden aanmaken [43](#page=43).
* **Apache Tomcat:** Als Java-applicatieserver, logt Apache Tomcat typisch in de map `/opt/tomcat/logs/*` [43](#page=43).
#### 4.1.3 Gebruik van systemd-journald
Sommige applicaties maken gebruik van `systemd-journald` voor hun logging. In dit geval worden de logboeken niet als platte tekstbestanden in `/var/log` opgeslagen, maar beheerd door de journald-service [43](#page=43).
* **OpenSSH server:** Voor diensten die `systemd-journald` gebruiken, kan de logging worden opgevraagd met commando's zoals `journalctl -u sshd` voor de OpenSSH server [43](#page=43).
> **Tip:** Het is essentieel om de documentatie van specifieke applicaties te raadplegen om de exacte locatie van hun logbestanden te achterhalen, aangezien deze sterk kunnen variëren [43](#page=43).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| Authenticatie logboeken | Logbestanden die specifieke gegevens bevatten over de inlogactiviteiten van gebruikers op een systeem, inclusief succesvolle en mislukte pogingen. |
| Systemd Journal | Een centrale logboekcomponent van systemd die logboekvermeldingen verwerkt en opslaat in een cryptografisch beveiligde, binaire vorm, wat manipulatie bemoeilijkt. |
| Syslog protocol | Een gestandaardiseerd netwerkprotocol voor het verzenden van logboekberichten van verschillende bronnen naar een centrale logboekserver. |
| rsyslog | Een verbeterde implementatie van het syslog-protocol die hogere prestaties, remote log shipping en database-integratie biedt. |
| logrotate | Een hulpprogramma dat wordt gebruikt om logbestanden te beheren door ze periodiek te roteren, te comprimeren en oude logbestanden te verwijderen op basis van ingestelde regels. |
| Kernelringbuffer | Een cyclische datastructuur die door de kernel wordt gebruikt om berichten op te slaan, inclusief bootberichten, die worden gegenereerd door de printk() functie. |
| Binaire bestandsformaat | Een opslagmethode voor gegevens die rechtstreeks door een computer wordt gelezen en verwerkt, in tegenstelling tot leesbare tekstbestanden. |
| SetGID (setgroup) | Een bestand permissiebit dat ervoor zorgt dat bestanden die in een directory worden aangemaakt, automatisch de groep van die directory erven, wat toegang vergemakkelijkt voor groepsleden. |
| Access Control List (ACL) | Een geavanceerd mechanisme voor toegangscontrole dat gedetailleerdere permissies toestaat dan de standaard Unix-permissies. |
| Extended Attributes (xattr) | Een functie van bestandssystemen die het mogelijk maakt om extra metagegevens aan bestanden te koppelen, zoals ACL's of SELinux-contexten. |
| pam_unix module | Een PAM (Pluggable Authentication Modules) module die wordt gebruikt voor authenticatie en autorisatie op basis van wachtwoorden die zijn opgeslagen in de `/etc/shadow` database. |
| Y2K38 bug | Een probleem dat vergelijkbaar is met de Y2K-bug, waarbij de tijd op 32-bits systemen na 19 januari 2038 een integer-overflow zal ervaren als de tijd wordt opgeslagen als een 32-bits Unix timestamp. |
| /var/log/lastlog | Een binair logbestand dat de meest recente inloggegevens van gebruikers bevat, waaronder de laatste loginlocatie en -tijd. |
| /var/log/btmp | Een binair logbestand dat mislukte loginpogingen registreert, inclusief informatie zoals gebruikersnaam, terminal en IP-adres. |
| /var/log/wtmp | Een binair logbestand dat alle succesvolle login- en logout-sessies, evenals systeemreboots, registreert. |
| /run/utmp | Een binair logbestand dat bijhoudt welke gebruikers momenteel op het systeem zijn ingelogd, inclusief hun terminal en inlogtijd. |
| Faciliteitscodes | Categorieën die de bron van een logbericht aangeven, zoals kernel, mail, auth, etc., binnen het syslog-protocol. |
| Ernstniveaus | Indicatoren van de prioriteit of belangrijkheid van een logbericht, variërend van DEBUG tot EMERGENCY, binnen het syslog-protocol. |
| Systemd timer | Een mechanisme binnen systemd dat taken op specifieke tijden of intervallen kan uitvoeren, vergelijkbaar met cron jobs. |
| Log rotatie | Het proces van het vervangen van een actief logbestand door een nieuw, leeg bestand, vaak gevolgd door compressie en archivering van het oude bestand. |
[/
Cover
MODULE 2.docx
Summary
# Basic computer operations
This section details the fundamental operations of a computer, including its power management, user access, and basic system and desktop configuration.
## 1. Basic computer operations
### 1.1 Starting the computer
To start a computer, ensure all cables are securely connected to the rear of the machine. Locate the power switch and turn the computer on. If no image appears on the screen, verify that the monitor is also switched on.
### 1.2 Shutting down the computer
Before shutting down, it is crucial to save any open files and close all running applications. Always use the "Shut Down" command provided by the operating system. Do not switch off the main power to the machine until the computer has completely powered down.
### 1.3 Restarting the computer
Never abruptly switch off a Windows-based computer. Always use the "Shut Down" command for proper closure. To restart, click the "Start" button, then click the power button. From the options that appear, select "Restart" if you wish to shut down and immediately restart the computer.
### 1.4 Signing in and out from the computer network
#### 1.4.1 Signing in
When using a computer, you might be in a standalone environment (like a home PC) or part of a computer network. To sign in:
1. On the welcome screen, locate the "Other User" option, typically found on the left side, bottom.
2. Enter your assigned username in the designated text box.
3. Enter your assigned password in the password text box.
4. Press "Enter" or click "Submit" to log on.
#### 1.4.2 Signing out
To sign out from the computer:
1. Click the "Start" button.
2. Click on your user profile.
3. Select "Sign out" from the list. This action will disconnect your network connection.
#### 1.4.3 Switching accounts
To switch between user accounts on the computer:
1. Click the "Start" button.
2. Click on your user profile.
3. Select "Switch Account" from the list.
### 1.5 System configuration
Upon initial startup, a computer displays various system information on the screen. To view system properties:
1. On the Desktop, right-click on "This PC" to open a context menu.
2. Select the "Properties" command from the menu.
This action will open the "System Properties" dialog box, which displays details such as the installed Windows version ("Windows edition"), the type of processor ("CPU type"), and the amount of installed memory ("RAM").
### 1.6 Desktop and icons
The desktop displays various types of icons:
* **System icons:** Represent core operating system elements.
* **Application icons:** Shortcuts to launch specific programs.
* **Folder icons:** Represent directories used to organize files.
* **File icons:** Represent individual data files.
### 1.7 Desktop configuration
The desktop's appearance and settings can be customized. Right-clicking on an empty area of the desktop opens a context menu. From this menu, users can access options to change various desktop elements, including the background wallpaper, colors, and other visual settings.
### 1.8 Creating a desktop shortcut
To create a shortcut for an application on the desktop:
1. Click the "Start" button.
2. Locate the icon of the application you wish to create a shortcut for within the Start Menu.
3. Click and drag the application icon from the Start Menu directly onto the desktop.
A shortcut icon for the application will then be created and displayed on the desktop.
### 1.9 Common parts of a window
Windows in an operating system typically include several standard components:
* **Title Bar:** Displays the name of the application and the current document.
* **Toolbar:** Contains buttons for frequently used commands.
* **Menu Bar:** Lists available menus (e.g., File, Edit, View) containing commands.
* **Status Bar:** Located at the bottom, it provides information about the current state of the window or application.
* **Scroll Bar:** Appears when content exceeds the visible area, allowing users to scroll through the content.
#### 1.9.1 Resize, minimize, and close the window
Users can manipulate the size and state of a window using its control buttons, typically located in the title bar. This includes resizing the window to fit a desired space, minimizing it to the taskbar, or closing it entirely.
### 1.10 Moving between open windows
To switch between multiple open application windows:
1. Click on the respective application icon displayed in the Taskbar.
2. Alternatively, features like "Task View" (if available) can provide an overview of all open windows for easy selection.
### 1.11 File management with Windows 10
#### 1.11.1 Folder and subfolder definition
* **Folder:** A container used to store files, shortcuts, icons, and other subfolders.
* **Subfolder (or Subdirectory):** A folder located inside another folder.
Folders can hold various types of files, including documents, music, pictures, videos, and programs. Windows facilitates easy browsing and management of files and folders stored on the computer. Users can copy or move files from other locations (like other folders, computers, or the internet) into created folders. It is also possible to create nested folders (folders within folders).
#### 1.11.2 Navigation pane
The Navigation pane, usually located on the left side of a File Explorer window, allows users to view and access their computer's file and folder structure, including drives (like USB flash drives or hard disk partitions) and network locations.
#### 1.11.3 Key locations within File Explorer
* **OneDrive:** A free cloud storage service offered by Microsoft for users with a Microsoft account.
* **This PC:** Contains all user-created folders, hard disk partitions, external hard drives, USB flash drives, CD/DVD drives, and network location drives.
* **Network:** If the computer is connected to a network, this option allows access to folders stored on network resources.
#### 1.11.4 Address bar
The Address Bar displays the complete path to the currently selected folder, indicating its location within the file system hierarchy.
#### 1.11.5 Search box
The Search Box allows users to find specific subfolders or files within the current folder or its subfolders.
#### 1.11.6 Frequent folders
This section displays folders that are accessed most often, providing quick access to commonly used locations.
#### 1.11.7 Recent files
This area shows files that have been opened most recently, offering another method for quickly retrieving previously accessed items.
---
# File management with Windows 10
This section of the document focuses on understanding and utilizing file management features within the Windows 10 operating system, including the organization of files and folders, navigation, and access to cloud and network storage.
### 2.1 Organizing files and folders
Windows 10 provides a structured environment for managing digital assets through the use of folders and subfolders.
#### 2.1.1 Folders and subfolders
* **Folder:** A folder acts as a container for organizing files, shortcuts, and other subfolders. These containers can hold various types of files, such as documents, music, pictures, videos, and programs.
* **Subfolder (Subdirectory):** A subfolder is simply a folder located within another folder, allowing for hierarchical organization and deeper levels of categorization.
> **Tip:** Effective use of folders and subfolders is crucial for maintaining an organized and efficient digital workspace, making it easier to locate specific files when needed.
#### 2.1.2 Navigating the file system
Windows 10 offers intuitive ways to navigate through the computer's file structure.
* **Navigation pane:** This pane, typically found on the left side of a File Explorer window, displays the hierarchical structure of your computer's files and folders. It allows you to easily access drives (like hard disk partitions, external hard drives, USB flash drives, CD/DVD drives) and network locations.
* **Address bar:** Located at the top of a File Explorer window, the address bar displays the complete path to the currently selected folder. This helps users understand their current location within the file system.
* **Search box:** Situated within File Explorer, this box allows users to quickly search for specific subfolders or files within the current folder or its subdirectories.
* **Frequent folders:** This section, often found in File Explorer's Quick Access area, displays folders that have been opened most frequently, providing rapid access to commonly used locations.
* **Recent files:** This feature, also often within Quick Access, lists files that have been opened most recently, streamlining access to recently worked-on documents.
> **Example:** If you want to access a document saved on your external hard drive named "MyDocuments," you would navigate through the Navigation pane to find your external drive, then open folders such as "Projects" and "Reports" to locate the specific file. The Address bar would update to show the path, for instance, `This PC\External Drive (E:)\Projects\Reports`.
### 2.2 Accessing storage locations
Windows 10 provides access to various storage solutions.
#### 2.2.1 This PC
The "This PC" option in File Explorer serves as a central hub for all local and connected storage devices. This includes:
* All folders stored directly on the computer.
* Hard disk partitions (e.g., C: drive, D: drive).
* External hard drives.
* USB flash drives.
* CD/DVD drives.
* Network drives that have been mapped.
#### 2.2.2 Cloud storage (OneDrive)
* **OneDrive:** OneDrive is a cloud storage service offered by Microsoft. It is available for free to anyone with a Microsoft account. This service allows users to store files online and access them from multiple devices, providing a convenient way to back up data and share files.
#### 2.2.3 Network storage
* **Network:** If your computer is connected to a network (e.g., in an office or home network), the "Network" option in File Explorer allows you to access shared folders and resources stored on other computers or servers within that network.
> **Tip:** Cloud storage like OneDrive is excellent for syncing files across devices and for backup purposes, while network storage is ideal for collaborative environments where multiple users need to access shared project files.
### 2.3 Common File Explorer features
File Explorer in Windows 10 includes several standard components that aid in managing files and windows.
#### 2.3.1 Common parts of a window
When working with File Explorer or other applications, recognizing the standard window components is essential:
* **Title Bar:** Displays the name of the file or folder currently open, along with the application name.
* **Toolbar:** Contains buttons for common actions like navigating back and forward, cutting, copying, pasting, and sorting.
* **Menu Bar:** Provides access to various commands and options organized into menus (e.g., File, Edit, View).
* **Status Bar:** Located at the bottom of the window, it displays information about the selected item, such as file size, date modified, or the number of items in a folder.
* **Scroll Bar:** Appears when the content of a window exceeds its visible area, allowing users to move up, down, left, or right to view the hidden content.
#### 2.3.2 Window manipulation
Users can manipulate open windows in several ways:
* **Resize:** Windows can be resized by dragging their edges or corners.
* **Minimize:** Reduces the window to a button on the taskbar, keeping the application running in the background.
* **Close:** Terminates the application or closes the window.
#### 2.3.3 Moving between open windows
* **Taskbar:** The taskbar at the bottom of the screen displays icons for all currently open applications. Clicking on an application's icon on the taskbar brings that window to the foreground, allowing you to switch between them.
* **Task View:** This feature, accessible from the taskbar, provides an overview of all open applications and windows, enabling users to select and switch to the desired one efficiently.
---
## Common mistakes to avoid
- Review all topics thoroughly before exams
- Pay attention to formulas and key definitions
- Practice with examples provided in each section
- Don't memorize without understanding the underlying concepts
Glossary
| Term | Definition |
|------|------------|
| Power switch | The button or lever used to turn a computer or electronic device on or off. |
| Shut Down command | A system function that properly closes all applications and turns off the computer's operating system. |
| Restart option | A command that shuts down the computer and then immediately starts it up again, useful for applying updates or resolving minor issues. |
| Sign in | The process of authenticating oneself to gain access to a computer, network, or online service using credentials like a username and password. |
| Sign out | The process of terminating a session and logging off from a computer, network, or online service, which disconnects the connection. |
| Switch account | A function that allows a user to log into a different user profile on the same computer without fully shutting down the system. |
| System properties | A set of details that describe the core components and configuration of a computer, including its operating system version, processor type, and installed memory (RAM). |
| Desktop icons | Small graphical representations on the computer screen that users can click to open applications, files, or folders. |
| Folder | A digital container used to organize and store files, other folders, or shortcuts on a computer's storage device. |
| Subfolder / Subdirectory | A folder that is located inside another folder, allowing for hierarchical organization of files. |
| Navigation pane | A user interface element, typically on the left side of a file explorer window, that displays the hierarchical structure of files and folders and allows for easy access. |
| Cloud storage | A model of computer data storage in which the digital data is stored in logical pools, said to be on the Internet, managed by a third party. |
| Network location drives | Storage locations accessible over a computer network, such as shared folders on another computer or a network-attached storage (NAS) device. |
| Address Bar | A component of a web browser or file explorer that displays the current Uniform Resource Locator (URL) or file path. |
| Search Box | An input field within an application or operating system that allows users to enter keywords to find files, folders, or information. |
| Frequent folders | A section in a file explorer or operating system interface that lists folders that the user has accessed most often. |
| Recent files | A list that displays files that have been opened or modified most recently by the user. |