Linux Laarzen

Het blijkt dat er niet veel aan het opstartproces is:

1. Een bootloader vindt de kernel-image op de disk, laadt het in het geheugen en start het.
2. De kernel initialiseert de apparaten en soa's.
3. De kernel koppelt het rootbestand aansystem.
4. De kernel start init Geroepen om te plannen.
5. init wordt de rest van de processen in beweging.
6. De laatste processen die init start als onderdeel van de opstartvolgorde kunt u aan te melden.

Het identificeren van elke fase van het opstartproces is van onschatbare waarde bij het oplossen van opstartproblemen en het begrijpen van de system Als geheel. Om te beginnen, richt u zich op de opstartlader, het eerste scherm of de prompt die u krijgt nadat de computer de zelftest bij opstarten heeft uitgevoerd, waarbij u vraagt ​​welke system rennen. Nadat u een keuze hebt gemaakt, voert de bootloader de Linux kernel, het overhandigen van de controle over de system naar de pit.

Er is een gedetailleerde bespreking van de kernel Elders in dit boek van Which dit artikel is een uittreksel. Dit artikel heeft betrekking op de kernel initialisatie fase, het stadium waarin de kernel een aantal berichten afdrukt over de hardware die aanwezig is op het system. De kernel start init net nadat het een bericht weergeeft waarin wordt verkondigd dat de kernel het root bestandsystem:

VFS: Gemonteerd root (ext2-bestandensystem) alleen lezen.

Kort daarna ziet u een bericht over het starten van init, gevolgd door system service-opstartberichten, en tot slot krijg je een soort login-prompt.

NOTITIE Op Red Hat Linux, de init-noot is vooral duidelijk, omdat het je "verwelkomt" in Red Hat Linux.” Alle berichten daarna tonen succes of mislukking tussen haakjes aan de rechterkant van het scherm.

Het grootste deel van dit hoofdstuk gaat over init, Want het is het deel van de boot sequence waar je de meeste controle.
init

Er is niets bijzonders aan init. Het is een programma net als alle andere op de Linux system, en je vindt het samen met andere in / sbin system binaries. Het belangrijkste doel van init is om andere programma's in een bepaalde volgorde te starten en te stoppen. Het enige dat u hoeft te weten, is hoe deze reeks werkt.

Er zijn een paar verschillende variaties, maar de meeste Linux distributies gebruiken de System V-stijl die hier wordt besproken. Sommige distributies gebruiken een eenvoudigere versie die lijkt op BSD init, maar het is onwaarschijnlijk dat u dit tegenkomt.

Runlevels

Op elk willekeurig moment op een Linux system, is een bepaalde basisset van processen actief. Deze staat van de machine wordt het runlevel genoemd en wordt aangegeven met een getal van 0 tot en met 6. De system besteedt de meeste tijd in een enkel runlevel. Wanneer u echter het machine down, init schakelt over naar een ander runlevel om het system services op een ordelijke manier uit te voeren en de kernel te vertellen dat hij moet stoppen. Nog een ander runlevel is voor één gebruiker mode, later besproken.

De eenvoudigste manier om grip te krijgen op runlevels is door het init-configuratiebestand /etc/inittab te onderzoeken. Zoek naar een regel zoals de volgende:

ID: 5: initdefault:

Deze regel betekent dat de default runlevel op het system is 5. Alle regels in het inittab-bestand hebben deze vorm, waarbij vier velden, gescheiden door dubbele punten, in de volgende volgorde voorkomen:
# Een unieke identificatie (een korte tekenreeks, zoals ID in het vorige voorbeeld)
# De van toepassing zijnde runlevel nummer (s)
# De actie die init zou moeten ondernemen (in het voorgaande voorbeeld is de actie om de default runlevel naar 5)
# Een opdracht uit te voeren (optioneel)

Er is geen commando om uit te voeren in het voorgaande initdefault voorbeeld omdat een commando geen zin heeft in de context van het instellen van de default runlevel. Kijk een beetje verder naar beneden in inittab, totdat je een regel als deze ziet:

