Ismerje meg az / etc / inittab
On február 12, 2021 by admin A következő /etc/inittab
fájlt (systemv) használom:
# /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
Annak érdekében, hogy megértsem, hogyan is működnek a dolgok, nagyra értékelem, ha az 1-3. válaszaival két helyzetet különböztetünk meg:
- Soros porton keresztül kapcsolódtam a rendszeremhez.
- Van “rendes” asztali számítógépem.
Kérdések:
-
Ha hozzáadok egy újabb getty sort, a linux indításakor két külön terminált fogok látni?
-
Ha több getty vonalat nyitok meg, akkor melyiket rendeltem hozzá A getty futtatja az
si::sysinit:/etc/init.d/rcS
parancsomat, és melyik getty futtatja a többi szkript parancsát (azokat, akik a rendszer futtatási szintjének megfelelően futtatnak szkripteket)más szavakkal: a
/etc/inittab
fájlban – tudok-e különféle parancsokat rendelni különböző gettekhez? (mármint azokhoz a terminálokhoz, amelyeket ezek a gettys nyit meg) -
az /etc/init.d/rc5 mappában található utolsó parancsfájl fut a következő parancs:
su nobody -c /bin/sh
és a kimenet:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Tehát igazoltam hogy senki nem vagyok, de miért írja az első két sort? az is, hogy miért a sh-4,3 $ parancs, és nem senki @ …
-
Soros kapcsolatot használok. Megváltoztathatom az / etc / inittab fájlt és az utolsó szkriptet amelyet az init futtat, hogy:
- futtasson egy programot a bejelentkezés előtt alacsony jogosultságú felhasználóként (az init folyamat várni fog a leállításra)
- amint a program kilép, megkapja a szabályos bejelentkezési értesítés a rendszeremhez
- mi a legjobb módja annak, hogy alacsony jogosultságú felhasználókat hozzunk létre, és engedjük, hogy az init folyamat alatt futtassa ezt a programot (ha nem akarom senki felhasználót használni)
Válasz
1. kérdés:
Igen, további getty
vonalakkal több terminált szerezhet párhuzamosan. Egyetlen termináleszközhöz egyszerre csak egy getty
társítható, így soros portonként csak egy getty
lehetséges. Egy rendes asztali PC-n a Linux kern számos virtuális konzolt határoz meg, amelyek a Control + Alt + FX billentyűkombinációk segítségével érhetők el. /dev/ttyX
eszközök (X = szám). A pontos beállítás változhat a disztribúciók között, de általában a mainstream disztribúcióknál az első 6 vagy úgy /dev/ttyX
eszköz getty
konfigurálva van, amikor a rendszer normálisan működik. Használhatja a openvt
és a deallocvt
parancsokat virtuális konzolok hozzáadásához vagy eltávolításához, valamint folyamatok indításához (amelyek bármilyen folyamatok lehetnek, nem feltétlenül getty
s) rajtuk.
/dev/tty0
különleges: arra a virtuális konzolra vonatkozik, amelyik jelenleg kiválasztott. Az /dev/console
hasonló speciális eszköz, amely arra mutat, hogy az elsődleges kernel szintű rendszerkonzolként definiált TTY-eszköz bárhová mutat. Asztali rendszereken alapértelmezés szerint a /dev/tty0
álnév, de a console=
rendszerindítási opcióval sorosra kapcsolhatjuk kikötő. A pl. néhány beágyazott architektúra alapértelmezés szerint soros port lehet. A xconsole
-hez hasonló segédprogramok további kimenetként is működhetnek az /dev/console
számára.
Akkor, amikor a számítógépek nagy többszekrényes dolgok voltak a dedikált számítógépes helyiségekben, az üzenet elküldése a /dev/console
címre az ügyeletes rendszerüzemeltető elérésének módja lett volna. fizikailag a számítógép közelében, ami hasznos lehetett pl szalagok vagy lemezcsomagok cseréje. A modern rendszereken a kifejezetten az /dev/console
címre küldött üzenetek rendszerint indító / leállító üzenetek, vagy esetleg egy utolsó lehetőség csatornája a sürgősségi riasztásokhoz olyan hibaállapotokról, amelyek hatással lehetnek a hálózati vagy a tárhely-hozzáférésre, vagy akár magában foglalja a rendszermag összeomlását: “a fizikai hardverért felelős személynek látnia kell ezt, és a szokásos naplófájlok valamilyen okból használhatatlanok.”
2. kérdés:
Attól tartok, hogy tévhited van itt. A sysinit
és más /etc/inittab
sorok nem társítva a egyáltalán feldolgozza. Az inittab
parancsból végrehajtott minden parancsnak, hacsak másképp nincs meghatározva, a normál bemeneti, kimeneti és hibafolyamok a /dev/console
.
A getty
sorok megadják az általuk használt TTY-eszközt és a getty
folyamatot beépített kóddal rendelkezik, amely hozzárendeli a TTY eszközt saját magukhoz és az összes gyermekfolyamatuk, hacsak / amíg a felhasználó nem futtat egy héjat, és nem úgy dönt, hogy az adatfolyamokat más módon irányítja át.Ez és a TTY eszköz beállításainak inicializálása a getty
“céljának legnagyobb része: /etc/issue
és a bejelentkezési parancs megjelenítése, a felhasználónév, a TERM környezeti változó beállítása és a TTY bejelentkezési folyamat következő lépésének megkezdése (általában /bin/login
, de testreszabható) gyakorlatilag csak kisebb részek.
Ne feledje, hogy ott olyan megállapodás, hogy a TTY eszközök esetében az inittab
sor első oszlopában szereplő két karakteres azonosító mezőnek meg kell egyeznie a szóban forgó TTY eszköz nevével a /dev/tty
előtag, így /dev/ttyS0
inittab sorazonosítót kap S0
és így tovább. egyáltalán nem feltétlenül kapcsolódik semmilyen TTY-hez (vagy szükség esetén csak sürgősségi dolgokat ad ki a / dev / console-ra), az azonosító bármi lehet, ami nem ütközik a TTY eszközsor-azonosítókkal.
(Vissza az a nap, amikor a soros csatlakozású terminálok nem voltak rm, a TTY eszköz beállításainak megszerzése a vonal másik végén lévő terminál számára, és a terminál visszaállítása ismert állapotba bejelentkezéshez nem triviális feladat, mivel sok versengő termináltípusú szabvány létezett.)
Ha egy inittab
sort konfigurál egy szkript futtatásához, akkor például megnézheti, hogy egy adott /dev/ttyX
virtuális konzol eszköz létezik. Ha nem, akkor a openvt -c X <command>
segítségével létrehozhatja a virtuális konzolt, és elindíthat rajta egy parancsot; ha a virtuális konzol eszköz már létezik, egyszerűen elindíthatja a kívánt parancsot a szokásos bemenettel, kimenettel és a hibával átirányítva. Például megadhat egy ilyen inittab sort:
6:345:respawn:/usr/local/sbin/myscript
, majd /usr/local/sbin/myscript
ilyesmivel ( felelősség kizárása: nincs tesztelve, jelenleg nincs kéznél egy olyan rendszerem, ahol SysVinit van, nyugodtan szerkesztheti, ha javítani tud rajta):
#!/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
a inittab
sorban biztosítja, hogy a folyamat automatikusan újrainduljon, ha bármilyen okból meghal. 345
a SysVinit futási szintjeinek listája, amelyen a folyamatnak futtatnia kell. Ha az összes szokásos futási szinten futtatni kell, írja be az 12345
parancsot.
Megjegyzés: csak akkor működik rendeltetésszerűen, ha az inittab sort a sysinit
sor után helyezzük el, így a udev
inicializálása teljesnek feltételezhető. ezt az init folyamat elején szeretné megtenni, előfordulhat, hogy gondoskodnia kell a tényleges eszközcsomópontok létrehozásáról azokhoz az eszközökhöz, amelyekhez az illesztőprogramok már korábban betöltődtek; amint a udev
fut, az eszközillesztőket az eszközillesztők inicializálásakor automatikusan létre kell hoznia.
Ha soros portot használ, akkor a openvt
parancs nem lesz érvényes.
Tehát igen, mindenképpen különböző parancsokat csatolhat különböző TTY eszközökhöz. Segít, ha a parancsok beépített létesítményekkel rendelkeznek ehhez hasonlóan, mint a getty
s, de megteheti a szkriptekkel is.
(Ha valami egyszerűbbet állít be, mint egy egyszerű tail -f
, hogy véglegesen megtekinthessen egy naplót egy egyébként nem használt virtuális konzolban, olvassa el a man setsid
és nézze meg, hogy alkalmazható-e arra, amit tervez.)
3. kérdés:
A TTY-munkamenet inicializálásánál még sok más van egy adott nem root felhasználó számára, csak ha egy shellt indítasz a su
paranccsal.
A hibaüzenetek
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
oka valószínűleg az, hogy a héjat a /dev/console
eszköz társítja, nem pedig egy adott TTY eszköz. Mivel az /dev/console
csak a jelenlegi konzol bármelyikének álneve, nem lesz elérhető a TTY vezérlő ioctl funkcióinak teljes sora.
Ha nincs bejelentkezési parancsfájl, amely hasznosabb értéket rendelne a PS1
környezeti változóhoz, akkor a /bin/sh
egyszerűen sh-<version>$
lehet.
4. kérdés:
Igen. Meg kell adnia az “utolsó szkriptet” wait
-típusú sorként a inittab
mezőben, és előtte kell elhelyeznie a soros vonalának megfelelő getty
sor.
Anélkül, hogy sokkal több részletet tudna a környezetéről, nagyon nehéz megmondani, melyik lenne a legjobb mód alacsony jogosultsággal rendelkező felhasználók létrehozására ilyen célokra.
Megjegyzések
Válasz
-
Igen, vállalva a sort egyedi azonosítót kap, és a konfigurált terminál elérhető:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
terminált nyit meg az
ttyS1
. -
Az
inittab
sorok nem egymás utániak, vagy nem kapcsolódnak bejelentkezéshez. Minden sor egy futási szintek adott halmazában végrehajtandó műveletet ír le. Így azsi::sysinit:/etc/init.d/rcS
meghatározza, hogyinit
futtatnia kell/etc/init.d/rcS
, amikor kezeli a rendszer inicializálását; ez még a bejelentkezés lehetősége előtt megtörténik. (A részletekért lásd: ainittab(5)
manapot .Különböző parancsok hozzárendelése különböző
getty
s meghatározott terminálokon konfigurálja magát agetty
meghívást, például alogin
program elindul (a-l
opció a legtöbbgetty
megvalósításban):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
-
iv
/etc/init.d/rc 5
még a bejelentkezés lehetséges futtatása előtt fut, és az általa futtatott programok nincsenek csatlakoztatva egy terminálhoz („megfelelően”, ami az, amitgetty
tesz – megnyílik a terminál az Ön számára és összekapcsolja az elindított programokat hozzá), tehát amikorsu nobody -c /bin/sh
meghívásra kerül, A shell nem találja meg a várt terminálbeállítást, és ennek következtében letiltja a munka vezérlését. Ash-4.3$
prompt a Bash 4.3 alapértelmezett promptja, amikor/bin/sh
néven fut. -
Ha a programodnak csak akkor szabad futtatnia, ha a felhasználó elkezd bejelentkezni, akkor bekapcsolhatja a
getty
által használt bejelentkezési sorrendbe; de egy ilyen program rootként futna. Attól függően, hogy pontosan mire vágyik, valószínűleg jobban járna, ha/etc/inittab
testreszabás, vagysudo
helyett inkább egy initscriptet használna. shell indító szkriptjei.
Megjegyzések
- köszönöm az ismétlést. Kérhetek smailes magyarázatot a 2. sec-vel kapcsolatban? hogyan szerkeszthetem a bejelentkezési parancsot minden egyes gettyhez?
- Kész, lásd a frissítést.
- köszönöm! csak azért, hogy ellenőrizzem, jól értettem-e: alapértelmezés szerint a getty folyamat futtatja a / bin / login parancsot, amely végrehajtja a rendszer bejelentkezéséért felelős folyamatot. Most a getty egy másik parancsot fog futtatni, minden olyan parancsot, amelyet ‘ választok, és nem hívja meg a rendszer bejelentkezési folyamatát, mint korábban … igazam van?
- Igen, ez így van. A legfontosabb, hogy
getty
megnyissa a TTY-t az Ön számára; szokásos viselkedése az, hogy megvárja a bejelentkezési nevet, majd lefuttatja a TTY-hez csatlakozólogin
parancsot;login
megvárja a jelszót, ellenőrzi és elindítja a héjat, szintén a TTY-hez csatlakozva. Ha lecseréli alogin
részt, meg kell győződnie arról, hogy a helyettesítő program úgy viselkedik, mint alogin
. - Például, ha át akarom hagyni a bejelentkezési fázist – annak érdekében, hogy felhasználónevem vagy jelszavam beírása nélkül nyithassam meg a rendszeremet root felhasználóval. Használhatom: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 vagy használhatom: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 és belül a szkript i ‘ futtatom a – / bin / sh és más parancsokat?
Válasz
Csak egy pillanat (hosszú!) választ elküldtük. Azt kell mondanom, hogy az első elég jól magyaráz. Jelenleg a harmadik ponthoz szeretnék hozzászólni: Ez kevésbé az időzítés kérdése, hanem egy “valódi virtuális” tty-t irányító folyamatok kérdése, és nem csak egy “konzolos próbabábu”.
Mielőtt elindítaná a shell-t “job control” -val, be kell állítania, vagyis meg kell nyitnia egy ttyN-t. Az “általános” parancs getty
. Ebből a tty-valamiből elindíthat egy héjat, nemcsak utána .
Olyan ez, mintha először megpróbálnánk elindítani az ablakkezelőt, majd az xorg-ot, ahelyett, hogy az “xinit” -nel együtt “elindítanánk” őket. Gondolom. “munkamenet-vezető”.
A
xx:12:...:program
és ezzel ellentétben:
… kapsz egy N: M relációt (akkor is rendetlenséget kapsz, ha visszaélsz – sok RL sokféle progival). Ezzel messzire el lehet jutni, de mióta az RC-szabványok különféle típusai vették át az irányítást. “Runcoms”. Velük az inittab egyszerűnek tűnik, de ezek a szkriptek nagyon összetettek.
De az inittab egyszerűnek és helyesnek tűnik – csak az utolsó megjegyzés és a “z6” bejegyzés …
Lehet, hogy a “su senkinek” csak egy “getty … ttyN” kell előtte / körül. su
a login
helyett, és nincs újrakezdés. Legalább egy másik hibaüzenetet kell adnia, mint a “nem megfelelő”.
Következtetés (a 2. válasz elolvasása után): Nincs szüksége bonyolult init.d
rendszerre, a nyers inittab elég rugalmas. Csak meg kell szereznie a koncepció és a részletek jobbak.
Három futási szintet állíthat be: egyet ttyNs-el, egyet ttySN-el és egy RL-t, amely mindkettőt elindítja. Ez egy indítóparaméter, amelyet hozzáadhat a boot loader-hez. Az “5” az Ön esetében csak az alapértelmezett. Kiválaszthatja a rendszermagot, a root = és a futási szintet.
A “respawn” művelet az, amire a sysvinit valójában szükség volt / van Sokkal többet nem tesz, és kevesebbet lehetett volna végrehajtani egy szkriptben. De ha kilép (vagy összeomlik) az “utolsó” héjszintről, akkor biztonsági hálóra van szüksége.
A sysvinit képes még egy hibás beállítást is észlelhet, ha hibát okoz a “túl gyors ívás – 5 percig figyelmen kívül hagyva …”.
getty
egy folyamat; amiről beszélsz, az egy TTY eszköz . A kernel megnyitotta az elsőt az Ön és az init szkriptek számára; A/dev/console
egy álnév ” az első TTY eszköz, amelyet a kernel megnyitott és használt “. Ha felhasználói fiókja rendelkezik az olvasási és írási hozzáférési jogosultságokkal egy TTY eszközhöz, akkor csak elkezdheti használni (nincsgetty
szükség), de célszerű lehet beállítani a A TERM változó helyesen:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
vagyTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
elindítja atop
parancsot a 8. virtuális konzolon vagy a 2. soros port.getty
folyamat, az rendetlenséget okoz. a bemenet & kimenet, mivel a két folyamat harcolni fog az inputért, és kimeneteik összekeverednek. Agetty
folyamatok csak azután indulnak el, hogy a/etc/init.d/rc 5
és az általa elindított szkriptek elkészültek .