Förstå / etc / inittab (Svenska)
On februari 12, 2021 by admin Jag använder följande /etc/inittab
-fil (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
För att förstå hur saker verkligen fungerar kommer jag att uppskatta om dina svar på 1-3 du ”skiljer mellan två situationer:
- Jag är ansluten till mitt system med en seriell port.
- Jag har en ”vanlig” stationär dator.
Frågor:
-
Om jag lägger till en annan getty-linje, när jag startar Linux kommer jag att se två separata terminaler?
-
Om jag öppnar flera getty-rader, hur tilldelade jag vilka getty kommer att köra mitt
si::sysinit:/etc/init.d/rcS
-kommando och vilken getty kommer att köra de andra kommandona för skript? (de som kör skript enligt systemkörningsnivån)i andra ord: i
/etc/inittab
-filen – kan jag tilldela olika kommandon till olika gettys? (jag menar de terminaler som öppnas av dessa gettys) -
det sista skriptet i /etc/init.d/rc5 mappkörning följande kommando:
su nobody -c /bin/sh
och utdata är:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Så jag verifierade att jag är ingen utom varför det skriver de två första raderna? också varför prompten är sh-4.3 $ och inte ingen @ …
-
Jag använder seriell anslutning. Kan jag ändra filen / etc / inittab och det sista skriptet som körs av init för att:
- köra ett program innan du loggar in som lågprivilegierad användare (init-processen väntar på avslutning)
- när programmet avslutas får du det vanliga inloggningsprompt till mitt system
- vad är det bästa sättet att skapa en lågprivilegierad användare och låta honom köra detta program under init-processen (om jag inte vill använda ingenanvändaren)
Svar
Fråga 1:
Ja, genom att lägga till mer getty
linjer kan du få fler terminaler parallellt. Endast en getty
kan associeras med en terminalenhet åt gången, så endast en getty
per seriell port är möjlig. På en vanlig stationär dator definierar Linux-kärnan ett antal virtuella konsoler, tillgängliga med tangentkombinationerna Control + Alt + FX och motsvarar /dev/ttyX
enheter (X = ett nummer). Den exakta inställningen kan variera mellan distributioner, men vanliga distributioner har vanligtvis de första 6 eller så /dev/ttyX
enheter getty
s konfigurerade för dem när systemet körs normalt. Du kan använda kommandona openvt
och deallocvt
för att lägga till eller ta bort virtuella konsoler och starta processer (vilket kan vara alla processer, inte nödvändigtvis getty
s) på dem.
/dev/tty0
är speciellt: det hänvisar till vilken virtuell konsol som är vald. /dev/console
är en liknande speciell enhet som pekar på vilken TTY-enhet som helst som definieras som den primära systemkonsolen på kärnnivå. På stationära system är det i själva verket ett alias till /dev/tty0
som standard, men med hjälp av console=
startalternativ kan du byta till en seriell hamn. På t.ex. vissa inbäddade arkitekturer kan det vara en serieport som standard. Verktyg som xconsole
kan också fungera som en extra utgång för /dev/console
.
Tillbaka när datorer var stora flerskåp saker i dedikerade datorrum, skulle ett meddelande till /dev/console
ha varit ett sätt att nå den systemansvarige i tjänst fysiskt nära datorn, vilket kan ha varit användbart för förfrågningar om t.ex. byta band eller skivpaket. På moderna system är meddelanden som skickas specifikt till /dev/console
vanligtvis start- / avstängningsmeddelanden, eller möjligen en sista utvägskanal för brådskande larm om felförhållanden som kan påverka nätverks- eller lagringsåtkomst, eller till och med involverar en kärnkrasch: ”en person som ansvarar för den fysiska hårdvaran behöver se detta och de vanliga loggfilerna är oanvändbara av någon anledning.”
Fråga 2:
Jag är rädd att du har en missuppfattning här. sysinit
raden och andra /etc/inittab
rader är inte associerade med getty
processer alls. Varje kommando som körs från inittab
, om inte annat anges, har sina standardinmatnings-, utdata- och felströmmar associerade med /dev/console
.
getty
raderna anger faktiskt den TTY-enhet som de ska använda och getty
-processen har inbyggd kod som tilldelar TTY-enheten för sig själva och alla deras underordnade processer såvida inte / tills användaren kör ett skal och väljer att omdirigera dessa strömmar på något annat sätt.Det och initialisering av inställningarna för TTY-enheten är den största delen av getty
”: s syfte: att visa /etc/issue
och inloggningsprompten, acceptera användarnamn, ställa in miljövariabeln TERM och starta nästa steg i TTY-inloggningsprocessen (vanligtvis /bin/login
men anpassningsbara) är i själva verket bara mindre delar.
Observera att det är en konvention att för TTY-enheterna ska ID-fältet med två tecken i den första kolumnen i inittab
-raden matcha namnet på TTY-enheten i fråga efter /dev/tty
prefix, så /dev/ttyS0
får ett ID för inittab rad på S0
och så vidare. För saker som är inte nödvändigtvis associerad med någon TTY alls (eller skickar bara ut nödsaker till / dev / konsol om det behövs), kan ID: t vara allt som inte strider mot TTY-enhetsrad-ID: n.
(Tillbaka i dagen då serieanslutna terminaler var nr rm, att få inställningarna för TTY-enheten rätt för terminalen i andra änden av raden och återställa terminalen till ett känt tillstånd för inloggning var inte triviala uppgifter, eftersom det fanns många konkurrerande terminaltypstandarder.)
Om du konfigurerar en inittab
-rad för att köra ett skript kan du till exempel se om en viss /dev/ttyX
virtuell konsol enheten finns. Om det inte gör det kan du använda openvt -c X <command>
för att skapa den virtuella konsolen och starta ett kommando på den. om den virtuella konsolenheten redan finns kan du helt enkelt starta vilket kommando du vill med standardinmatning, utdata och fel som omdirigeras till den. Till exempel kan du ange en inittab-rad så här:
6:345:respawn:/usr/local/sbin/myscript
och sedan /usr/local/sbin/myscript
med något liknande detta ( ansvarsfriskrivning: inte testad, jag har inte ett system med SysVinit till hands just nu, gärna redigera om du kan förbättra detta):
#!/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
i inittab
ser till att processen startas om automatiskt om den av någon anledning dör. 345
är listan över SysVinit-körnivåer som denna process ska köras på. Om du behöver den för att köras på alla vanliga körnivåer, skriv in 12345
.
Obs, detta fungerar som avsett endast om inittab-raden placeras efter sysinit
-raden, så initialiseringen av udev
kan antas vara fullständig. du vill göra detta tidigt i init-processen, du kan behöva ta hand om att skapa de faktiska enhetsnoderna för enheter som har drivrutiner som redan har laddats först; när udev
körs, bör den skapa enhetsnoder automatiskt när enhetsdrivrutinerna initialiseras.
Om du använder en seriell port, openvt
-kommandot gäller inte.
Så ja, du kan definitivt bifoga olika kommandon till olika TTY-enheter. Det hjälper om kommandona har inbyggda faciliteter för det som getty
gör, men du kan också göra det med skript.
(Om du ställer in något mer komplicerat än en enkel tail -f
för att permanent visa en del loggar i en annars oanvänd virtuell konsol, bör du läsa man setsid
och se om det är tillämpligt på vad du planerar.)
Fråga 3:
Det finns mer att initiera en TTY-session för en viss icke-root-användare än att bara starta ett skal med su
.
Felmeddelandena
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
orsakas troligen av att skalet associeras av /dev/console
-enheten snarare än en specifik TTY-enhet. Eftersom /dev/console
är bara ett alias till vad som än är den nuvarande systemkonsolen, den kommer inte att ha hela uppsättningen TTY-kontroll ioctl-funktioner tillgängliga för den.
Om det inte finns något inloggningsskript för att tilldela ett mer användbart värde till PS1
miljövariabel, är standardprompten för /bin/sh
kan helt enkelt vara sh-<version>$
.
Fråga 4:
Ja, det kan du. Du bör ange det ”sista skriptet” som wait
-typrad i inittab
och placera det före getty
raden som motsvarar din seriella linje.
Utan att veta mycket mer information om din miljö blir det mycket svårt att säga vilken som skulle vara bästa sättet att skapa en användare med låg privilegium för sådana ändamål.
Kommentarer
Svar
-
Ja, förutsatt att raden får en unik identifierare och den konfigurerade terminalraden är tillgänglig:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
öppnar en terminal på den seriella porten kopplad till
ttyS1
. -
Rader i
inittab
är inte sekventiella eller relaterade till en inloggning. Varje rad beskriver en åtgärd som ska vidtas i en viss uppsättning körnivåer. Således angersi::sysinit:/etc/init.d/rcS
attinit
ska köras/etc/init.d/rcS
när det hanterar systeminitiering; detta händer innan inloggningar är möjliga. (Seinittab(5)
manpage för detaljer).Att tilldela olika kommandon till olika
getty
s på specifika terminaler, skulle du konfigureragetty
själva anropet, till exempel genom att ändralogin
programmet startar (alternativet-l
i de flestagetty
-implementeringar):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
körs innan inloggningar är möjliga och de program det körs är inte anslutna till en terminal (”ordentligt”, vilket är vadgetty
gör – det öppnar terminalen för dig och ansluter programmen den startar till den), så närsu nobody -c /bin/sh
anropas, shell hittar inte den terminalinstallation som den förväntar sig och inaktiverar jobbkontroll som ett resultat.sh-4.3$
-prompten är Bash 4.3s standardprompt när den körs som/bin/sh
. -
Om ditt program bara ska köras när en användare börjar logga in kan du ansluta det till inloggningssekvensen som används av
getty
; men ett sådant program skulle köras som root. Beroende på vad du är ute efter exakt skulle du förmodligen vara bättre med att använda en inskript istället för/etc/inittab
anpassning, ellersudo
och shells startskript.
Kommentarer
- tack för din omspelning. Kan jag begära ett förklaring om smail angående avsnitt 2? hur kan jag redigera inloggningskommandot för varje getty?
- Klar, se uppdateringen.
- tack! bara för att kontrollera om jag förstod rätt: som standard kör getty-processen kommandot / bin / login som kör processen som är ansvarig för systeminloggning. Nu kommer getty att köra ett annat kommando, varje kommando som jag ’ väljer, och kommer inte att ringa till systeminloggningsprocessen som tidigare … har jag rätt?
- Ja, det stämmer. Nyckeln får
getty
att öppna TTY för dig; dess normala beteende är att vänta på ett inloggningsnamn och sedan köralogin
, ansluten till TTY;login
väntar på lösenordet, kontrollerar det och startar skalet, även anslutet till TTY. Om du byter utlogin
-delen måste du se till att ditt utbytesprogram beter sig somlogin
. - Till exempel om jag vill hoppa över inloggningsfasen – för att kunna öppna mitt system med root-användare utan att ange något användarnamn eller lösenord. Jag kan använda: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 eller att använda: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 och inuti skriptet i ’ Kommer du att köra kommandot – / bin / sh och andra?
Svar
Just nu en sekund (lång!) svar har lagts upp. Jag måste säga att den första förklarar ganska bra. Just nu vill jag kommentera punkt tre: Det är mindre en fråga om timing, men om processer som styr en ”riktig virtuell” tty, och inte bara en ”console dummy”.
Innan du kan starta ett skal ”med jobbkontroll” måste du ställa in dvs öppna ett ttyN. Kommandot ”generiskt” är getty
. Från det tty-något du får kan du starta ett skal, inte bara efter det.
Det är som att först starta en fönsterhanterare och sedan xorg istället för att ”starta” dem tillsammans med xinit. Jag tror. ”session leader”.
På grund av
xx:12:...:program
och tvärtom:
aa:1:...:pr_1 bb:1:...:pr_2
… du får en N: M-relation (du får också en röra om du missbrukar – många RL-var och en med många olika progs). Du kan gå långt med det, men eftersom någonsin olika typer av RC- ”standarder” har tagit över. ”Runcoms”. Med dem ser inittab enkelt ut, men all komplexitet ligger i dessa skript.
Men din inittab ser enkel och korrekt ut – bara den sista kommentaren och ”z6” -posten …
Kanske behöver din ”su ingen” bara en ”getty … ttyN” före / runt. su
istället för login
, och inget svar. Bör åtminstone ge ett annat felmeddelande än ”olämpligt”.
Slutsats (efter att ha läst det andra svaret): Du behöver inte ett komplicerat init.d
-system, den råa inittabben är tillräckligt flexibel. Bara måste få konceptet och detaljerna rätt.
Du kan ställa in tre körnivåer: en med ttyNs, en med ttySN och en RL som startar båda. Det är en startparameter du kan lägga till med startlastaren. ”5” är i ditt fall bara standard. Du väljer en kärna, en root = och en körnivå att initiera till.
Åtgärden ”respawn” är vad sysvinit faktiskt behövdes för / Mycket mer gör det inte, och mindre skulle ha varit möjligt att implementera i ett skript. Men om du lämnar (eller kraschar) den ”sista” skalnivån behöver du ett skyddsnät.
sysvinit kan till och med upptäcka en felkonfiguration genom att felaktigt ”leka för snabbt – ignorera i 5 minuter …”.
getty
är en process; det du pratar om är en TTY-enhet . Kärnan öppnade den första för dig och för init-skript;/dev/console
är ett alias för ” den första TTY-enheten som öppnades och användes av kärnan ”. Om ditt användarkonto har behörighet för läs + skrivåtkomst till en TTY-enhet kan du bara börja använda den (ingengetty
behövs), men det kan vara en bra idé att ställa in TERM-variabel korrekt:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
ellerTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
startar kommandottop
på den åttonde virtuella konsolen eller den andra seriella porten.getty
-process på den, kommer den att göra en röra av ingången &, eftersom de två processerna kommer att kämpa för ingången och deras utgångar blandas ihop.getty
-processerna startas först efter att/etc/init.d/rc 5
och alla skript som startas av den har avslutat .