l5: 5: wait :/ etc / rc.d / rc 5

Deze regel activeert de meeste system configuratie en services via de mappen rc * .d en init.d. Je kunt zien dat init is ingesteld om een ​​commando genaamd /etc/rc.d/rc 5 uit te voeren in runlevel 5. De wait-actie vertelt wanneer en hoe init het commando uitvoert: voer rc 5 eenmaal uit wanneer entering runlevel 5 en wacht vervolgens tot deze opdracht is voltooid voordat u iets anders doet.

Er zijn verschillende acties in addinitiërendefault en wacht, vooral met betrekking tot energiebeheer, en de inittab (5) hulppagina vertelt je er alles over. Degenen die u het meest waarschijnlijk zult tegenkomen, worden in de volgende secties uitgelegd.

respawn

De respawn-actie zorgt ervoor dat init het volgende commando uitvoert, en als het commando klaar is met uitvoeren, het opnieuw uitvoert. Waarschijnlijk zie je iets dat lijkt op deze regel in je inittab-bestand:

1: 2345: respawn :/ sbin / mingetty tty1

De getty programma's bieden login aanwijzingen. De vorige regel is voor de eerste virtuele console (/ dev / tty1), degene die je ziet wanneer u op ALT of CONTROL-ALT-F1 F1. De respawn actie brengt de login-prompt terug na je uitlogt.

ctrlergens anders

De ctrlaltdel-actie bepaalt wat de system doet wanneer u op CONTROL-ALT-DELETE drukt op een virtuele console. Op de meeste systems, dit is een soort reboot-opdracht met behulp van de shutdown-opdracht.

sysinit

De sysinit-actie is het allereerste dat init moet uitvoeren wanneer het opstart, eerder enterin alle runlevels.

Hoe Processen in runlevels beginnen

U bent nu klaar om te leren hoe u het system services, net voordat u zich kunt aanmelden. Herinner deze inittab-regel van eerder:

l5: 5: wait :/ etc / rc.d / rc 5

Dit kleine lijn leidt tot veel andere programma's. rc staat voor run commando's, en je hoort mensen verwijzen naar de commando's als scripts, programma's of diensten. Dus, waar zijn deze commando's eigenlijk?

Voor runlevel 5, in dit voorbeeld, bevinden de commando's zich waarschijnlijk in /etc/rc.d/rc5.d of /etc/rc5.d. Runlevel 1 gebruikt rc1.d, runlevel 2 gebruikt rc2.d, enzovoort. Misschien vindt u het volgende items in de map rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

De rc 5 commando start programma's op dit runlevel directory door het uitvoeren van de commando's na:

S10sysklogd huis
S12kerneld huis
S15netstd_init huis
S18netbase huis
...
S99sshd huis

Let op het startargument in elke opdracht. De S in een opdrachtnaam betekent dat de opdracht aan het begin moet worden uitgevoerd mode, en het getal (00 tot en met 99) bepaalt waar in de reeks rc de opdracht begint.

De rc *. D commando wordt meestal op Start Programma's die shell-scripts in / sbin of / usr / sbin. Normaal gesproken kunt u erachter te komen wat een van de commando's eigenlijk niet door te kijken naar het script met minder of semafoon een ander programma.

U kunt een van deze services handmatig starten. Als u bijvoorbeeld het httpd-webserverprogramma handmatig wilt starten, voert u S99httpd start uit. Evenzo, als u ooit een van de services moet uitschakelen wanneer het machine is ingeschakeld, kunt u de opdracht uitvoeren in de map rc * .d met het argument stop (bijvoorbeeld S99httpd stop).

Sommige rc*.d-mappen bevatten opdrachten die beginnen met K (voor "kill" of stop mode). In dit geval voert rc de opdracht uit met het stop-argument in plaats van start. De kans is groot dat je K-opdrachten tegenkomt in runlevels die het system naar beneden.

Addservices in- en uitschakelen

