Forstå / etc / inittab (Norsk)
On februar 12, 2021 by admin Jeg bruker 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 å forstå hvordan ting virkelig fungerer, vil jeg sette pris på at svarene dine på 1-3 du «skiller mellom to situasjoner:
- Jeg er koblet til systemet mitt ved hjelp av en seriell port.
- Jeg har en «vanlig» stasjonær pc.
Spørsmål:
-
Hvis jeg legger til en annen getty-linje, vil jeg se to separate terminaler når jeg har startet linux?
-
Hvis jeg åpner flere getty-linjer, hvordan tildelte jeg hvilke getty vil kjøre kommandoen
si::sysinit:/etc/init.d/rcS
og hvilken getty vil kjøre kommandoene til det andre skriptet? (de som kjører skript i henhold til systemets kjøringsnivå)i andre ord: i
/etc/inittab
-filen – kan jeg tildele forskjellige kommandoer til forskjellige gettys? (jeg mener terminalene som åpnes av disse gettys) -
det siste skriptet i /etc/init.d/rc5 mappekjøring følgende kommando:
su nobody -c /bin/sh
og utgangen 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 bekreftet at jeg er ingen andre enn hvorfor det skriver de to første linjene? også hvorfor ledeteksten er sh-4.3 $ og ikke ingen @ …
-
Jeg bruker seriell tilkobling. Kan jeg endre / etc / inittab-filen og det siste skriptet som kjøres av init for å:
- kjøre et program før pålogging som bruker med lite privilegium (init-prosessen venter på avslutning)
- når programmet avsluttes, får du påloggingsprompt til systemet mitt
- hva er den beste måten å opprette en bruker med lite privilegium og la ham kjøre dette programmet under init-prosessen (hvis jeg ikke vil bruke ingen bruker)
Svar
Spørsmål 1:
Ja, ved å legge til mer getty
linjer kan du få flere terminaler parallelt. Bare en getty
kan tilknyttes en terminalenhet om gangen, så bare en getty
per seriell port er mulig. På en vanlig stasjonær PC, definerer Linux-kjernen et antall virtuelle konsoller, tilgjengelige ved hjelp av Control + Alt + FX -tastekombinasjoner og tilsvarer /dev/ttyX
enheter (X = et tall). Det nøyaktige oppsettet kan variere mellom distribusjoner, men vanligvis på vanlige distribusjoner har de første 6 eller så /dev/ttyX
enhetene getty
s konfigurert for dem når systemet kjører normalt. Du kan bruke openvt
og deallocvt
kommandoer for å legge til eller fjerne virtuelle konsoller og starte prosesser (som kan være alle prosesser, ikke nødvendigvis getty
s) på dem.
/dev/tty0
er spesiell: den refererer til hvilken virtuell konsoll som er valgt. /dev/console
er en lignende spesiell enhet, som peker på hva TTY-enheten som er definert som den primære systemkonsoll på kjernenivå. På stasjonære systemer er det effektivt et alias til /dev/tty0
som standard, men ved å bruke oppstartsalternativet console=
kan du bytte det til en seriell havn. På f.eks. noen innebygde arkitekturer kan det være en seriell port som standard. Verktøy som xconsole
kan også fungere som en ekstra utgang for /dev/console
.
Tilbake da datamaskiner var store flerkabinett ting i dedikerte datarom, hadde det vært en måte å nå den vakthavende systemoperatøren å sende en melding til /dev/console
>
vanligvis oppstarts- / nedleggingsmeldinger, eller muligens en siste-utvei-kanal for presserende alarmer om feilforhold som kan påvirke nettverks- eller lagringstilgang, eller til og med involverer en kjernekrasj: «en person med ansvar for den fysiske maskinvaren trenger å se dette og de vanlige loggfilene er ubrukelige av en eller annen grunn.»
Spørsmål 2:
Jeg er redd du har en misforståelse her. sysinit
linjen og andre /etc/inittab
linjene er ikke knyttet til getty
prosesser i det hele tatt. Hver kommando utført fra inittab
, med mindre annet er spesifisert, har standard inngangs-, utdata- og feilstrømmer tilknyttet /dev/console
.
getty
linjene angir faktisk TTY-enheten de skal bruke, og getty
prosessen har kode innebygd som vil tildele TTY-enheten for seg selv og alle barnets prosesser med mindre / til brukeren kjører et skall og velger å omdirigere disse strømningene på en annen måte.Det og initialisering av innstillingene til TTY-enheten er den største delen av getty
«formål: å vise /etc/issue
og påloggingsprompten, godta brukernavn, innstilling av TERM-miljøvariabelen og start av neste trinn i TTY-påloggingsprosessen (vanligvis /bin/login
men tilpasses) er faktisk bare mindre deler.
Merk at det er en konvensjon at for TTY-enhetene skal ID-feltet med to tegn i den første kolonnen i inittab
-linjen matche navnet på den aktuelle TTY-enheten etter /dev/tty
prefiks, så /dev/ttyS0
får en linje-ID for inittab på S0
, og så videre. For ting som ikke nødvendigvis er forbundet med noen TTY i det hele tatt (eller bare sender ut nødsaker til / dev / konsoll om nødvendig), kan ID-en være alt som ikke er i konflikt med TTY-enhetslinje-ID-ene.
(Tilbake i dagen da seriekoblede terminaler var nr rm, å få innstillingene til TTY-enheten riktig for terminalen i den andre enden av linjen, og tilbakestille terminalen til en kjent tilstand for pålogging var ikke trivielle oppgaver, siden det var mange konkurrerende terminaltypestandarder.)
Hvis du konfigurerer en inittab
linje for å kjøre et skript, kan du for eksempel se om en bestemt /dev/ttyX
virtuell konsoll enheten eksisterer. Hvis ikke, kan du bruke openvt -c X <command>
til å opprette den virtuelle konsollen og starte en kommando på den. Hvis den virtuelle konsollenheten allerede eksisterer, kan du ganske enkelt starte hvilken kommando du vil med standard inngang, utgang og feil omdirigert til den. Du kan for eksempel spesifisere en inittab-linje som denne:
6:345:respawn:/usr/local/sbin/myscript
og deretter /usr/local/sbin/myscript
med noe som dette ( ansvarsfraskrivelse: ikke testet, jeg har ikke et system med SysVinit for hånden akkurat nå, rediger gjerne 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 prosessen automatisk startes på nytt hvis den av en eller annen grunn dør. 345
er listen over SysVinit-løpsnivåer denne prosessen skal kjøres på. Hvis du trenger det for å kjøre på alle vanlige kjørenivåer, skriv inn 12345
.
Merk fungerer bare som ment hvis inittab-linjen er plassert etter sysinit
-linjen, så initialiseringen av udev
kan antas å være fullført. du vil gjøre dette tidlig i init-prosessen, må du kanskje ta vare på å lage de faktiske enhetsnodene for enheter som har drivere som allerede er lastet inn først; når udev
kjører, bør den opprette enhetsnoder automatisk når enhetsdrivere initialiseres.
Hvis du bruker en seriell port, vil openvt
-kommandoen vil ikke gjelde.
Så ja, du kan definitivt legge ved forskjellige kommandoer til forskjellige TTY-enheter. Det hjelper hvis kommandoene har innebygde fasiliteter for det som getty
gjør, men du kan også gjøre det med skripting.
(Hvis du setter opp noe mer komplisert enn en enkel tail -f
for permanent å se noen logg i en ellers ubrukt virtuell konsoll, bør du lese man setsid
og se om det er aktuelt for det du planlegger.)
Spørsmål 3:
Det er mer å initialisere en TTY-økt for en bestemt ikke-rotbruker enn bare å starte et skall med su
.
Feilmeldingene
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
er sannsynligvis forårsaket av at skallet er tilknyttet /dev/console
-enheten i stedet for en spesifikk TTY-enhet. Siden /dev/console
er bare et alias til hva som enn er den nåværende systemkonsollen, den vil ikke ha hele settet med TTY-kontroll ioctl-funksjoner tilgjengelig.
Hvis det ikke er noe påloggingsskript for å tildele en mer nyttig verdi til PS1
miljøvariabelen, vil standardmeldingen for /bin/sh
kan bare være sh-<version>$
.
Spørsmål 4:
Ja, det kan du. Du bør spesifisere det «siste skriptet» som en wait
-typelinje i inittab
, og plassere den før getty
linjen som tilsvarer din serielle linje.
Uten å vite mye mer om miljøet ditt, vil det være veldig vanskelig å si hvilken som ville være beste måten å opprette en bruker med lite privilegium til slike formål.
Kommentarer
Svar
-
Ja, forutsatt linjen får en unik identifikator og den konfigurerte terminalen er tilgjengelig:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
åpner en terminal på den serielle porten som er festet til
ttyS1
. -
Linjer i
inittab
er ikke sekvensielle, eller er relatert til pålogging. Hver linje beskriver en handling som skal utføres i et gitt sett med løpsnivåer. Dermed spesifiserersi::sysinit:/etc/init.d/rcS
atinit
skal kjøre/etc/init.d/rcS
når den håndterer systeminitialisering; dette skjer før pålogginger er mulig. (Seinittab(5)
manpage for detaljer).For å tildele forskjellige kommandoer til forskjellige
getty
s på bestemte terminaler, vil du konfigureregetty
selve innkallingen, for eksempel ved å endrelogin
programmet starter (-l
alternativet 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
kjører før pålogginger er mulige, og programmene den kjører er ikke koblet til en terminal («ordentlig», som er detgetty
gjør – det åpner terminalen for deg og kobler programmene den starter med den), så nårsu nobody -c /bin/sh
påkalles, shell finner ikke terminaloppsettet den forventer, og deaktiverer jobbkontroll som et resultat.sh-4.3$
-prompten er Bash 4.3s standardmelding når den kjøres som/bin/sh
. -
Hvis programmet bare skal kjøres når en bruker begynner å logge på, kan du koble det til påloggingssekvensen som brukes av
getty
; men et slikt program vil kjøre som rot. Avhengig av hva du er ute etter nøyaktig, vil du sannsynligvis være bedre å bruke en initscript i stedet for/etc/inittab
tilpasning, ellersudo
og shells oppstartsskript.
Kommentarer
- takk for reprisen. Kan jeg be om en smail-avklaring angående punkt 2? hvordan kan jeg redigere innloggingskommandoen for hver enkelt getty?
- Ferdig, se oppdateringen.
- takk! bare for å sjekke om jeg forsto riktig: Som standard kjører getty-prosessen kommandoen / bin / login som utfører prosessen som er ansvarlig for systeminnlogging. Nå vil getty kjøre en annen kommando, hver kommando jeg ‘ velger, og vil ikke ringe til systeminnloggingsprosessen som før … har jeg rett?
- Ja, det stemmer. Nøkkelen får
getty
til å åpne TTY for deg; dens normale oppførsel er å vente på et påloggingsnavn, og kjør deretterlogin
, koblet til TTY;login
venter på passordet, sjekker det og starter skallet, også koblet til TTY. Hvis du bytter utlogin
-delen, må du sørge for at erstatningsprogrammet ditt oppfører seg somlogin
. - For eksempel hvis jeg vil hoppe over påloggingsfasen – for å kunne åpne systemet mitt med rotbruker uten å oppgi noe brukernavn eller passord. Jeg kan bruke: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 eller å bruke: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 og inni skriptet i ‘ Vil du kjøre kommandoen – / bin / sh og andre?
Svar
Bare et sekund (langt!) svaret er lagt ut. Jeg må si at den første forklarer ganske bra. For øyeblikket vil jeg kommentere punkt tre: Det er mindre et spørsmål om timing, men om prosesser som styrer en «ekte virtuell» tty, og ikke bare en «console dummy».
Før du kan starte et skall «med jobbkontroll», må du sette opp, dvs. åpne et tynn. Den «generiske» kommandoen er getty
. Fra det tty-noe du får kan du starte et skall, ikke bare etter det.
Det er som å prøve å starte en vindusbehandling, og deretter xorg, i stedet for å «starte» dem sammen med xinit. Jeg tror. «sesjonsleder».
På grunn av
xx:12:...:program
og motsatt:
aa:1:...:pr_1 bb:1:...:pr_2
… du får en N: M-relasjon (du får også et rot hvis du misbruker – mange RL hver med mange forskjellige progs). Du kan gå langt med det, men siden forskjellige typer RC- «standarder» har tatt over. «Runcoms». Med dem ser inittab enkelt ut, men all kompleksiteten er i disse skriptene.
Men inittab-en din ser enkel og korrekt ut – bare den siste kommentaren og «z6» -oppføringen …
Kanskje din «su none» trenger bare en «getty … ttyN» før / rundt. su
i stedet for login
, og ingen respawn. Bør i det minste gi en annen feilmelding enn «upassende».
Konklusjon (etter å ha lest 2. svar): Du trenger ikke et komplisert init.d
system, den rå inittab er fleksibel nok. Bare må få konseptet og detaljene riktig.
Du kan sette opp tre runlevels: en med ttyNs, en med ttySN og en RL som starter begge. Det er en oppstartsparameter du kan legge til med boot loader. «5» i ditt tilfelle er bare standard. Du velger en kjerne, en root = og et nivå å starte i.
«Respawn» -handlingen er det sysvinit faktisk var / er nødvendig for Mye mer gjør det ikke, og mindre ville vært mulig å implementere i et skript. Men hvis du avslutter (eller krasjer) det «siste» skallnivået, trenger du et sikkerhetsnett.
sysvinit kan til og med oppdage en feilkonfigurasjon ved å feile «gyte for fort – ignorere i 5 minutter …».
getty
er en prosess; det du snakker om er en TTY-enhet . Kjernen åpnet den første for deg og for init-skriptene;/dev/console
er et alias til » den første TTY-enheten som ble åpnet og brukt av kjernen «. Hvis brukerkontoen din har tillatelser for lese- og skrivetilgang til en TTY-enhet, kan du bare begynne å bruke den (ingengetty
nødvendig), men det kan være lurt å stille inn TERM-variabel riktig:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
ellerTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
starter kommandoentop
på den 8. virtuelle konsollen eller den andre serielle porten.getty
-prosess, vil den gjøre et rot av inngangen & -utgangen, da de to prosessene vil kjempe for inngangen og deres utganger blir blandet sammen.getty
prosessene startes først etter at/etc/init.d/rc 5
og eventuelle skript som er startet av den er ferdig .