Begrijp het / etc / inittab
Geplaatst op februari 12, 2021 door admin Ik gebruik het volgende /etc/inittab
bestand (systemv):
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Om te begrijpen hoe dingen echt werken, “zal ik het waarderen als uw antwoorden op 1-3 u” onderscheid zullen maken tussen twee situaties:
- Ik ben met mijn systeem verbonden via een seriële poort.
- Ik heb een “gewone” desktop-pc.
Vragen:
-
Als ik nog een getty-regel toevoeg, zie ik na het opstarten van linux twee aparte terminals?
-
Als ik meerdere getty-regels open, hoe heb ik welke getty zal mijn
si::sysinit:/etc/init.d/rcS
commando uitvoeren en welke getty zal de commandos van de andere scripts uitvoeren? (degenen die scripts uitvoeren volgens het systeem run level)in andere woorden: in het
/etc/inittab
bestand – kan ik verschillende commandos toewijzen aan verschillende gettys? (ik bedoel aan de terminals die door deze gettys worden geopend) -
het laatste script in /etc/init.d/rc5 map wordt uitgevoerd het volgende commando:
su nobody -c /bin/sh
en de output is:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Dus ik heb geverifieerd dat ik niemand ben, maar waarom schrijft het de eerste twee regels? ook waarom de prompt sh-4.3 $ is en niet niemand @ …
-
Ik gebruik een seriële verbinding. Kan ik het bestand / etc / inittab en het laatste script wijzigen dat wordt uitgevoerd door init om:
- een programma uit te voeren voordat u zich aanmeldt als gebruiker met weinig rechten (het init-proces wacht op beëindiging)
- zodra het programma stopt, krijgt u de reguliere login prompt op mijn systeem
- wat is de beste manier om een laag geprivilegieerde gebruiker aan te maken en hem dit programma te laten draaien tijdens het init proces (als ik de niemand gebruiker niet wil gebruiken)
Beantwoord
Vraag 1:
Ja, door meer getty
regels kunt u meer terminals parallel krijgen. Er kan slechts één getty
worden geassocieerd met één terminalapparaat tegelijk, dus er is slechts één getty
per seriële poort mogelijk. Op een gewone desktop-pc definieert de Linux-kernel een aantal virtuele consoles, toegankelijk met de Control + Alt + FX -toetscombinaties en corresponderend met /dev/ttyX
apparaten (X = een getal). De exacte configuratie kan per distributies verschillen, maar bij reguliere distributies zijn meestal voor de eerste zes /dev/ttyX
apparaten getty
s geconfigureerd wanneer het systeem werkt normaal. U kunt openvt
en deallocvt
opdrachten gebruiken om virtuele consoles toe te voegen of te verwijderen en processen te starten (dit kunnen alle processen zijn, niet noodzakelijk getty
s) op hen.
/dev/tty0
is speciaal: het verwijst naar de virtuele console die momenteel is geselecteerd. /dev/console
is een soortgelijk speciaal apparaat, dat verwijst naar het TTY-apparaat dat is gedefinieerd als de primaire systeemconsole op kernelniveau. Op desktopsystemen is het in feite standaard een alias voor /dev/tty0
, maar door de opstartoptie console=
te gebruiken, kunt u deze omzetten naar een seriële haven. Op b.v. Bij sommige embedded architecturen kan het standaard een seriële poort zijn. Hulpprogrammas zoals xconsole
kunnen ook fungeren als een extra uitvoer voor /dev/console
.
Toen computers grote dingen waren met meerdere kasten in speciale computerruimten, zou het sturen van een bericht naar /dev/console
een manier zijn geweest om de systeembeheerder van dienst te bereiken fysiek in de buurt van de computer, wat handig zou kunnen zijn voor verzoeken aan bijv verander banden of disk packs. Op moderne systemen zijn berichten die specifiek naar /dev/console
worden gestuurd, meestal opstart- / uitschakelberichten, of mogelijk een laatste redmiddel voor dringende alarmen over storingen die van invloed kunnen zijn op netwerk- of opslagtoegang, of zelfs impliceren een kernelcrash: “een persoon die verantwoordelijk is voor de fysieke hardware moet dit zien en de gebruikelijke logbestanden zijn om de een of andere reden onbruikbaar.”
Vraag 2:
Ik vrees dat u hier een misvatting heeft. De sysinit
-regel en andere /etc/inittab
-regels zijn niet gekoppeld aan getty
verwerkt überhaupt. Elke opdracht uitgevoerd vanaf inittab
, tenzij anders gespecificeerd, heeft zijn standaard invoer-, uitvoer- en foutstromen die zijn gekoppeld aan /dev/console
.
De getty
-regels specificeren feitelijk het TTY-apparaat dat ze zullen gebruiken, en het getty
-proces heeft ingebouwde code die dat TTY-apparaat voor zichzelf en al hun onderliggende processen tenzij / totdat de gebruiker een shell uitvoert en ervoor kiest om die streams op een andere manier om te leiden.Dat en het initialiseren van de instellingen van het TTY-apparaat vormen het grootste deel van het doel van getty
“: /etc/issue
weergeven en de login-prompt, de gebruikersnaam, het instellen van de TERM-omgevingsvariabele en het starten van de volgende stap van het TTY-inlogproces (meestal /bin/login
maar aanpasbaar) zijn in feite slechts kleine onderdelen.
Merk op dat er is een afspraak dat voor de TTY-apparaten het ID-veld van twee tekens in de eerste kolom van de regel inittab
moet overeenkomen met de naam van het betreffende TTY-apparaat na /dev/tty
prefix, dus /dev/ttyS0
krijgt een inittab regel-ID van S0
, enzovoort. Voor dingen die is niet noodzakelijkerwijs geassocieerd met een TTY (of voert alleen noodgevallen uit naar / dev / console indien nodig), de ID kan alles zijn dat niet conflicteert met de TTY-apparaatlijn-IDs.
(Terug in de dag waarop serieel aangesloten terminals de nee waren rm, de instellingen van het TTY-apparaat juist krijgen voor de terminal aan de andere kant van de lijn, en die terminal resetten naar een bekende staat om in te loggen waren niet-triviale taken, aangezien er veel concurrerende terminaltype-standaarden waren.)
Als u een inittab
regel configureert om een script uit te voeren, kunt u bijvoorbeeld kijken of een bepaalde /dev/ttyX
virtuele console apparaat bestaat. Als dit niet het geval is, kunt u openvt -c X <command>
gebruiken om de virtuele console te maken en er een commando op te starten; als het virtuele console-apparaat al bestaat, kunt u eenvoudig elk commando starten dat u wilt met standaardinvoer, -uitvoer en foutmeldingen ernaar omgeleid. U kunt bijvoorbeeld een inittab-regel als volgt specificeren:
6:345:respawn:/usr/local/sbin/myscript
en vervolgens /usr/local/sbin/myscript
met zoiets als dit ( disclaimer: niet getest, ik heb momenteel geen systeem met SysVinit bij de hand, voel je vrij om het te bewerken als je dit kunt verbeteren):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
in de inittab
regel zorgt ervoor dat het proces automatisch opnieuw wordt gestart als het om welke reden dan ook sterft. 345
is de lijst met SysVinit-runlevels waarop dit proces zou moeten draaien. Als je het nodig hebt om op alle reguliere runlevels te draaien, voer dan 12345
in.
Let op, dit werkt alleen zoals bedoeld als de regel inittab na de regel sysinit
wordt geplaatst, dus kan worden aangenomen dat de initialisatie van udev
voltooid is. Als als u dit vroeg in het init-proces wilt doen, moet u mogelijk eerst de daadwerkelijke apparaatknooppunten maken voor apparaten waarop al stuurprogrammas zijn geladen; zodra udev
draait, zou het automatisch apparaatknooppunten moeten aanmaken wanneer apparaatstuurprogrammas worden geïnitialiseerd.
Als u een seriële poort gebruikt, moet de openvt
commando zal niet van toepassing zijn.
Dus ja, je kunt zeker verschillende commandos aan verschillende TTY-apparaten koppelen. Het helpt als de commandos daarvoor ingebouwde faciliteiten hebben zoals getty
s dat doen, maar je kunt het ook doen met scripting.
(Als u iets ingewikkelder instelt dan een simpele tail -f
om permanent een logboek in een anders ongebruikte virtuele console te bekijken, moet u man setsid
en kijk of het van toepassing is op wat u “aan het plannen bent.)
Vraag 3:
Er komt meer kijken bij het initialiseren van een TTY-sessie voor een bepaalde niet-rootgebruiker dan gewoon een shell starten met su
.
De foutmeldingen
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
worden waarschijnlijk veroorzaakt doordat de shell wordt geassocieerd met het /dev/console
-apparaat in plaats van een specifiek TTY-apparaat. Aangezien /dev/console
slechts een alias voor wat de huidige systeemconsole ook is, het zal niet de volledige set TTY control ioctl-functies beschikbaar hebben.
Als er geen login-script is om een meer bruikbare waarde toe te wijzen aan de PS1
omgevingsvariabele, de standaard prompt voor /bin/sh
kan eenvoudig sh-<version>$
zijn.
Vraag 4:
Ja, dat kan. U moet het “laatste script” specificeren als een wait
-type regel in inittab
, en deze voor plaatsen de getty
regel die overeenkomt met uw seriële lijn.
Zonder veel meer details over uw omgeving te weten, zal het erg moeilijk zijn om te zeggen welke de beste manier om een gebruiker met weinig rechten voor dergelijke doeleinden aan te maken.
Reacties
Answer
-
Ja, uitgaande van de regel krijgt een unieke identificatie en de geconfigureerde terminalregel is beschikbaar:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
opent een terminal op de seriële poort die is gekoppeld aan
ttyS1
. -
Regels in
inittab
zijn niet opeenvolgend, of gerelateerd aan een login. Elke regel beschrijft een actie die moet worden ondernomen in een bepaalde set runlevels. Dussi::sysinit:/etc/init.d/rcS
specificeert datinit
/etc/init.d/rcS
moet draaien wanneer het systeeminitialisatie afhandelt; dit gebeurt voordat logins mogelijk zijn. (Zie deinittab(5)
manpage voor details).Om verschillende commandos toe te wijzen aan verschillende
getty
s op specifieke terminals, zou u degetty
aanroep zelf configureren, bijvoorbeeld door delogin
programma dat het start (de-l
optie in de meestegetty
implementaties):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
wordt uitgevoerd voordat inloggen mogelijk is, en de programmas die worden uitgevoerd, zijn niet verbonden met een terminal (“correct”, die is watgetty
doet – het opent de terminal voor u en verbindt de programmas waarmee het begint), dus wanneersu nobody -c /bin/sh
wordt aangeroepen, wordt de shell vindt niet de terminal setup die het verwacht, en schakelt als resultaat taakbeheer uit. Desh-4.3$
-prompt is de standaardprompt van Bash 4.3 wanneer deze wordt uitgevoerd als/bin/sh
. -
Als het de bedoeling is dat uw programma alleen wordt uitgevoerd als een gebruiker begint in te loggen, dan kunt u het inhaken op de inlogreeks die wordt gebruikt door
getty
; maar zon programma zou als root draaien. Afhankelijk van wat u precies zoekt, kunt u waarschijnlijk beter een initscript gebruiken in plaats van/etc/inittab
aanpassing, ofsudo
en de shells opstartscripts.
Reacties
- bedankt voor je herhaling. Kan ik om een korte toelichting vragen over punt 2? hoe kan ik het inlogcommando voor elke verschillende getty bewerken?
- Klaar, zie de update.
- bedankt! gewoon om te controleren of ik het goed heb begrepen: standaard zal het getty-proces het / bin / login-commando uitvoeren dat het proces uitvoert dat verantwoordelijk is voor het inloggen op het systeem. Nu zal getty een ander commando uitvoeren, elk commando dat ik ‘ zal kiezen, en zal niet het systeemaanmeldingsproces aanroepen zoals voorheen … heb ik gelijk?
- Ja, dat klopt. De sleutel krijgt
getty
om de TTY voor je te openen; het normale gedrag is om te wachten op een inlognaam en vervolgenslogin
uit te voeren, verbonden met de TTY;login
wacht op het wachtwoord, controleert het en start de shell, ook verbonden met de TTY. Als u hetlogin
-gedeelte vervangt, moet u ervoor zorgen dat uw vervangende programma zich gedraagt alslogin
. - Als ik bijvoorbeeld de inlogfase wil overslaan – om mijn systeem met rootgebruiker te kunnen openen zonder een gebruikersnaam of wachtwoord in te voeren. Ik kan gebruiken: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 of om te gebruiken: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 en binnen het script i ‘ voer ik het – / bin / sh commando uit en anderen?
Antwoord
Zojuist een seconde (lang!) antwoord is gepost. Ik moet zeggen dat de eerste vrij goed uitlegt. Op dit moment wil ik iets zeggen over punt drie: het is minder een kwestie van timing, maar van processen die een “echte virtuele” tty besturen, en niet alleen een “console-dummy”.
Voordat u een shell “met taakbeheer” kunt starten, moet u een ttyN instellen. De “generieke” opdracht is getty
. Van dat tty-iets dat je krijgt, kun je een shell starten, niet alleen daarna .
Het is alsof je eerst een window manager start, en dan xorg, in plaats van ze samen met xinit te “booten”. I denk. “sessieleider”.
Vanwege
xx:12:...:program
en, omgekeerd:
aa:1:...:pr_1 bb:1:...:pr_2
… je krijgt een N: M-relatie (je krijgt ook een zooitje als je misbruik maakt – veel RLs met elk veel verschillende progs). Daar kun je ver mee gaan, maar sindsdien hebben verschillende soorten RC- “standaarden” het overgenomen. “Runcoms”. Bij hen ziet inittab er eenvoudig uit, maar alle complexiteit zit in deze scripts.
Maar je inittab ziet er eenvoudig en correct uit – alleen de laatste opmerking en het “z6” -item …
Misschien heeft je “su niemand” gewoon een “getty … ttyN” nodig voor / rond. su
in plaats van login
, en geen respawn. Moet op zijn minst een andere foutmelding geven dan “ongepast”.
Conclusie (na het lezen van het 2e antwoord): Je hebt geen “ingewikkeld init.d
-systeem nodig, het ruwe inittab is flexibel genoeg. het concept en de details kloppen.
Je zou drie runlevels kunnen instellen: een met ttyNs, een met ttySN, en een RL die beide start. Het is een bootparameter die je kunt toevoegen met de bootloader. “5” is in jouw geval alleen de standaard. Je kiest een kernel, een root = en een runlevel om in te initiëren.
De “respawn” -actie is waar sysvinit eigenlijk voor nodig was / is . Veel meer doet het niet, en minder zou mogelijk zijn geweest om in een script te implementeren. Maar als je het “laatste” shell-niveau verlaat (of crasht), heb je een vangnet nodig.
sysvinit kan ontdek zelfs een verkeerde configuratie door de fout “te snel spawnen – 5 minuten negeren …” te geven.
getty
is een proces; waar je het over hebt, is een TTY-apparaat . De kernel opende de eerste voor jou en voor de init-scripts;/dev/console
is een alias voor ” het eerste TTY-apparaat dat werd geopend en gebruikt door de kernel “. Als uw gebruikersaccount de rechten heeft voor lees- en schrijftoegang tot een TTY-apparaat, kunt u het gewoon gaan gebruiken (geengetty
nodig), maar het kan een goed idee zijn om de TERM-variabele correct:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
ofTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
start detop
-opdracht op de 8e virtuele console of de 2e seriële poort.getty
-proces heeft, zal het er een puinhoop van maken de input & output, aangezien de twee processen zullen vechten om de input en hun output door elkaar zal worden gehaald. Degetty
processen worden pas gestart nadat de/etc/init.d/rc 5
en eventuele scripts die ermee gestart zijn klaar zijn.