Als u wilt add, verwijder of wijzig services in de rc*.d-mappen, moet u de bestanden daarin nader bekijken. Een lange lijst onthult een structuur als deze:

lrwxrwxrwx. . . S10sysklogd -> .. / init.d / sysklogd
lrwxrwxrwx. . . S12kerneld -> .. / init.d / kerneld
lrwxrwxrwx. . . S15netstd_init -> .. / init.d / netstd_init
lrwxrwxrwx. . . S18netbase -> .. / init.d / netbase
...

De opdrachten in een rc*.d-map zijn feitelijk symbolische koppelingen naar bestanden in een init.d-map, meestal in /etc of /etc/rc.d. Linux distributies bevatten deze links zodat ze voor alle runlevels dezelfde opstartscripts kunnen gebruiken. Deze conventie is geen vereiste, maar maakt de organisatie vaak wel wat makkelijker.

Om te voorkomen dat een van de commando's in de init.d directory in een bepaald runlevel wordt uitgevoerd, zou je kunnen denken aan het verwijderen van de symbolische link in de juiste rc * .d directory. Dit werkt wel, maar als je een fout maakt en de link ooit terug moet plaatsen, kan het zijn dat je moeite hebt om de exacte naam van de link te onthouden. Daarom moet u geen links in de rc * .d-mappen verwijderen, maar eerder: add een onderstrepingsteken (_) aan het begin van de linknaam als volgt:

mv S99httpd _S99httpd

Tijdens het opstarten negeert rc _S99httpd omdat het niet begint met S of K. Bovendien is de originele naam nog steeds duidelijk en heb je snel toegang tot het commando als je in de problemen zit en het met de hand moet starten.

Naar add een service is, moet u een script maken zoals de andere in de init.d-directory en vervolgens een symbolische link maken in de juiste rc * .d-directory. De gemakkelijkste manier om een ​​script te schrijven is door de scripts die al in init.d staan ​​te onderzoeken, een kopie te maken van een die u begrijpt en de kopie aan te passen.

. addAls u een service uitvoert, moet u ervoor zorgen dat u een geschikte plaats in de opstartvolgorde kiest om de service te starten. Als de service te vroeg start, werkt deze mogelijk niet vanwege afhankelijkheid van een andere service. Voor niet-essentiële diensten, de meeste systems administrators geven de voorkeur aan nummers in de jaren 90, na de meeste diensten die bij de system.

Linux distributies worden meestal geleverd met een opdracht om services in de rc * .d-directory's in en uit te schakelen. In Debian is het commando bijvoorbeeld update-rc.d, en in Red Hat Linux, is het commando chkconfig. Grafische gebruikersinterfaces zijn ook beschikbaar. Het gebruik van deze programma's helpt de opstartdirectory's consistent te houden en helpt bij upgrades.

TIP: Een van de meest voorkomende Linux installation problems is een onjuist geconfigureerde XFree86-server die aan en uit springt, waardoor de system onbruikbaar op consoles. Om dit gedrag te stoppen, start u op in single-user mode en wijzig uw runlevel- of runlevel-services. Zoek naar iets dat xdm, gdm of kdm bevat in uw rc*.d-directory's, of in uw /etc/inittab.

Controlling init

Af en toe moet je init een kleine schop geven om te zeggen dat hij van runlevel moet wisselen, het inittab-bestand opnieuw moet lezen, of gewoon shut down de system. Omdat init altijd het eerste proces is op een system, de proces-ID is altijd 1.

U kunt bedienen init met selderij. Bijvoorbeeld, als u wilt overschakelen naar runlevel 3, gebruikt u deze opdracht:

telinit 3

Bij het wisselen van runlevel probeert init alle processen af ​​te sluiten die niet in het inittab-bestand voor het nieuwe runlevel voorkomen. Daarom moet u voorzichtig zijn met het wijzigen van runlevels.

