Linux bruker en spesiell oppstartsfunksjon kalt SysVinit som er basert på konseptet kjørenivåer. Det kan være ganske forskjellig fra et system til et annet, så det kan ikke antas at fordi ting fungerte i en spesiell Linux distribusjon, bør de fungere på samme måte i LFS også. LFS har sin egen måte å gjøre ting på, men den respekterer allment aksepterte standarder.
SysVinit (som vil bli referert til som “init” fra nå
av) fungerer ved å bruke en kjørenivåordning. Det er syv (nummerert
0 til 6) kjørenivåer (faktisk er det flere kjørenivåer, men de er
for spesielle tilfeller og er vanligvis ikke brukt. Se init(8)
for flere detaljer), og hver av disse
tilsvarer handlingene datamaskinen skal utføre når den starter opp.
Standard kjørenivå er 3. Her er beskrivelser av de ulike
kjørenivåene etter hvert som de implementeres:
0: stopper datamaskinen
1: enkeltbrukermodus
2: flerbrukermodus uten nettverk
3: flerbrukermodus med nettverk
4: reservert for tilpasning, ellers gjør den det samme som 3
5: samme som 4, den brukes vanligvis for GUI pålogging (som X sin xdm eller KDE sin kdm)
6: starter datamaskinen på nytt
Under kjerneinitialiseringen, det første programmet som kjøres er
enten spesifisert på kommandolinjen eller som standard init. Dette programmet leser
initialiseringsfilen /etc/inittab
.
Opprette denne filen med:
cat > /etc/inittab << "EOF"
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc S
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty --noclear tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
EOF
En forklaring av denne initialiseringsfilen er på man siden for
inittab. For LFS er
nøkkelkommandoen som kjøres rc. Initialiseringsfilen ovenfor
vil instruere rc å
kjøre alle skriptene som starter med en S i /etc/rc.d/rcS.d
mappen etterfulgt av alle
skriptene som begynner med en S i /etc/rc.d/rc?.d
mappen hvor spørsmålstegnet er
spesifisert av initdefault verdien.
Som en bekvemmelighet rc skriptet leser et bibliotek av
funksjoner i /lib/lsb/init-functions
.
Dette biblioteket leser også en valgfri konfigurasjonsfil,
/etc/sysconfig/rc.site
. Hvilket som
helst av systemets konfigurasjonsfilparametere beskrevet i
påfølgende avsnitt kan være alternativt plassert i denne filen som
tillater konsolidering av alle systemets parametere i denne ene
filen.
Som en bekvemmelighet for feilsøking logger funksjonsskriptet også
all utdata til /run/var/bootlog
.
Siden /run
mappen er en tmpfs, er
denne filen ikke vedvarende på tvers av oppstarter, men den er lagt
til den mer permanente filen /var/log/boot.log
på slutten av
oppstartsprosessen.
Endring av kjørenivåer er gjort med init <runlevel>
,
hvor <runlevel>
er målet for kjørenivå. For eksempel for å starte datamaskinen på
nytt, kan en bruker utstede init
6 kommandoen, som er et alias for reboot kommandoen. Likeså er,
init 0 er et alias
for halt
kommandoen.
Det er en rekke mapper under /etc/rc.d
som ser ut som rc?.d
(hvor ? er nummeret på kjørenivået) og
rcsysinit.d
, alle inneholder en
rekke symbolske lenker. Noen begynner med en K, de andre begynner med en
S, og alle av dem har to
tall etter forbokstaven. K betyr å stoppe (drepe) en tjeneste og
S betyr å starte en tjeneste. Tallene bestemmer rekkefølgen
skriptene kjøres i, fra 00 til 99—jo lavere tall, desto
tidligere blir det utført. Når init bytter til et annet
kjørenivå, de aktuelle tjenestene er enten startet eller stoppet,
avhengig av valgt kjørenivå.
De virkelige skriptene er i /etc/rc.d/init.d
. De gjør selve jobben, og alle
symbolkoblingene peker til dem. K-lenker og S-lenker peker på
samme skript i /etc/rc.d/init.d
.
Dette er fordi skriptene kan kalles med forskjellige parametere
som start
, stop
, restart
, reload
, og status
. Når en K-lenke oppstår, det
aktuelle skriptet kjøres med stop
argumentet. Når en S-kobling
oppstår, kjøres det riktige skriptet med start
argumentet.
Det er ett unntak fra denne forklaringen. Lenker som starter med
en S i rc0.d
og rc6.d
kataloger vil ikke få noe til å starte. De vil bli kalt opp med
parameteren stop
for å
stoppe noe. Logikken bak dette er at når en bruker skal starte på
nytt eller stoppe systemet, ingenting må startes. Systemet må
bare stoppes.
Dette er beskrivelser av hva argumentene får skriptene til å gjøre:
start
Tjenesten blir startet.
stop
Tjenesten blir stoppet.
restart
Tjenesten stoppes og startes deretter på nytt.
reload
Konfigurasjonen av tjenesten er oppdatert. Dette brukes etter at konfigurasjonsfilen til en tjeneste ble endret, når tjenesten ikke trenger å startes på nytt.
status
Forteller om tjenesten kjører og med hvilke PID-er.
Du kan gjerne endre måten oppstartsprosessen fungerer på (tross alt, det er ditt eget LFSsystem). Filene gitt her er et eksempel på hvordan det kan gjøres.
/etc/rc.d/init.d/udev
initskriptet
starter udevd,
trigger alle "coldplug"-enheter som allerede er opprettet av
kjernen og venter på at eventuelle regler skal fullføres. Skriptet
fjerner også uevent behandleren fra standarden på /sbin/hotplug
. Dette gjøres fordi kjernen ikke
lenger trenger å kalle en ekstern binær. I stedet vil udevd lytte på en netlink socket
for uevents som kjernen løfter.
/etc/rc.d/init.d/udev_retry
initskriptet tar kontroll for å utløse hendelser på nytt for
undersystemer, som reglene kan stole på, for filsystemer som ikke
er montert før mountfs skriptet kjøres
(spesielt, /usr
og /var
kan forårsake dette). Dette skriptet kjører
etter mountfs
skriptet, så de reglene (hvis de utløses på nytt) bør lykkes andre
gang. De er konfigurert fra /etc/sysconfig/udev_retry
filen; alle andre ord i
denne filen enn kommentarer regnes som undersystemnavn for å
utløses ved nytt forsøk. For å finne delsystemet til en enhet, bruk
udevadm info --attribute-walk
<device> hvor <device> er en absolutt
sti i /dev eller /sys som f.eks /dev/sr0 eller /sys/class/rtc.
For informasjon om lasting av kjernemoduler og udev, se Section 9.3.2.3, “Modul lasting”.
setclock skriptet
leser tiden fra maskinvare klokken, også kjent som BIOS eller
Complementary Metal Oxide Semiconductor (CMOS) klokke. Hvis
maskinvareklokken er satt til UTC, vil dette skriptet konvertere
maskinvareklokkens tid til lokal tid ved å bruke /etc/localtime
filen (som forteller hwclock programmet hvilken
tidssone som skal brukes). Det er ingen måte å oppdage om
maskinvareklokken er satt til UTC eller ikke, så dette må
konfigureres manuelt.
setclock programmet kjøres via udev når kjernen oppdager maskinvare kapasiteten ved oppstart. Den kan også kjøres manuelt med stop parameteren til å lagre systemtiden til CMOS-klokken.
Hvis du ikke husker om maskinvareklokken er satt til UTC eller
ikke, finn ut ved å kjøre hwclock
--localtime --show
kommandoen. Dette vil vise hva
gjeldende tid er i henhold til maskinvare klokken. Hvis denne tiden
samsvarer med hva klokken din sier, er maskinvareklokken satt til
lokal tid. Hvis utdataen fra hwclock ikke er lokal tid,
sjansen er stor for at den er satt til UTC-tid. Bekreft dette ved å
legge til eller trekke fra riktig antall timer for tidssonen til
tiden vist av hwclock. For eksempel, hvis du
for øyeblikket er i MST tidssonen, som også er kjent som GMT -0700,
legg til syv timer til din lokale tid.
Endre verdien på UTC
variabelen nedenfor
til verdien 0
(null) hvis
maskinvareklokken IKKE er
satt til UTC-tid.
Opprett en ny fil /etc/sysconfig/clock
ved å kjøre følgende:
cat > /etc/sysconfig/clock << "EOF"
# Begin /etc/sysconfig/clock
UTC=1
# Set this to any options you might need to give to hwclock,
# such as machine hardware clock type for Alphas.
CLOCKPARAMS=
# End /etc/sysconfig/clock
EOF
Et godt hint som forklarer hvordan man skal håndtere tid på LFS er
tilgjengelig på https://www.linuxfromscratch.org/hints/downloads/files/time.txt.
Den forklarer problemstillinger som f.eks tidssoner, UTC og
TZ
miljøvariabelen.
Parameterne CLOCKPARAMS og UTC kan også angis i /etc/sysconfig/rc.site
filen.
Denne delen diskuterer hvordan du konfigurerer console oppstartsskriptet som
setter opp tastaturkartet, konsollfonten og konsollkjerneloggens
nivå. Hvis ikke-ASCII-tegn (f.eks. copyright-tegnet, britiske pund
tegn og eurosymbol) ikke vil bli brukt, og tastaturet er et
amerikansk, mye av denne delen kan hoppes over. Uten
konfigurasjonsfilen, (eller tilsvarende innstillinger i
rc.site
), console oppstartsskriptet vil
ikke gjøre noe.
console skriptet
leser /etc/sysconfig/console
filen
for konfigurasjons informasjon. Bestem hvilket tastatur og
skjermskrift som skal brukes. Diverse språkspesifikke HOWTOer kan
også hjelpe med dette, se http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html.
Hvis du fortsatt er i tvil, se i /usr/share/keymaps
og /usr/share/consolefonts
mappene for gyldige
tastaturer og skjermfonter. Les loadkeys(1)
og setfont(8)
manualsider for å finne de riktige
argumenter for disse programmene.
/etc/sysconfig/console
filen skal
inneholde linjer av formen: VARIABLE="verdi". Følgende variabler
gjenkjennes:
Denne variabelen spesifiserer loggnivået for kjernemeldinger som sendes til konsollen som angitt av dmesg -n. Gyldige nivåer er fra "1" (ingen meldinger) til "8". Standardnivået er "7".
Denne variabelen spesifiserer argumentene for loadkeys programmet, vanligvis navnet på tastaturet å laste, f.eks., “it”. Hvis denne variabelen ikke er satt, vil oppstartsskriptet ikke kjøre loadkeys programmet, og standard kjernetastatur vil bli brukt. Merk at noen få tastaturer har flere versjoner med samme navn (cz og dens varianter i qwerty/ og qwertz/, es i olpc/ og qwerty/, og trf i fgGIod/ og qwerty/). I disse tilfellene bør også overordnet mappe spesifisere (f.eks. qwerty/es) for å sikre at det riktige tastaturet er lastet.
Denne (sjelden brukte) variabelen spesifiserer argumentene for det andre kallet til loadkeys programmet. Dette er nyttig hvis keymap ikke helt er tilfredsstillende og en liten justering må gjøres. f.eks. å inkludere eurotegnet i et tastatur som vanligvis ikke har det, sett denne variabelen til “euro2”.
Denne variabelen spesifiserer argumentene for setfont programmet. Vanligvis inkluderer dette fontnavnet, “-m”, og navnet på programtegnkartet som skal lastes. For eksempel for å laste inn “lat1-16” fonten sammen med “8859-1” applikasjonskartet (som er det passende i USA), sett denne variabelen til “lat1-16 -m 8859-1”. I UTF-8 modus bruker kjernen applikasjonens tegnkart for konvertering av sammensatte 8-bits nøkkelkoder i keymap til UTF-8, og dermed argumentet til parameteren "-m" bør settes til kodingen av komponerte nøkkelkoder i nøkkelkartet.
Sett denne variabelen til “1”, “yes” eller “true” for å sette konsollen til UTF-8 modus. Dette er nyttig i UTF-8 baserte lokaliteter og skadelig ellers.
For mange tastaturoppsett er det ikke noe Unicode-tastatur i Kbd pakken. console oppstartsskriptet vil konverter et tilgjengelig nøkkelkart til UTF-8 umiddelbart hvis denne variabelen er satt til kodingen av det tilgjengelige tastaturet som ikke er UTF-8.
Noen eksempler:
For et ikke-Unicode oppsett er bare KEYMAP- og FONT-variablene generelt nødvendige. For eksempel for et polsk oppsett, ville man bruke:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="pl2"
FONT="lat2a-16 -m 8859-2"
# End /etc/sysconfig/console
EOF
Som nevnt ovenfor er det noen ganger nødvendig å justere et tastaturoppsett litt. Følgende eksempel legger til Euro-symbolet til Tysk tastaturkart:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
FONT="lat0-16 -m 8859-15"
UNICODE="1"
# End /etc/sysconfig/console
EOF
Følgende er et Unicode-aktivert eksempel for bulgarsk, hvor en UTF-8 keymap finnes:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="LatArCyrHeb-16"
# End /etc/sysconfig/console
EOF
På grunn av bruken av en 512-glyph LatArCyrHeb-16 font i forrige eksempel, lyse farger er ikke lenger tilgjengelig på Linux konsollen med mindre en rammebuffer brukes. Hvis man ønsker å ha lyse farger uten en rammebuffer og kan leve uten karakterer som ikke tilhører språket hans, er det fortsatt mulig å bruke en språkspesifikk font med 256 glyffer, som illustrert nedenfor:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="bg_bds-utf8"
FONT="cyr-sun16"
# End /etc/sysconfig/console
EOF
Følgende eksempel illustrerer tastaturets autokonvertering fra ISO-8859-15 til UTF-8 og aktivering av døde nøkler i Unicode-modus:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
KEYMAP="de-latin1"
KEYMAP_CORRECTIONS="euro2"
LEGACY_CHARSET="iso-8859-15"
FONT="LatArCyrHeb-16 -m 8859-15"
# End /etc/sysconfig/console
EOF
Noen keymaps har døde taster (dvs. taster som ikke produserer en karakter av seg selv, men legger en aksent på karakteren som er produsert ved neste nøkkel) eller definer komposisjonsregler (som f.eks: “press Ctrl+. A E for å hente Æ” i standard tastaturoppsett). Linux-5.16.9 tolker døde taster og komposisjonsregler i keymap riktig bare når kildetegnene som skal komponeres sammen ikke er multibyte. Denne mangelen påvirker ikke tastaturkart for europeiske språk, fordi aksenter legges til ASCII uten aksent tegn, eller to ASCII-tegn er satt sammen. Imidlertid, i UTF-8-modus er det et problem; f.eks. for det greske språket, hvor man noen ganger trenger å sette en aksent på bokstaven “alpha”. Løsningen er enten å unngå bruk av UTF-8, eller å installere X-vindussystemet som ikke har denne begrensningen i inndata håndtering.
For kinesisk, japansk, koreansk og noen andre språk, Linux konsollen kan ikke konfigureres til å vise de nødvendige tegnene. Brukere som trenger slike språk bør installere et X Window System, fonter som dekker de nødvendige tegnområdene og den riktige inndatametoden (f.eks. SCIM, støtter et bredt utvalg av språk).
/etc/sysconfig/console
filen
kontroller kun lokaliseringen av Linux-tekstkonsollen. Det har
ingenting med innstilling å gjøre riktig tastaturoppsett og
terminalfonter i X Window System, med ssh økter, eller med en
seriell konsoll. I slike situasjoner, begrensninger nevnt i de to
siste listepunktene ovenfor gjelder ikke.
Noen ganger er det ønskelig å lage filer ved oppstart. For
eksempel, /tmp/.ICE-unix
mappen er
ofte nødvendig. Dette kan gjøres ved å opprette en oppføring i
/etc/sysconfig/createfiles
konfigurasjonsskriptet. Formatet til denne filen er innebygd i
kommentarene til standard konfigurasjonsfil.
sysklogd
skriptet starter
syslogd programmet
som en del av System V initialisering. -m 0
alternativet slår av det
periodiske tidsstempelet syslogd skriver til loggfilene
hvert 20. minutt som standard. Hvis du vil slå på dette periodiske
tidsstempelmerket, rediger /etc/sysconfig/rc.site
og definere variabelen
SYSKLOGD_PARMS til ønsket verdi. For å fjerne alle parametere, sett
variabelen til en nullverdi:
SYSKLOGD_PARMS=
Se man syslogd
for
flere alternativer.
Den valgfrie /etc/sysconfig/rc.site
filen inneholder innstillinger som angis automatisk for hvert
SystemV oppstartsskript. Det kan alternativt angi verdiene
spesifisert i hostname
, console
, og clock
filer i /etc/sysconfig/
mappen. Hvis
tilknyttede variabler er til stede i begge disse separate filene og
rc.site
, verdiene i de
skriptspesifikke filene har presedens.
rc.site
inneholder også parametere
som kan tilpasse andre aspekter av oppstartsprosessen. Stille inn
IPROMPT variabelen vil aktivere selektiv kjøring av
oppstartsskript. Andre alternativer er beskrevet i filkommentarene.
Standardversjonen av filen er som følger:
# rc.site # Optional parameters for boot scripts. # Distro Information # These values, if specified here, override the defaults #DISTRO="Linux From Scratch" # The distro name #DISTRO_CONTACT="lfs-dev@linuxfromscratch.org" # Bug report address #DISTRO_MINI="LFS" # Short name used in filenames for distro config # Define custom colors used in messages printed to the screen # Please consult `man console_codes` for more information # under the "ECMA-48 Set Graphics Rendition" section # # Warning: when switching from a 8bit to a 9bit font, # the linux console will reinterpret the bold (1;) to # the top 256 glyphs of the 9bit font. This does # not affect framebuffer consoles # These values, if specified here, override the defaults #BRACKET="\\033[1;34m" # Blue #FAILURE="\\033[1;31m" # Red #INFO="\\033[1;36m" # Cyan #NORMAL="\\033[0;39m" # Grey #SUCCESS="\\033[1;32m" # Green #WARNING="\\033[1;33m" # Yellow # Use a colored prefix # These values, if specified here, override the defaults #BMPREFIX=" " #SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " #FAILURE_PREFIX="${FAILURE}*****${NORMAL} " #WARNING_PREFIX="${WARNING} *** ${NORMAL} " # Manually seet the right edge of message output (characters) # Useful when resetting console font during boot to override # automatic screen width detection #COLUMNS=120 # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot prompt #itime="3" # The amount of time (in seconds) to display the prompt # The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Write out fsck progress if yes #VERBOSE_FSCK=no # Speed up boot without waiting for settle in udev #OMIT_UDEV_SETTLE=y # Speed up boot without waiting for settle in udev_retry #OMIT_UDEV_RETRY_SETTLE=yes # Skip cleaning /tmp if yes #SKIPTMPCLEAN=no # For setclock #UTC=1 #CLOCKPARAMS= # For consolelog (Note that the default, 7=debug, is noisy) #LOGLEVEL=7 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET=
LFS oppstartsskriptene starter opp og slår av et system på en
rimelig effektiv måte, men det er noen få justeringer du kan
gjøre i rc.site filen for å forbedre hastigheten enda mer og for
å justere meldinger i henhold til til dine preferanser. For å
gjøre dette, juster innstillingene i /etc/sysconfig/rc.site
filen ovenfor.
Under oppstartsskriptet udev
,
det er et kall til udev
settle som krever litt tid for å fullføres.
Denne tiden kan være nødvendig eller ikke, avhengig av
tilstedeværende enheter i systemet. Hvis du bare har enkle
partisjoner og et enkelt ethernet kort, vil
oppstartsprosessen sannsynligvis ikke trenge å vente på
denne kommandoen. For å hopp over det, sett variabelen
OMIT_UDEV_SETTLE=y.
Oppstartsskriptet udev_retry
kjører også udev
settle som standard. Denne kommandoen er
kun nødvendig som standard hvis /var
mappen er separat montert. Dette er
fordi klokken trenger filen /var/lib/hwclock/adjtime
. Andre
tilpasninger kan også må vente på at udev skal fullføres,
men i mange installasjoner er det ikke behov for det. Hopp
over kommandoen ved å sette variabelen
OMIT_UDEV_RETRY_SETTLE=y.
Som standard er filsystemkontrollene stille. Dette kan se ut til å være en forsinkelse under oppstartsprosessen. For å slå på fsck utdata, sett variabelen VERBOSE_FSCK=y.
Ved omstart kan det være lurt å hoppe over
filsystemkontrollen, fsck, helt. For å gjøre
dette, opprett enten filen /fastboot
eller start systemet på nytt
med kommandoen /sbin/shutdown
-f -r now. På den annen side kan du tvinge
alle filsystemer til å bli kontrollert ved å opprette
/forcefsck
eller kjøre
shutdown med
-F
parameter i
stedet for -f
.
Sette variabelen FASTBOOT=y vil deaktivere fsck under oppstartsprosessen til den fjernes. Dette anbefales ikke på permanent basis.
Normalt slettes alle filene i /tmp
mappen ved oppstart. Avhengig av
antall filer eller mapper som er tilstede, kan dette føre
til en merkbar forsinkelse i oppstartsprosessen. For å
hoppe over å fjerne disse filene, sett inn variabelen
SKIPTMPCLEAN=y.
Under avstengning, init programmet sender et TERM signal til hvert program det har startet (f.eks. agetty), venter på en tid (standard 3 sekunder), og sender hver prosess et KILL signal og venter en gang til. Denne prosessen gjentas i sendsignals skript for alle prosesser som ikke stenges av deres egne skript. Forsinkelse for init kan stilles inn ved å sende en parameter. For eksempel for å fjerne forsinkelsen i init, passerer -t0 parameter når du slår av eller starter på nytt (f.eks. /sbin/shutdown -t0 -r now). Forsinkelsen for sendsignals skriptet kan hoppes over ved å sette parameteren KILLDELAY=0.