openSUSE 12.1 en andere recente distributies hebben System V vervangen door systemd. Systemd gebruikt een nieuwe en verbeterde manier om uw systeem te starten en systeemdiensten te beheren. Systemd heeft heel wat nieuwe mogelijkheden zoals sockets, dbus-activering, gebruik van cgroups (control groups) en gebruikt agressieve parallellisatie om uw systeem sneller te laten opstarten. Om met systemd te werken bevat bestaan specifieke hulpmiddelen voor systeembeheerders. We kijken wat systemd doet, hoe het werkt en hoe je de nieuwe mogelijkheden kunt gebruiken. Met op het einde een praktisch voorbeeld.
Na het opstarten van uw systeem blijft systemd de systeemdiensten in het oog houden en start indien nodig nieuwe diensten (zoals afdrukken).
Systemd vervangt het oude SysV init systeem, wat eigenlijk uit een losse verzameling scripts in de map /etc/init.d (of /etc/rc.d bij andere distributies) bestaat. Deze scripts waren afhankelijk van het "runlevel" van het systeem, gebaseerd op koppelingen in de /etc/init.d/rcX.d mappen naar de scripts. Elke map stelde een runlevel met bijhorend nummer voor. De uitvoervolgorde gebaseerd op onderlinge afhankelijkheden werd bepaald door de getallen in de naam van de koppelingen (van 00 to 99). Tijdens het opstarten werden alle scripts in het betreffende runlevel uitgevoerd. Hoewel dit systeem nogal breekbaar is, is het transparant en begrijpelijk. De scripts daarentegen waren meestal uitgebreid en complex.
In plaats van scripts, gebruikt systemd .service bestanden waarin verschillende aanwijzingen en opdrachten voor systemd staan. Een beetje zoals de oude SysV init scripts, maar eenvoudiger en met een duidelijker schrijfwijze dan bash.
In plaats van het starten van scripts op basis van een vast aantal runlevels, gebruikt systemd afhankelijkheden en gebeurtenissen om een systeemdienst al dan niet te starten. Een voorbeeld, na het initialiseren van de netwerkkaart, start systemd de netwerkdienst. Nadat een verbinding is gemaakt, worden netwerkgebaseerde diensten zoals NFS (Network File Storage) en Samba (gedeelde mappen) gestart. Indien er geen netwerk aanwezig is, zal systemd deze diensten nooit starten. En zonder aangesloten printer is de printerdienst CUPS ook niet nodig.
Systemd gebruikt sockets en dbus om diensten te starten en kan zo op aanvraag diensten starten. Indien een programma een socket gebruikt, wordt dit door systemd opgemerkt en kan de betreffende dienst gestart worden. Een voorbeeld, alleen bij het geven van een printopdracht wordt de printdienst gestart.
Systemd kan verschillende diensten tegelijkertijd opstarten, daarbij worden steeds de afhankelijkheden en noden van het systeem gerespecteerd. Dit in combinatie met het feit dat niet voor elk script een shell interpreter (bash) moet gestart worden, zorgt voor een snellere systeemstart.
Diensten kunnen met systemd uitgeschakeld, geactiveerd, gestart, gestopt, herstart en herladen worden, juist zoals de scripts in SysV. Maar in tegenstelling tot SysV worden de diensten door systemd in de gaten gehouden. SysV zal het uitvallen van een dienst nooit opmerken, systemd daarentegen zal proberen de dienst terug te herstarten. En bij het stoppen van een dienst, kan je er zeker van zijn dat de dienst inderdaad gestopt is (dank zij de cgroup mogelijkheden van de kernel). Bij SysV onttrokken de diensten zich soms van de controle van de SysV scripts.
Systemd streeft naar het normaliseren van de init scripts die vroeger per distributie verschilden. Dit moet dus het onderhouden van een distributie vereenvoudigen. Men kan dus door het aanvaarden van een gemeenschappelijke standaard systemd scripts uitwisselen. Dit vereist het gebruik van de standaard systemctl voor de controle van de diensten. Voor het ogenblik ondersteunt openSUSE nog steeds de oude rc-scripts (koppelingen in de /etc/rc.d map) waardoor je nog steeds diensten op de oude manier kunt opstarten. Daarenboven is systemd compatibel het de oude scripts, waardoor niet aan systemd aangepaste scripts blijven werken. Voor meer details en een lijst met incompatibiliteiten kan je hier terecht.
Apparaten die via udev werken, worden door systemd opgemerkt. Hun udev eigenschappen kunnen in systemd gebruikt worden als bron voor de configuratie van de udev-apparaten. Systemd verzorgt daarbij het koppelen, het koppelpunt en het afkoppelen (veilig verwijderen). Om systemd een apparaat automatisch te laten aankoppelen, kan je de optie comment=systemd.automount in een fstab regel opnemen. Dit kan gebruikt worden voor netwerk gebaseerde bestandssystemen zoals nfs en cifs. /etc/fstab wordt daarbij gebruikt als een extra configuratie voor de koppelpunten. Systemd ondersteunt target units die logisch gegroepeerd zijn, waardoor deze als groep gecontroleerd kunnen worden.
Systemd bepaalt zelf de afhankelijkheden tussen de verschillende diensten en is in staat afhankelijkheden aan te passen om oneindige lussen te vermijden. M.a.w. uw systeem blijft functioneren. Systemd ondersteunt het maken van een momentopname (snapshot) die je dan kunt gebruiken bij noodgevallen. Deze mogelijkheid is niet persistent en wordt alleen in het geheugen bewaard waardoor het geen herstart overleeft.
dany@linux-bxth:~> systemctl status dbus.service
dbus.service - D-Bus System Message Bus
Loaded: loaded (/lib/systemd/system/dbus.service; static)
Active: active (running) since Fri, 06 Jan 2012 20:00:15 +0100; 13min ago
Process: 991 ExecStartPre=/bin/rm -f /var/run/dbus/pid (code=exited, status=0/SUCCESS)
Process: 940 ExecStartPre=/bin/dbus-uuidgen --ensure (code=exited, status=0/SUCCESS)
Main PID: 1029 (dbus-daemon)
CGroup: name=systemd:/system/dbus.service
├ 1029 /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
├ 1079 /usr/lib/polkit-1/polkitd --no-debug
├ 1083 /usr/sbin/modem-manager
├ 1707 /usr/lib/upower/upowerd
├ 1748 /usr/lib/udisks/udisks-daemon
├ 1749 udisks-daemon: not polling any devices
└ 2207 /usr/lib/rtkit/rtkit-daemon
Leuk is de ondersteuning van het automatisch aanvullen met de Tab-toets. Na het intypen van systemctl kun je Tab gebruiken om de mogelijke acties te tonen, op het tweede niveau wordt de naam van de dienst aangevuld, zo zal na het typen van dbus de Tab-toets aanvullen naar dbus.service.
sudo systemctl enable pindadns.service
sudo systemctl disable pindadns.service
De systemd service bestanden worden opgeslagen in de map /lib/systemd/system/.
Gebruik de volgende opdrachten om de computer te herstarten, af te sluiten, uit te schakelen, noodgeval en redding:
sudo systemctl reboot
sudo systemctl halt
sudo systemctl poweroff
sudo systemctl emergency
sudo systemctl rescue
Het verschil tussen de verschillende modes heeft te maken met de manier van afsluiten omschreven in de .target scripts.
De opdrachten sudo /sbin/halt
en sudo /sbin/reboot
werken in openSUSE 12.1 niet meer naar behoren.
Ze sluiten wel nog alle diensten en processen af, maar de computer zelf wordt niet afgesloten of herstart, waardoor je deze zelf moet afsluiten of herstarten.
De opdrachten sudo /sbin/shutdown -h now
en sudo /sbin/shutdown -r now
werken wel perfect.
systemd-analyze time
toont hoeveel tijd het systeem nodig had om te starten.
systemd-analyze blame
zoekt naar diensten die (te) veel tijd nodig hadden om te starten.
systemd-analyze plot > bootchart.svg
maakt een grafiek van het starten van uw systeem.
De grafiek bootchart.svg kun je met elke moderne browser (konqueror) openen en bekijken.
systemctl dot
toont de relaties (afhankelijkheden) tussen de verschillende diensten.
Gebruik de opdracht systemctl dot --order | dot -Tsvg > systemd-order.svg
om de informatie in een vectorieel grafisch formaat op te slaan (eveneens te bekijken met een moderne browser).
Voeg bij het opstarten van de computer aan de opstartregel de volgende kernelopties toe om de debugmode te activeren:
systemd.log_target=kmsg systemd.log_level=debug
Na het starten van het systeem kan je de vele meldingen van systemd opvragen met dmesg
of dmesg | grep systemd
.
Hoewel niemand je zal aanbevelen het oude SysV init systeem in openSUSE 12.1 te gebruiken, kan dit toch door het pakket sysvinit-init te installeren (waarbij het systemd-sysvinit zal verwijderd worden). Zelfs al gebruik je systemd niet, verwijder het pakket niet of je maakt kans dat uw systeem niet meer werkt. Als je het pakket systemd-sysvinit niet verwijderd (als voorzorgsmaatregel) kan je het geïnstalleerde sysvinit pakket gebruiken door in de opdrachtregel de kerneloptie init=/sbin/sysvinit op te nemen.
In een school met Windows computers wordt een klas ingericht met Linux computers.
Het beheer van alle Windows computers verloopt via een Windows server.
Hoewel het perfect mogelijk is de Linux computers gebruik te laten maken van de Windows server diensten, moet de Linux klas afzonderlijk kunnen werken.
Daarvoor maken we gebruik van dynamische ip-adressen uitgeleverd door de Windows server (die zorgt voor internettoegang e.d.m.).
Naast deze dynamische adressen wil ik de netwerkkaart van elke computer ook een vast ip adres geven met een eigen netwerknaam.
De netwerknamen voegen we op elke computer toe aan het bestand /etc/hosts.
Dit kan met de volgende opdrachten:
su
echo -e '192.168.92.1 l092pc01 l092pc01.snt.local' >> /etc/hosts
echo -e '192.168.92.2 l092pc02 l092pc02.snt.local' >> /etc/hosts
echo -e '192.168.92.3 l092pc03 l092pc03.snt.local' >> /etc/hosts
Zoals je merkt, werken we met ip adressen die beginnen met 192.168, gevolgt door het nummer van het lokaal (hier 92), gevolgt door het nummer van de computer (in het voorbeeld 01 tot en met 03).
De namen worden op een gelijkaardige manier samengesteld.
Maak met de volgende opdrachten het systemd bestand /lib/systemd/system/pindadns.service voor computer 03 aan:
echo -e '[Unit]' > /lib/systemd/system/pindadns.service
echo -e 'Description=Add static ipadress alias' >> /lib/systemd/system/pindadns.service
echo -e 'After=syslog.target network.target' >> /lib/systemd/system/pindadns.service
echo -e '' >> /lib/systemd/system/pindadns.service
echo -e '[Service]' >> /lib/systemd/system/pindadns.service
echo -e 'Type=simple' >> /lib/systemd/system/pindadns.service
echo -e 'ExecStart=/sbin/ifconfig eth0:0 192.168.92.3 netmask 255.255.0.0' >> /lib/systemd/system/pindadns.service
echo -e '' >> /lib/systemd/system/pindadns.service
echo -e '[Install]' >> /lib/systemd/system/pindadns.service
echo -e 'WantedBy=multi-user.target' >> /lib/systemd/system/pindadns.service
Ik gebruik daarbij steeds echo opdrachten omdat deze bewerkingen door een script geautomatiseerd worden uitgevoerd.
De meeste regels in dit script wijzen zichzelf uit.
De Description bevat een beschrijving.
De regel After bevat de afhankelijkheden van dit script, m.a.w. de log faciliteit moet aanwezig zijn en het netwerk moet actief zijn.
De regel ExecStart bevat de uit te voeren opdracht om de netwerkkaart een extra vast ip adres te geven, misschien gebruik je hier beter de nieuwe opdracht /bin/ip a add 192.168.92.3/255.255.0.0 dev eth0:0
.
De regel WantedBy bepaalt voor welk doel de dienst actief moet worden.
Om te testen, start je de nieuwe dienst met de opdracht:
systemctl start pindadns.service
en controleer je de ip-adressen van de netwerkkaart met de opdracht ip a
.
Indien alles naar wens is verlopen, kan je de dienst activeren met de opdracht:
systemctl enable pindadns.service
Opmerking: dit systeem werkt enkel als je werkt met netwerkconfiguraties die gebruik maken van de Traditionele methode met ifup en niet met Gebruikersgecontroleerd met NetworkManager (instelbaar met YaST > Netwerkapparaten > Netwerkinstellingen > Tabblad Globale opties).
Als je hetzelfde wilt bereiken met NetworkManager, moet je gebruik maken van de netwerkconfiguratiemogelijkheden bij de gebruiker.Voor meer informatie kan je zoals gewoonlijk terecht bij de man-pagina's en op de volgende websites: freedesktop.org - Software/systemd, systemd - Gentoo Linux Wiki, My Blog: Writing systemd service files en Managing Services on Linux with systemd.