Wanneer u add of respawnende taken verwijdert of een andere wijziging in het inittab-bestand aanbrengt, moet u init over de wijziging vertellen en ervoor zorgen dat het bestand opnieuw wordt gelezen. Sommige mensen gebruiken kill -HUP 1 om init te vertellen dit te doen. Deze traditionele methode werkt op de meeste versies van Unix, zolang je het maar correct typt. U kunt echter ook dit telinit-commando uitvoeren:

telinit q

Ook kunt u met telinit s overstappen naar single-user mode.

Buiten bedrijf stellen

init bepaalt ook hoe het system wordt afgesloten en opnieuw opgestart. De juiste manier om shut down a Linux machine is om het shutdown-commando te gebruiken.

Er zijn twee basismanieren om afsluiten te gebruiken. Als u het system, het sluit de machine down en houdt het laag. Om het machine stop onmiddellijk, gebruik dan deze opdracht:

shutdown-h now

Meestal modern machines met redelijk recente versies van Linux, een stop snijdt de stroom naar de machine. U kunt ook het machine. Gebruik -r in plaats van -h om opnieuw op te starten.

Het afsluiten duurt enkele seconden. U mag een machine tijdens deze fase.

In het voorgaande voorbeeld is het nu de tijd om shut down. Dit argument is verplicht, maar er zijn veel manieren om het te specificeren. Als je de macOm ergens in de toekomst naar beneden te gaan, is een manier om + n te gebruiken, waarbij n het aantal minuten is dat het afsluiten moet wachten voordat het zijn werk doet. Voor anderen options, kijk naar de handleiding voor afsluiten (8).

Om het te maken system start opnieuw op in 10 minuten, voer deze opdracht uit:

shutdown-r + 10

On Linux, shutdown meldt iedereen die is ingelogd dat de macDe machine gaat omlaag, maar het levert weinig echt werk op. Als u een andere tijd dan nu opgeeft, wordt door shutdown een bestand gemaakt met de naam /etc/nologin. Wanneer dit bestand aanwezig is, wordt het system verbiedt logins door iedereen behalve de superuser.

. system de shutdown-tijd is eindelijk aangebroken, shutdown vertelt init om over te schakelen naar runlevel 0 voor een stop en runlevel 6 voor een herstart. Wanneer init enters runlevel 0 of 6, al het volgende vindt plaats, wat u kunt verifiëren door te kijken naar de scripts binnen rc0.d en rc6.d:

1. init doodt elk proces dat het kan (als het zou Wanneer u overschakelt naar een andere runlevel).

# De eerste rc0.d / rc6.d-opdrachten worden uitgevoerd, vergrendeld system bestanden op hun plaats zetten en andere voorbereidingen treffen voor het afsluiten.
# De volgende rc0.d/rc6.d-opdrachten ontkoppelen alle bestandensystems anders dan de root.
# Verdere rc0.d/rc6.d-opdrachten koppelen het rootbestand opnieuwsystem alleen lezen.
# Nog meer rc0.d/rc6.d-opdrachten schrijven alle gebufferde gegevens naar het bestandsystem met het synchronisatieprogramma.
# De laatste rc0.d / rc6.d commando de kernel vertellen om opnieuw op te starten of te stoppen met de reboot, halt, of poweroff programma.

De herstart- en stopprogramma's gedragen zich anders voor elk runlevel, wat mogelijk tot verwarring kan leiden. door default, deze programma's roepen shutdown aan met de -r of -h options, maar als het system reeds op het runlevel is gestopt of herstart, vertellen de programma's de kernel om zichzelf onmiddellijk af te sluiten. Als je je machaast je (als je geen rekening houdt met mogelijke schade door een wanordelijke uitschakeling), gebruik dan de optie -f.

Gepassioneerd door techniek schrijf ik met plezier verder StealthSettings.com sinds 2006. Ik heb uitgebreide ervaring met besturingssystemen: macOS, Windows şi Linux, maar ook in programmeertalen en blogplatforms (WordPress) en voor online winkels (WooCommerce, Magento, PrestaShop).

Laat een bericht achter