Zoeken op website

RHCSA-serie: procesbeheer in RHEL 7: opstarten, afsluiten en alles daartussenin – deel 5


We beginnen dit artikel met een algemene en korte revisie van wat er gebeurt vanaf het moment dat u op de Aan/uit-knop drukt om uw RHEL 7-server in te schakelen totdat u de login te zien krijgt scherm in een opdrachtregelinterface.

Houd er rekening mee dat:

1. dezelfde basisprincipes zijn, met misschien kleine aanpassingen, ook van toepassing op andere Linux-distributies, en
2. De volgende beschrijving is niet bedoeld als een uitputtende uitleg van het opstartproces, maar alleen van de basisprincipes.

Linux-opstartproces

1. De POST (Power On Self Test) initialiseert en voert hardwarecontroles uit.

2. Wanneer de POST eindigt, wordt de systeemcontrole doorgegeven aan de opstartlader van de eerste fase, die is opgeslagen op de opstartsector van een van de harde schijven (voor oudere systemen die BIOS en MBR gebruiken), of een speciale (U)EFI-partitie.

3. De eerste fase bootloader laadt vervolgens de tweede fase bootloader, meestal GRUB (GRand Unified Boot Loader), die zich in /boot, dat op zijn beurt de kernel en het aanvankelijke op RAM gebaseerde bestandssysteem laadt (ook bekend als initramfs, dat programma's en binaire bestanden bevat die de noodzakelijke acties uitvoeren die nodig zijn om uiteindelijk mount het daadwerkelijke rootbestandssysteem).

4. We krijgen een opstartscherm te zien waarin we een besturingssysteem en een kernel kunnen kiezen om op te starten:

5. De kernel stelt de hardware in die aan het systeem is gekoppeld en zodra het rootbestandssysteem is aangekoppeld, start het proces met PID 1, dat op zijn beurt andere processen zal initialiseren en presenteren ons met een inlogprompt.

Opmerking: als we dit op een later tijdstip willen doen, kunnen we de details van dit proces onderzoeken met behulp van het dmesg-commando en de uitvoer ervan filteren met behulp van de tools die we hebben hebben uitgelegd in eerdere artikelen van deze serie.

In het bovenstaande voorbeeld hebben we het bekende ps-commando gebruikt om een lijst met huidige processen weer te geven waarvan het bovenliggende proces (of met andere woorden, het proces waarmee ze zijn gestart) systemd is > (de systeem- en servicemanager waarnaar de meeste moderne Linux-distributies zijn overgeschakeld) tijdens het opstarten van het systeem:

ps -o ppid,pid,uname,comm --ppid=1

Houd er rekening mee dat u met de vlag -o (afkorting van –format) de uitvoer van ps in een aangepast formaat kunt presenteren dat aan uw behoeften voldoet met behulp van de trefwoorden die zijn opgegeven in de sectie STANDARD FORMAT SPECIFICERS in man ps.

Een ander geval waarin u de uitvoer van ps wilt definiëren in plaats van de standaardinstelling te gebruiken, is wanneer u processen moet vinden die een aanzienlijke CPU- en/of geheugenbelasting veroorzaken, en deze dienovereenkomstig moet sorteren:

ps aux --sort=+pcpu              # Sort by %CPU (ascending)
ps aux --sort=-pcpu              # Sort by %CPU (descending)
ps aux --sort=+pmem              # Sort by %MEM (ascending)
ps aux --sort=-pmem              # Sort by %MEM (descending)
ps aux --sort=+pcpu,-pmem        # Combine sort by %CPU (ascending) and %MEM (descending)

Een inleiding tot SystemD

Er zijn maar weinig beslissingen in de Linux-wereld die meer controverses hebben veroorzaakt dan de adoptie van systemd door grote Linux-distributies. De voorstanders van Systemd noemen als belangrijkste voordelen de volgende feiten:

Lees ook: Het verhaal achter ‘init’ en ‘systemd’

1. Met Systemd kunnen meer verwerkingen parallel worden uitgevoerd tijdens het opstarten van het systeem (in tegenstelling tot het oudere SysVinit, dat altijd trager is omdat het processen één voor één start, controleert als de een afhankelijk is van de ander, en dan wacht tot daemons starten zodat meer services kunnen starten), en

2. Het werkt als dynamisch resourcebeheer in een draaiend systeem. Services worden dus gestart wanneer dat nodig is (om te voorkomen dat systeembronnen worden verbruikt als ze niet worden gebruikt) in plaats van dat ze tijdens het opstarten zonder geldige reden worden gestart.

3. Achterwaartse compatibiliteit met SysVinit-scripts.

Systemd wordt bestuurd door het hulpprogramma systemctl. Als u een SysVinit-achtergrond heeft, is de kans groot dat u bekend bent met:

  1. de service tool, die -in die oudere systemen- werd gebruikt om SysVinit-scripts te beheren, en
  2. het hulpprogramma chkconfig, dat diende voor het bijwerken en opvragen van runlevel-informatie voor systeemservices.
  3. afsluiten, die u meerdere keren moet hebben gebruikt om een actief systeem opnieuw op te starten of te stoppen.

De volgende tabel toont de overeenkomsten tussen het gebruik van deze oudere tools en systemctl:

Legacy tool Systemctl equivalent Description
service name start systemctl start name Start name (where name is a service)
service name stop systemctl stop name Stop name
service name condrestart systemctl try-restart name Restarts name (if it’s already running)
service name restart systemctl restart name Restarts name
service name reload systemctl reload name Reloads the configuration for name
service name status systemctl status name Displays the current status of name
service –status-all systemctl Displays the status of all current services
chkconfig name on systemctl enable name Enable name to run on startup as specified in the unit file (the file to which the symlink points). The process of enabling or disabling a service to start automatically on boot consists in adding or removing symbolic links inside the /etc/systemd/system directory.
chkconfig name off systemctl disable name Disables name to run on startup as specified in the unit file (the file to which the symlink points)
chkconfig –list name systemctl is-enabled name Verify whether name (a specific service) is currently enabled
chkconfig –list systemctl –type=service Displays all services and tells whether they are enabled or disabled
shutdown -h now systemctl poweroff Power-off the machine (halt)
shutdown -r now systemctl reboot Reboot the system

Systemd introduceerde ook de concepten van eenheden (die een service, een koppelpunt, een apparaat of een netwerksocket kunnen zijn) en doelen (dit is hoe systemd erin slaagt verschillende gerelateerde processen tegelijkertijd te starten tijd, en kan worden beschouwd -hoewel niet gelijk- als het equivalent van runlevels in SysVinit-gebaseerde systemen.

Opsommen

Andere taken die verband houden met procesmanagement omvatten, maar zijn mogelijk niet beperkt tot, het vermogen om:

1. Pas de uitvoeringsprioriteit aan voor zover het het gebruik van systeembronnen van een proces betreft:

Dit wordt bereikt via het hulpprogramma renice, dat de planningsprioriteit van een of meer actieve processen wijzigt. Simpel gezegd is de planningsprioriteit een functie waarmee de kernel (aanwezig in versies => 2.6) systeembronnen kan toewijzen volgens de toegewezen uitvoeringsprioriteit (ook wel niceness genoemd, in een bereik van -20 tot en met 19) van een bepaald proces.

De basissyntaxis van renice is als volgt:

renice [-n] priority [-gpu] identifier

In het algemene commando hierboven is het eerste argument de te gebruiken prioriteitswaarde, terwijl het andere argument kan worden geïnterpreteerd als proces-ID's (wat de standaardinstelling is), procesgroep-ID's, gebruikers-ID's of gebruikersnamen. Een normale gebruiker (anders dan root) kan alleen de planningsprioriteit wijzigen van een proces waarvan hij of zij eigenaar is, en alleen het niceness-niveau verhogen (wat betekent dat het minder systeembronnen in beslag neemt).

2. Beëindig (of onderbreek de normale uitvoering) van een proces als dat nodig is:

In meer precieze termen geeft het beëindigen van een proces het recht om het een signaal te sturen om de uitvoering ervan ofwel netjes af te ronden (SIGTERM=15) of onmiddellijk (SIGKILL=9) via de kill of pkill opdrachten.

Het verschil tussen deze twee tools is dat de eerste wordt gebruikt om een specifiek proces of een procesgroep helemaal te beëindigen, terwijl je met de laatste hetzelfde kunt doen op basis van naam en andere attributen.

Bovendien wordt pkill gebundeld met pgrep, waarmee u de PID's kunt zien die worden beïnvloed als pkill wordt gebruikt. Voordat u gaat hardlopen, bijvoorbeeld:

pkill -u gacanepa

Het kan nuttig zijn om in één oogopslag te zien welke PID's eigendom zijn van gacanepa:

pgrep -l -u gacanepa

Standaard sturen zowel kill als pkill het SIGTERM signaal naar het proces. Zoals we hierboven vermeldden, kan dit signaal worden genegeerd (terwijl het proces zijn uitvoering beëindigt of voorgoed), dus als je een lopend proces om een geldige reden serieus moet stoppen, moet je de SIGKILL signaal op de opdrachtregel:

kill -9 identifier               # Kill a process or a process group
kill -s SIGNAL identifier        # Idem
pkill -s SIGNAL identifier       # Kill a process by name or other attributes 

Conclusie

In dit artikel hebben we de basisprincipes van het opstartproces in een RHEL 7-systeem uitgelegd, en enkele van de tools geanalyseerd die beschikbaar zijn om u te helpen bij het beheren van processen met behulp van algemene hulpprogramma's en systemd-specifieke opdrachten.

Houd er rekening mee dat deze lijst niet bedoeld is om alle toeters en bellen van dit onderwerp te behandelen, dus voel je vrij om je eigen favoriete tools en commando's aan dit artikel toe te voegen met behulp van het onderstaande commentaarformulier. Vragen en andere opmerkingen zijn ook welkom.