Forstå / etc / inittab
On februar 12, 2021 by admin Jeg bruger følgende /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
For at forstå, hvordan ting virkelig fungerer, vil jeg sætte pris på, hvis dine svar på 1-3 dig “skelner mellem to situationer:
- Jeg har forbindelse til mit system ved hjælp af en seriel port.
- Jeg har en “almindelig” desktop pc.
Spørgsmål:
-
Hvis jeg tilføjer en anden getty-linje, vil jeg, når jeg starter Linux, se to separate terminaler?
-
Hvis jeg åbner flere getty-linjer, hvordan tildelte jeg hvilke getty vil køre min
si::sysinit:/etc/init.d/rcS
kommando, og hvilken getty kører kommandoer til det andet script? (dem der kører scripts i henhold til systemets køringsniveau)i andre ord: i
/etc/inittab
filen – kan jeg tildele forskellige kommandoer til forskellige gettys? (jeg mener de terminaler, der åbnes af disse gettys) -
det sidste script i /etc/init.d/rc5 mappekørsel følgende kommando:
su nobody -c /bin/sh
og output er:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Så jeg bekræftede at jeg er ingen, men hvorfor skriver de de to første linjer? også hvorfor prompt er sh-4.3 $ og ikke nogen @ …
-
Jeg bruger seriel forbindelse. Kan jeg ændre filen / etc / inittab og det sidste script der køres ved init for at:
- køre et program inden login som lavprivilegieret bruger (init-processen venter på opsigelse)
- når programmet afsluttes, få det normale loginprompten til mit system
- hvad er den bedste måde at oprette en lavprivilegeret bruger på og lade ham køre dette program under init-processen (hvis jeg ikke vil bruge nogen-brugeren)
Svar
Spørgsmål 1:
Ja, ved at tilføje mere getty
linjer kan du få flere terminaler parallelt. Kun en getty
kan tilknyttes en terminalenhed ad gangen, så kun en getty
pr. Seriel port er mulig. På en almindelig stationær pc definerer Linux-kernen et antal virtuelle konsoller, der er tilgængelige ved hjælp af Control + Alt + FX -tastekombinationer og svarende til /dev/ttyX
enheder (X = et tal). Den nøjagtige opsætning kan variere mellem distributioner, men normalt på mainstream-distributioner har de første 6 eller deromkring /dev/ttyX
enheder getty
s konfigureret til dem, når systemet kører normalt. Du kan bruge kommandoerne openvt
og til at tilføje eller fjerne virtuelle konsoller og starte processer (som kan være alle processer, ikke nødvendigvis getty
s) på dem.
/dev/tty0
er speciel: den henviser til den virtuelle konsol, der er den aktuelt valgte. /dev/console
er en lignende speciel enhed, der peger på uanset hvilken TTY-enhed der er defineret som den primære systemkonsol på kerneniveau. På stationære systemer er det faktisk et alias til /dev/tty0
som standard, men ved at bruge console=
boot-indstillingen kan du skifte det til en seriel Havn. På f.eks. nogle indlejrede arkitekturer kan det være en seriel port som standard. Hjælpeprogrammer som xconsole
kan også fungere som en ekstra output for /dev/console
.
Tilbage, da computere var store ting i flere kabinetter i dedikerede computerrum, ville det have været en måde at nå den vagthavende systemoperatør til at sende en besked til /dev/console
fysisk nær computeren, hvilket kunne have været nyttigt til anmodninger om f.eks skift bånd eller diskpakker. På moderne systemer er meddelelser, der sendes specifikt til /dev/console
, normalt boot / shutdown-beskeder eller muligvis en sidste udvejskanal til presserende alarmer om fejltilstande, der kan påvirke netværks- eller lageradgang eller endda involverer et kernekrasch: “en person med ansvar for den fysiske hardware skal se dette, og de sædvanlige logfiler er af en eller anden grund ubrugelige.”
Spørgsmål 2:
Jeg er bange for, at du har en misforståelse her. sysinit
linjen og andre /etc/inittab
linjer er ikke tilknyttet getty
processer overhovedet. Hver kommando, der udføres fra inittab
, medmindre andet er angivet, har sine standardinput-, output- og fejlstrømme tilknyttet /dev/console
.
getty
linjerne angiver faktisk den TTY-enhed, de vil bruge, og getty
-processen har indbygget kode, der tildeler TTY-enheden til sig selv og alle deres underordnede processer, medmindre / indtil brugeren kører en shell og vælger at omdirigere disse streams på en anden måde.Det og initialisering af indstillingerne for TTY-enheden er den største del af getty
“s formål: at vise /etc/issue
og loginprompten, acceptere brugernavn, indstilling af TERM-miljøvariablen og start af næste trin i TTY-loginprocessen (normalt /bin/login
men tilpasses) er faktisk bare mindre dele.
Bemærk at der er en konvention, at for TTY-enhederne skal ID-feltet med to tegn i den første kolonne i inittab
linjen matche navnet på den pågældende TTY-enhed efter /dev/tty
præfiks, så /dev/ttyS0
får et inittab-linje-id på S0
osv. For ting der er ikke nødvendigvis forbundet med nogen TTY overhovedet (eller udsender bare nødsituationer til / dev / konsol, hvis det er nødvendigt), kan IDet være alt, hvad der ikke er i konflikt med TTY-enhedens linje-ider.
(Tilbage i den dag, hvor serieforbundne terminaler var nr rm, at få indstillingerne for TTY-enheden til terminalen i den anden ende af linjen og nulstille terminalen til en kendt tilstand til login var ikke-trivielle opgaver, da der var mange konkurrerende terminaltypestandarder.)
Hvis du konfigurerer en inittab
linje til at køre et script, kan du f.eks. se om en bestemt /dev/ttyX
virtuel konsol enhed findes. Hvis den ikke gør det, kan du bruge openvt -c X <command>
til at oprette den virtuelle konsol og starte en kommando på den; hvis den virtuelle konsollenhed allerede findes, kan du simpelthen starte den kommando, du ønsker, med standard input, output og fejl omdirigeret til den. For eksempel kan du angive en inittab-linje som denne:
6:345:respawn:/usr/local/sbin/myscript
og derefter /usr/local/sbin/myscript
med noget som dette ( ansvarsfraskrivelse: ikke testet, jeg har ikke et system med SysVinit ved hånden lige nu, er du velkommen til at redigere, hvis du kan forbedre dette):
#!/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
-linjen sørger for, at processen automatisk genstartes, hvis den af en eller anden grund dør. 345
er listen over SysVinit-runlevels, som denne proces skal køre på. Hvis du har brug for det til at køre på alle normale runlevels, skal du indtaste 12345
.
Bemærk, dette fungerer kun som beregnet, hvis inittab-linjen er placeret efter sysinit
-linjen, så initialiseringen af udev
kan antages at være fuldført. du vil gøre dette tidligt i init-processen, skal du muligvis sørge for at oprette de aktuelle enhedsnoder til enheder, der har drivere, der allerede er indlæst først; når udev
kører, skal den automatisk oprette enhedsknudepunkter, når enhedsdrivere initialiseres.
Hvis du bruger en seriel port, skal openvt
-kommandoen gælder ikke.
Så ja, du kan helt sikkert vedhæfte forskellige kommandoer til forskellige TTY-enheder. Det hjælper, hvis kommandoerne har indbyggede faciliteter til det som getty
, men du kan også gøre det med scripting.
(Hvis du konfigurerer noget mere kompliceret end en simpel tail -f
til permanent at se nogle logfiler i en ellers ubrugt virtuel konsol, skal du læse man setsid
og se om det er relevant for det, du planlægger.)
Spørgsmål 3:
Der er mere at initialisere en TTY-session for en bestemt ikke-root-bruger end bare at starte en shell med su
.
Fejlmeddelelserne
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
skyldes sandsynligvis, at skallen er tilknyttet /dev/console
-enheden snarere end en bestemt TTY-enhed. Da /dev/console
er lige et alias til hvad som helst den nuværende systemkonsol, den har ikke det fulde sæt TTY-kontrol ioctl-funktioner tilgængelige.
Hvis der ikke er noget login-script til at tildele en mere nyttig værdi til PS1
miljøvariablen, er standardprompten for /bin/sh
kan være sh-<version>$
.
Spørgsmål 4:
Ja, det kan du. Du skal angive det “sidste script” som en wait
-typelinje i inittab
, og placere den før getty
-linjen, der svarer til din serielle linje.
Uden at vide mange flere detaljer om dit miljø, vil det være meget vanskeligt at sige, hvilket ville være bedste måde at oprette en bruger med lavt privilegium til sådanne formål.
Kommentarer
Svar
-
Ja, forudsat at linjen får en unik identifikator, og den konfigurerede terminallinje er tilgængelig:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
åbner en terminal på den serielle port, der er knyttet til
ttyS1
. -
Linjer i
inittab
er ikke sekventielle eller relaterede til et login. Hver linje beskriver en handling, der skal udføres i et givet sæt runlevels. Såledessi::sysinit:/etc/init.d/rcS
angiver, atinit
skal køre/etc/init.d/rcS
, når det håndterer systeminitialisering; dette sker inden logins er mulige. (Seinittab(5)
manpage for detaljer).At tildele forskellige kommandoer til forskellige
getty
s på bestemte terminaler, ville du konfigureregetty
selve påkaldelsen, for eksempel ved at ændrelogin
program det starter (-l
indstillingen i de flestegetty
implementeringer):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ører inden logins er mulige, og de programmer, den kører, er ikke forbundet til en terminal (“ordentligt”, som er, hvadgetty
gør – det åbner terminalen for dig og forbinder de programmer, den starter med den), så nårsu nobody -c /bin/sh
påberåbes, shell finder ikke den terminalopsætning, den forventer, og deaktiverer jobkontrol som et resultat.sh-4.3$
-prompten er Bash 4.3s standardprompt, når den køres som/bin/sh
. -
Hvis dit program kun skal køre, når en bruger begynder at logge ind, kan du tilslutte det til den loginsekvens, der bruges af
getty
; men et sådant program vil køre som root. Afhængigt af hvad du leder efter nøjagtigt, ville du sandsynligvis have det bedre at bruge en initscript i stedet for/etc/inittab
tilpasning ellersudo
og shells opstartsskripter.
Kommentarer
- tak for din gentagelse. Kan jeg bede om en smail-afklaring vedrørende afsnit 2? hvordan kan jeg redigere loginkommandoen for hver enkelt getty?
- Færdig, se opdateringen.
- tak! bare for at kontrollere, om jeg forstod korrekt: Som standard kører getty-processen kommandoen / bin / login, som udfører processen, der er ansvarlig for systemlogin. Nu vil getty køre en anden kommando, hver kommando, som jeg ‘ vælger, og kalder ikke til system loginprocessen som før … har jeg ret?
- Ja, det er rigtigt. Nøglen får
getty
til at åbne TTY for dig; dens normale opførsel er at vente på et login-navn og derefter kørelogin
, der er forbundet til TTY;login
venter på adgangskoden, kontrollerer den og starter skallen, også forbundet med TTY. Hvis du udskifterlogin
-delen, skal du sørge for, at dit erstatningsprogram opfører sig somlogin
. - For eksempel hvis jeg vil springe loginfasen over – for at kunne åbne mit system med rodbruger uden at indtaste noget brugernavn eller adgangskode. Jeg kan bruge: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 eller at bruge: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 og indvendigt scriptet i ‘ Vil du køre kommandoen – / bin / sh og andre?
Svar
Lige nu et sekund (langt!) svar er sendt. Jeg må sige, at den første forklarer ganske godt. I øjeblikket vil jeg kommentere punkt tre: Det er mindre et spørgsmål om timing, men om processer, der styrer en “ægte virtuel” tty og ikke kun en “console dummy”.
Før du kan starte en shell “med jobkontrol”, skal du konfigurere, dvs. åbne en ttyN. Den “generiske” kommando er getty
. Fra det tty-noget, du får, kan du starte en shell, ikke bare efter det.
Det er som at prøve først at starte en vinduemanager og derefter xorg i stedet for at “starte” dem sammen med xinit. Jeg tror. “session leader”.
På grund af
xx:12:...:program
og modsat:
aa:1:...:pr_1 bb:1:...:pr_2
… du får et N: M-forhold (du får også et rod, hvis du misbruger – mange RLer hver med mange forskellige progs). Du kan gå langt med det, men siden forskellige slags RC- “standarder” har overtaget. “Runker”. Inittab ser simpelt ud med dem, men al kompleksiteten er i disse scripts.
Men din inittab ser enkel og korrekt ud – kun den sidste kommentar og “z6” -indgangen …
Måske har din “su ingen” bare brug for en “getty … ttyN” før / omkring. su
i stedet for login
, og ingen respawn. Skal i det mindste give en anden fejlmeddelelse end “upassende”.
Konklusion (efter at have læst 2. svar): Du behøver ikke et kompliceret init.d
system, den rå inittab er fleksibel nok. Bare skal få konceptet og detaljerne rigtigt.
Du kan oprette tre runlevels: en med ttyNs, en med ttySN og en RL, der starter begge. Det er en boot-parameter, du kan tilføje med boot loader. “5” er i dit tilfælde kun standard. Du vælger en kerne, en root = og et runlevel at starte i.
Handlingen “respawn” er, hvad sysvinit faktisk var / er behov for Meget mere gør det ikke, og mindre ville have været muligt at implementere i et script. Men hvis du afslutter (eller går ned) fra det “sidste” skalniveau, har du brug for et sikkerhedsnet.
sysvinit kan selv opdage en forkert konfiguration ved at fejle “gydning for hurtigt – ignorere i 5 minutter …”.
getty
er en proces; hvad du taler om er en TTY-enhed . Kernen åbnede den første for dig og for init-scripts;/dev/console
er et alias til ” den første TTY-enhed, der blev åbnet og brugt af kernen “. Hvis din brugerkonto har tilladelser til læs + skriveadgang til en TTY-enhed, kan du bare begynde at bruge den (ingengetty
nødvendig), men det kan være en god ide at indstille TERM-variabel korrekt:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
ellerTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
starter kommandoentop
på den 8. virtuelle konsol eller den 2. serielle port.getty
-proces på den, vil den gøre et rod af input & output, da de to processer kæmper for input og deres output blandes sammen.getty
processerne startes først efter/etc/init.d/rc 5
og eventuelle scripts startet af den er færdig .