Detaljer om denne pakken finner du i avsnitt Section 8.18.2, “Innhold i Binutils.”
Copyright © 1999-2022 Gerard Beekmans
Opphavsrett © 1999-2022, Gerard Beekmans
Alle rettigheter forbeholdt.
Denne boken er lisensiert under Creative Commons License.
Datainstruksjoner kan trekkes ut fra boken under MIT License.
Linux® er et registrert varemerke for Linus Torvalds.
Min reise for å lære og bedre forstå Linux begynte tilbake i 1998. Jeg hadde nettopp installert min første Linux-distribusjon og hadde raskt blitt fascinert av hele konseptet og filosofien bak Linux.
Det er alltid mange måter å utføre en enkelt oppgave på. Det samme kan sies om Linux-distribusjoner. Svært mange har eksistert opp gjennom årene. Noen eksisterer fortsatt, noen har forvandlet seg til noe annet, mens andre har blitt henvist til våre minner. De gjør alle ting annerledes for å passe behovene til deres målgruppe. Fordi det eksisterer så mange forskjellige måter å oppnå det samme sluttmålet , begynte jeg å innse at jeg ikke lenger måtte være begrenset av noen gjennomføring. Før vi oppdaget Linux, stilte vi rett og slett opp med problemer i andre operativsystemer siden du ikke hadde noe valg. Det var hva det var, enten du likte det eller ikke. Med Linux begynte konseptet med valg å dukke opp. Hvis du ikke likte noe, du var fri, til og med oppmuntret, til å endre det.
Jeg prøvde en rekke distribusjoner og kunne ikke bestemme meg for noen. De var flotte systemer i seg selv. Det var ikke et spørsmål om rett og feil lenger. Det var blitt et spørsmål om personlig smak. Med allle de valgene tilgjengelig, ble det klart at det ikke ville være en eneste system som ville være perfekt for meg. Så jeg satte meg for å lage min egen Linux system som fullt ut samsvarer med mine personlige preferanser.
For å virkelig gjøre det til mitt eget system, bestemte jeg meg for å kompilere alt fra kildekode i stedet for å bruke forhåndskompilerte binære pakker. Dette “perfekt” Linux-system vil ha styrken til forskjellige systemer uten deres opplevde svakheter. Først var tanken snarere skremmende. Jeg forble forpliktet til ideen om at et slikt system kunne bli bygget.
Etter å ha sortert gjennom problemer som sirkulære avhengigheter og kompileringsfeil , bygget jeg endelig et spesialbygd Linux-system. Det var fullt operativ og perfekt brukbart som alle andre Linux-systemer ute der på den tiden. Men det var min egen skapelse. Det var veldig tilfredsstillende å har satt sammen et slikt system selv. Det eneste bedre ville ha vært å lage hvert stykke programvare selv. Dette var det nest beste .
Da jeg delte mine mål og erfaringer med andre medlemmer av Linux samfunnet, ble det tydelig at det var en vedvarende interesse for disse ideer. Det ble raskt klart at slike spesialbygde Linux-systemer tjener ikke bare for å møte brukerspesifikke krav, men også tjene som en ideell læringsmulighet for programmerere og systemadministratorer forbedre deres (eksisterende) Linux-ferdigheter. Ut fra denne utvidede interessen Linux From Scratch Project ble født.
Denne Linux From Scratch boken er den sentrale kjernen rundt det prosjektet. Den gir bakgrunnen og instruksjonene som er nødvendige for deg å designe og bygge ditt eget system. Mens denne boken gir en mal som vil resultere i et korrekt fungerende system står du fritt til å endre instruksjonene til å passer deg selv, som delvis er en viktig del av dette prosjektet. Du forblir i kontroll; vi gir bare en hjelpende hånd for å komme i gang på din egen reise.
Jeg håper inderlig at du vil ha en flott tid med å jobbe med din egen Linux From Scratch system og nyte de mange fordelene ved å ha et system som er virkelig din egen.
--
Gerard Beekmans
gerard AT linuxfromscratch D0T org
Det er mange grunner til at du ønsker å lese denne boken. Et av spørsmålene mange spørrer seg er, “hvorfor gå gjennom alt bryet med å manuelt bygge et Linux system fra bunnen av når du bare kan laste ned og installere en eksisterende?”
En viktig grunn til dette prosjektets eksistens er å hjelpe deg med å lære hvordan et Linux system fungerer fra innsiden og ut. Å bygge et LFS system hjelper å demonstrere hva som får Linux til å virke, og hvordan ting fungerer sammen og avhenger av hverandre. Noe av det beste denne læringsopplevelsen kan gi er muligheten til å tilpasse et Linux system for å passe dine egne unike behov.
En annen viktig fordel med LFS er at den lar deg ha mer kontroll over systemet uten å stole på andres Linux implementering. Med LFS, du er i førersetet og dikterer alle aspekter av systemet.
LFS lar deg lage svært kompakte Linux systemer. Ved installasjon av vanlige distribusjoner, blir du ofte tvunget til å installere svært mange programmer som sannsynligvis aldri blir brukt eller forstått. Disse programmene sløser ressurser. Du kan hevde at det med dagens harddisk og CPUer, f.eks ressurser er ikke lenger en vurdering. Noen ganger er du imidlertid fortsatt begrenset av størrelseshensyn om ikke annet. Tenk på oppstartbar CDer, USB-pinner og innebygde systemer. Det er områder hvor LFS kan være gunstig.
En annen fordel med et spesialbygd Linux system er sikkerhet. Ved å kompilere hele systemet fra kildekoden, har du fullmakt til å revidere alt og bruk alle sikkerhetsoppdateringene du ønsker. Det er ikke lenger nødvendig å vente på at noen andre skal kompilere binære pakker som fikser et sikkerhetshull. Med mindre du undersøker oppdateringen og implementerer den selv, har du ingen garantier på at den nye binære pakken ble bygget riktig og løser pråblemet tilstrekkelig.
Målet med Linux From Scratch er å bygge en komplett og brukbart system på fundamentnivå. Hvis du ikke ønsker å bygge ditt eget Linux system fra bunnen av kan du likevel ha nytte av informasjonen i denne boken.
Det er for mange andre gode grunner til å bygge ditt eget LFS-system til liste dem alle her. Til syvende og sist er utdanning den desidert mest kraftfulle av grunner. Når du fortsetter i LFS-opplevelsen din, vil du oppdage kraften som informasjon og kunnskap virkelig gir.
Det primære målarkitekturene til LFS er AMD/Intel x86 (32-bit) og x86_64 (64-bit) CPUer. På den annen side er instruksjonene i denne boken også kjent for å fungere, med noen modifikasjoner, med Power PC og ARM CPUer. Hovedforutsetningen for å bygge et system som bruker en av disse CPUene, i i tillegg til de på neste side, er et eksisterende Linux-system som f.eks tidligere LFS installasjon, Ubuntu, Red Hat/Fedora, SuSE eller annen distribusjon som retter seg mot arkitekturen du har. Vær også oppmerksom på at en 32-bit distribusjon kan installeres og brukes som et vertssystem på en 64-bit AMD/Intel datamaskin.
For å bygge LFS, gevinsten ved å bygge på et 64-bitssystem sammenlignet med et 32-bits system er minimal. For eksempel, i en testbygging av LFS-9.1 på et Core i7-4790 CPU-basert system, ved bruk av 4 kjerner ble følgende statistikk målt:
Arkitektur Byggetid Byggestørrelse
32-bit 239.9 minutes 3.6 GB
64-bit 233.2 minutes 4.4 GB
Som du kan se, på den samme maskinvaren, er 64-bits bygg bare 3% raskere og er 22 % større enn 32-bits bygg. Hvis du planlegger å bruke LFS som en LAMP server, eller en brannmur, kan en 32-bits CPU stort sett være tilstrekkelig. På den andre siden, trenger flere pakker i BLFS nå mer enn 4 GB RAM for å bygges og/eller å kjøre, slik at hvis du planlegger å bruke LFS som skrivebord, så anbefaler LFS-forfatterne å bygge på et 64-bitssystem.
Standard 64-bits bygg som et resultat av LFS regnes som et “rent” 64-bits system. Det vil si at den bare støtter 64-biters kjørbare filer . Å bygge et “flerarkitekturs” system krever kompilering av mange applikasjoner to ganger, én gang for et 32-bitssystem og én gang for et 64-bitssystem. Dette støttes ikke direkte i LFS fordi det ville forstyrre pedagogisk mål om å gi instruksjonene som trengs for et enkelt grunnleggende Linux-system. Noen LFS/BLFS-redaktører opprettholder en forgrening av LFS for flerarkitektur, som er tilgjengelig på https://www.linuxfromscratch.org/~thomas/multilib/index.html. Men det er et avansert tema.
Å bygge et LFS system er ikke en enkel oppgave. Det krever en viss nivå av eksisterende kunnskap om Unix systemadministrasjon for å løse problemer og utfør kommandoene som er oppført riktig. Spesielt som en absolutt minimum, bør du allerede ha muligheten til å bruke kommandolinje (skall) for å kopiere eller flytte filer og mapper, liste mapper og filinnhold, og endre gjeldende mappe. Det forventes også at du har rimelig kunnskap om bruk og installasjon av Linux programvare.
Fordi LFS boka antar i det minste dette grunnleggende ferdighetsnivået, er det usannsynlig at de ulike LFS støtteforaene vil kunne gi deg mye hjelp på disse områdene. Du vil finne at dine spørsmål angående slik grunnleggende kunnskap vil sannsynligvis forbli ubesvart eller du vil ganske enkelt bli henvist til LFS essensielle forhåndsleseliste.
Før du bygger et LFS system, anbefaler vi å lese følgende:
Programvare-bygging-HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.html
Dette er en omfattende veiledning for bygging og installasjon av “generiske” Unix-programvarepakker under Linux. Selv om det ble skrevet for en tid siden, gir den fortsatt en god oppsummering av grunnleggende teknikker som trengs for å bygge og installere programvare.
Nybegynnerveiledning for å installere fra kilden http://moi.vonos.net/linux/beginners-installing-from-source/
Denne veiledningen gir en god oppsummering av grunnleggende ferdigheter og teknikker som trengs for å bygge programvare fra kildekode.
Strukturen til LFS følger Linux standarder så tett som mulig. De primære standardene er:
Linux Standard base (LSB) Version 5.0 (2015)
LSB har fire separate standarder: Kjerne, Skrivebord, Kjøretidsspråk og bildebehandling. I tillegg til generiske krav er det også arkitekturspesifikke krav. Det er også to områder for prøvebruk: Gtk3 og grafikk. LFS forsøker å tilpasse seg arkitekturer omtalt i forrige avsnitt.
Mange mennesker er ikke enige i kravene til LSB. Hovedformålet med å definere det er å sikre at proprietær programvare vil kunne installeres og kjøres riktig på et kompatibelt system. Siden LFS er kildebasert, har brukeren full kontroll over hvilke pakker som er ønsket og mange velger å ikke installere noen pakker som er spesifisert av LSB.
Å opprette et komplett LFS system som er i stand til å bestå LSB sertifiseringstester er mulig, men ikke uten mange tilleggspakker som er utenfor omfanget av LFS. Disse tilleggspakkene har installasjonsinstruksjoner i BLFS.
LSB Kjerne: |
Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux, Zlib |
LSB Skrivebord: |
None |
LSB Kjøretidsspråk: |
Perl, Python |
LSB Bildebehandling: |
None |
LSB Gtk3 og LSB Grafikk (Prøvebruk): |
None |
LSB Kjerne: |
At, Batch (a part of At), Cpio, Ed, Fcrontab, LSB-Tools, NSPR, NSS, PAM, Pax, Sendmail (or Postfix or Exim), time |
LSB Skrivebord: |
Alsa, ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Gdk-pixbuf, Glib2, GTK+2, Icon-naming-utils, Libjpeg-turbo, Libpng, Libtiff, Libxml2, MesaLib, Pango, Xdg-utils, Xorg |
LSB Kjøretidsspråk: |
Libxml2, Libxslt |
LSB Bildebehandling: |
CUPS, Cups-filters, Ghostscript, SANE |
LSB Gtk3 and LSB Grafikk (Prøvebruk): |
GTK+3 |
Som nevnt tidligere er målet med LFS å bygge en komplett og brukbar system på fundamentnivå. Dette inkluderer alle pakker som trengs for å replikere seg selv samtidig som det gir en relativt minimal base å tilpasse for et mer komplett system basert på brukerens valg. Dette betyr ikke at LFS er det minste systemet som er mulig å bygge. Flere viktige pakker er inkludert som ikke er strengt påkrevd. Listene nedenfor dokumenterer begrunnelsen for hver pakke i boken.
Acl
Denne pakken inneholder verktøy for å administrere tilgangskontrolllister, som brukes til å definere mer finkornet skjønnsmessige tilgangsrettigheter for filer og kataloger.
Attr
Denne pakken inneholder programmer for administrasjon av utvidede attributter på filsystemobjekter.
Autoconf
Denne pakken inneholder programmer for å produsere skallskript som automatisk kan konfigurere kildekoden fra en utviklermal . Det er ofte nødvendig for å gjenoppbygge en pakke etter oppdateringer til byggeprosedyrene.
Automake
Denne pakken inneholder programmer for å generere Make filer fra en mal. Det er ofte nødvendig for å gjenoppbygge en pakke etter oppdateringer til byggeprosedyrene.
Bash
Denne pakken tilfredsstiller et LSB-kjernekrav for å gi et Bourne Shell grensesnitt til systemet. Det ble valgt over andre skallpakker på grunn av dens vanlige bruk og omfattende funksjoner utover grunnleggende skallfunksjoner.
Bc
Denne pakken gir et vilkårlig presisjons numerisk behandlingsspråk. Den tilfredsstiller et krav som er nødvendig når du bygger Linux kjernen.
Binutils
Denne pakken inneholder en linker, en assembler og annet verktøy for håndtering av objektfiler. Programmene i denne pakken er nødvendig for å kompilere de fleste pakkene i et LFS system og videre.
Bison
Denne pakken inneholder GNU-versjonen av yacc (Yet Another Compiler Compiler) nødvendig for å bygge flere andre LFS programmer.
Bzip2
Denne pakken inneholder programmer for komprimering og dekomprimering av filer. Det kreves for å dekomprimere mange LFS pakker.
Check
Denne pakken inneholder et testmiljø for andre programmer.
Coreutils
Denne pakken inneholder en rekke viktige programmer for visning og manipulering av filer og mapper. Disse programmene trengs for kommandolinjefilbehandling, og er nødvendige for installasjons prosedyrer for hver pakke i LFS.
DejaGNU
Denne pakken inneholder et rammeverk for å teste andre programmer.
Diffutils
Denne pakken inneholder programmer som viser forskjellene mellom filer eller mapper. Disse programmene kan brukes til å lage oppdateringer (patcher), og brukes også i mange pakkers byggeprosedyrer.
E2fsprogs
Denne pakken inneholder verktøyene for å håndtere ext2, ext3 og ext4 filsystemer. Disse er de mest vanlige og grundig testede filsystemer som Linux støtter.
Eudev
Denne pakken er en enhetsbehandler. Den styrer dynamisk eierskapet, tillatelser, navn og symbolske lenker til enheter i /dev mappen mens enheter legges til eller fjernes fra systemet.
Expat
Denne pakken inneholder et relativt lite XML analysebibliotek. Den kreves av Perl modulen XML::Parser.
Expect
Denne pakken inneholder et program for å utføre skriptete dialoger med andre interaktive programmer. Det er ofte brukt for testing av andre pakker.
File
Denne pakken inneholder et verktøy for å bestemme typen av en gitt fil eller filer. Noen få pakker trenger det i byggeskriptene deres.
Findutils
Denne pakken inneholder programmer for å finne filer i et filsystem. Det brukes i mange pakkers byggeskript.
Flex
Denne pakken inneholder et verktøy for å generere programmer som gjenkjenne mønstre i tekst. Det er GNU versjonen av lex (leksikalsk analysator) programmet. Det kreves for å bygge flere LFS pakker.
Gawk
Denne pakken inneholder programmer for å manipulere tekstfiler. Det er GNU versjonen av awk (Aho-Weinberg-Kernighan). Den brukes i mange andre pakkers byggeskript.
GCC
Denne pakken er Gnu Kompilatorsamlingen. Den inneholder C og C++ kompilatorer samt flere andre som ikke er bygget av LFS.
GDBM
Denne pakken inneholder GNU Database behandlings biblioteket. Den brukes av en annen LFS pakke, Man-DB.
Gettext
Denne pakken inneholder verktøy og biblioteker for internasjonalisering og lokalisering av en rekke pakker.
Glibc
Denne pakken inneholder C hovedbiblioteket. Linux programmer vil ikke kjøre uten.
GMP
Denne pakken inneholder matematiske biblioteker som gir nyttige funksjoner for vilkårlig presisjonsaritmetikk. Det kreves for å bygge GCC.
Gperf
Denne pakken inneholder et program som genererer en perfekt hash funksjon fra et nøkkelsett. Det kreves for Eudev.
Grep
Denne pakken inneholder programmer for å søke gjennom filer. Disse programmene brukes av de fleste pakkenes byggeskript.
Groff
Denne pakken inneholder programmer for behandling og formatering av tekst. En viktig funksjon av disse programmene er å formatere man sider.
GRUB
Denne pakken er Grand Unified Boot Loader. Det er en av flere tilgjengelige oppstartslastere, men er den mest fleksible.
Gzip
Denne pakken inneholder programmer for komprimering og dekomprimere av filer. Det er nødvendig for å dekomprimere mange pakker i LFS og utover.
Iana-etc
Denne pakken gir data for nettverkstjenester og protokoller. Det er nødvendig for å aktivere riktige nettverksfunksjoner.
Inetutils
Denne pakken inneholder programmer for grunnleggende nettverksadministrasjon.
Intltool
Denne pakken inneholder verktøy for å trekke ut oversettbare strenger fra kildefiler.
IProute2
Denne pakken inneholder programmer for grunnleggende og avansert IPv4 og IPv6 nettverk. Det ble valgt fremfor det andre felles nettverks verktøypakke (net-tools) for sine IPv6-funksjoner.
Kbd
Denne pakken inneholder nøkkeltabellfiler, tastaturverktøy for ikke-amerikanske tastaturer, og en rekke konsollfonter.
Kmod
Denne pakken inneholder programmer som trengs for å administrere Linux kjernemoduler.
Less
Denne pakken inneholder en veldig fin tekstfilviser som lar deg rulle opp eller ned når du viser en fil. Den brukes også av Man-DB for visning av man sider.
Libcap
Denne pakken implementerer brukerromsgrensesnittene til POSIX 1003.1e funksjonene tilgjengelig i Linux kjerner.
Libelf
Elfutils prosjektet gir biblioteker og verktøy for ELF filer og DWARF data. De fleste verktøyene i denne pakken er tilgjengelige i andre pakker, men biblioteket er nødvendig for å bygge Linux kjernen som bruker standard (og mest effektive) konfigurasjon.
Libffi
Denne pakken implementerer et grensesnitt for overførbart programmering på høyt nivå til ulike kallkonvensjoner. Noen programmer vet kanskje ikke på sammenstillingstidspunktet hvilke argumenter som skal overføres til en funksjon. For eksempel kan en tolk bli fortalt under kjøringen om antallet og typene argumenter som brukes til å kalle en gitt funksjon. Libffi kan brukes i slike programmer for å gi en bro fra tolkeprogrammet til kompilert kode.
Libpipeline
Libpipeline pakken inneholder et bibliotek for å manipulere kommandokøer av delprosesser på en fleksibel og praktisk måte. Det kreves av Man-DB pakken.
Libtool
Denne pakken inneholder GNU generiske bibliotekstøtte skript. Det omslutter kompleksiteten ved å bruke delte biblioteker i en konsekvent, bærbart grensesnitt. Det trengs av testpakker i andre LFS pakker.
Linux Kernel
Denne pakken er operativsystemet. Det er Linux i GNU/Linux miljøet.
M4
Denne pakken inneholder en generell tekstmakroprosessor som er nyttig som byggeverktøy for andre programmer.
Make
Denne pakken inneholder et program for å styre byggingen av pakker. Det kreves av nesten alle pakker i LFS.
Man-DB
Denne pakken inneholder programmer for å finne og vise man sider. Det ble valgt i stedet for man pakken på grunn av overlegne internasjonaliseringsevner. Det leverer man programmet.
Man-pages
Denne pakken inneholder det faktiske innholdet i det grunnleggende Linux man sider.
Meson
Denne pakken inneholder et programvareverktøy for å automatisere byggingen av programvare. Hovedmålet for Meson er å minimere tiden som programvareutviklere må bruke på å konfigurere bygge systemet. Det kreves for å bygge Systemd, så vel som mange BLFS pakker.
MPC
Denne pakken inneholder funksjoner for aritmetikk av komplekse tall. Det kreves av GCC.
MPFR
Denne pakken inneholder funksjoner for multiple presisjons aritmetikk. Det kreves av GCC.
Ninja
Denne pakken inneholder et lite byggesystem med fokus på hastighet. Den er designet for å ha inndatafilene generert på høyere nivå av et bygge system, og å kjøre bygget så raskt som mulig. Denne pakken kreves av Meson.
Ncurses
Denne pakken inneholder biblioteker for terminaluavhengig håndtering av skjermkarakterer. Det brukes ofte til å gi markørkontroll for et menysystem. Det trengs av en rekke pakker i LFS.
Openssl
Denne pakken inneholder administrasjonsverktøy og biblioteker knyttet til kryptografi. Disse er nyttige for å gi kryptografiske funksjoner til andre pakker, inkludert Linux kjernen.
Patch
Denne pakken inneholder et program for å endre eller lage filer ved å bruke en patch fil vanligvis opprettet av diff programmet. Det trengs av byggeprosedyren for flere LFS pakker.
Perl
Denne pakken er en tolk for kjøretidsspråket PERL. Det er nødvendig for installasjon og testpakker for flere LFS pakker.
Pkg-config
Denne pakken gir et program som returnerer metadata om en installert bibliotek eller pakke.
Procps-NG
Denne pakken inneholder programmer for overvåking av prosesser. Disse programmer er nyttige for systemadministrasjon, og brukes også av LFS Oppstartsskript.
Psmisc
Denne pakken inneholder programmer for å vise informasjon om prosesser som kjører. Disse programmene er nyttige for system administrasjon.
Python 3
Denne pakken gir et tolkeprogram som har en design filosofi som legger vekt på kodelesbarhet.
Readline
Denne pakken er et sett med biblioteker som tilbyr redigerings- og historikkfunksjoner på kommandolinjen. Den brukes av Bash.
Sed
Denne pakken tillater redigering av tekst uten å åpne den i en tekstredigerer. Det er også nødvendig for de fleste LFS pakkers konfigureringsskript.
Shadow
Denne pakken inneholder programmer for håndtering av passord på en sikker måte.
Sysklogd
Denne pakken inneholder programmer for logging av systemmeldinger, slik som de som er gitt av kjernen eller nisseprosessene (daemon processes) når uvanlig hendelser oppstår.
Sysvinit
Denne pakken inneholder init programmet, som er overordnet for alle andre prosesser på et Linux system.
Tar
Denne pakken gir arkiverings- og utpakkingssmuligheter av praktisk talt alle pakker som brukes i LFS.
Tcl
Denne pakken inneholder Verktøykommandospråk som brukes i mange testpakker i LFS pakker.
Texinfo
Denne pakken inneholder programmer for lesing, skriving og konvertere informasjonssider. Den brukes i installasjons prosedyrer for mange LFS pakker.
Util-linux
Denne pakken inneholder diverse hjelpeprogrammer. Blant dem er verktøy for håndtering av filsystemer, konsoller, partisjoner og meldinger.
Wheel
Denne pakken inneholder Python modulen Wheel som er referanseimplementering av Python wheel pakkingsstandarden.
Vim
Denne pakken inneholder et redigeringsprogram. Den ble valgt på grunn av sin kompatibilitet med det klassiske vi redigeringsprogrammet og dens enorme antall kraftige kapasiteter.. Et redigeringsprogram er et veldig personlig valg for mange brukere og andre redigeringsprogram kan brukes om ønskelig.
XML::Parser
Denne pakken er en Perl modul som har grensesnitt med Expat.
XZ Utils
Denne pakken inneholder programmer for komprimering og dekomprimering av filer. Det gir den høyeste kompresjonen som generelt er tilgjengelig og er nyttig for å dekomprimere pakker i XZ- eller LZMA-format.
Zlib
Denne pakken inneholder komprimerings- og dekompresjonsrutiner som brukes av noen programmer.
Zstd
Denne pakken inneholder komprimerings- og dekompresjonsrutiner som brukes av noen programmer. Det gir høyt kompresjonsforhold og en svært bredt utvalg av kompresjon/hastighets avveininger.
For å gjøre ting lettere å følge, er det noen få typografiske konvensjoner brukt gjennom denne boken. Denne delen inneholder noen eksempler på det typografiske formatet som finnes i hele Linux From Scratch.
./configure --prefix=/usr
Denne formen for tekst er designet for å skrives nøyaktig slik den er skrevet med mindre noe annet er notert i den omkringliggende teksten. Det brukes også i forklaringsseksjoner for å identifisere hvilke av kommandoene det refereres til.
I noen tilfeller utvides en logisk linje til to eller flere fysiske linjer med en omvendt skråstrek på slutten av linjen.
CC="gcc -B/usr/bin/" ../binutils-2.18/configure \ --prefix=/tools --disable-nls --disable-werror
Merk at omvendt skråstrek må følges av en umiddelbar retur. Annen mellomromstegn som mellomrom eller tabulatortegn vil lage feil resultater.
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
Denne formen for tekst (tekst med fast bredde) viser
skjermutdata, vanligvis som resultatet av utstedte kommandoer.
Dette formatet brukes også til å vise filnavn, som for eksempel
/etc/ld.so.conf
.
Vennligst konfigurer nettleseren din til å vise tekst med fast
bredde og en god monospace font, så du kan skille
tegnvariantene Il1
eller
O0
helt klart.
Uthevet
Denne tekstformen brukes til flere formål i boken. Dens viktigste formålet er å understreke viktige punkter eller elementer.
https://www.linuxfromscratch.org/
Dette formatet brukes for hyperkoblinger både innenfor LFS-fellesskapet og til eksterne sider. Det inkluderer HOWTOer, nedlastingssteder og nettsteder.
cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:
......
EOF
Dette formatet brukes når du oppretter konfigurasjonsfiler. Den
første kommandoen ber systemet lage filen $LFS/etc/group
fra hva som enn skrives på de
følgende linjene til sekvensen End Of File (EOF) er påtruffet.
Derfor er hele denne delen vanligvis skrevet som det vises.
<ERSTATTET TEKST>
Dette formatet brukes til å kapsle inn tekst som ikke skal skrives som det vises eller for kopier-og-lim-operasjoner.
[VALGFRI TEKST]
Dette formatet brukes til å kapsle inn tekst som er valgfri.
passwd(5)
Dette formatet brukes til å referere til en spesifikk manual
(man) side. Tallet innenfor parentes indikerer en bestemt del i
manualene. For eksempel, passwd har to man sider. I
henhold til LFS installasjonsinstruksjoner, disse to man sidene
vil være plassert på /usr/share/man/man1/passwd.1
og /usr/share/man/man5/passwd.5
. Når boken bruker
passwd(5)
refererer den spesifikt
til /usr/share/man/man5/passwd.5
.
man passwd vil
skrive ut den første man siden den finner som stemmer med
“passwd”, som vil bli /usr/share/man/man1/passwd.1
. For dette
eksemplet må du kjøre man 5
passwd for å lese siden som blir spesifisert.
Merk at de fleste man sider ikke har duplikate sidenavn i
forskjellige seksjoner. Derfor, man
<programnavn>
er generelt tilstrekkelig.
Denne boken er delt inn i følgende deler.
Del I forklarer noen viktige merknader om hvordan du går frem med LFS installasjon. Denne delen gir også metainformasjon om boken.
Del II beskriver hvordan du forbereder byggeprosessen—lage en partisjon, nedlasting av pakkene og kompilering av midlertidige verktøy.
Del III gir instruksjoner for å bygge verktøyene nødvendig for å konstruere det endelige LFS systemet.
Del IV guider leseren gjennom byggingen av LFS systemet—kompilere og installere alle pakkene én etter én, sette opp oppstartsskriptene og installere kjernen. Det resulterende Linux-systemet er grunnlaget som annen programvare kan bygges på, utvide systemet etter ønske. På slutten av denne boken er det en enkel å bruke referanse som viser alle programmene, bibliotekene og viktige filer som er installert.
Del V gir informasjon om selve boken inkludert akronymer og termer, anerkjennelser, pakkeavhengigheter, en liste over LFS-oppstartsskript, lisenser for distribusjon av bok, og en omfattende indeks over pakker, programmer, biblioteker, og skript.
Programvaren som brukes til å lage et LFS system blir kontinuerlig oppdatert og forbedret. Sikkerhetsadvarsler og feilrettinger kan bli tilgjengelige etter at LFS boken er utgitt. For å sjekke om pakkeversjonene eller instruksjonene i denne utgaven av LFS trenger eventuelle modifikasjoner for å imøtekomme sikkerhetssårbarheter eller andre feilrettinger, vennligst besøk https://www.linuxfromscratch.org/lfs/errata/11.2/ før du fortsetter med byggingen. Du bør merke noen endringer som vises, og bruke dem på den relevante delen av boken mens du bygger LFS systemetet.
I tillegg opprettholder Linux From Scratch redaktørene en liste over sikkerhetssårbarheter oppdaget etter at en bok ble utgitt. For å sjekke om det er noen aktive sikkerhetssårbarheter, vennligst besøk https://www.linuxfromscratch.org/lfs/advisories/ før du fortsetter med byggingen. Du bør merke deg eventuelle råd og utfør trinnene for å fikse eventuelle sikkerhetssårbarheter mens du bygger LFS systemet.
LFS-systemet vil bli bygget ved å bruke en allerede installert Linux-distribusjon (som Debian, OpenMandriva, Fedora eller openSUSE). Dette eksisterende Linux-system (verten) vil bli brukt som utgangspunkt for gi nødvendige programmer, inkludert en kompilator, linker og skall, å bygge det nye systemet. Velg “development” alternativ under distribusjonsinstallasjonen for å kunne få tilgang til disse verktøy.
Som et alternativ til å installere en separat distribusjon på din maskinen, du kanskje ønsker å bruke en LiveCD fra en kommersiell distribusjon.
Kapittel 2 i denne boken beskriver hvordan lage en ny Linuxpartisjon og et nytt filsystem. Dette er stedet hvor det nye LFS systemet skal kompileres og installeres. Kapittel 3 forklarer hvilke pakker og oppdateringer som må lastes ned for å bygge et LFS system og hvordan lagre dem på det nye filsystemet. Kapittel 4 diskuterer oppsettet av et hensiktsmessig arbeidsmiljø. Vennligst les Kapittel 4 nøye som det forklarer flere viktige problemer du må være klar over før du begynner å jobbe deg gjennom Kapittel 5 og utover.
Kapittel 5, forklarer installasjonen av den første verktøykjeden (binutils, gcc og glibc) ved bruk av krysskompilerings teknikker for å isolere de nye verktøyene fra vertssystemet.
Kapittel 6 viser hvordan du krysskompiler grunnleggende verktøy ved å bruke den nettopp bygde kryssverktøykjeden.
Chapter 7 går deretter inn i et "chroot" miljø og bruker de tidligere bygde verktøyene til å bygge tilleggsverktøyene som trengs for å bygge og teste det endelige systemet.
Denne innsatsen for å isolere det nye systemet fra vertsdistribusjonen kan virke overdreven. En fullstendig teknisk forklaring på hvorfor dette gjøres er gitt inn Toolchain Technical Notes.
I Chapter 8, Det fulle LFS system blir bygget. En annen fordel gitt av chroot miljøet er at det lar deg fortsette å bruke vertssystemet mens LFS bygges. Mens du venter på at pakkesammenstillinger blir fullført, kan du fortsette å bruke datamaskinen som normalt.
For å fullføre installasjonen er den grunnleggende systemkonfigurasjonen satt opp i Kapittel 9, og kjernen og oppstartslasteren er satt opp i Kapittel 10. Kapittel 11 inneholder informasjon om å fortsette LFS opplevelsen utover denne boken. Etter at trinnene i denne boken er implementert, vil datamaskinen være klar til å starte på nytt i det nye LFS systemet.
Dette er prosessen i et nøtteskall. Detaljert informasjon om hvert trinn er diskutert i de følgende kapitlene og pakkebeskrivelsene. Punkter som kan virke kompliserte vil bli avklart, og alt vil falle på plass når du legger ut på LFS eventyret.
Nedenfor er en liste over pakkeoppdateringer gjort siden forrige utgivelse av boken.
Oppgradert til:
Bc 6.0.1
Binutils-2.39
Coreutils-9.1
E2fsprogs-1.46.5
Expat-2.4.8
File-5.42
GCC-12.2.0
Glibc-2.36
Gzip-1.12
IANA-Etc-20220812
Inetutils-2.3
IPRoute2-5.19.0
Kbd-2.5.1
Kmod-30
Libcap-2.65
Libelf-0.187 (from elfutils)
Libpipeline-1.5.6
Libtool-2.4.7
Linux-5.19.2
Man-DB-2.10.2
Meson-0.63.1
Ninja-1.11.0
Openssl-3.0.5
Perl-5.36.0
Procps-ng-4.0.0
Psmisc-23.5
Python-3.10.6
Shadow-4.12.2
SysVinit-3.04
Tzdata-2022c
Util-Linux-2.38.1
Vim-9.0.0228
XZ-Utils-5.2.6
Zlib-1.2.12
Lagt til:
Wheel-0.37.1
zstd-1.5.2-upstream_fixes-1.patch
Fjernet:
perl-5.34.0-upstream_fixes-1.patch
systemd-250-kernel_5.17_fixes-1.patch
systemd-250-upstream_fixes-1.patch
Dette er versjon 11.2 av Linux From Scratch-boken, datert 1. September 2022. Hvis denne boken er mer enn seks måneder gammel, en nyere og bedre versjonen er sannsynligvis allerede tilgjengelig. For å finne ut, vennligst sjekk et av speilene via https://www.linuxfromscratch.org/mirrors.html.
Nedenfor er en liste over endringer som er gjort siden forrige utgivelse av boken.
Endringsloggoppføringer:
2022-09-01
[bdubbs] - LFS-11.2 utgitt.
01.09.2022
[bdubbs] - Oppdatert til vim-9.0.0228. Adresserer #4500.
[bdubbs] - Oppdatert til iana-etc-20220812. Adresserer #5006.
[bdubbs] - Oppdatert til gcc-12.2.0. Fikser #5098.
[bdubbs] - Oppdatert til linux-5.19.2 (sikkerhetsfikser). Fikser #5097.
[bdubbs] - Oppdatert til tzdata-2022c. Fikser #5096.
[bdubbs] - Oppdatert til shadow-4.12.2 (sikkerhetsfiks). Fikser #5095.
[bdubbs] - Oppdatert til meson-0.63.1. Fikser #5094.
[bdubbs] - Oppdatert til xz-5.2.6. Fikser #5093.
18.08.2022
[xry111] - Fjern libtool-arkivfiler (.la) i kapittel 5 og 6 fordi disse filene er skadelige for krysskompilering.
11.082022
[bdubbs] - Oppdatert til vim-9.0.0192. Adresserer #4500.
[bdubbs] - Oppdatert til iana-etc-20220803. Adresserer #5006.
[bdubbs] - Oppdatert til tzdata-2022b. Fikser #5092.
[bdubbs] - Oppdatert til iproute2-5.19.0. Fikser #5086.
[bdubbs] - Oppdatert til linux-5.19.1. Fikser #5085.
[bdubbs] - Oppdatert til bc-6.0.1. Fikser #5090.
06.08.2022
24.07.2022
15.07.2022
01.07.2022
[bdubbs] - Oppdatert til vim-9.0.0006. Adresserer #4500.
[bdubbs] - Oppdatert til iana-etc-20220610. Adresserer #5006.
[bdubbs] - Oppdatert til OpenSSL-3.0.4. Fikser #5076.
[bdubbs] - Oppdatert til kbd-2.5.1. Fikser #5075.
[bdubbs] - Oppdatert til linux-5.18.8. Fikser #5074.
[bdubbs] - Oppdatert til bc-5.3.3. Fikser #5073.
29.06.2022
[pierre] - Generer delte C++-bindinger for ncurses i stedet for å generere og deretter fjerne de statiske.
14.06.2022
[bdubbs] - Oppdatert til python3-3.10.5. Fikser #5070.
[bdubbs] - Oppdatert til meson-0.62.2. Fikser #5068.
[bdubbs] - Oppdatert til kbd-2.5.0. Fikser #5067.
[bdubbs] - Oppdatert til file-5.42. Fikser #5072.
[bdubbs] - Oppdatert til linux-5.18.3. Fikser #5069.
[bdubbs] - Oppdatert til bc-5.3.1. Fikser #5071.
29.05.2022
29.05.2022
16.05.2022
01.05.2022
[bdubbs] - Oppdatert til openssl-3.0.3. Fikser #5057.
01.05.2022
[bdubbs] - Endre nobody/nogroup uid/gid to 65534.
[bdubbs] - Oppdatert til meson-0.62.1. Fikser #5052.
[bdubbs] - Oppdatert til libpipeline-1.5.6. Fikser #5053.
[bdubbs] - Oppdatert til elfutils-0.187. Fikser #5054.
[bdubbs] - Oppdatert til vim-8.2.4814. Adresserer #4500.
[bdubbs] - Oppdatert til sysvinit-3.03. Fikser #5046.
[bdubbs] - Oppdatert til linux-5.17.5. Fikser #5050.
[bdubbs] - Oppdatert til gcc-11.3.0. Fikser #5051.
[bdubbs] - Oppdatert til coreutils-9.1. Fikser #5048.
[bdubbs] - Oppdatert til bc-5.2.4. Fikser #5049.
15.04.2022
[bdubbs] - La til wheel-0.37.1 (Python modul).
15.04.2022
31.03.2022
[bdubbs] - Oppdatert til sysvinit-3.02. Fikser #5041.
[bdubbs] - Oppdatert til zlib-1.2.12 (sikkerhetsoppdatering). Fikser #5040.
[bdubbs] - Oppdatert til expat-2.4.8. Fikser #5039.
[bdubbs] - Oppdatert til Python-3.10.4. Fikser #5037.
[bdubbs] - Oppdatert til procps-ng-4.0.0. Fikser #5036.
[bdubbs] - Oppdatert til iproute2-5.17.0. Fikser #5035.
[bdubbs] - Oppdatert til meson-0.62.0. Fikser #5034.
[bdubbs] - Oppdatert til linux-5.17.1 (sikkerhets Update). Fikser #5033.
[bdubbs] - Oppdatert til util-linux-2.38. Fikser #4997.
25.03.2022
[pierre] - Oppdatert bootscripts til 20220324. Fikser #5027.
30.03.2022
16.03.2022
[xry111] - Oppdatert til MarkupSafe-2.1.1. Fikser #5025.
15.03.2022
[bdubbs] - Oppdatert til openssl-3.0.2. Fikser #5024.
[bdubbs] - Oppdatert til meson-0.61.3. Fikser #5023.
[xry111] - Oppdatert til expat-2.4.7. Fikser #5019.
[xry111] - Oppdatert til bc-5.2.3. Fikser #5020.
[xry111] - Oppdatert til linux-5.16.14 (sikkerhetsfiks). Fikser #5021.
[xry111] - Oppdatert til perl-5.34.1. Fikser #5022.
[xry111] - Oppdatert til vim-8.2.4567 (sikkerhetsfiks). Adresserer #4500.
05.03.2022
[xry111] - Slutt å bytte eier av $LFS/source
til lfs
. Fikser
#5018.
[xry111] - Legg til zstd-1.5.2 oppstrøms fikser oppdatering.
02.03.2022
[xry111] - Oppdatert til meson-0.61.2. Fikser #5013.
[xry111] - Oppdatert til linux-5.16.12. Fikser #5014.
[xry111] - Oppdatert til MarkupSafe-2.1.0. Fikser #5015.
[xry111] - Oppdatert til vim-8.2.4489 (sikkerhetsfikser). Adresserer #4500.
[xry111] - Bygg libstdc++ i GCC pass 2, og fjern den separate libstdc++ pass 2.
[xry111] - Fjern unødvendig --enable-64bit
for
tcl.
2022-03-01
[bdubbs] - LFS-11.1 utgitt.
Hvis du under byggingen av LFS systemet støter på noen feil, har spørsmål eller tror det er en skrivefeil i boken, vennligst start med å se de vanlige spørsmålene (FAQ) som befinner seg på https://www.linuxfromscratch.org/faq/.
linuxfromscratch.org
serveren er
vert for en rekke E-post lister brukt til utvikling av LFS
prosjektet. Disse listene inkluderer hovedutviklings- og
støttelister, blant annet. Hvis FAQ ikke løser problemet du
har, vil neste trinn være å søke i E-post listene på
https://www.linuxfromscratch.org/search.html.
For informasjon om de forskjellige listene, hvordan abonnere, arkiv steder og tilleggsinformasjon, besøk https://www.linuxfromscratch.org/mail.html.
Flere medlemmer av LFS fellesskapet tilbyr assistanse på
Internett Relay Chat (IRC). Før du bruker denne støtten, sørg
for at dine spørsmål ikke allerede er besvart i LFS FAQ eller
E-postlistenens arkiv. Du finner IRC-nettverket på
irc.libera.chat
. Støttekanalen heter
#lfs-support.
LFS prosjektet har en rekke verdensomspennende speil for å få tilgang til nettstedet og laste ned de nødvendige pakkene mer praktisk. Vær så snill besøk LFS nettstedet på https://www.linuxfromscratch.org/mirrors.html for en liste av nåværende speil.
Hvis det oppstår et problem eller et spørsmål mens du arbeider gjennom denne boken, vennligst sjekk siden FAQ på https://www.linuxfromscratch.org/faq/#generalfaq. Spørsmål er ofte allerede besvart der. Hvis spørsmålet ditt ikke er svart på denne siden, prøv å finne kilden til problemet. De følgende tips vil gi deg veiledning for feilsøking: https://www.linuxfromscratch.org/hints/downloads/files/errors.txt.
Hvis du ikke finner problemet oppført i vanlige spørsmål, søk i E-post listene på https://www.linuxfromscratch.org/search.html.
Vi har også et fantastisk LFS fellesskap som er villig til å tilby hjelp gjennom E-postlistene og IRC (se Section 1.4, “Ressurser” delen av denne boken). Imidlertid får vi flere brukerspørsmål hver dag, og mange av dem kan være besvart gjennom FAQ og gjennom E-postlistene, søk der først. Så for at vi skal kunne tilby best mulig hjelp, må du gjøre noe forskning på egen hånd først. Det lar oss fokusere på de mere uvanlige brukerstøtte. Hvis søkene dine ikke gir en løsning, vennligst ta med all relevant informasjon (nevnt nedenfor) i din forespørsel om hjelp.
Bortsett fra en kort forklaring av problemet som oppleves, de viktigste tingene å inkludere i enhver forespørsel om hjelp er:
Versjonen av boken som brukes (i dette tilfellet 11.2)
Vertsdistribusjonen og versjonen som brukes til å lage LFS
Utdata fra Systemkrav for vert skriptet
Pakken eller seksjonen problemet ble oppdaget i
Den nøyaktige feilmeldingen eller symptomet som mottas
Gi beskjed om du har avviket fra boken
Avvik fra denne boken gjør ikke at vi ikke vil hjelpe deg. Tross alt handler LFS om personlig preferanse. Å være på forhånd om eventuelle endringer i den etablerte prosedyren hjelper oss å vurdere og finne mulige årsaker til problemet ditt.
Hvis noe går galt mens du kjører configure skript, gjennomgå
config.log
filen. Denne filen
kan inneholde feil oppstått under configure som ikke ble
skrevet ut på skjermen. Inkluder relevante linjer hvis du trenger å
be om hjelp.
Både skjermutdata og innholdet i ulike filer er nyttige ved å fastslå årsaken til kompileringsproblemer. Skjermens utdata fra configure skriptet og make kjøringen kan være nyttig. Det er ikke nødvendig å inkludere hele utdataen, men inkludere nok av relevant informasjon. Nedenfor er et eksempel på type informasjon som skal inkluderes fra skjermens utdata fra make:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2
I dette tilfellet vil mange mennesker bare inkludere seksjonen fra bunnen:
make [2]: *** [make] Error 1
Dette er ikke nok informasjon til å diagnostisere problemet riktig fordi den bare merker at noe gikk galt, ikke hva som gikk galt. Hele delen, som i eksempelet ovenfor, er det som skal lagres fordi det inkluderer kommandoen som ble utført og tilhørende feilmelding(er).
En utmerket artikkel om å be om hjelp på Internett er tilgjengelig på nett på http://catb.org/~esr/faqs/smart-questions.html. Les og følg tipsene i dette dokumentet for å øke sannsynligheten for å få hjelpen du trenger.
I dette kapittelet, vertsverktøyene som trengs for å bygge LFS kontrolleres og om nødvendig installeres. Deretter vil en partisjon klargjøres som vert for LFS systemet. Vi lager partisjonen selv, lager et filsystem på den og monter den.
Vertssystemet ditt bør ha følgende programvare med minimumsversjoner angitt. Dette burde ikke være et problem for de fleste moderne Linux-distribusjoner. Vær også oppmerksom på at mange distribusjoner vil plassere programvaredeklarasjoner i separate pakker, ofte i form av “<package-name>-devel” eller “<package-name>-dev”. Pass på å installere disse hvis distribusjonen din gir dem.
Tidligere versjoner av de oppførte programvarepakkene kan fungere, men har ikke blitt testet.
Bash-3.2 (/bin/sh bør være en symbolsk eller hard lenke til bash)
Binutils-2.13.1 (Versjoner større enn 2.39 anbefales ikke ettersom de ikke har blitt testet)
Bison-2.7 (/usr/bin/yacc bør være en lenke til bison eller et lite skript som kjører bison)
Coreutils-6.9
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1 (/usr/bin/awk bør være en link til gawk)
GCC-4.8 inkludert C++ kompilatoren, g++ (Versjoner større enn 12.2.0 er ikke anbefalt da de ikke er testet). C og C++ standard biblioteker (med deklarasjoner) må også være tilstede slik at C++ kompilatoren kan bygge vertsbaserte programmer
Grep-2.5.1a
Gzip-1.3.12
Linux Kernel-3.2
Grunnen til kravet om kjerneversjon er at vi spesifiserer den versjonen når du bygger glibc i Kapittel 5 og Chapter 8, etter anbefaling fra utviklerne. Det kreves også av udev.
Hvis vertskjernen er tidligere enn 3.2 du må erstatte kjernen med en mer oppdatert versjon. Det er to måter du kan gjøre dette på. Først, se om din Linux leverandør tilbyr en 3.2 eller senere kjernepakke. I så fall kan det være lurt å installere den. Hvis din leverandøren ikke tilbyr en akseptabel kjernepakke, eller du foretrekker å la være å installer den, kan du kompilere en kjerne selv. Instruksjoner for å kompilere kjernen og konfigurere oppstartslasteren (forutsatt at verten bruker GRUB) er lokalisert i Kapittel 10.
M4-1.4.10
Make-4.0
Patch-2.5.4
Perl-5.8.8
Python-3.4
Sed-4.1.5
Tar-1.22
Texinfo-4.7
Xz-5.0.0
Merk at symbollenkene nevnt ovenfor er nødvendige for å bygge et LFS system ved å bruke instruksjonene i denne boken. Symlinker som peker på annen programvare (som dash, mawk osv.) kan fungere, men er ikke testet eller støttet av LFS-utviklingsteamet, og kan kreve enten avvik fra instruksjonene eller tilleggsoppdateringer til noen pakker.
For å se om vertssystemet ditt har alle de riktige versjonene, og muligheten til å kompilere programmer, kjør følgende:
cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
else
echo "yacc not found"
fi
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo awk is `/usr/bin/awk --version | head -n1`
else
echo "awk not found"
fi
gcc --version | head -n1
g++ --version | head -n1
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
python3 --version
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1 # texinfo version
xz --version | head -n1
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF
bash version-check.sh
LFS er designet for å bygges i én økt. Det er det instruksjonene forutsetter, at systemet ikke vil bli slått av under prosessen. Det betyr ikke at systemet må gjøres i en økt. Problemet er at visse prosedyrer må gjenopprettes etter en omstart hvis LFS gjenopptas på forskjellige punkter.
Disse kapitlene er utført på vertssystemet. Ved omstart, vær forsiktig med følgende:
Prosedyrer utført som root
brukeren etter seksjon 2.4 må
ha LFS miljøvariabelen satt FOR BRUKEREN ROOT.
/mnt/lfs partisjonen må være montert.
Disse to kapitlene må gjøres som bruker
lfs
. En su - lfs må gjøres
før noen oppgaver i disse kapitlene. Hvis du ikke gjør
det, risikerer du å installere pakker til
vertssystemet, og potensielt gjøre det ubrukelig.
Prosedyrene i General Compilation Instructions er kritiske. Hvis det er noen tvil om installerte pakker, sørg for at tidligere utpakkede tarballs fjernes, pakk deretter ut pakkefilene på nytt og fullfør alle instruksjonene i den delen.
/mnt/lfs partisjonen må være montert.
Noen få operasjoner, fra “Skifte
eierskap” for å “Gå inn i Chroot
miljøet” må gjøres som root
brukeren, med LFS
miljøvariabel satt for root
brukeren.
Når du går inn i chroot, må LFS miljøvariabelen angis
for root
. LFS
variabelen brukes ikke i etterkant.
De virtuelle filsystemene må være montert. Dette kan
gjøres før eller etter at chroot er gått inn i, ved å
bytte til en virtuell vertsterminal og som root
, kjøre kommandoene i Section 7.3.1,
“Montering og fylling av /dev” og
Section 7.3.2,
“Montering av virtuelle
kjernefilsystemer”.
Som de fleste andre operativsystemer er LFS vanligvis installert på en dedikert partisjon. Den anbefalte tilnærmingen til å bygge et LFS system er å bruke en tilgjengelig tom partisjon eller, hvis du har nok upartisjonert plass, å lage en.
Et minimalt system krever en partisjon på rundt 10 gigabyte (GB). Dette er nok til å lagre alle kildetarballene og kompilere pakkene. Men hvis LFS systemet er ment å være det primære Linux systemet, vil tilleggsprogramvare sannsynligvis bli installert som vil kreve ekstra plass. En 30 GB partisjon er en rimelig størrelse for å sørge for nok plass. LFS systemet i seg selv vil ikke ta så mye plass. En stor del av dette kravet er å sørge for tilstrekkelig ledig midlertidig lagring samt for å legge til flere funksjoner etter at LFS er fullført. I tillegg kompilering av pakker kan kreve mye diskplass som vil bli gjenvunnet etter at pakken er installert.
Fordi det ikke alltid er nok minne (RAM) tilgjengelig for
kompileringsprosesser er det en god idé å bruke en liten
diskpartisjon som swap
plass.
Dette brukes av kjernen for å lagre sjelden brukte data og la
mer minne være tilgjengelig for aktive prosesser. swap
partisjon for et LFS system kan være
det samme som det som brukes av vertssystemet, i det tilfellet
er det ikke er nødvendig å opprette en annen.
Start et diskpartisjoneringsprogram som f.eks cfdisk eller fdisk med et
kommandolinjealternativ som navngir harddisken som den nye
partisjonen vil bli opprettet på—for eksempel
/dev/sda
for den primære
diskstasjonen. Lag en innebygd Linux partisjon og en
swap
partisjon, hvis nødvendig.
Vennligst referere til cfdisk(8)
eller fdisk(8)
hvis du ennå ikke
vet hvordan du bruker programmene.
For erfarne brukere er andre partisjoneringsordninger mulig. Det nye LFS systemet kan være på et programvare RAID matrise eller en LVM logisk volum. Noen av disse alternativene krever imidlertid initramfs, som er et avansert emne. Disse partisjoneringsmetodene anbefales ikke for førstegangs LFS brukere.
Husk betegnelsen på den nye partisjonen (f.eks., sda5
). Denne boken vil referere til dette som
LFS partisjonen. Husk også betegnelsen på swap
partition. Disse navnene vil være
nødvendig senere for /etc/fstab
filen.
Forespørsler om råd om systempartisjonering legges ofte ut på LFS E-post lister. Dette er et høyst subjektivt tema. Standard for de fleste distribusjoner er å bruke hele stasjonen med unntak av en liten partisjon til vekselminne. Dette er ikke optimalt for LFS av flere grunner. Det reduserer fleksibiliteten, gjør deling av data på tvers av flere distribusjoner eller LFS bygg vanskeligere, gjør sikkerhetskopiering mer tidkrevende, og kan kaste bort diskplass gjennom ineffektiv allokering av filsystemstrukturer.
En root LFS partisjon (ikke å forveksle med /root
mappen) av tjue gigabyte er et godt
kompromiss for de fleste systemer. Det gir nok plass til å
bygge LFS og det meste av BLFS, men er liten nok til at
flere partisjoner kan enkelt lages for eksperimentering.
De fleste distribusjoner oppretter automatisk et vekselminnepartisjon. Som regel er den anbefalte størrelsen på vekselminnepartisjonen omtrent det dobbelte av fysisk RAM, men dette er sjelden nødvendig. Hvis diskplassen er begrenset, hold vekselminnepartisjonen til to gigabyte og overvåk mengden disk veksling.
Hvis du vil bruke dvalefunksjonen (suspend-to-disk) i Linux, den skriver ut innholdet i RAM til vekselminnepartisjonen før den slår av maskinen. I dette tilfellet bør størrelsen på vekselminnepartisjonen være minst like stor som systemets installerte RAM.
Bruk av vekselminne er aldri bra. For mekaniske harddisker kan du generelt fortelle om et system veksler ved å bare lytte til diskaktivitet og observere hvordan systemet reagerer på kommandoer. For en SSD stasjon vil du ikke kunne høre veksling, men du kan se hvor mye vekslingsplass som brukes ved å bruke top eller free programmene. Bruken av en SSD stasjon for en vekselminnepartisjon bør unngås hvis mulig. Den første reaksjon på veksling bør være å se etter en urimelig kommando som f.eks prøver å redigere en fil på fem gigabyte. Hvis veksling normalt , er den beste løsningen å kjøpe mer RAM til ditt system.
Hvis oppstartsdisken har blitt partisjonert med en GUID Partisjons Tabell (GPT), da må en liten, vanligvis 1 MB, partisjon bli opprettet hvis den ikke eksisterer allerede. Denne partisjonen er ikke formatert, men må være tilgjengelig for GRUB for å bruke under installasjonen av oppstarts lasteren. Denne partisjonen vil normalt være merket 'BIOS Boot' hvis den opprettes av fdisk eller har en kode på EF02 hvis du bruker gdisk.
Grub Bios partisjonen må være på stasjonen som BIOS bruker for å starte opp systemet. Dette er ikke nødvendigvis den samme stasjonen der LFS rotpartisjon er lokalisert. Disker på et system kan bruke forskjellig partisjonstabelltyper. Kravet til denne partisjonen avhenger bare på partisjonstabelltypen til oppstartsdisken.
Det er flere andre partisjoner som ikke er påkrevd, men som bør vurderes når du designer et diskoppsett. Følgende liste er ikke utfyllende, men er ment som en veiledning.
/boot – Sterkt anbefalt. Bruk denne partisjonen til å lagre kjerner og annen oppstartsinformasjon. For å minimere potensielle oppstarts problemer med større disker, gjør dette til den første fysiske partisjonen på din første diskstasjon. En partisjonsstørrelse på 200 megabyte er ganske tilstrekkelig.
/boot/efi – EFI systempartisjonen, som er nødvendig for å starte opp systemet med UEFI. Les the BLFS page for detaljer.
/home – Sterkt anbefalt. Del hjemme mappen og brukertilpasning på tvers av flere distribusjoner eller LFS bygginger. Størrelsen er vanligvis ganske stor og avhenger av tilgjengelig disk plass.
/usr – I LFS, /bin
, /lib
, og /sbin
er symbolkoblinger til deres
motpart i /usr
. Så
/usr
inneholder alle
binærfiler nødvendig for at systemet skal kjøre. For
LFS en egen partisjon for /usr
er normalt ikke nødvendig.
Hvis du uansett trenger det, bør du lage en partisjon
som er stor nok til å passe til alle programmer og
biblioteker i systemet. Rotpartisjonen kan være
veldig liten (kanskje bare én gigabyte) i denne
konfigurasjonen, så det er det egnet for en tynn
klient eller diskløs arbeidsstasjon (hvor
/usr
monteres fra en
fjern server). Du bør imidlertid merke deg at
initramfs (ikke dekket av LFS) vil være nødvendig for
å starte et system med separat /usr
partisjon.
/opt – Denne mappen er mest nyttig for BLFS der flere installasjoner av store pakker som Gnome eller KDE kan installeres uten å bygge inn filene i /usr hierarkiet. Hvis den brukes, er 5 til 10 gigabyte generelt tilstrekkelig.
/tmp – En separat /tmp mappe er sjelden, men nyttig hvis du konfigurerer en tynn klient. Denne partisjonen, hvis den brukes, vil vanligvis ikke trenge å overstige et par gigabyte.
/usr/src – Denne partisjonen er veldig nyttig for å gi en plassering for å lagre BLFS kildefiler og dele dem på tvers av LFS bygg. Den kan også brukes som lokasjon for å bygge BLFS pakker. En rimelig stor partisjon på 30-50 gigabyte gir god plass.
Enhver separat partisjon du vil ha automatisk montert ved
oppstart må spesifiseres i /etc/fstab
. Detaljer om hvordan du
spesifiserer partisjoner vil bli diskutert i Section 10.2,
“Opprette /etc/fstab filen”.
Nå som en tom partisjon er satt opp, kan filsystemet bli opprettet. LFS kan bruke et hvilket som helst filsystem som gjenkjennes av Linux kjernen, men de vanligste typene er ext3 og ext4. Valget av filsystem kan være kompleks og avhenger av egenskapene til filene og størrelsen på partisjonen. For eksempel:
passer for små partisjoner som oppdateres sjelden slik som /boot.
er en oppgradering til ext2 som inkluderer en loggføring for å hjelpe til med å gjenopprette partisjonens status i tilfelle en uren avslutning. Det er ofte brukt som et generelt filsystem.
er den nyeste versjonen av ext filsystemfamilien til partisjonstyper. Det gir flere nye funksjoner, inkludert nano-sekunders tidsstempler, opprettelse og bruk av veldig store filer (16 TB), og hastighetsforbedringer.
Andre filsystemer, inkludert FAT32, NTFS, ReiserFS, JFS og XFS er nyttig for spesialiserte formål. Mer informasjon om disse filsystemene finner du på http://en.wikipedia.org/wiki/Comparison_of_file_systems.
LFS antar at rotfilsystemet (/) er av typen ext4. Å lage et
ext4
filsystemet på LFS
partisjonen, kjør følgende:
mkfs -v -t ext4 /dev/<xxx>
Erstatt <xxx>
med navnet på LFS partisjonen.
Hvis du bruker en eksisterende swap
partisjon, er det ikke nødvendig å
formatere den. Hvis en ny swap
partisjonen ble opprettet, må den initialiseres med denne
kommandoen:
mkswap /dev/<yyy>
Erstatt <yyy>
med navnet på swap
partisjonen.
Gjennom hele denne boken, miljøvariabelen LFS
vil brukes flere ganger. Du bør sørge for at
denne variabelen alltid er definert gjennom hele LFS
byggeprosessen. Det bør settes til navnet på mappen hvor du
skal bygge LFS systemet ditt - vi vil bruke /mnt/lfs
som et eksempel, men mappevalg er
opp til deg. Hvis du bygger LFS på en separat partisjon, vil
denne mappen være monteringspunktet for partisjonen. Velg en
mappeplassering og sett variabelen med følgende kommando:
export LFS=/mnt/lfs
Å ha dette variabelsettet er fordelaktig ved at kommandoer som f.eks mkdir -v $LFS/tools kan skrives bokstavelig. Skallet vil automatisk erstatte “$LFS” med “/mnt/lfs” (eller hva variabelen ble satt til) når den behandler kommandolinjen.
Ikke glem å sjekke at LFS
er satt
når du forlater og går inn i det nåværende arbeidsmiljøet
igjen (for eksempel når du gjør en su til root
eller en annen bruker). Sjekk at
LFS
variabelen er satt opp
skikkelig med:
echo $LFS
Sørg for at utdataene viser banen til LFS systemets bygge
plassering, som er /mnt/lfs
hvis gitt eksempel ble fulgt. Hvis utdaten er feil, bruk
kommandoen gitt tidligere på denne siden for å sette
$LFS
til det riktige mappenavnet.
En måte å sikre at LFS
variabelen
alltid er satt er å redigere .bash_profile
fil i både din personlig
hjemmemappe og i /root/.bash_profile
og skriv inn export
kommandoen ovenfor. I tillegg, skallet spesifisert i
/etc/passwd
fil for alle
brukere som trenger LFS
variabelen
må være bash for å sikre at /root/.bash_profile
filen er innlemmet som
en del av påloggingsprosessen.
En annen vurdering er metoden som brukes for å logge på
vertssystemet. Hvis du logger på via en grafisk
skjermbehandler, brukerens .bash_profile
brukes vanligvis ikke når en
virtuell terminal startes. I dette tilfellet legger du til
export kommandoen til filen .bashrc
for brukeren og root
. I tillegg, noen distribusjoner har
instruksjoner om å ikke kjøre .bashrc
instruksjoner i en ikke interaktiv
bash påkallelse. Sørg for å legge til export kommandoen før
testen for ikke interaktiv bruk.
Nå som et filsystem er opprettet, må partisjonen gjøres
tilgjengelig. For å gjøre dette, må partisjonen være montert på
et valgt monteringspunkt. For formålet med denne boken er det
antatt at filsystemet er montert under mappen spesifisert av
LFS
miljøvariabel som beskrevet i
forrige avsnitt.
Opprett monteringspunktet og monter LFS filsystemet ved å kjøre:
mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx>
$LFS
Erstatt <xxx>
med betegnelsen for LFS partisjon.
Hvis du bruker flere partisjoner for LFS (f.eks. en for
/
og en annen for /home
), monter dem med:
mkdir -pv $LFS mount -v -t ext4 /dev/<xxx>
$LFS mkdir -v $LFS/home mount -v -t ext4 /dev/<yyy>
$LFS/home
Erstatt <xxx>
og <yyy>
med
riktige partisjons navn.
Sørg for at de nye partisjonene ikke er montert med tillatelser
som er for restriktiv (som f.eks nosuid
eller nodev
alternativer). Kjør mount kommandoen uten noen
parametere for å se hvilke alternativer som er satt for den
monterte LFS partisjonen. Hvis nosuid
og/eller nodev
er satt, partisjonene må monteres på
nytt.
Instruksjonene ovenfor forutsetter at du ikke starter datamaskinen på nytt din gjennom hele LFS prosessen. Hvis du slår av systemet, enten må du montere LFS partisjonen på nytt hver gang du starter byggeprosessen på nytt eller modifisere vertssystemets /etc/fstab-fil til å automatisk monter den på nytt ved oppstart. For eksempel:
/dev/<xxx>
/mnt/lfs ext4 defaults 1 1
Hvis du bruker flere valgfrie partisjoner, sørg for å legge dem til også.
Hvis du bruker en swap
partisjon, sørg for at den er aktivert, bruk swapon kommandoen:
/sbin/swapon -v /dev/<zzz>
Erstatt <zzz>
med navnet på swap
partisjonen.
Nå som det er etablert et sted å jobbe, er det på tide å laste ned pakkene.
Dette kapittelet inneholder en liste over pakker som må lastes ned for å bygge et grunnleggende Linux system. De oppførte versjonsnumrene tilsvarer versjoner av programvaren som er kjent for å fungere, og denne boken er basert på deres bruk. Vi anbefaler på det sterkeste å ikke bruke forskjellige versjoner fordi konstruksjonens kommandoer for én versjon kanskje ikke fungerer med en annen versjon, med mindre annen versjon er spesifisert av en LFS errata eller sikkerhetsrådgivning. De nyeste pakkeversjonene kan også ha problemer som krever løsninger. Disse løsningene vil bli utviklet og stabilisert i utviklingsversjon av boken.
For noen pakker, utgivelsens tarball og (Git eller SVN) øyeblikksbilde fra depotets tarball for denne utgivelsen kan publiseres med lignende filnavn. En utgivelses tarball inneholder genererte filer (for eksempel, configure skript generert av autoconf), i tillegg til innholdet i tilsvarende øyeblikksbilde av depot. Boken bruker utgivelses tarballer når det er mulig. Bruke et øyeblikksbilde av depot i stedet for en utgivelses tarball spesifisert av boken vil forårsake problemer.
Nedlastingsplasseringer er kanskje ikke alltid tilgjengelige. Hvis en nedlastings plasseringen har endret seg siden denne boken ble publisert, Google (http://www.google.com/) gir en nyttig søkemotor for de fleste pakkene. Hvis dette søket ikke lykkes, prøv en alternativ måte å laste ned på https://www.linuxfromscratch.org/lfs/mirrors.html#files.
Nedlastede pakker og oppdateringer må oppbevares et sted som er
praktisk tilgjengelig gjennom hele bygget. En fungerende mappe
er også nødvendig for å pakke ut kildene og bygge dem.
$LFS/sources
kan brukes både som
et sted å oppbevare tarballene og oppdateringene og som en
arbeids mappe. Ved å bruke denne mappen vil de nødvendige
elementene være plassert på LFS partisjonen og vil være
tilgjengelig under alle stadier av byggeprosessen.
For å opprette denne mappen, utfør følgende kommando, som
bruker root
, før du starter
nedlastingsøkten :
mkdir -v $LFS/sources
Gjør denne mappen skrivbar og låst (sticky). “Låst” betyr at selv om flere brukere har skrivetillatelse på en mappe, er det bare eieren av en fil som kan slette filen i en låst mappe. Følgende kommando vil aktivere skrive og låste moduser:
chmod -v a+wt $LFS/sources
Det er flere måter å få tak i alle nødvendige pakker og oppdateringer å bygge LFS:
Filene kan lastes ned individuelt som beskrevet i neste to avsnitt.
For stabile versjoner av boken, en tarball av alle nødvendige filer kan lastes ned fra et av LFS filspeilene som er oppført på https://www.linuxfromscratch.org/mirrors.html#files.
Filene kan lastes ned ved hjelp av wget og en wget-liste som beskrevet nedenfor.
For å laste ned alle pakkene og oppdateringene ved å bruke wget-list-sysv som en inngang til kommandoen wget bruk:
wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources
I tillegg, fra og med LFS-7.0, er det en egen fil, md5sums, som kan brukes til å
bekrefte at alle de riktige pakkene er tilgjengelige før du
fortsetter. Legg inn denne filen i $LFS/sources
og kjør:
pushd $LFS/sources md5sum -c md5sums popd
Denne sjekken kan brukes etter å ha hentet de nødvendige filene med en av de metodene oppført ovenfor.
Les sikkerhetsrådene før du laster ned pakker for å finne ut om en nyere versjon av noen pakken bør brukes for å unngå sikkerhetssårbarheter.
Oppstrøms kan fjerne gamle utgivelser, spesielt når disse utgivelser inneholder en sikkerhetssårbarhet. Hvis én URL nedenfor ikke er tilgjengelig, bør du lese sikkerhetsrådene først for å finne ut om en nyere versjon (med sårbarheten fikset) skal brukes. Hvis ikke, prøv å laste ned den fjernede pakken fra et speil. Selv om det er mulig å laste ned en gammel utgivelse fra et speil selv om denne utgivelsen har blitt fjernet på grunn av en sårbarhet, anbefales det ikke bruk en utgivelse som er kjent for å være sårbar for å bygge systemet ditt.
Last ned eller på annen måte skaff deg følgende pakker:
Hjemmeside: https://savannah.nongnu.org/projects/acl
Laste ned: https://download.savannah.gnu.org/releases/acl/acl-2.3.1.tar.xz
MD5 sum: 95ce715fe09acca7c12d3306d0f076b2
Hjemmeside: https://savannah.nongnu.org/projects/attr
Laste ned: https://download.savannah.gnu.org/releases/attr/attr-2.5.1.tar.gz
MD5 sum: ac1c5a7a084f0f83b8cace34211f64d8
Hjemmeside: https://www.gnu.org/software/autoconf/
Laste ned: https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.xz
MD5 sum: 12cfa1687ffa2606337efe1a64416106
Hjemmeside: https://www.gnu.org/software/automake/
Laste ned: https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz
MD5 sum: 4017e96f89fca45ca946f1c5db6be714
SHA256 sum: 80facc09885a57e6d49d06972c0ae1089c5fa8f4d4c7cfe5baea58e5085f136d
Hjemmeside: https://www.gnu.org/software/bash/
Laste ned: https://ftp.gnu.org/gnu/bash/bash-5.1.16.tar.gz
MD5 sum: c17b20a09fc38d67fb303aeb6c130b4e
Hjemmeside: https://git.yzena.com/gavin/bc
Laste ned: https://github.com/gavinhoward/bc/releases/download/6.0.1/bc-6.0.1.tar.xz
MD5 sum: 4c8b8d51eb52ee66f5bcf6a6a1ca576e
Hjemmeside: https://www.gnu.org/software/binutils/
Laste ned: https://ftp.gnu.org/gnu/binutils/binutils-2.39.tar.xz
MD5 sum: f7e986ae9ff06405cafb2e585ee36d27
Hjemmeside: https://www.gnu.org/software/bison/
Laste ned: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
MD5 sum: c28f119f405a2304ff0a7ccdcc629713
Laste ned: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
MD5 sum: 67e051268d0c475ea773822f7500d0e5
Hjemmeside: https://libcheck.github.io/check
Laste ned: https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz
MD5 sum: 50fcafcecde5a380415b12e9c574e0b2
Hjemmeside: https://www.gnu.org/software/coreutils/
Laste ned: https://ftp.gnu.org/gnu/coreutils/coreutils-9.1.tar.xz
MD5 sum: 8b1ca4e018a7dce9bb937faec6618671
Hjemmeside: https://www.gnu.org/software/dejagnu/
Laste ned: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz
MD5 sum: 68c5208c58236eba447d7d6d1326b821
Hjemmeside: https://www.gnu.org/software/diffutils/
Laste ned: https://ftp.gnu.org/gnu/diffutils/diffutils-3.8.tar.xz
MD5 sum: 6a6b0fdc72acfe3f2829aab477876fbc
Hjemmeside: http://e2fsprogs.sourceforge.net/
Laste ned: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.46.5/e2fsprogs-1.46.5.tar.gz
MD5 sum: 3da91854c960ad8a819b48b2a404eb43
Hjemmeside: https://sourceware.org/elfutils/
Laste ned: https://sourceware.org/ftp/elfutils/0.187/elfutils-0.187.tar.bz2
MD5 sum: cc04f07b53a71616b22553c0a458cf4b
Laste ned: https://github.com/eudev-project/eudev/releases/download/v3.2.11/eudev-3.2.11.tar.gz
MD5 sum: 417ba948335736d4d81874fba47a30f7
Hjemmeside: https://libexpat.github.io/
Laste ned: https://prdownloads.sourceforge.net/expat/expat-2.4.8.tar.xz
MD5 sum: 0584a7318a4c007f7ec94778799d72fe
Hjemmeside: https://core.tcl.tk/expect/
Laste ned: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz
MD5 sum: 00fce8de158422f5ccd2666512329bd2
Hjemmeside: https://www.darwinsys.com/file/
Laste ned: https://astron.com/pub/file/file-5.42.tar.gz
MD5 sum: 4d4f70c3b08a8a70d8baf67f085d7e92
Hjemmeside: https://www.gnu.org/software/findutils/
Laste ned: https://ftp.gnu.org/gnu/findutils/findutils-4.9.0.tar.xz
MD5 sum: 4a4a547e888a944b2f3af31d789a1137
Hjemmeside: https://github.com/westes/flex
Laste ned: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
MD5 sum: 2882e3179748cc9f9c23ec593d6adc8d
Hjemmeside: https://www.gnu.org/software/gawk/
Laste ned: https://ftp.gnu.org/gnu/gawk/gawk-5.1.1.tar.xz
MD5 sum: 83650aa943ff2fd519b2abedf8506ace
Hjemmeside: https://gcc.gnu.org/
Laste ned: https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.xz
MD5 sum: 73bafd0af874439dcdb9fc063b6fb069
SHA256 sum:
Hjemmeside: https://www.gnu.org/software/gdbm/
Laste ned: https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz
MD5 sum: 8551961e36bf8c70b7500d255d3658ec
Hjemmeside: https://www.gnu.org/software/gettext/
Laste ned: https://ftp.gnu.org/gnu/gettext/gettext-0.21.tar.xz
MD5 sum: 40996bbaf7d1356d3c22e33a8b255b31
Hjemmeside: https://www.gnu.org/software/libc/
Laste ned: https://ftp.gnu.org/gnu/glibc/glibc-2.36.tar.xz
MD5 sum: 00e9b89e043340f688bc93ec03239b57
Hjemmeside: https://www.gnu.org/software/gmp/
Laste ned: https://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz
MD5 sum: 0b82665c4a92fd2ade7440c13fcaa42b
Hjemmeside: https://www.gnu.org/software/gperf/
Laste ned: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
MD5 sum: 9e251c0a618ad0824b51117d5d9db87e
Hjemmeside: https://www.gnu.org/software/grep/
Laste ned: https://ftp.gnu.org/gnu/grep/grep-3.7.tar.xz
MD5 sum: 7c9cca97fa18670a21e72638c3e1dabf
Hjemmeside: https://www.gnu.org/software/groff/
Laste ned: https://ftp.gnu.org/gnu/groff/groff-1.22.4.tar.gz
MD5 sum: 08fb04335e2f5e73f23ea4c3adbf0c5f
Hjemmeside: https://www.gnu.org/software/grub/
Laste ned: https://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz
MD5 sum: cf0fd928b1e5479c8108ee52cb114363
Hjemmeside: https://www.gnu.org/software/gzip/
Laste ned: https://ftp.gnu.org/gnu/gzip/gzip-1.12.tar.xz
MD5 sum: 9608e4ac5f061b2a6479dc44e917a5db
Hjemmeside: https://www.iana.org/protocols
Laste ned: https://github.com/Mic92/iana-etc/releases/download/20220812/iana-etc-20220812.tar.gz
MD5 sum: 851a53efd53c77d0ad7b3d2b68d8a3fc
Hjemmeside: https://www.gnu.org/software/inetutils/
Laste ned: https://ftp.gnu.org/gnu/inetutils/inetutils-2.3.tar.xz
MD5 sum: e73e2ed42d73ceb47616b20131236036
SHA256 sum:
Hjemmeside: https://freedesktop.org/wiki/Software/intltool
Laste ned: https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz
MD5 sum: 12e517cac2b57a0121cda351570f1e63
Hjemmeside: https://www.kernel.org/pub/linux/utils/net/iproute2/
Laste ned: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-5.19.0.tar.xz
MD5 sum: 415bd9eeb8515a585e245809d2fe45a6
Hjemmeside: https://kbd-project.org/
Laste ned: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.5.1.tar.xz
MD5 sum: 10f10c0a9d897807733f2e2419814abb
Laste ned: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-30.tar.xz
MD5 sum: 85202f0740a75eb52f2163c776f9b564
Hjemmeside: https://www.greenwoodsoftware.com/less/
Laste ned: https://www.greenwoodsoftware.com/less/less-590.tar.gz
MD5 sum: f029087448357812fba450091a1172ab
Laste ned: https://www.linuxfromscratch.org/lfs/downloads/11.2/lfs-bootscripts-20220723.tar.xz
MD5 sum: 74884d0d91616f843599c99a333666da
Hjemmeside: https://sites.google.com/site/fullycapable/
Laste ned: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.65.tar.xz
MD5 sum: 3543e753dd941255c4def6cc67a462bb
Hjemmeside: https://sourceware.org/libffi/
Laste ned: https://github.com/libffi/libffi/releases/download/v3.4.2/libffi-3.4.2.tar.gz
MD5 sum: 294b921e6cf9ab0fbaea4b639f8fdbe8
Hjemmeside: http://libpipeline.nongnu.org/
Laste ned: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.6.tar.gz
MD5 sum: 829c9ba46382b0b3e12dd11fcbc1bb27
Hjemmeside: https://www.gnu.org/software/libtool/
Laste ned: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz
MD5 sum: 2fc0b6ddcd66a89ed6e45db28fa44232
Hjemmeside: https://www.kernel.org/
Laste ned: https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.19.2.tar.xz
MD5 sum: 391274e2e49a881403b0ff2e0712bf82
Linux kjernen oppdateres relativt ofte, mange ganger pga oppdagelser av sikkerhetssårbarheter. Den siste tilgjengelige stabile kjerne versjonen kan være brukt, med mindre errata siden sier noe annet.
For brukere med begrenset hastighet eller dyr båndbredde som ønsker å oppdatere Linux kjernen, en grunnlinjeversjon av pakken og oppdateringer kan lastes ned separat. Dette kan spare litt tid eller kostnad for en påfølgende nivåoppgradering av oppdateringer i en mindre utgivelse.
Hjemmeside: https://www.gnu.org/software/m4/
Laste ned: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz
MD5 sum: 0d90823e1426f1da2fd872df0311298d
Hjemmeside: https://www.gnu.org/software/make/
Laste ned: https://ftp.gnu.org/gnu/make/make-4.3.tar.gz
MD5 sum: fc7a67ea86ace13195b0bce683fd4469
Hjemmeside: https://www.nongnu.org/man-db/
Laste ned: https://download.savannah.gnu.org/releases/man-db/man-db-2.10.2.tar.xz
MD5 sum: e327f7af3786d15e5851658ae7ef47ed
Hjemmeside: https://www.kernel.org/doc/man-pages/
Laste ned: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-5.13.tar.xz
MD5 sum: 3ac24e8c6fae26b801cb87ceb63c0a30
Hjemmeside: https://mesonbuild.com
Laste ned: https://github.com/mesonbuild/meson/releases/download/0.63.1/meson-0.63.1.tar.gz
MD5 sum: 078e59d11a72b74c3bd78cb8205e9ed7
Hjemmeside: http://www.multiprecision.org/
Laste ned: https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz
MD5 sum: 9f16c976c25bb0f76b50be749cd7a3a8
Hjemmeside: https://www.mpfr.org/
Laste ned: https://ftp.gnu.org/gnu/mpfr/mpfr-4.1.0.tar.xz
MD5 sum: bdd3d5efba9c17da8d83a35ec552baef
Hjemmeside: https://www.gnu.org/software/ncurses/
Laste ned: https://invisible-mirror.net/archives/ncurses/ncurses-6.3.tar.gz
MD5 sum: a2736befde5fee7d2b7eb45eb281cdbe
Hjemmeside: https://ninja-build.org/
Laste ned: https://github.com/ninja-build/ninja/archive/v1.11.0/ninja-1.11.0.tar.gz
MD5 sum: 7d1a1a2f5cdc06795b3054df5c17d5ef
Hjemmeside: https://www.openssl.org/
Laste ned: https://www.openssl.org/source/openssl-3.0.5.tar.gz
MD5 sum: 163bb3e58c143793d1dc6a6ec7d185d5
Hjemmeside: https://savannah.gnu.org/projects/patch/
Laste ned: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz
MD5 sum: 78ad9937e4caadcba1526ef1853730d5
Hjemmeside: https://www.perl.org/
Laste ned: https://www.cpan.org/src/5.0/perl-5.36.0.tar.xz
MD5 sum: 826e42da130011699172fd655e49cfa2
Hjemmeside: https://www.freedesktop.org/wiki/Software/pkg-config
Laste ned: https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
MD5 sum: f6e931e319531b736fadc017f470e68a
Hjemmeside: https://sourceforge.net/projects/procps-ng
Laste ned: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.0.tar.xz
MD5 sum: eedf93f2f6083afb7abf72188018e1e5
Hjemmeside: https://gitlab.com/psmisc/psmisc
Laste ned: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.5.tar.xz
MD5 sum: 014f0b5d5ab32478a2c57812ad01e1fb
Hjemmeside: https://www.python.org/
Laste ned: https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
MD5 sum: afc7e14f7118d10d1ba95ae8e2134bf0
Laste ned: https://www.python.org/ftp/python/doc/3.10.6/python-3.10.6-docs-html.tar.bz2
MD5 sum: 8f32c4f4f0b18ec56e8b3822bbaeb017
Hjemmeside: https://tiswww.case.edu/php/chet/readline/rltop.html
Laste ned: https://ftp.gnu.org/gnu/readline/readline-8.1.2.tar.gz
MD5 sum: 12819fa739a78a6172400f399ab34f81
Hjemmeside: https://www.gnu.org/software/sed/
Laste ned: https://ftp.gnu.org/gnu/sed/sed-4.8.tar.xz
MD5 sum: 6d906edfdb3202304059233f51f9a71d
Hjemmeside: https://shadow-maint.github.io/shadow/
Laste ned: https://github.com/shadow-maint/shadow/releases/download/4.12.2/shadow-4.12.2.tar.xz
MD5 sum: 52637cb34c357acf85c617cf95da34a6
Hjemmeside: https://www.infodrom.org/projects/sysklogd/
Laste ned: https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz
MD5 sum: c70599ab0d037fde724f7210c2c8d7f8
Hjemmeside: https://savannah.nongnu.org/projects/sysvinit
Laste ned: https://download.savannah.gnu.org/releases/sysvinit/sysvinit-3.04.tar.xz
MD5 sum: 9a00e5f15dd2f038f10feee50677ebff
Hjemmeside: https://www.gnu.org/software/tar/
Laste ned: https://ftp.gnu.org/gnu/tar/tar-1.34.tar.xz
MD5 sum: 9a08d29a9ac4727130b5708347c0f5cf
Hjemmeside: http://tcl.sourceforge.net/
Laste ned: https://downloads.sourceforge.net/tcl/tcl8.6.12-src.tar.gz
MD5 sum: 87ea890821d2221f2ab5157bc5eb885f
Laste ned: https://downloads.sourceforge.net/tcl/tcl8.6.12-html.tar.gz
MD5 sum: a0d1a5b60bbb68f2f0bd3066a19c527a
Hjemmeside: https://www.gnu.org/software/texinfo/
Laste ned: https://ftp.gnu.org/gnu/texinfo/texinfo-6.8.tar.xz
MD5 sum: a91b404e30561a5df803e6eb3a53be71
Hjemmeside: https://www.iana.org/time-zones
Laste ned: https://www.iana.org/time-zones/repository/releases/tzdata2022c.tar.gz
MD5 sum: 4e3b2369b68e713ba5d3f7456f20bfdb
Laste ned: https://anduin.linuxfromscratch.org/LFS/udev-lfs-20171102.tar.xz
MD5 sum: 27cd82f9a61422e186b9d6759ddf1634
Hjemmeside: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/
Laste ned: https://www.kernel.org/pub/linux/utils/util-linux/v2.38/util-linux-2.38.1.tar.xz
MD5 sum: cd11456f4ddd31f7fbfdd9488c0c0d02
Hjemmeside: https://www.vim.org
Laste ned: https://anduin.linuxfromscratch.org/LFS/vim-9.0.0228.tar.gz
MD5 sum: bc7e0a4829d94bb4c03a7a6b4ad6a8cf
The version of vim changes daily. To get the latest version, go to https://github.com/vim/vim/tags.
Hjemmeside: https://pypi.org/project/wheel/
Laste ned: https://anduin.linuxfromscratch.org/LFS/wheel-0.37.1.tar.gz
MD5 sum: f490f1399e5903706cb1d4fbed9ecb28
Hjemmeside: https://github.com/chorny/XML-Parser
Laste ned: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.46.tar.gz
MD5 sum: 80bb18a8e6240fcf7ec2f7b57601c170
Hjemmeside: https://tukaani.org/xz
Laste ned: https://tukaani.org/xz/xz-5.2.6.tar.xz
MD5 sum: d9cd5698e1ec06cf638c0d2d645e8175
Hjemmeside: https://www.zlib.net/
Laste ned: https://zlib.net/zlib-1.2.12.tar.xz
MD5 sum: 28687d676c04e7103bb6ff2b9694c471
Hjemmeside: https://facebook.github.io/zstd/
Laste ned: https://github.com/facebook/zstd/releases/download/v1.5.2/zstd-1.5.2.tar.gz
MD5 sum: 072b10f71f5820c24761a65f31f43e73
Total størrelse på disse pakkene: ca 461 MB
I tillegg til pakkene kreves det også flere oppdateringer. Disse oppdateringene retter eventuelle feil i pakkene som skal være fikset av vedlikeholderen. Oppdateringene gjør også små modifikasjoner som gjør pakkene lettere å jobbe med. Følgende oppdateringene vil være nødvendig for å bygge et LFS-system:
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/bzip2-1.0.8-install_docs-1.patch
MD5 sum: 6a5ac7e89b791aae556de0f745916f7f
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/coreutils-9.1-i18n-1.patch
MD5 sum: c1ac7edf095027460716577633da9fc5
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/glibc-2.36-fhs-1.patch
MD5 sum: 9a5997c3452909b1769918c759eff8a2
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/kbd-2.5.1-backspace-1.patch
MD5 sum: f75cca16a38da6caa7d52151f7136895
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/sysvinit-3.04-consolidated-1.patch
MD5 sum: 4900322141d493e74020c9cf437b2cdc
Last ned: https://www.linuxfromscratch.org/patches/lfs/11.2/zstd-1.5.2-upstream_fixes-1.patch
MD5 sum: a7e576e3f87415fdf388392b257cdcf3
Total størrelse på disse oppdateringene: ca 188.8 KB
I tillegg til de ovennevnte nødvendige oppdateringene, finnes det en rekke valgfrie oppdateringer laget av LFS fellesskapet. Disse valgfrie oppdateringene løser mindre problemer eller aktiverer funksjonalitet som ikke er aktivert som standard. Les gjerne oppdateringsdatabasen som ligger på https://www.linuxfromscratch.org/patches/downloads/ and acquire any additional patches to suit your system needs.
I dette kapittelet vil vi utføre noen tilleggsoppgaver for å
forberede byggingen av det midlertidige systemet. Vi vil lage
et sett med mapper i $LFS
for
installasjon av midlertidige verktøy, legg til en uprivilegert
bruker for å redusere risikoen, og skape et passende byggemiljø
for den brukeren. Det vil også bli forklart tidsenheten vi
bruker for å måle hvor lang tid LFS pakker tar å bygge, som er
“SBU”, og gi litt informasjon om
pakkenes testpakker.
Den første oppgaven som utføres i LFS partisjonen er å lage et begrenset mappehierarki slik at programmer kompilert i Kapittel 6 (i tillegg til glibc og libstdc++ i Kapittel 5) kan installeres i deres endelige plassering. Dette er nødvendig for at de midlertidige programmene skal overskrives når du bygger dem igjen i Chapter 8.
Opprett det nødvendige mappeoppsettet ved å kjøre følgende som
root
:
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin} for i in bin lib sbin; do ln -sv usr/$i $LFS/$i done case $(uname -m) in x86_64) mkdir -pv $LFS/lib64 ;; esac
Programmer i Kapittel 6 vil bli kompilert med en krysskompilator (mer detaljer i avsnitt Toolchain Technical Notes). For å skille denne krysskompilatoren fra de andre programmene, vil den bli installert i en spesiell mappe. Opprett denne mappen med:
mkdir -pv $LFS/tools
Når du er logget inn som bruker root
, kan det å gjøre en enkelt feil skade
eller ødelegge et system. Derfor, pakkene i de neste to
kapitlene er bygget som en uprivilegert bruker. Du kan bruke
ditt eget brukernavn, men for å gjøre det enklere å sette opp
en ren arbeidsmiljø, opprett en ny bruker kalt lfs
som medlem av en ny gruppe (også kalt
lfs
) og bruk denne brukeren
under installasjonsprosessen. Som root
, utfør følgende kommandoer for å legge
til den nye brukeren:
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs
Betydningen av kommandolinjealternativene:
-s
/bin/bash
Dette gjør bash standard skall for
brukeren lfs
.
-g
lfs
Dette alternativet legger til bruker lfs
til gruppe lfs
.
-m
Dette oppretter en hjemmemappe for lfs
.
-k
/dev/null
Denne parameteren forhindrer mulig kopiering av filer fra
en skjelett mappe (standard er /etc/skel
) ved å endre
inndataplasseringen til den spesielle nullenheten.
lfs
Dette er det faktiske navnet på den opprettede brukeren..
For å logge inn som lfs
i
motsetning til å bytte til bruker lfs
når logget inn som root
, som ikke krever at lfs
bruker har et passord), gi lfs
et passord:
passwd lfs
Bevilg lfs
full tilgang til
alle mapper under $LFS
ved å
gjøre lfs
eier av mappene:
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -v lfs $LFS/lib64 ;; esac
I noen vertssystemer fullføres ikke følgende kommando riktig og suspenderer påloggingen til lfs brukeren til bakgrunnen. Hvis ledeteksten "lfs:~$" ikke vises umiddelbart, å skrive inn fg kommandoen vil fikse problemet..
Deretter logger du på som bruker lfs
. Dette kan gjøres via en virtuell
konsoll, gjennom en skjermbehandler eller med følgende
erstatt/bytt brukerkommando:
su - lfs
“-
” instruerer
su å starte et
påloggingsskall i motsetning til et ikke-påloggingsskall.
Forskjellen mellom disse to skjelltypene finner du i detalj i
bash(1)
og info bash.
Sett opp et godt arbeidsmiljø ved å lage to nye oppstartsfiler
for bash skallet.
Mens du er logget inn som bruker lfs
, utsted følgende kommando å lage en ny
.bash_profile
:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
Når du er logget på som bruker lfs
, det første skallet er vanligvis et
login skall som leser
filen /etc/profile
fra verten
(som sannsynligvis inneholder noen innstillinger og
miljøvariabler) og deretter .bash_profile
. exec env -i.../bin/bash
kommandoen i .bash_profile
filen
erstatter det kjørende skallet med et nytt med et helt tomt
miljø, bortsett fra HOME
,
TERM
, og PS1
variabler. Dette sikrer at ingen uønskede og
potensielt farlige miljøvariabler fra vertssystemet lekker inn
i byggemiljøet. Teknikken som brukes her oppnår målet om å
sikre et rent miljø.
Den nye instansen av skallet er et non-login skall, som ikke leser, og
utfører, innholdet i /etc/profile
eller .bash_profile
filer, men
heller leser og kjører .bashrc
filen istedet. Opprett .bashrc
filen nå:
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
Betydningen av innstillingene i .bashrc
set
+h
set +h
kommandoen slår av bash's hashfunksjon.
Hashing er vanligvis en nyttig
funksjon—bash
bruker en hashtabell for å huske banen til kjørbare filer
for å unngå å søke i PATH
gang
på gang for å finne den samme kjørbare filen. Imidlertid
bør de nye verktøyene brukes så snart de er installert.
Ved å slå av hashfunksjonen, vil skallet alltid søke
PATH
når et program kjøres.
Som sådan vil skallet finne de nylig kompilerte
verktøyene i $LFS/tools/bin
så snart de er det tilgjengelig uten å huske en tidligere
versjon av det samme programmet levert av vertsdistroen,
i /usr/bin
eller
/bin
.
umask
022
Å sette brukerfilopprettingsmasken (umask) til 022 sikrer
at nye opprettede filer og mapper bare kan skrives av
eieren, men er lesbar og kjørbar av alle (forutsatt at
standardmoduser brukes av open(2)
systemkall, vil nye filer ende
opp med tillatelse modus 644 og mapper med modus 755).
LFS=/mnt/lfs
LFS
variabelen skal settes til
det valgte monteringens punkt.
LC_ALL=POSIX
LC_ALL
variabel styrer
lokaliseringen av visse programmer, slik at meldingene
deres følger konvensjonene i et spesifisert land.
Innstillingen LC_ALL
til
“POSIX” eller “C”
(de to er likeverdige) sikrer at alt fungerer som
forventet i chroot miljøet.
LFS_TGT=(uname
-m)-lfs-linux-gnu
LFS_TGT
variabel setter en
ikkestandard, men kompatibel maskin beskrivelse for bruk
når du bygger vår krysskompiler og linker og når du
krysskompiler vår midlertidige verktøykjede. Mer
informasjon finnes i Toolchain Technical
Notes.
PATH=/usr/bin
Mange moderne Linux distribusjoner har slått sammen
/bin
og /usr/bin
. Når dette er tilfelle,
standard PATH
variabel må
settes bare til /usr/bin/
for
Kapittel 6 miljøet. Når dette ikke er tilfelle,
legger følgende linje til /bin
til stien.
if [ ! -L
/bin ]; then PATH=/bin:$PATH; fi
Hvis /bin
er ikke et
symbolsk lenke, så må den legges til PATH
variabelen.
PATH=$LFS/tools/bin:$PATH
Ved å putte $LFS/tools/bin
foran standard PATH
,
krysskompilatoren installert i begynnelsen av Kapittel 5
blir plukket opp av skallet umiddelbart etter
installasjonen. Dette, kombinert med å slå av hashing,
begrenser risikoen for at kompilatoren fra verten brukes
i stedet for krysskompilator.
CONFIG_SITE=$LFS/usr/share/config.site
I Kapittel 5
og
Kapittel 6, hvis denne variabelen ikke er satt,
configure
skriptet kan forsøke å laste inn konfigurasjonselementer
som er spesifikke for enkelte distribusjoner fra
/usr/share/config.site
på
vertssystemet. Overstyr det for å forhindre potensiell
forurensning fra verten.
export
...
Mens kommandoene ovenfor har satt noen variabler, i rekkefølge for å gjøre dem synlige innenfor eventuelle underskall, eksporterer vi dem.
Flere kommersielle distribusjoner legger til en ikke
dokumentert instansiering of /etc/bash.bashrc
til initialisering av
bash. Denne
filen har potensial til å endre lfs
brukerens miljø på måter som kan
påvirke byggingen av kritiske LFS pakker. For å sikre at
lfs
brukerens miljø er rent,
sjekk for nærvær av /etc/bash.bashrc
og flytt den ut av veienh
vis den er tilstede. Som root
bruker, kjør:
[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE
Etter at bruken av lfs
brukeren er ferdig i begynnelsen av
Chapter 7, du kan gjenopprette /etc/bash.bashrc
(hvis ønsket).
Legg merke til at LFS Bash pakken vi vil bygge i Section 8.34,
“Bash-5.1.16” ikke er konfigurert til å laste
eller kjøre /etc/bash.bashrc
,
så denne filen er ubrukelig på et fullført LFS system.
Til slutt, å ha miljøet fullt forberedt for å bygge midlertidige verktøy, hente den nettopp opprettede brukerprofilen:
source ~/.bash_profile
Mange vil gjerne vite på forhånd hvor lenge det tar å kompilere og installere hver pakke. Fordi Linux Fra Scratch kan bygges på mange forskjellige systemer, er det umulig å gi nøyaktige tidsanslag. Den største pakken (Glibc) vil ta omtrent 20 minutter på de raskeste systemene, men kan ta opptil tre dager på tregere systemer! I stedet for å oppgi faktiske tider, vil Standard byggenhet (SBU) brukes i stedet.
SBU fungerer som følgende. Den første pakken som skal kompileres fra denne boken er binutils i Kapittel 5. Den tiden det tar å kompilere denne pakken er det som vil bli referert til som Standard byggenhet eller SBU. Alle andre kompileringstider vil bli uttrykt relative til denne tiden.
Tenk for eksempel på en pakke hvis kompileringstid er 4,5 SBU. Dette betyr at hvis et system tok 10 minutter å kompilere og installer det første passet med binutils, vil det ta omtrent 45 minutter å bygge denne eksempelpakken. Heldigvis er de fleste byggetidene kortere enn den for binutils.
Generelt er ikke SBU helt nøyaktige fordi de er avhengige av mange faktorer, inkludert vertssystemets versjon av GCC. De er gitt her for å gi et estimat på hvor lang tid det kan ta å installere en pakke, men tall kan variere med så mye som dusinvis av minutter i noen tilfeller.
For mange moderne systemer med flere prosessorer (eller kjerner) kan kompileringstiden for en pakke reduseres ved å utføre en "parallell make" ved å enten sette en miljøvariabel eller fortelle make programmer hvor mange prosessorer som er tilgjengelige. For eksempel kan en Intel i5-6500 CPU støtte fire samtidige prosesser med:
export MAKEFLAGS='-j4'
eller bare bygge med:
make -j4
Når flere prosessorer brukes på denne måten, vil SBU enhetene i boken variere enda mer enn de normalt ville gjort. I noen tilfeller, make trinnet vil rett og slett mislykkes. Å analysere resultatet av byggeprosessen vil også være vanskeligere fordi linjene i forskjellige prosesser vil være sammenflettet. Hvis du får et problem med et byggetrinn, gå tilbake til et enkelt prosessorbygg for å analysere feilmeldingene på riktig måte.
De fleste pakkene gir en testpakke. Å kjøre testpakken for en nybygd pakke er en god idé fordi den kan gi en “tilregnelighets sjekk” som indikerer at alt er kompilert riktig. En testpakke som består sitt sett med kontroller, beviser vanligvis at pakken fungerer slik utvikleren har tenkt. Det gir imidlertid ingen garanti at pakken er helt feilfri.
Noen testpakker er viktigere enn andre. For eksempel, testpakkene for kjerneverktøykjedepakkene—GCC, binutils, og glibc—er av største betydning på grunn av deres sentrale rolle i et riktig fungerende system. Testpakkene for GCC og glibc kan ta veldig lang tid å fullføre, spesielt på tregere maskinvare, men anbefales på det sterkeste.
Å kjører testpakkene i Kapittel 5 og Kapittel 6 er umulig, siden programmene er kompilert med en krysskompilator, som ikke ment å kunne kjøre på byggeverten.
Et vanlig problem med å kjøre testpakkene for binutils og GCC
er å gå tom for pseudoterminaler (PTY). Dette kan resultere i
et høyt antall feilende prøver. Dette kan skje av flere
grunner, men den mest sannsynlig årsaken er at vertssystemet
ikke har devpts
filsystemet
satt opp riktig. Dette spørsmålet diskuteres mer detaljert på
https://www.linuxfromscratch.org/lfs/faq.html#no-ptys.
Noen ganger vil pakkers testpakker mislykkes, men av årsaker som utviklere er klar over og har ansett som ikke kritiske. Se loggene som finnes på https://www.linuxfromscratch.org/lfs/build-logs/11.2/ for å bekrefte om disse feilene er forventet eller ikke. Denne siden er gyldig for alle tester i denne boken.
Denne delen er delt inn i tre stadier: først bygge en krysskompilator og tilhørende biblioteker; for det andre, bruke denne kryssverktøykjeden å bygge flere verktøy på en måte som isolerer dem fra vertens distribusjon; for det tredje, gå inn i chroot miljøet, som forbedrer ytterligere vertsisolasjon, og bygge de resterende verktøyene som trengs for å bygge det endelige systemet.
Med denne delen begynner det virkelige arbeidet med å bygge et nytt system. Det krever mye forsiktighet for å sikre at instruksjonene blir fulgt nøyaktig slik boken viser dem. Du bør prøve å forstå hva de gjør, og uansett hvor ivrig du er etter å fullføre bygget, bør du avstå fra å skrive dem blindt som vist, men les heller dokumentasjon når det er noe du ikke forstår. Hold også styr på skrivingen din og utdata av kommandoer, ved å sende dem til en fil ved å bruke tee verktøyet. Dette gir bedre diagnose hvis noe går galt.
Den neste delen gir en teknisk introduksjon til byggeprosessen, mens den følgende inneholder veldig viktige generelle instruksjoner.
Denne delen forklarer noen av begrunnelsen og de tekniske detaljene bak den overordnede byggemetoden. Det er ikke nødvendig å umiddelbart forstå alt i denne delen. Det meste av denne informasjonen vil være klarere etter å ha utført en faktisk konstruksjon. Denne delen kan refereres til når som helst under prosessen.
Det overordnede målet for Kapittel 5 og Kapittel 6 er å produsere et midlertidig område som inneholder et kjent sett med verktøy som kan isoleres fra vertssystemet. Ved bruk av chroot, kommandoene i de resterende kapitlene vil være inne i det miljøet, og sikre en ren, problemfri bygging av det nye LFS systemet. Byggeprosessen er designet for å minimere risikoen for nye lesere og gi den mest pedagogiske verdien samtidig.
Byggeprosessen baserer seg på prosessen med krysskompilering. Krysskompilering brukes normalt for å bygge en kompilator og dens verktøykjede for en annen maskin enn den som brukes til byggingen. Dette er strengt tatt ikke nødvendig for LFS, siden maskinen der det nye systemet skal kjøre er den samme som den brukt til byggingen. Men krysskompilering har den store fordelen at alt som er krysskompilert ikke avhenger av vertsmiljøet.
LFS boken er ikke, og inneholder ikke en generell veiledning til å bygge en kryss (eller lokal) verktøykjede. Ikke bruk kommandoen i boken for en kryssverktøykjede som skal brukes til andre formål enn å bygge LFS, med mindre du virkelig forstår hva du gjør.
Krysskompilering involverer noen begreper som fortjener en seksjon for seg selv. Selv om denne delen kan utelates i en første lesning, å komme tilbake til det senere vil være gunstig for din fulle forståelse av prosessen.
La oss først definere noen begreper som brukes i denne sammenhengen:
er maskinen der vi bygger programmer. Merk at denne maskinen refereres til som “verten” i andre seksjoner.
er maskinen/systemet der de bygde programmene skal kjøres. Merk at denne bruken av “host” ikke er den samme som i andre seksjoner.
brukes kun for kompilatorer. Det er maskinen kompilatoren produserer kode for. Det kan være forskjellig fra både build og host.
Som et eksempel, la oss forestille oss følgende scenario (noen ganger referert til som “Canadian Cross”): vi kan ha en kompilator bare på en treg maskin, la oss kalle det maskin A, og kompilatoren ccA. Vi kan også ha en rask maskin (B), men uten kompilator, og vi ønsker å produsere kode for en annen treg maskin (C). Å bygge en kompilator for maskin C, ville vi ha tre trinn:
Stadie | Bygg | Vert | Mål | Handling |
---|---|---|---|---|
1 | A | A | B | bygg krysskompilator cc1 med ccA på maskin A |
2 | A | B | C | bygg krysskompilator cc2 med cc1 på maskin A |
3 | B | C | C | bygg kompilator ccC med cc2 på maskin B |
Deretter kan alle de andre programmene som trengs av maskin C kompileres ved å bruke cc2 på den raske maskinen B. Merk at med mindre B kan kjøre programmer produsert for C, er det ingen måte å teste de bygde programmene før maskinen C selv kjører. For eksempel, for å teste ccC, vil vi kanskje legge til en fjerde trinn:
Stadie | Bygg | Vert | Mål | Handling |
---|---|---|---|---|
4 | C | C | C | bygge om og teste ccC ved å bruke seg selv på maskin C |
I eksemplet ovenfor er bare cc1 og cc2 krysskompilatorer, det vil si de produserer kode for en annen maskin enn de de kjører på. De andre kompilatorene ccA og ccC produserer kode for maskinen de kjører på. Slike kompilatorer kalles lokale kompilatorer.
Nesten alle byggesystemer bruker navn i formen
cpu-vendor-kernel-os referert til som maskintripletten. En
klok leseren kan lure på hvorfor en “triplett” refererer til et
firekomponents navn. Årsaken er historie: i utgangspunktet
var tre komponentnavn nok å angi en maskin entydig, men nye
maskiner og systemer dukket opp, som viste seg
utilstrekkelig. Ordet “triplett” hang igjen. En enkel
måte å finne din maskintriplett på er å kjøre config.guess skript som
følger med kilden for mange pakker. Pakk ut binutils kilder
og kjør skriptet: ./config.guess
og merk
deg utdataen. For eksempel, for en 32-bits Intel-prosessor
utdataen vil være i686-pc-linux-gnu. På et 64-bit
system blir det x86_64-pc-linux-gnu.
Vær også oppmerksom på navnet på plattformens dynamiske
lenker, ofte referert til som den dynamiske lasteren (ikke
å forveksle med standard lenker ld som er en del av
binutils). Den dynamiske lenkeren levert av Glibc finner og
laster de delte bibliotekene som trengs av et program,
forbereder programmet for kjøring, og deretter kjører det.
Navnet på dynamisk lenker for en 32-bits Intel-maskin er
ld-linux.so.2
og er
ld-linux-x86-64.so.2
for
64-bits systemer. En sikker måte å bestemme navnet på den
dynamiske lenkeren på er å inspisere en tilfeldig binær fra
vertssystemet ved å kjøre: readelf -l <name of binary> | grep
interpreter
og legger merke til utdataen.
Den autoritative referansen som dekker alle plattformer er
i shlib-versions
filen i
roten til Glibc kildetreet.
For å forfalske en krysskompilering i LFS, navnet på
vertstripletten justeres litt ved å endre "vendor" feltet i
LFS_TGT
variabelen. Vi bruker også
--with-sysroot
alternativet når du bygger krysslenkeren og krysskompilatoren
for å fortelle dem hvor de skal finne de nødvendige
vertsfilene. Dette sikrer at ingen av de andre programmene
bygget i
Kapittel 6 kan lenke til biblioteker på
byggemaskinen. Kun to trinn er obligatoriske, og ett til for
tester:
Stadie | Bygg | Vert | Mål | Handling |
---|---|---|---|---|
1 | pc | pc | lfs | bygg krysskompilator cc1 ved å bruke cc-pc på pc |
2 | pc | lfs | lfs | bygg kompilator cc-lfs ved å bruke cc1 på pc |
3 | lfs | lfs | lfs | bygge om og teste cc-lfs ved å bruke seg selv på lfs |
I tabellen ovenfor, “på pc” betyr at kommandoene kjøres på en maskin som bruker den allerede installerte distribusjonen. “på lfs” betyr at kommandoene kjøres i et chroot-miljø.
Nå er det mer om krysskompilering: C-språket er ikke bare en kompilator, men definerer også et standardbibliotek. I denne boken blir GNU C-biblioteket, kalt glibc, brukt. Dette biblioteket må kompileres for lfs-maskinen, det vil si ved å bruke krysskompilatoren cc1. Men kompilatoren selv bruker interne bibliotekimplementeringskomplekse instruksjoner som ikke tilgjengelige i assembleranvisningssettet. Dette interne biblioteket heter libgcc, og må være koblet til glibc biblioteket for å være fullt funksjonelt! Videre må standardbiblioteket for C++ (libstdc++) også kobles til glibc. Løsningen på dette kylling og egg problemet er først å bygge en degradert cc1 basert libgcc, som mangler noen funksjoner som tråder og unntakshåndtering, bygge glibc ved å bruke denne degraderte kompilatoren (glibc selv er ikke degradert), og bygg deretter libstdc++. Men dette siste biblioteket vil mangle samme funksjonalitet som libgcc.
Dette er ikke slutten på historien: konklusjonen av det foregående avsnittet er at cc1 ikke er i stand til å bygge en fullt funksjonell libstdc++, men dette er den eneste kompilatoren som er tilgjengelig for å bygge C/C++ bibliotekene under trinn 2! Selvfølgelig, kompilatoren bygget under trinn 2, cc-lfs, ville være i stand til å bygge disse bibliotekene, men (1) byggesystemet til GCC vet ikke at det er brukbart på pc, og (2) å bruke det på pc vil være en fare for å koble til pc-bibliotekene, siden cc-lfs er en lokal kompilator. Så vi må bygge libstdc++ senere, i chroot.
Krysskompilatoren vil bli installert i en separat
$LFS/tools
mappe, siden det
ikke vil være en del av det endelige systemet.
Binutils installeres først fordi configure kjøringer av både GCC og Glibc utfører forskjellige funksjonstester på assembleren og lenker for å bestemme hvilke programvarefunksjoner som skal aktiveres eller deaktiveres. Dette er viktigere enn man kanskje først er klar over. En feilkonfigurert GCC eller Glibc kan resultere i en subtilt ødelagt verktøykjede, hvor virkningen av et slikt brudd ikke vises før mot slutten av konstruksjonen av hele distribusjonen. En feil i testserien vil vanligvis fremheve denne feilen før det utføres for mye tilleggsarbeid.
Binutils installerer sin assembler og lenker på to steder,
$LFS/tools/bin
og $LFS/tools/$LFS_TGT/bin
. Verktøyene i en
plassering er hardlenket til den andre. En viktig fasett av
lenkeren er bibliotekets søkerekkefølge. Detaljert
informasjon kan fås fra ld ved å gi den --verbose
flagget. For
eksempel, $LFS_TGT-ld --verbose
| grep SEARCH vil illustrere gjeldende
søkestier og rekkefølgen deres. Det viser hvilken filer som
er lenket av ld
ved å kompilere et dummyprogram og gi --verbose
parameteren til
lenkeren. For eksempel, $LFS_TGT-gcc dummy.c -Wl,--verbose
2>&1 | grep succeeded vil vise alle
filene som ble åpnet under koblingen.
Den neste pakken som er installert er GCC. Et eksempel på hva som kan bli sett under kjøringen av configure er:
checking what assembler to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /mnt/lfs/tools/i686-lfs-linux-gnu/bin/ld
Dette er viktig av grunnene nevnt ovenfor. Det viser også at GCCs konfigureringsskript ikke søker i PATH mapper for å finne hvilke verktøy det skal bruke. Imidlertid under selve kjøringen av gcc, er det ikke de samme søkestiene nødvendigvis brukt. For å finne ut hvilke standardlenker gcc vil bruke, kjør: $LFS_TGT-gcc -print-prog-name=ld.
Detaljert informasjon kan fås fra gcc med å gi alternativet
-v
på kommandolinjen
under kompilering av et dummy-program. For eksempel,
gcc -v dummy.c
Vil vise detaljert informasjon om forprosessorenkompileringen
og sammenstillings stadier, inkludert gcc sine inkluderte
søkestier og deres rekkefølge.
Neste installert er desinfiserte Linux API deklarasjoner (headers). Disse tillater standard C-bibliotek (Glibc) å bruke funksjoner som Linux kjernen vil gi.
Den neste pakken som blir installert er Glibc. Det viktigste
hensyn for å bygge Glibc er kompilatoren, binære verktøy og
kjernedeklarasjoner. Kompilatoren er generelt ikke et problem
siden Glibc vil alltid bruke kompilatoren som er relatert til
--host
parameteret
sendt til konfigureringsskriptet; f.eks. i vårt tilfelle
kompilatoren vil være $LFS_TGT-gcc. De binære
verktøyene og kjerne deklarasjoner kan være litt mer
kompliserte. Derfor tar vi ingen risiko og bruker de
tilgjengelige konfigurasjonsbryterne for å fremtvinge de
riktige valgene. Etter kjøring av configure, sjekk innholdet
i config.make
filen i
build
mappen for alle viktige
detaljer. Legg merke til bruken av CC="$LFS_TGT-gcc"
(med
$LFS_TGT
utvidet) for å
kontrollere hvilke binære verktøy som brukes og bruken av
-nostdinc
og
-isystem
flaggfor å
kontrollere kompilatorens inkluderte søkeveier. Disse
elementene fremhever et viktig aspekt ved Glibc
pakken—den er veldig selvforsynt med tanke på
byggemaskineriet og er generelt ikke avhengig av
standardinnstillinger for verktøykjeder.
Som nevnt ovenfor, blir standard C++-biblioteket kompilert
som neste, etterfulgt i
Kapittel 6 av alle programmene som må bygges selv.
Installasjonstrinnet for alle disse pakkene bruker
DESTDIR
variabelen for å få
programmene til å lande i LFS filsystemet.
Ved slutten av
Kapittel 6 den lokale lfs kompilatoren er
installert. Første binutils-pass2 blir bygget, med det samme
DESTDIR
installasjon som de andre
programmene, deretter konstrueres den andre passeringen av
GCC, og utelater libstdc++ og andre ikke-viktige biblioteker.
På grunn av en merkelig logikk i GCC konfigureringsskript,
CC_FOR_TARGET
ender opp som
cc når verten
er den samme som målet, men er forskjellig fra byggesystemet.
Det er derfor CC_FOR_TARGET=$LFS_TGT-gcc
er
satt eksplisitt inn i konfigureringsalternativene.
Når du kommer inn i chroot-miljøet i Chapter 7, den første oppgaven er å installere libstdc++. Deretter utføres midlertidige installasjoner av programmer som trengs for riktig betjening av verktøykjeden. Fra dette tidspunktet og fremover er kjerneverktøykjeden selvstendig og selvbetjent. I Chapter 8, bygges, testes og installeres de endelige versjonene av alle pakker som trengs for et fullt funksjonelt system.
Ved bygging av pakker er det flere forutsetninger som er gjort innenfor instruksjonene:
Flere av pakkene oppdateres før kompilering, men kun når oppdateringen er nødvendig for å omgå et problem. En oppdatering er ofte nødvendig i både dette og de følgende kapitlene, men noen ganger på bare ett sted. Vær derfor ikke bekymret hvis instruksjoner for en nedlastet oppdatering vises å være savnet. Advarselsmeldinger om offset eller fuzz kan også oppstå ved en oppdatering. Ikke bekymre deg for disse advarslene, siden oppdateringen fortsatt var vellykket anvendt.
Under kompileringen av de fleste pakkene vil det være flere advarsler som ruller forbi på skjermen. Disse er normale og kan trygt bli ignorert. Disse advarslene er slik de vises—advarsler om utdatert, men ikke ugyldig, bruk av C- eller C++-syntaksen. C-standardene endres ganske ofte, og noen pakker bruker fortsatt den eldre standarden. Dette er ikke et problem, men gir en advarsel.
Sjekk en siste gang at LFS
miljøvariabelen er riktig satt opp:
echo $LFS
Sørg for at utdataen viser banen til LFS partisjonens
monterings punkt, som er /mnt/lfs
, ved bruken av vårt eksempel.
Til slutt må to viktige punkter understrekes:
Byggeinstruksjonene forutsetter at Systemkrav for vert, inkludert symbolske lenker, har blitt riktig innstilt:
bash er skallet i bruk.
sh er en symbolsk lenke til bash.
/usr/bin/awk er en symbolsk lenke til gawk.
/usr/bin/yacc er en symbolsk lenke til bison eller et lite skript som starter bison.
Å understreke byggeprosessen på nytt:
Plasser alle kildene og oppdateringene i en mappe
som vil være tilgjengelig fra chroot-miljøet som
f.eks /mnt/lfs/sources/
.
Bytt til kildemappen.
Bruk tar programmet, til å pakke ut pakken som skal bygges. I Kapittel 5 og Kapittel 6, sikre at du er lfs brukeren når du pakker ut pakken.
Alle metoder for å få bygget kildekodetreet på sin plass, bortsett fra å trekke ut pakkens tarball, er ikke støttet. Spesielt ved å bruke cp -R for å kopiere kildekodetre til et annet sted kan ødelegge koblinger og tidsstempler i kildetreet og forårsake at byggingen feiler.
Bytt til mappen som ble opprettet da pakken ble pakket ut.
Følg bokens instruksjoner for å bygge pakken.
Bytt tilbake til kildemappen.
Slett den utpakkede kildemappen med mindre du blir bedt om noe annet.
Dette kapittelet viser hvordan du bygger en krysskompilator og dens tilhørende verktøy. Selv om krysskompilering her er forfalsket, er prinsippene det det samme som for en ekte kryssverktøykjede.
Programmene som er kompilert i dette kapittelet vil bli
installert under $LFS/tools
mappe
for å beholde dem atskilt fra filene som er installert i de
følgende kapitlene. Bibliotekene, på den annen side, er
installert på sin endelige plass, siden de er knyttet til
systemet vi ønsker å bygge.
Binutils pakken inneholder en linker, en assembler og annet verktøy for håndtering av objektfiler.
Gå tilbake og les notatene i avsnittet med tittelen General Compilation Instructions. Å forstå notatene merket som viktig kan spare deg for mange problemer senere.
Det er viktig at Binutils er den første pakken som blir satt sammen fordi både Glibc og GCC utfører ulike tester på tilgjengelige linker og assembler for å bestemme hvilke av deres egne funksjoner som skal aktiveres.
Binutils dokumentasjonen anbefaler å bygge Binutils i en dedikert byggemappe:
mkdir -v build cd build
For at SBU verdiene som er oppført i resten av boken skal
kunne brukes, måler du tiden det tar å bygge denne pakken
fra konfigurasjonen, til og med den første installasjonen.
For å oppnå dette enkelt, pakk kommandoene inn i en
time kommando
som dette: time {
../configure ... && make && make install;
}
.
Forbered nå Binutils til kompilering:
../configure --prefix=$LFS/tools \ --with-sysroot=$LFS \ --target=$LFS_TGT \ --disable-nls \ --enable-gprofng=no \ --disable-werror
Betydningen av konfigurasjonsalternativene:
--prefix=$LFS/tools
Dette forteller konfigurasjonsskriptet å forberede for
å installere Binutils programmene i $LFS/tools
mappen.
--with-sysroot=$LFS
For krysskompilering, dette forteller byggesystemet å søke i $LFS etter målsystembibliotekene etter behov.
--target=$LFS_TGT
Fordi maskinbeskrivelsen i variabelen LFS_TGT
er litt annerledes enn verdien
som returneres av config.guess
skriptet, vil denne bryteren fortelle skriptet
configure
om å justere Binutils byggesystem for å bygge en
tverrlinker.
--disable-nls
Dette deaktiverer internasjonalisering ettersom i18n ikke er nødvendig for de midlertidige verktøyene.
--enable-gprofng=no
Dette deaktiverer bygging av gprofng som ikke er nødvendig for midlertidige verktøy.
--disable-werror
Dette forhindrer byggingen i å stoppe i tilfelle det er advarsler fra vertens kompilator.
Fortsett med å kompilere pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i avsnitt Section 8.18.2, “Innhold i Binutils.”
GCC pakken inneholder GNU kompilatorsamlingen, som inkluderer C og C++ kompilatorene.
GCC krever GMP-, MPFR- og MPC pakkene. Siden disse pakkene kanskje ikke er inkludert i vertsdistribusjonen din, blir de bygget med GCC. Pakk ut hver pakke i GCC-kildemappen, og gi nytt navn til de resulterende mappene slik at GCC byggprosedyrene automatisk bruker dem:
Det er hyppige misforståelser om dette kapittelet. Prosedyrene er de samme som alle andre kapitler som forklart tidligere (Package build instructions). Pakk først ut gcc-tarballen fra kildemappen og bytt deretter til den opprettede mappen. Først da bør du fortsette med instruksjonene nedenfor.
tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.1.tar.xz mv -v gmp-6.2.1 gmp tar -xf ../mpc-1.2.1.tar.gz mv -v mpc-1.2.1 mpc
På x86_64-verter, sett standard mappenavn for 64-bits biblioteker til “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
GCC dokumentasjonen anbefaler å bygge GCC i en dedikert byggemappe:
mkdir -v build cd build
Forbered GCC for kompilering:
../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ --with-glibc-version=2.36 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++
Betydningen av konfigurasjonsalternativene:
--with-glibc-version=2.36
Dette alternativet spesifiserer versjonen av glibc som vil være brukt på målet. Det er ikke relevant for vertens libc distribusjon fordi alt kompilert av pass1 gcc vil kjøre i chroot miljøet, som er isolert fra libc til vertens distribusjon.
--with-newlib
Siden et fungerende C-bibliotek ikke er tilgjengelig ennå, sikrer dette at inhibit_libc-konstanten blir definert når du bygger libgcc. Dette forhindrer kompilering av kode som krever libc støtte.
--without-headers
Når du oppretter en komplett tverrkompilator, krever GCC standarddeklarasjoner som er kompatible med målsystemet. For våre formål vil disse deklarasjonene ikke være nødvendige. Denne bryteren hindrer GCC i å lete etter dem.
--disable-shared
Denne bryteren tvinger GCC til å koble sine interne biblioteker statisk. Vi trenger dette fordi de delte bibliotekene krever glibc, som ennå ikke er installert på målsystemet.
--disable-multilib
På x86_64 støtter LFS ennå ikke en multilib-konfigurasjon. Denne bryteren er ufarlig for x86.
--disable-decimal-float,
--disable-threads, --disable-libatomic,
--disable-libgomp, --disable-libquadmath,
--disable-libssp, --disable-libvtv,
--disable-libstdcxx
Disse bryterne deaktiverer støtte for flytende desimal punkter, tråd, libatomic, libgomp, libquadmath, libssp, henholdsvis libvtv og C++ standardbiblioteket. Disse funksjonene klarer ikke å kompilere når du bygger en tverrkompilator og er ikke nødvendig for oppgaven med å krysskompilere den midlertidige libc.
--enable-languages=c,c++
Dette alternativet sikrer at bare C- og C ++ -kompilatorene blir bygget. Dette er de eneste språkene som trengs nå.
Kompiler GCC ved å kjøre:
make
Installer pakken:
make install
Denne versjonen av GCC har installert et par interne
systemoverskrifter. Normalt vil en av dem, limits.h
, i sin tur inkludere den
tilsvarende system limits.h
systemoverskrift, i dette tilfellet, $LFS/usr/include/limits.h
. På tidspunktet
for denne byggingen av GCC eksisterer imidlertid ikke
$LFS/usr/include/limits.h
så
den interne overskriften som nettopp har blitt installert er
en delvis, selvstendig fil og inkluderer ikke de utvidede
funksjonene til systemoverskriften. Dette er tilstrekkelig
for å bygge glibc, men den fullstendige interne overskriften
vil være nødvendig senere. Lag en fullversjon av den interne
overskriften ved å bruke en kommando som er identisk med det
GCC-byggesystemet gjør under normale omstendigheter:
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h
Detaljer om denne pakken finner du i avsnitt Section 8.26.2, “Innhold i GCC.”
Linux API deklarasjonene (i linux-5.19.2.tar.xz) eksponerer kjernens API for bruk av Glibc.
Linux-kjernen må eksponere et applikasjonsprogrammeringsgrensesnitt (API) som systemets C bibliotek (Glibc i LFS) kan bruke. Dette har blitt gjort ved å rense ulike C deklarasjonsfiler som er i Linux kjernekilde tarball.
Sørg for at det ikke er noen gamle filer innebygd i pakken:
make mrproper
Trekk nå ut de brukersynlige kjernedeklarasjonene fra kilden.
Det anbefalte make målet “headers_install” Kan ikke brukes,
fordi det krever rsync, som
kanskje ikke er tilgjengelig. Overskriftene plasseres først i
./usr
, deretter kopiert til
nødvendig plassering.
make headers find usr/include -type f ! -name '*.h' -delete cp -rv usr/include $LFS/usr
Linux API ASM deklarasjoner |
|
Linux API ASM Generiske deklarasjoner |
|
Linux API DRM deklarasjoner |
|
Linux API Linux deklarasjoner |
|
Linux API Diverse deklarasjoner |
|
Linux API MTD deklarasjoner |
|
Linux API RDMA deklarasjoner |
|
Linux API SCSI deklarasjoner |
|
Linux API Lyd deklarasjoner |
|
Linux API Video deklarasjoner |
|
Linux API Xen deklarasjoner |
Glibc pakken inneholder C hovedbiblioteket. Dette biblioteket tilbyr de grunnleggende rutinene for tildeling av minne, søk i kataloger, åpne og lukke filer, lese og skrive filer, strenghåndtering, mønstertilpasning, aritmetikk og så videre.
Først oppretter du en symbolsk lenke for LSB kompalitet. I tillegg, for x86_64 oppretter du en symbolsk kompatibilitetskobling som kreves for korrekt operasjon av den dynamiske biblioteklasteren:
case $(uname -m) in i?86) ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac
Kommandoen ovenfor er riktig. The ln kommandoen har noen få
syntaktiske versjoner, så sørg for å sjekke info coreutils ln og
ln(1)
før du rapporterer det
du kanskje tror er en feil.
Noen av Glibc-programmene bruker FHS inkompatible
/var/db
mappen for å lagre
deres kjøretidsdata. Bruk følgende oppdatering for å få slike
programmer til å lagre sine kjøretidsdata på de FHS
kompatible stedene:
patch -Np1 -i ../glibc-2.36-fhs-1.patch
Glibc dokumentasjonen anbefaler å bygge Glibc i en dedikert byggemappe:
mkdir -v build cd build
Sørg for at ldconfig og sln verktøy er installert i
/usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Deretter forbereder du Glibc for kompilering:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=$LFS/usr/include \ libc_cv_slibdir=/usr/lib
Betydningen av konfigureringsalternativene:
--host=$LFS_TGT,
--build=$(../scripts/config.guess)
Den kombinerte effekten av disse bryterne er at Glibcs
byggesystem konfigurerer seg selv til å være
krysskompilert, ved hjelp av krysskoblingen og
krysskompilator i $LFS/tools
.
--enable-kernel=3.2
Dette forteller Glibc å kompilere biblioteket med støtte til 3.2 og senere Linux kjerner. Løsninger for eldre kjerner er ikke aktivert.
--with-headers=$LFS/usr/include
Dette forteller Glibc å kompilere seg selv mot deklarasjonene nylig installert i mappen $LFS/usr/include, slik at den vet nøyaktig hvilke funksjoner kjernen har og kan optimalisere seg selv deretter.
libc_cv_slibdir=/usr/lib
Dette sikrer at biblioteket er installert i /usr/lib i stedet for standard /lib64 på 64-bits maskiner.
I løpet av dette stadiet kan følgende advarsel vises:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
Den manglende eller inkompatible msgfmt programmet er generelt ufarlig. Dette msgfmt programmet er en del av Gettext pakken som vertsdistribusjonen skal gi.
Det har vært rapporter om at denne pakken kan mislykkes når bygning som et "parallell make". Hvis dette skjer, kjør make kommandoen på nytt med et "-j1"-alternativ.
Compile the package:
make
Installer pakken:
Hvis LFS
ikke er riktig
innstilt, og til tross for anbefalinger, bygger du som
root
, neste kommando vil
installer den nybygde glibc til vertssystemet ditt, som
mest sannsynlig vil gjøre det ubrukelig. Så dobbeltsjekk at
miljøet er riktig innstilt før du kjører følgende kommando.
make DESTDIR=$LFS install
Betydningen av make install alternativene:
DESTDIR=$LFS
The DESTDIR
make variabelen
brukes av nesten alle pakker for å definere
plasseringen der pakken skal være installert. Hvis den
ikke er angitt, er den standard til rot (/
) mappen. Her spesifiserer vi at
pakken installeres i $LFS
, som vil bli roten etter Section 7.4,
“Gå inn i Chroot miljøet”.
Fiks hardkodet bane til den kjørbare lasteren i ldd script:
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
På dette tidspunktet er det viktig å stoppe og sikre at de grunnleggende funksjoner (kompilering og lenker) til den nye verktøykjeden fungerer som forventet. For å utføre en tilregnelighetssjekk, kjør følgende kommandoer:
echo 'int main(){}' | gcc -xc - readelf -l a.out | grep ld-linux
Hvis alt fungerer som det skal, skal det ikke være noen feil, og utdata fra den siste kommandoen vil være av formen:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Merk at for 32-bits maskiner vil fortolkenavnet være
/lib/ld-linux.so.2
.
Hvis utdataen ikke vises som ovenfor eller det ikke var noen utdata i det hele tatt, da er det noe galt. Undersøk og følg trinnene for å finne ut hvor problemet er og korriger det. Dette problemet må løses før fortsetter.
Når alt er bra, rydd opp i testfilene:
rm -v a.out
Byggepakker i neste kapittel vil fungere som en ekstra sjekk at verktøykjeden er riktig bygget. Hvis noen pakken, spesielt binutils-pass2 eller gcc-pass2, klarer ikke å bygge, er det en indikasjon på at noe har gått galt med tidligere Binutils-, GCC- eller Glibc-installasjoner.
Nå som vår kryssverktøykjede er fullført, fullfør installasjonen limits.h deklarasjoner. For å gjøre det, kjør et verktøy levert av GCC utviklere:
$LFS/tools/libexec/gcc/$LFS_TGT/12.2.0/install-tools/mkheaders
Detaljer om denne pakken finner du i Section 8.5.3, “Innhold i Glibc.”
Libstdc++ er standard C++-biblioteket. Det trengs for å kompilere C++-kode (en del av GCC er skrevet i C++), men vi måtte utsette installasjonen da vi bygde gcc-pass1 fordi det avhenger av glibc, som ennå ikke var tilgjengelig i målmappen .
Libstdc++ er en del av GCC
kildene. Du bør først pakke ut GCC tarball og bytte til
gcc-12.2.0
mappen.
Opprett en egen byggemappe for libstdc++ og gå inn i den:
mkdir -v build cd build
Forbered libstdc++ for kompilering:
../libstdc++-v3/configure \ --host=$LFS_TGT \ --build=$(../config.guess) \ --prefix=/usr \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0
Betydningen av konfigureringsalternativene:
--host=...
Spesifiserer at krysskompilatoren vi nettopp har bygget
skal brukes i stedet for den i /usr/bin
.
--disable-libstdcxx-pch
Denne bryteren forhindrer installasjon av inkluderte forhåndskompilerte filer som ikke er nødvendige på dette stadiet.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0
Dette spesifiserer installasjonsmappen for inkluderende
filer. Fordi libstdc++ er standard C++-biblioteket for
LFS, skal denne mappen samsvare med plasseringen der
C++-kompilatoren ($LFS_TGT-g++) vil
søke etter standard C++ inkludererende filer. I en
normal konstruksjon, sendes denne informasjonen
automatisk til libstdc++ configure
alternativer fra toppnivåmappen. I vårt tilfelle, denne
informasjonen må gis eksplisitt. C++-kompilatoren vil
legge til sysroot banen $LFS
(spesifisert bygning GCC
passerer 1) til inkludere filsøkebanen, så den vil
faktisk søke i $LFS/tools/$LFS_TGT/include/c++/12.2.0
.
Kombinasjonen av DESTDIR
variabelen (i
make
install kommando nedenfor) og denne
bryteren sørger for å installere deklarasjonene der.
Kompiler libstdc++ ved å kjøre:
make
Installer biblioteket:
make DESTDIR=$LFS install
Fjern libtool arkivfilene fordi de er skadelige for krysskompilering:
rm -v $LFS/usr/lib/lib{stdc++,stdc++fs,supc++}.la
Detaljer om denne pakken finner du i Section 8.26.2, “Innhold i GCC.”
Dette kapittelet viser hvordan du krysskompilerer grunnleggende verktøy ved å bruke den nettopp bygde kryssverktøykjeden. Disse verktøyene er installert i deres endelige plassering, men kan ikke brukes ennå. Grunnleggende oppgaver er fortsatt avhengige av vertens verktøy. Likevel brukes de installerte bibliotekene ved koblinger.
Bruk av verktøyene vil være mulig i neste kapittel etter å ha gått inn i “chroot” miljøet. Men alle pakkene som bygges i nåværende kapittel må bygges før vi gjør det. Derfor kan vi ikke være uavhengig av vertssystemet ennå.
Nok en gang, la oss huske den feilaktige innstillingen av
LFS
sammen med å bygge som
root
, kan gjøre datamaskinen
din ubrukelig. Hele dette kapittelet må gjøres som bruker
lfs
, med miljøet som beskrevet
i Section 4.4, “Sette
opp miljøet”.
M4 pakken inneholder en makroprosessor.
Forbered M4 for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.12.2, “Innhold i M4.”
Ncurses pakken inneholder biblioteker for terminaluavhengig håndtering av karakterskjermer.
Først, sørg for at gawk blir funnet først under konfigurasjonen:
sed -i s/mawk// configure
Kjør deretter følgende kommandoer for å bygge “tic” programmet på byggeverten:
mkdir build pushd build ../configure make -C include make -C progs tic popd
Forbered Ncurses for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(./config.guess) \ --mandir=/usr/share/man \ --with-manpage-format=normal \ --with-shared \ --without-normal \ --with-cxx-shared \ --without-debug \ --without-ada \ --disable-stripping \ --enable-widec
Betydningen av de nye konfigureringsalternativene:
--with-manpage-format=normal
Dette forhindrer Ncurses fra å installere komprimerte manual sider, noe som kan skje hvis selve vertsdistribusjonen har komprimerte manual sider.
--with-shared
Dette får Ncurses til å bygge og installere delte C biblioteker.
--without-normal
Dette forhindrer at Ncurses bygger og installerer statiske C biblioteker.
--without-debug
Dette forhindrer at Ncurses bygger og installerer feilsøkings biblioteker.
--with-cxx-shared
Dette får Ncurses til å bygge og installere delte C++ bindinger. Den forhindrer også at den bygger og installerer statiske C++ bindinger.
--without-ada
Dette sikrer at Ncurses ikke bygger støtte for Ada kompilator som kan være til stede på verten, men som ikke vil være tilgjengelig når vi går inn i chroot miljøet.
--disable-stripping
Denne bryteren hindrer byggesystemet å strippe programmene som bruker strip programmet fra verten. Bruk av vertsverktøy på krysskompilerte program kan forårsake feil.
--enable-widec
Denne bryteren forårsaker biblioteker med store tegn
(f.eks., libncursesw.so.6.3
) skal bygges i
stedet for vanlige (f.eks., libncurses.so.6.3
). Disse brede
tegnbibliotekene er brukbare i både multibyte og
tradisjonelle 8-biters lokaliteter, mens vanlige
biblioteker fungerer som de skal bare i 8-biters
lokaliteter. Brede karakterer og normale biblioteker er
kildekompatibel, men ikke binærkompatibel.
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so
Betydningen av installasjonsalternativene:
TIC_PATH=$(pwd)/build/progs/tic
Vi må sende stien til den nettopp bygde tic så den er i stand til å kjøre på byggemaskinen, slik at terminaldatabasen kan opprettes uten feil.
libncurses.so
biblioteket
trengs av noen få pakker vi skal bygge snart. Vi lager
denne lille linkskriptet , da dette er det som gjøres i
Chapter 8.
Detaljer om denne pakken finner du i Section 8.28.2, “Innhold i Ncurses.”
Bash pakken inneholder Bourne-Again Skallet (Bourne-Again SHell).
Forbered Bash for kompilering:
./configure --prefix=/usr \ --build=$(support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc
Betydningen av konfigureringsalternativene:
--without-bash-malloc
Dette alternativet slår av bruken av Bash
minnetildelings funksjon (malloc
) som er kjent for å forårsake
segmenteringsfeil. Ved å slå av dette alternativet vil
Bash bruke malloc
funksjonen fra Glibc som er mer stabil.
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Lag en lenke for programmene som bruker sh til et skall:
ln -sv bash $LFS/bin/sh
Detaljer om denne pakken finner du i Section 8.34.2, “Innholdet i Bash.”
Pakken Coreutils inneholder verktøy for å vise og stille inn grunnleggende systemegenskaper.
Forbered Coreutils for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --enable-install-program=hostname \ --enable-no-install-program=kill,uptime
Betydningen av konfigureringsalternativene:
--enable-install-program=hostname
Dette muliggjør hostname binær å bli bygget og installert – den er deaktivert som standard, men kreves av testpakken til Perl.
Kompiler pakken:
make
Install the package:
make DESTDIR=$LFS install
Flytt programmer til deres endelige forventede plasseringer. Selv om dette ikke er nødvendig i dette midlertidige miljøet, må vi gjøre det fordi noen programmer hardkoder kjørbare steder:
mv -v $LFS/usr/bin/chroot $LFS/usr/sbin mkdir -pv $LFS/usr/share/man/man8 mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8
Detaljer om denne pakken finner du i Section 8.54.2, “Innhold i Coreutils.”
Diffutils pakken inneholder programmer som viser forskjellene mellom filer eller mapper.
Forbered Diffutils for kompilering:
./configure --prefix=/usr --host=$LFS_TGT
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.56.2, “Innhold i Diffutils.”
File pakken inneholder et verktøy for å bestemme typen av en gitt fil eller filer.
file kommando på byggeverten trenger å være samme versjon som den vi bygger for å opprette signaturfilen. Kjør følgende kommandoer for å bygge den:
mkdir build pushd build ../configure --disable-bzlib \ --disable-libseccomp \ --disable-xzlib \ --disable-zlib make popd
Betydningen av det nye konfigureringsalternativet:
--disable-*
Konfigurasjonsskriptet prøver å bruke noen pakker fra vertsdistribusjonen hvis de tilsvarende bibliotekfilene finnes. Det kan føre til kompileringsfeil hvis det finnes en bibliotekfil, men de tilsvarende deklarasjonsfilene ikke gjør det. Disse alternativene forhindrer at det brukes disse unødvendige egenskapene fra verten.
Forbered File for kompilering:
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
Kompiler pakken:
make FILE_COMPILE=$(pwd)/build/src/file
Installer pakken:
make DESTDIR=$LFS install
Fjern libtool arkivfilen fordi den er skadelig for krysskompilering:
rm -v $LFS/usr/lib/libmagic.la
Detaljer om denne pakken finner du i Section 8.10.2, “Innholdet i File.”
Findutils pakken inneholder programmer for å finne filer. Disse programmene er gitt for å rekursivt søke gjennom et katalogtre og til å opprette, vedlikeholde og søke i en database (ofte raskere enn den rekursive letingen, men er upålitelig hvis databasen ikke nylig har blitt oppdatert).
Forbered Findutils for kompilering:
./configure --prefix=/usr \ --localstatedir=/var/lib/locate \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.58.2, “Innhold i Findutils.”
Gawk pakken inneholder programmer for å manipulere tekstfiler.
Først, sørg for at noen unødvendige filer ikke blir installert:
sed -i 's/extras//' Makefile.in
Forbered Gawk for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.57.2, “Innhold i Gawk.”
Grep pakken inneholder programmer for å søke gjennom innholdet i filer.
Forbered Grep for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.33.2, “Innhold i Grep.”
Gzip pakken inneholder programmer for komprimering og dekomprimering av filer.
Forbered Gzip for kompilering:
./configure --prefix=/usr --host=$LFS_TGT
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.61.2, “Contents of Gzip.”
Make pakken inneholder et program for å kontrollere genereringen av kjørbare filer og andre ikke-kildefiler av en pakke fra kildefiler.
Forbered Make for kompilering:
./configure --prefix=/usr \ --without-guile \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Betydningen av det nye konfigureringsalternativet:
--without-guile
Selv om vi krysskompilerer, prøver configure å bruke guile fra byggeverten hvis den finner det. Dette gjør at kompileringen mislykkes, så denne bryteren forhindrer bruk av den.
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.65.2, “Innhold i Make.”
Patch pakken inneholder et program for å endre eller lage filer ved å bruke en “patch” fil som vanligvis opprettes av diff programmet.
Forbered Patch for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.66.2, “Innhold i oppdateringen.”
Sed pakken inneholder en dataflyt (stream) redigerer.
Forbered Sed for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.29.2, “Innhold i Sed.”
Tar pakken gir muligheten til å lage tar arkiver også å utføre forskjellige andre typer arkivmanipulering. Tar kan brukes på tidligere opprettede arkiver for å trekke ut filer, for å lagre flere filer, eller for å oppdatere eller liste filer som allerede var lagret.
Forbered Tar for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.67.2, “Innhold i Tar.”
Xz pakken inneholder programmer for komprimering og dekomprimering av filer. Det gir muligheter for lzma og den nyere xz komprimerings formatene. Komprimering av tekstfiler med xz gir en bedre kompresjonsprosent enn med de tradisjonelle gzip eller bzip2 kommandoene.
Forbered Xz for kompilering:
./configure --prefix=/usr \ --host=$LFS_TGT \ --build=$(build-aux/config.guess) \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.6
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Fjern libtool-arkivfilen fordi den er skadelig for krysskompilering:
rm -v $LFS/usr/lib/liblzma.la
Detaljer om denne pakken finner du i Section 8.8.2, “Innhold i Xz.”
Binutils pakken inneholder en linker, en assembler og annet verktøy for håndtering av objektfiler.
Binutils sender en utdatert kopi av libtool i tarballen. Det mangler støtte for sysroot slik at de produserte binærfilene feilaktig kobles til biblioteker fra vertsdistroen. Omgå dette problemet:
sed '6009s/$add_dir//' -i ltmain.sh
Opprett en egen byggemappe igjen:
mkdir -v build cd build
Forbered Binutils for kompilering:
../configure \ --prefix=/usr \ --build=$(../config.guess) \ --host=$LFS_TGT \ --disable-nls \ --enable-shared \ --enable-gprofng=no \ --disable-werror \ --enable-64-bit-bfd
Betydningen av de nye konfigureringsalternativene:
--enable-shared
Bygger libbfd
som et delt
bibliotek.
--enable-64-bit-bfd
Aktiverer 64-biters støtte (på verter med smalere ordstørrelser). Kanskje ikke nødvendig på 64-bits systemer, men skader ikke.
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Fjern libtool arkivfilene fordi de er skadelige for krysskompilering, og fjern unødvendige statiske biblioteker:
rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes}.{a,la}
Detaljer om denne pakken finner du i Section 8.18.2, “Innhold i Binutils.”
GCC pakken inneholder GNU kompilatorsamlingen, som inkluderer C og C++ kompilatorene.
Som i den første versjonen av GCC, er GMP-, MPFR- og MPC-pakkene nødvendig. Pakk ut tarballene og flytt dem til den nødvendige mappen :
tar -xf ../mpfr-4.1.0.tar.xz mv -v mpfr-4.1.0 mpfr tar -xf ../gmp-6.2.1.tar.xz mv -v gmp-6.2.1 gmp tar -xf ../mpc-1.2.1.tar.gz mv -v mpc-1.2.1 mpc
Hvis du bygger på x86_64, endre standard mappenavn for 64-bit bibliotekene til “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 ;; esac
Overstyr byggeregelen for libgcc og libstdc++ deklarasjoner, til tillat å bygge disse bibliotekene med støtte for POSIX-tråder:
sed '/thread_header =/s/@.*@/gthr-posix.h/' \ -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
Opprett en egen byggemappe igjen:
mkdir -v build cd build
Før du begynner å bygge GCC, husk å deaktivere alle miljø variabler som overstyrer standard optimaliseringsflagg.
Forbered nå GCC for kompilering:
../configure \ --build=$(../config.guess) \ --host=$LFS_TGT \ --target=$LFS_TGT \ LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc \ --prefix=/usr \ --with-build-sysroot=$LFS \ --enable-initfini-array \ --disable-nls \ --disable-multilib \ --disable-decimal-float \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++
Betydningen av de nye konfigureringsalternativene:
--with-build-sysroot=$LFS
Normalt bruker --host
å sørge for at en
krysskompilator brukes til å bygge GCC, og da vet
dennne kompilatoren at den må lete etter overskrifter
og biblioteker i $LFS
.
Men byggesystemet til GCC bruker andre verktøy som ikke
er klar over denne plasseringen. Denne bryteren sørger
for at de finner de nødvendige filene på $LFS
, og ikke på verten.
--target=$LFS_TGT
Mens vi krysskompilerer GCC, er det umulig å bygge
målbiblioteker (libgcc
og
libstdc++
) med kompilerte
GCC-binærfiler fordi disse binærfilene ikke vil kjøre
på vertsdistroen. GCC-byggesystemet vil forsøke å bruke
C- og C++-kompilatorer på vertsdistroen som en løsning
som standard. Det støttes ikke å bygge
GCC-målbiblioteker med en annen versjon av GCC, så bruk
av vertskompilatorer kan føre til feil bygging . Denne
parameteren sikrer å bygge bibliotekene med GCC pass 1
og forhindre problemet.
LDFLAGS_FOR_TARGET=...
Tillat libstdc++
å bruke
den delte libgcc
som ble
bygget i dette passet, i stedet for den statiske
versjonen bygget i GCC pass 1. Dette er nødvendig for å
støtte C++ unntaks håndtering.
--enable-initfini-array
Dette alternativet aktiveres automatisk når du bygger en innebygd kompilator med en innebygd kompilator på x86. Men her bygger vi med en krysskompilator, så vi må eksplisitt angi dette alternativet.
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Som en siste finpuss kan du lage en symbolkobling. Mange programmer og skript bruker cc i stedet for gcc, som brukes til å holde programmer generiske og derfor brukbare på alle typer UNIX systemer der GNU C-kompilatoren ikke alltid er installert. Å kjøre cc lar systemadministratoren bestemme hvilken C-kompilator som skal installeres:
ln -sv gcc $LFS/usr/bin/cc
Detaljer om denne pakken finner du i Section 8.26.2, “Innhold i GCC.”
Dette kapittelet viser hvordan du bygger de siste manglende delene av det midlertidige systemet: verktøyene som trengs for å bygge maskineriet av forskjellige pakker. Nå som alle sirkulære avhengigheter er løst, et “chroot” miljø, fullstendig isolert fra vertsoperativsystemet (bortsett fra den kjørende kjernen), kan brukes til byggingen.
For riktig drift av det isolerte miljøet, noe kommunikasjon med den kjørende kjernen må være etablert. Dette gjøres gjennom det såkalte Virtuelle kjernefilsystemer (Virtual Kernel File Systems), som må være montert når du går inn i chroot miljøet. Det kan være lurt å sjekke at de er montert ved å kjøre findmnt.
Før Section 7.4, “Gå
inn i Chroot miljøet”, kommandoene må kjøres som
root
, med LFS
variabelsett. Etter å ha gått inn i inn
chroot, alle kommandoer kjøres som root
, heldigvis uten tilgang til
operativsystemet til datamaskinen du bygde LFS på. Vær
forsiktig uansett, da det er lett å ødelegge hele LFS system
med dårlig utformede kommandoer.
Kommandoene i resten av denne boken må utføres logget på som
bruker root
og ikke lenger
som bruker lfs
. Også dobbelt
sjekk at $LFS
er satt i
root
sitt miljø.
For øyeblikket er hele mappehierarkiet i $LFS
eid av brukeren lfs
, en bruker som bare eksisterer på
vertssystemet. Hvis mappene og filene under $LFS
blir holdt som de er, vil de være eid av
en bruker-ID uten en tilsvarende konto. Dette er farlig pga en
brukerkonto opprettet senere kan få samme bruker-ID og eie alle
filene under $LFS
, dermed
eksponere disse filene til mulig ondsinnet manipulasjon.
For å løse dette problemet, endre eierskap til $LFS/*
mapper til bruker root
ved å kjøre følgende kommando:
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools} case $(uname -m) in x86_64) chown -R root:root $LFS/lib64 ;; esac
Ulike filsystemer eksportert av kjernen brukes til å kommunisere til og fra selve kjernen. Disse filsystemene er virtuelle ved at ingen disk plass brukes til dem. Innholdet i filsystemene ligger i minnet.
Begynn med å lage mapper som filsystemene vil bli montert på:
mkdir -pv $LFS/{dev,proc,sys,run}
Under en normal oppstart, monterer kjernen automatisk
devtmpfs
filsystemet på
/dev
mappen, og tillater
enheter som skal opprettes dynamisk på det virtuelle
filsystemet etter hvert som de oppdages eller åpnes.
Enhetsoppretting gjøres vanligvis i løpet av
oppstartsprosessen av kjernen og Udev. Siden dette nye
systemet ennå ikke har Udev og har ennå ikke blitt startet
opp, er det nødvendig å montere og fylle /dev
manuelt. Dette oppnås ved å binde
montering av vertssystemets /dev
mappe. Å binde montering er en
spesiell type montering som lar deg lage et speil av en
katalog eller monteringspunkt til et annet sted. Bruk
følgende kommando for å oppnå dette:
mount -v --bind /dev $LFS/dev
Monter nå de gjenværende virtuelle kjernefilsystemene:
mount -v --bind /dev/pts $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
I noen vertssystemer, /dev/shm
er en symbolsk lenke til /run/shm
. /run tmpfs ble montert ovenfor,
så i dette tilfellet er det bare en mappe som må opprettes.
if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi
Nå som alle pakkene som kreves for å bygge resten av nødvendige
verktøy er på systemet, er det på tide å gå inn i chroot
miljøet for å fullføre installasjonen av de gjenværende
midlertidige verktøyene. Dette miljøet vil også brukes for å
installere det endelige systemet. Som bruker root
, kjør følgende kommando for å gå inn i
miljøet som for øyeblikket er befolket med bare midlertidige
verktøy:
chroot "$LFS" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ /bin/bash --login
-i
alternativet gitt
til env
kommandoen vil slette alle variabler i chroot miljøet. Etter
det, bare HOME
, TERM
, PS1
, og
PATH
variablene settes på nytt.
TERM=$TERM
konstruksjonen vil sette TERM
variabelen inne i chroot til samme verdi som utenfor chroot.
Denne variabelen er nødvendig for programmer som vim og less å fungere skikkelig.
Hvis andre variabler ønskes, som f.eks CFLAGS
eller CXXFLAGS
, dette er et bra sted å sette dem
igjen.
Fra dette tidspunktet er det ikke nødvendig å bruke
LFS
variabelen lenger fordi alt
arbeid vil være begrenset til LFS filsystemet. Dette er fordi
Bash skallet blir fortalt at for $LFS
er roten nå (/
) mappen.
Legg merke til at /tools/bin
ikke
er i PATH
. Dette betyr at
kryssverktøykjeden ikke lenger vil være det som brukes i chroot
miljøet.
Merk at ledeteksten til bash vil si I have no name!
Dette er normalt fordi
/etc/passwd
filen ikke er
opprettet ennå.
Det er viktig at alle kommandoene gjennom resten av dette kapittel og de følgende kapitlene kjøres fra chroot miljøet. Hvis du forlater dette miljøet av en eller annen grunn (omstart for eksempel), sørg for at de virtuelle kjernefilsystemene er montert som forklart i Section 7.3.1, “Montering og fylling av /dev” og Section 7.3.2, “Montering av virtuelle kjernefilsystemer” og gå inn i chroot igjen før du fortsetter med installasjonen.
Det er på tide å lage hele strukturen i LFS filsystemet.
Noen av mappene nevnt i denne delen kan allerede være opprettet tidligere med eksplisitte instruksjoner eller når du installerer noen pakker. De gjentas nedenfor for fullstendighet.
Lag noen mapper på rotnivå som ikke er i det begrensede settet som kreves i de foregående kapitlene ved å gi følgende kommando:
mkdir -pv /{boot,home,mnt,opt,srv}
Lag det nødvendige settet med undermapper under rotnivået ved å utstede følgende kommandoer:
mkdir -pv /etc/{opt,sysconfig} mkdir -pv /lib/firmware mkdir -pv /media/{floppy,cdrom} mkdir -pv /usr/{,local/}{include,src} mkdir -pv /usr/local/{bin,lib,sbin} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -pv /usr/{,local/}share/man/man{1..8} mkdir -pv /var/{cache,local,log,mail,opt,spool} mkdir -pv /var/lib/{color,misc,locate} ln -sfv /run /var/run ln -sfv /run/lock /var/lock install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp
mapper er som standard opprettet med tillatelsesmodus 755, men
dette er ikke ønskelig for alle mapper. I kommandoene ovenfor,
to endringer gjøres—en til root
, brukerens hjemmemappe, og en annen
til mappene for midlertidige filer.
Den første modusendringen sikrer at ikke hvem som helst kan
komme inn i /root
mappen—det samme som en vanlig bruker ville gjort med sin
hjemmemappe. De andre modusendring sørger for at enhver bruker
kan skrive til /tmp
og
/var/tmp
mapper, men kan ikke
fjerne en annen brukers filer fra dem. Sistnevnte er forbudt av
den såkalte “låst
bit (sticky bit),” den høyeste biten (1) i
1777 bitmasken.
Mappetreet er basert på Filsystemhierarkistandard (Filesystem
Hierarchy Standard) (FHS) (tilgjengelig på https://refspecs.linuxfoundation.org/fhs.shtml).
FHS spesifiserer også den valgfrie tilstedeværelsen av noen
mapper som f.eks /usr/local/games
og /usr/share/games
. Vi skaper kun mapper som
trengs. Du må imidlertid gjerne lage disse mappene.
Historisk sett har Linux en liste over de monterte filsystemene
i filen /etc/mtab
. Moderne
kjerner opprettholder denne listen internt og eksponerer det
for brukeren via /proc
filsystemet. For å tilfredsstille verktøy som forventer
tilstedeværelse av /etc/mtab
,
opprett følgende symbolske lenke:
ln -sv /proc/self/mounts /etc/mtab
Lag en grunnleggende /etc/hosts
fil som blir referert til i noen testsuiter, og også i en av
Perls konfigurasjonsfiler :
cat > /etc/hosts << EOF 127.0.0.1 localhost $(hostname) ::1 localhost EOF
For at bruker root
skal kunne
logge inn og for navnet “root” å bli gjenkjent, det må være
relevante oppføringer i /etc/passwd
og /etc/group
filene.
Opprett /etc/passwd
filen ved å
kjøre følgende kommando:
cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/usr/bin/false
daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
EOF
Selve passordet for root
velges
senere.
Opprett /etc/group
filen ved å
kjøre følgende kommando:
cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
input:x:24:
mail:x:34:
kvm:x:61:
uuidd:x:80:
wheel:x:97:
users:x:999:
nogroup:x:65534:
EOF
De opprettede gruppene er ikke en del av noen standard—de
er grupper delvis bestemt av kravene til Udev konfigurasjonen i
kapittel 9, og delvis etter felles konvensjon brukt av en rekke
eksisterende Linux distribusjoner. I tillegg er noen testsuiter
avhengige av spesifikke brukere eller grupper. Linux Standard
Base (LSB, tilgjengelig på http://refspecs.linuxfoundation.org/lsb.shtml)
anbefaler bare at, foruten gruppen root
med en Gruppe ID (GID) på 0, en gruppe
bin
med en GID på 1 være
tilstede. GID på 5 er mye brukt for tty
gruppen, og tallet 5 er også brukt i
/etc/fstab
for devpts
filsystemet. Alle andre gruppenavn
og GID-er kan velges fritt av systemets administrator siden
velskrevne programmer ikke er avhengige av GID-nummer, men bruk
heller gruppens navn.
ID 65534 brukes av kjernen for NFS og separat bruker
navneområder for ikke-tilordnede brukere (de finnes på NFS
serveren eller den overordnede brukernavneområde, men
“finnes
ikke” på den lokale maskinen eller i det
separate navnerommet). Vi tildeler nobody
og nogroup
for å unngå en ikke navngitt ID.
Men andre distroer kan behandle denne IDen annerledes, så alle
flyttbare programmer bør ikke være avhengig av denne
tildelingen.
Noen tester i Chapter 8 trenger en vanlig bruker. Vi legger til denne brukeren her og sletter denne kontoen på slutten av det kapittelet.
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd echo "tester:x:101:" >> /etc/group install -o tester -d /home/tester
For å fjerne “I
have no name!” ledetekst, start et nytt
skall. Siden /etc/passwd
og
/etc/group
filer har blitt
opprettet, vil brukernavn og gruppenavnoppløsning nå virke:
exec /usr/bin/bash --login
login, agetty, og init programmene (og andre) bruker en rekke logg filer for å registrere informasjon som hvem som var logget inn på systemet og når. Disse programmene vil imidlertid ikke skrive til loggfilene hvis de ikke allerede eksisterer. Initialiser loggfilene og gi dem riktige tillatelser:
touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp
/var/log/wtmp
filen registrerer
alle pålogginger og logger ut. /var/log/lastlog
filen registrerer når hver
bruker sist logget på. /var/log/faillog
filen registrerer mislykkede
påloggingsforsøk. /var/log/btmp
filen registrerer de dårlige påloggingsforsøkene.
/run/utmp
filen registrerer
brukerne som for øyeblikket er pålogget. Denne filen
opprettes dynamisk i oppstart skriptet.
Gettext pakken inneholder verktøy for internasjonalisering og lokalisering. Disse gjør at programmer kan kompileres med NLS (Lokal Språk Støtte), slik at de kan sende ut meldinger i brukerens lokale språkformat.
For vårt midlertidige sett med verktøy trenger vi bare å installere tre programmer fra Gettext.
Forbered Gettext for kompilering:
./configure --disable-shared
Betydningen av konfigureringsalternativet:
--disable-shared
Vi trenger ikke å installere noen av de delte Gettext bibliotekene, denne gangen er det derfor ikke nødvendig å bygge dem.
Kompiler pakken:
make
Installer msgfmt, msgmerge, og xgettext programmene:
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
Detaljer om denne pakken finner du i Section 8.31.2, “Innhold i Gettext.”
Bison pakken inneholder en parsergenerator.
Forbered Bison for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/bison-3.8.2
Betydningen av det nye konfigureringsalternativet:
--docdir=/usr/share/doc/bison-3.8.2
Dette forteller byggesystemet å installere bison dokumentasjonen i en versjonert mappe.
Kompiler pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.32.2, “Innholdet i Bison.”
Perl pakken inneholder den praktiske utvinnings og rapporterings språket (Practical Extraction and Report Language).
Forbered Perl for kompilering:
sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.36/core_perl \ -Darchlib=/usr/lib/perl5/5.36/core_perl \ -Dsitelib=/usr/lib/perl5/5.36/site_perl \ -Dsitearch=/usr/lib/perl5/5.36/site_perl \ -Dvendorlib=/usr/lib/perl5/5.36/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.36/vendor_perl
Betydningen av de nye konfigureringsalternativene:
-des
Dette er en kombinasjon av tre alternativer: -d bruker standardinnstillinger for alle elementer; -e sikrer gjennomføring av alle oppgaver; -s sender ikke ut ikke-essensielle utdata.
Kompiler pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.41.2, “Innhold i Perl.”
Python 3 pakken inneholder Python utviklingsmiljøet. Den er nyttig for objektorientert programmering, skriving av skript, prototyping store programmer, eller utvikle hele applikasjoner.
Det er to pakkefiler som navnet begynner med “python”. Den å pakke ut er
Python-3.10.6.tar.xz
(legg
merke til stor bokstav først).
Forbered Python for kompilering:
./configure --prefix=/usr \ --enable-shared \ --without-ensurepip
Betydningen av konfigureringsalternativet:
--enable-shared
Denne bryteren forhindrer installasjon av statiske biblioteker.
--without-ensurepip
Denne bryteren deaktiverer Python pakkeinstallasjonsprogrammet, som ikke er nødvendig på dette stadiet.
Kompiler pakken:
make
Noen Python 3 moduler kan ikke bygges nå på grunn av avhengighetene ikke er installert ennå. Byggesystemet prøver imidlertid å bygge dem, så kompileringen av noen filer vil mislykkes og kompilatormeldingen kan synes å indikere “fatal error”. Meldingen bør ignoreres. Bare sørg for toppnivåets make kommando ikke har feilet. De valgfrie modulene er ikke nødvendig nå, og de vil bli bygget i Chapter 8.
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.50.2, “Innhold i Python 3.”
Texinfo pakken inneholder programmer for lesing, skriving og konvertere informasjonssider.
Forbered Texinfo for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.68.2, “Innhold i Texinfo.”
Util-linux pakken inneholder diverse hjelpeprogrammer.
FHS anbefaler å bruke /var/lib/hwclock
mappen i stedet for den
vanlige /etc
mappen som
plassering for adjtime
filen.
Opprett denne mappen med:
mkdir -pv /var/lib/hwclock
Forbered Util-linux for kompilering:
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \ --libdir=/usr/lib \ --docdir=/usr/share/doc/util-linux-2.38.1 \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ runstatedir=/run
Betydningen av konfigureringsalternativene:
ADJTIME_PATH=/var/lib/hwclock/adjtime
Dette angir plasseringen av filopptaksinformasjonen om maskinvareklokken i henhold til FHS. Dette er ikke strengt tatt nødvendig for dette midlertidige verktøyet, men det forhindrer at det lages en fil på et annet sted, som ikke ville bli overskrevet eller fjernet når du bygger den endelige util-linux pakken.
--libdir=/usr/lib
Denne bryteren sikrer .so
målrettes mot symbolkoblinger i den delte
bibliotekfilen i samme mappe (/usr/lib
) direkte.
--disable-*
Disse bryterne forhindrer advarsler om bygningskomponenter som krever pakker som ikke er i LFS eller ikke er installert ennå.
--without-python
Denne bryteren deaktiverer bruk av Python. Den unngår å prøve å bygge unødvendige bindinger.
runstatedir=/run
Denne bryteren angir plasseringen av socket som brukes
av uuidd
og libuuid
riktig.
Kompiler pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.73.2, “Innhold i Util-linux.”
Fjern først den installerte dokumentasjonen for å forhindre dem fra å havne i det endelige systemet, og å spare ca 35 MB:
rm -rf /usr/share/{info,man,doc}/*
For det andre er .la filene til libtool bare nyttige når du kobler til statiske biblioteker. De er unødvendige og potensielt skadelige ved bruk av dynamiske delte biblioteker, spesielt når du bruker byggesystemer som ikke er autoverktøy. Mens du fortsatt er i chroot, fjern disse filene nå:
find /usr/{lib,libexec} -name \*.la -delete
Den nåværende systemstørrelsen er nå omtrent 3 GB, /tools mappen er ikke lenger nødvendig. Den bruker ca 1 GB diskplass. Slett den nå:
rm -rf /tools
På dette tidspunktet er de essensielle programmene og bibliotekene opprettet og ditt nåværende LFS system er i god stand. Systemet ditt kan nå bli sikkerhetskopiert for senere gjenbruk. Ved fatale feil i de påfølgende kapitler, viser det seg ofte at å fjerne alt og starte på nytt (mer forsiktig) er det beste alternativet for å gjenopprette. Dessverre, alle midlertidige filer vil også bli fjernet. For å unngå å bruke ekstra tid på gjøre om noe som har blitt bygget vellykket, og lage en sikkerhetskopi av det nåværende LFS systemet kan vise seg å være nyttig.
Alle de resterende trinnene i denne delen er valgfrie. Likevel, så snart du begynner å installere pakker i Chapter 8, vil de midlertidige filene bli overskrevet. Så det kan være lurt å ta en sikkerhetskopi av systemet som beskrevet nedenfor.
Følgende trinn utføres fra utenfor chroot miljøet. Det betyr
at du må forlate chroot miljøet før du fortsetter. Grunnen
til det er å få tilgang til filsystemplasseringer utenfor
chroot miljøet for å lagre/lese sikkerhetskopiarkivet som
ikke skal plasseres innenfor $LFS
hierarkiet for sikkerhetsmessige
årsaker.
Hvis du har bestemt deg for å ta en sikkerhetskopi, forlat chroot miljøet:
exit
Alle de følgende instruksjonene utføres av root
på vertssystemet ditt. Vær ekstra
forsiktig med kommandoene du skal kjøre ettersom feil her
kan du endre vertssystemet ditt. Vær oppmerksom på at
miljøvariabelen LFS
is set for
user lfs
som standard er
kanskje ikke satt
for root
.
Når kommandoer skal utføres av root
, sørg for at du har satt
LFS
.
Dette har vært diskutert i Section 2.6, “Stille inn $LFS variabelen”.
Før du lager en sikkerhetskopi, avmonter de virtuelle filsystemene:
umount $LFS/dev/pts umount $LFS/{sys,proc,run,dev}
Sørg for at du har minst 1 GB ledig diskplass (kildenes tarballer vil bli inkludert i sikkerhetskopiarkivet) på filsystemet som inneholder mappen der du oppretter sikkerhetskopiarkivet.
Merk at instruksjonene nedenfor spesifiserer hjemmemappen til
vertenssystemets bruker root
som vanligvis finnes på rotfilsystemet.
Erstatt $HOME
av en mappe etter
eget valg hvis du ikke ønsker å ha sikkerhetskopien lagret i
root
sin hjemmemappe.
Opprett sikkerhetskopiarkivet ved å kjøre følgende kommando:
Fordi sikkerhetskopieringsarkivet er komprimert, tar det relativt lang tid (over 10 minutter) selv på et rimelig raskt system.
cd $LFS tar -cJpf $HOME/lfs-temp-tools-11.2.tar.xz .
Hvis du fortsetter til kapittel 8, ikke glem å gå inn i chroot miljøet på nytt som forklart i “Viktig” boksen under.
In caI tilfelle noen feil har blitt gjort og du må begynne på
nytt, kan du bruk denne sikkerhetskopien til å gjenopprette
systemet og spare litt gjenopprettingstid. Siden kildene
ligger under $LFS
, er de
inkludert i sikkerhetskopieringsarkivet, slik at de ikke
trenger å lastes ned igjen. Etter å ha sjekket at
$LFS
er riktig innstilt,
gjenopprett sikkerhetskopien ved å utføre følgende
kommandoer:
Følgende kommandoer er ekstremt farlige. Hvis du kjører
rm -rf ./*
som root
brukeren og du
ikke endret til $LFS-mappen eller LFS
miljøvariabelen ikke er satt for
brukeren root
vil den
ødelegge hele vertssystemet ditt. DU ER ADVART.
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-11.2.tar.xz
Igjen, dobbeltsjekk at miljøet er riktig konfigurert og fortsett å bygge resten av systemet.
Hvis du forlot chroot-miljøet for å lage en sikkerhetskopi eller starte byggingen på nytt ved hjelp av en gjenoppretting, husk å sjekke at det virtuelle filsystemer fortsatt er montert (findmnt | grep $LFS). Hvis de ikke er montert, monter dem på nytt nå som beskrevet i Section 7.3, “Klargjøring av virtuelle kjernefilsystemer” og gå inn i chroot miljøet igjen (se Section 7.4, “Gå inn i Chroot miljøet”) før du fortsetter.
I dette kapittelet begynner vi for alvor å bygge LFS systemet.
Installasjonen av denne programvaren er enkel. Skjønt i mange tilfeller kan installasjonsinstruksjonene gjøres kortere og mer generelle, vi har valgt å gi de fullstendige instruksjonene for hver pakke for å minimere mulighetene for feil. Nøkkelen til å lære hva som gjør et at et Linux system virker er å vite hva hver pakke brukes til og hvorfor du (eller systemet) kan trenge det.
Vi anbefaler ikke å bruke optimaliseringer. De kan gjøre at et
program kjører litt raskere, men de kan også forårsake
kompilerings vanskeligheter og problemer når du kjører
programmet. Hvis en pakke nekter å kompilere når du bruker
optimalisering, prøv å kompilere den uten optimalisering og se
om det løser problemet. Selv om pakken kompileres ved bruk av
optimalisering, er det risiko for at det kan ha blitt kompilert
feil fordi de komplekse interaksjonene mellom koden og
byggeverktøyene. Legg også merke til at -march
og -mtune
alternativene som ikke er spesifisert i boken er ikke testet.
Dette kan skape problemer med verktøykjedepakkene (Binutils,
GCC og Glibc). De små potensielle gevinstene oppnådd ved bruk
av kompilatoroptimaliseringer oppveies ofte av risikoen.
Førstegangsbyggere av LFS oppfordres til å bygge uten
tilpassete optimaliseringer. Det påfølgende systemet vil
fortsatt kjøre veldig raskt og være stabilt samtidig.
Før installasjonsinstruksjonene gir hver installasjonsside informasjon om pakken, inkludert en kortfattet beskrivelse av hva den inneholder, omtrent hvor lang tid det vil ta å bygge, og hvor mye diskplass kreves under denne byggeprosessen. Etter installasjoneninstruksene , er det en liste over programmer og biblioteker (sammen med korte beskrivelser) som pakken installerer.
SBU verdiene og nødvendig diskplass inkluderer testpakkedata for alle gjeldende pakker i Chapter 8. SBU verdier har blitt beregnet ved å bruke en enkelt CPU-kjerne (-j1) for alle operasjoner.
Generelt fraråder LFS redaktørene å bygge og installere statiske biblioteker. Det opprinnelige formålet for de fleste statiske biblioteker er nå foreldet i et moderne Linux system. I tillegg kan koblinger for et statiske biblioteker i et program være skadelig. Hvis en oppdatering til biblioteket er nødvendig for å fjerne et sikkerhetsproblem, må alle programmer som bruker det statiske biblioteket kobles til det nye biblioteket. Siden bruken av statiske biblioteker ikke alltid er åpenbart, de relevante programmene (og prosedyrene som trengs for å gjør koblingen) er kanskje ikke engang kjent.
I prosedyrene i dette kapittelet fjerner eller deaktiverer vi
installasjon av de fleste statiske biblioteker. Vanligvis
gjøres dette ved å utstede en --disable-static
alternativ til configure. I andre
tilfeller er det nødvendig med alternative midler. I noen få
tilfeller, spesielt glibc og gcc, forblir bruken av statiske
biblioteker avgjørende for det generelle pakke byggeprosess.
For en mer fullstendig diskusjon av biblioteker, se diskusjonen Biblioteker: Statiske eller delte? i BLFS boken.
Pakkebehandling er et ofte etterspurt tillegg til LFS boken. En pakkebehandler lar deg spore installasjonen av filer som gjør det enkelt å fjerne og oppgradere pakker. I tillegg til binær- og biblioteksfilene, en pakkebehandler vil håndtere installasjonen av konfigurasjonsfiler. Før du begynner å lure på, NEI—denne delen vil ikke snakke om eller anbefale noen spesiell pakkebehandler. Det den gir er en oppsummering av de fleste populære teknikker og hvordan de fungerer. Den perfekte pakkebehandleren for deg vil kanskje være blant disse teknikkene eller kan være en kombinasjon av to eller flere av disse teknikker. Denne delen nevner kort problemer som kan oppstå ved oppgradering av pakker.
Noen grunner til at ingen pakkebehandler er nevnt i LFS eller BLFS inkludere:
Å håndtere pakkehåndtering fjerner fokus fra målene til disse bøkene—som lærer hvordan et Linux system er bygget.
Det er flere løsninger for pakkehåndtering, som hver har dens styrker og ulemper. Inkludere en som tilfredsstiller alle målgrupper er vanskelig.
Det er skrevet noen tips om emnet pakkehåndtering. Besøk the Hints Project og se om en av dem passer ditt behov.
En Pakkehåndterer gjør det enkelt å oppgradere til nyere versjoner når de er utgitt. Generelt kan instruksjonene i LFS- og BLFS-bøkene brukes til å oppgradere til nyere versjoner. Her er noen punkter du bør være oppmerksom på når du oppgraderer pakker, spesielt på et kjørende system.
Hvis Linux kjernen må oppgraderes (for eksempel fra 5.10.17 til 5.10.18 eller 5.11.1), må ikke noe annet bygges om. Systemet vil fortsette å fungere bra takket være den veldefinerte grensen mellom kjernen og brukerområdet. Nærmere bestemt Linux API-deklarasjoner trenger ikke å (og bør ikke bli, se neste element) oppgraderes ved siden av kjernen. Du må starte systemet på nytt for å bruke den oppgraderte kjernen.
Hvis Linux API-deklarasjoner eller Glibc må oppgraderes til en nyere versjon, (f.eks. fra glibc-2.31 til glibc-2.32), er det tryggere å gjenoppbygge LFS. Selv om du kanskje kan gjenoppbygge alle pakkene i deres avhengighetsrekkefølge, anbefaler vi ikke det.
Hvis en pakke som inneholder et delt bibliotek
oppdateres, og hvis navnet på biblioteket endres, vil
eventuelle pakker dynamisk koblet til biblioteket måtte
kompileres på nytt for å kunne kobles mot det nyere
biblioteket. (Merk at det ikke er noen sammenheng
mellom pakkeversjon og navnet på biblioteket.) Tenk for
eksempel på en pakke foo-1.2.3 som installerer et delt
bibliotek med navn libfoo.so.1
. Hvis du oppgraderer
pakken til en nyere versjon foo-1.2.4 som installerer
et delt bibliotek med navn libfoo.so.2
. I dette tilfellet, alle
pakker som er dynamisk koblet til libfoo.so.1
må kompileres på nytt for
å lenke imot libfoo.so.2
for å bruke den nye bibliotekversjonen. Du bør ikke
fjerne det forrige biblioteker med mindre alle de
avhengige pakkene er rekompilert.
Hvis en pakke som inneholder et delt bibliotek
oppdateres, og navnet på biblioteket ikke endres, men
versjonsnummeret til bibliotek filen reduseres (f.eks.
navnet på biblioteket beholdes ved navn libfoo.so.1
, men navnet på
bibliotekfilen er endret fra libfoo.so.1.25
til libfoo.so.1.24
), bør du fjerne
bibliotekfilen fra den tidligere installerte versjonen
(libfoo.so.1.25
i dette
tilfellet). Eller, et ldconfig kjører (av
deg selv ved å bruke en kommando linje, eller ved
installasjon av en pakke) vil tilbakestille
symbolkoblingen libfoo.so.1
til å peke på den gamle
bibliotekfilen fordi den ser ut til å ha en
“nyere” versjon, ettersom
versjonsnummeret er større. Denne situasjonen kan skje
hvis du må nedgradere en pakke, ellers endrer pakken
versjonen ordningen med bibliotekfiler plutselig.
Hvis en pakke som inneholder et delt bibliotek
oppdateres, og navnet på biblioteket ikke endres, men
et alvorlig problem (spesielt en sikkerhetssårbarhet)
er fikset, alle programmer som kjører koblet til det
delte biblioteket bør startes på nytt. Følgende
kommando, kjørt som root
etter oppdateringen, vil liste
opp hva som bruker de gamle versjonene av disse
bibliotekene (erstatt libfoo
med navnet på
biblioteket):
grep -l -e 'libfoo
.*deleted' /proc/*/maps |
tr -cd 0-9\\n | xargs -r ps u
Hvis OpenSSH brukes for tilgang til systemet og det er koblet til det oppdaterte biblioteket, må du omstarte sshd tjenesten, deretter logg ut, logg på igjen, og kjør kommandoen på nytt for å bekrefte at ingenting fortsatt bruker de slettede bibliotekene.
Hvis et binært eller et delt bibliotek overskrives, kan prosessene som bruker koden eller dataene i binærfilen eller biblioteket krasje. Den riktige måten å oppdatere et binært eller et delt bibliotek uten å forårsake at prosessen krasjer er å fjerne den først, og deretter installere den nye versjonen. install kommandoen levert av Coreutils har allerede implementert dette og de fleste pakker bruker det til å installere binærfiler og biblioteker. Dette betyr at du ikke vil bli plaget av dette problemet mesteparten av tiden. Imidlertid er installasjonsprosessen for noen pakker (spesielt Mozilla JS i BLFS) bare å overskrive filen hvis den eksisterer og forårsaker et krasj, så det er tryggere å lagre arbeidet ditt og lukke unødvendige kjørende prosesser før du oppdaterer en pakke.
Følgende er noen vanlige pakkehåndteringsteknikker. Før du ta en avgjørelse om en pakkeforvalter, gjør litt research på de forskjellige teknikker, spesielt ulempene ved den spesielle ordningen.
Ja, dette er en pakkehåndteringsteknikk. Noen mennesker finner ikke behovet for en pakkehåndterer fordi de kjenner pakkene inngående og vet hvilke filer som er installert av hver pakke. Noen brukere trenger heller ikke pakkehåndtering fordi de planlegger å gjenoppbygge hele system når en pakke endres.
Dette er en forenklet pakkehåndtering som ikke trenger noe
ekstra pakke for å administrere installasjonene. Hver pakke
er installert i en egen katalog. For eksempel er pakke
foo-1.1 installert i /usr/pkg/foo-1.1
og en symbolkobling er
laget fra /usr/pkg/foo
til
/usr/pkg/foo-1.1
. Ved
installasjon av en ny versjon foo-1.2, installeres den i
/usr/pkg/foo-1.2
og den
forrige symbolkoblingen erstattes av en symbolkobling til
den nye versjonen.
Miljøvariabler som f.eks PATH
,
LD_LIBRARY_PATH
, MANPATH
, INFOPATH
og CPPFLAGS
må utvides til å
inkludere /usr/pkg/foo
. For
mer enn noen få pakker, blir denne ordningen uhåndterlig.
Dette er en variant av den tidligere
pakkehåndteringsteknikken. Hver pakke er installert på
samme måte som den forrige ordningen. Men i stedet for å
gjøre symbolkoblingen, er hver fil symlinked inn i
/usr
hierarkiet. Dette
fjerner behovet for å utvide miljøvariablene. Selv om
symbolkoblingene kan være opprettet av brukeren for å
automatisere opprettelsen, har mange pakkeforvaltere blitt
skrevet ved hjelp av denne tilnærmingen. Noen av de
populære inkluderer Stow, Epkg, Graft og Depot.
Installasjonen må forfalskes, slik at pakken tror det den
er installert i /usr
skjønt i
virkeligheten er den installert i /usr/pkg
hierarkiet. Installering på
denne måten er vanligvis ikke en triviell oppgave. Tenk for
eksempel på at du installerer en pakke libfoo-1.1. Følgende
instruksjoner kan ikke installere pakken riktig:
./configure --prefix=/usr/pkg/libfoo/1.1 make make install
Installasjonen vil fungere, men de avhengige pakkene kan
ikke kobles til libfoo som du forventer. Hvis du kompilerer
en pakke som lenker mot libfoo, kan du legge merke til at
den er koblet til /usr/pkg/libfoo/1.1/lib/libfoo.so.1
i
stedet for /usr/lib/libfoo.so.1
som du forventer.
Den riktige tilnærmingen er å bruke DESTDIR
strategi for forfalske installasjon
av pakken. Dette tilnærmingen fungerer som følger:
./configure --prefix=/usr make make DESTDIR=/usr/pkg/libfoo/1.1 install
De fleste pakker støtter denne tilnærmingen, men det er
noen som ikke gjør det. For de ikke-kompatible pakkene kan
det hende du må installere pakken manuelt , eller du kan
finne ut at det er lettere å installere noen problematiske
pakker inn i /opt
.
I denne teknikken blir en fil tidsstemplet før installasjonen av pakken. Etter installasjonen, en enkel bruk av find kommandoen med de riktige alternativene kan generere en logg over alle filene som er installert etter at tidsstempelfilen ble opprettet. En pakkebehandler skrevet med denne tilnærmingen er install-log.
Selv om denne ordningen har fordelen av å være enkel, har den to ulemper. Hvis filene under installasjonen er installert med et annet tidsstempel enn gjeldende tid, vil disse filene ikke spores av pakkebehandleren. Dessuten kan denne ordningen bare brukes når én pakke installeres om gangen. Loggene er ikke pålitelige hvis to pakker installeres på to forskjellige konsoller.
I denne tilnærmingen, blir kommandoene som installasjonsskriptene utfører registrert. Det er to teknikker man kan bruke:
LD_PRELOAD
miljøvariabelen kan
settes til å peke på et bibliotek som skal forhåndslastes
før installasjonen. Under installasjonen, sporer dette
biblioteket pakkene som blir installert og fester seg til
ulike kjørbare filer som f.eks cp, install, mv og sporing av
systemets anrop som endrer filsystemet. For å få denne
tilnærmingen til å virke, alle kjørbare filer må være
dynamisk koblet uten suid- eller sgid-biten.
Forhåndsinnlasting av biblioteket kan forårsake noen
uønskede bivirkninger under installasjon. Derfor anbefales
det at man utfører noen tester for å sørge for at
pakkebehandlingen ikke bryter noe og logger alle passende
filer.
Den andre teknikken er å bruke strace, som logger alle systemanrop som gjøres under utførelse av installasjonensskriptet.
I denne ordningen er pakkeinstallasjonen forfalsket til et separat tre som beskrevet i Symlink pakkebehandlingenen. Etter installasjon, opprettes et pakkearkiv ved hjelp av de installerte filene. Dette arkivet brukes deretter til å installere pakken enten på den lokale maskin eller kan til og med brukes til å installere pakken på andre maskiner.
Denne tilnærmingen brukes av de fleste pakkebehandlere som finnes i kommersielle distribusjoner. Eksempler på pakkeforvaltere som følger dette tilnærmingen er RPM (som for øvrig kreves av Linux Standard Base Specification),pkg-utils, Debian's apt, og Gentoo's Portage system. Et hint som beskriver hvordan du adopterer denne stilen av pakkehåndtering for LFS systemer ligger på https://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt.
Oppretting av pakkefiler som inkluderer avhengighetsinformasjon er kompleks og er utenfor omfanget av LFS.
Slackware bruker et tar basert system for pakke arkiv. Dette systemet håndterer med vilje ikke pakkeavhengigheter som mer komplekse pakkeforvaltere gjør. For detaljer om Slackware pakkebehandling, se http://www.slackbook.org/html/package-management.html.
Denne ordningen, unik for LFS, ble utviklet av Matthias Benkmann, og er tilgjengelig fra Hints Project. I denne ordningen, er hver pakke installert som en separat bruker i standardplasseringer. Filer som tilhører en pakke identifiseres enkelt med å sjekke bruker-ID. Funksjonene og manglene ved denne tilnærmingen er for komplisert til å beskrive i denne delen. For detaljer, se hintene på https://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt.
En av fordelene med et LFS system er at det ikke er noen
filer som avhenger av plasseringen til filene på et
disksystem. Kloning av et LFS bygg til en annen datamaskin
med samme arkitektur som basissystemet er like enkelt som å
bruke tar på
LFS partisjonen som inneholder rotkatalogen (ca. 250 MB
ukomprimert for en standard LFS bygg), kopiere den filen via
nettverksoverføring eller CD-ROM til det nye systemet og
utvide den. Fra det tidspunktet må noen få
konfigurasjonsfiler endres. Konfigurasjonsfiler som kanskje
må oppdateres inkluderer: /etc/hosts
, /etc/fstab
, /etc/passwd
, /etc/group
, /etc/shadow
,
/etc/ld.so.conf
, /etc/sysconfig/rc.site
, /etc/sysconfig/network
, og /etc/sysconfig/ifconfig.eth0
.
En tilpasset kjerne må kanskje bygges for det nye systemet avhengig av forskjeller i systemmaskinvare og den originale kjerne konfigurasjonen.
Det har vært noen rapporter om problemer ved kopiering mellom lignende, men ikke identiske arkitekturer. For eksempel instruksjonssettet for et Intel-system er ikke identisk med en AMD-prosessor og nyere versjoner av enkelte prosessorer kan ha instruksjoner som ikke er tilgjengelige i tidligere versjoner.
Til slutt må det nye systemet gjøres oppstartbart via Section 10.4, “Bruke GRUB til å sette opp oppstartsprosessen”.
Man-pages pakken inneholder over 2200 Man-sider.
Installer Man-sider ved å kjøre:
make prefix=/usr install
Iana-Etc pakken leverer data for nettverkstjenester og protokoller.
For denne pakken trenger vi bare å kopiere filene på plass:
cp services protocols /etc
Glibc pakken inneholder C hovedbiblioteket. Dette biblioteket tilbyr de grunnleggende rutinene for tildeling av minne, søk i kataloger, åpne og lukke filer, lese og skrive filer, strenghåndtering, mønstertilpasning, aritmetikk og så videre.
Noen av Glibc programmene bruker ikke-FHS kompatible
/var/db
mappen til å lagre
kjøretidsdataene i. Bruk følgende oppdatering for å forsikre
om at slike programmer lagrer kjøretidsdataene deres på de
FHS-kompatible stedene:
patch -Np1 -i ../glibc-2.36-fhs-1.patch
Glibc dokumentasjonen anbefaler å bygge Glibc i en dedikert byggemappe:
mkdir -v build cd build
Sørg for at ldconfig og sln verktøyene vil bli
installert i /usr/sbin
:
echo "rootsbindir=/usr/sbin" > configparms
Forbered Glibc for kompilering:
../configure --prefix=/usr \ --disable-werror \ --enable-kernel=3.2 \ --enable-stack-protector=strong \ --with-headers=/usr/include \ libc_cv_slibdir=/usr/lib
Betydningen av konfigureringsalternativene:
--disable-werror
Dette alternativet deaktiverer alternativet -Werror sendt til GCC. Dette er nødvendig for å kjøre testpakken.
--enable-kernel=3.2
Dette alternativet forteller byggesystemet at denne glibc kan brukes med kjerner så gamle som 3.2. Dette betyr å generere løsninger i tilfelle et systemanrop introdusert i en senere versjon ikke kan brukes.
--enable-stack-protector=strong
Dette alternativet øker systemsikkerheten ved å legge til ekstra kode for å se etter bufferoverflyt "buffer overflows", for eksempel stabel (stack) knusende angrep.
--with-headers=/usr/include
Dette alternativet forteller byggesystemet hvor det skal finne kjernens API deklarasjoner.
libc_cv_slibdir=/usr/lib
Denne variabelen setter riktig bibliotek for alle systemer. Vi ønsker ikke at lib64 skal brukes.
Kompiler pakken:
make
I denne delen anses testpakken for Glibc som kritisk. Ikke hopp over den under noen omstendigheter.
Vanligvis består ikke noen få tester. Testfeilene som er oppført nedenfor er vanligvis trygge å ignorere.
make check
Du kan se noen testfeil. Glibc testpakken er noe avhengig av vertssystemet. Noen få feil ut av over 4200 tester kan generelt ignoreres. Dette er en liste over de vanligste problemene som er sett for nyere versjoner av LFS:
io/tst-lchmod er kjent for å mislykkes i LFS chroot miljøet.
misc/tst-ttyname er kjent for å mislykkes i LFS chroot miljøet.
nss/tst-nss-files-hosts-long testen er kjent for å mislykkes hvis systemet ikke har noen ikke-tilbakekoblings IP-adresser.
The stdlib/tst-arc4random-thread testen er kjent for å mislykkes hvis vertskjernen er relativt gammel.
Noen tester, for eksempel nss/tst-nss-files-hosts-multi, er kjent for å mislykkes på relativt trege systemer på grunn av et internt tidsavbrudd.
Selv om det er en ufarlig melding, vil installasjonsstadiet
til Glibc klage på fravær av /etc/ld.so.conf
. Forhindre denne advarselen
med:
touch /etc/ld.so.conf
Fiks Makefilen til å hoppe over en unødvendig fornuftssjekk som svikter i LFS delmiljøet:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Installer pakken:
make install
Fiks hardkodet bane til den kjørbare lasteren i ldd skriptet:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Installer konfigurasjonsfilen og kjøretidsmappen for nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd
Installer deretter lokalitetene som kan få systemet til å svare i en annet språk. Ingen av lokalitetene er påkrevd, men hvis noen av dem mangler, vil testpakkene til fremtidige pakker hoppe over viktig tester.
Individuelle lokaliteter kan installeres ved å bruke
localedef
programmet. For eksempel den andre localedef kommandoen
nedenfor kombinerer /usr/share/i18n/locales/cs_CZ
tegnsettuavhengig lokalitetsdefinisjonen med /usr/share/i18n/charmaps/UTF-8.gz
tegnsett
definisjonen og legger resultatet til /usr/lib/locale/locale-archive
filen.
Følgende instruksjoner vil installere minimumssettet med
lokaliteter som er nødvendige for optimal dekning av tester:
mkdir -pv /usr/lib/locale localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i el_GR -f ISO-8859-7 el_GR localedef -i en_GB -f ISO-8859-1 en_GB localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_ES -f ISO-8859-15 es_ES@euro localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i is_IS -f ISO-8859-1 is_IS localedef -i is_IS -f UTF-8 is_IS.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f ISO-8859-15 it_IT@euro localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i se_NO -f UTF-8 se_NO.UTF-8 localedef -i ta_IN -f UTF-8 ta_IN.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030 localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
Installer i tillegg lokaliteten for ditt eget land, språk og tegnsett.
Alternativt kan du installere alle lokaliteter som er oppført
i glibc-2.36/localedata/SUPPORTED
filen (den
inkluderer alle lokaliteter oppført ovenfor og mange flere)
med en gang med denne tidkrevende kommandoen:
make localedata/install-locales
Bruk deretter localedef kommandoen for å
lage og installere lokaliteter som ikke er oppført i
glibc-2.36/localedata/SUPPORTED
filen når du trenger dem. For eksempel er følgende to
lokaliteter nødvendig for noen tester senere i dette
kapittelet:
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
Glibc bruker nå libidn2 når den løser internasjonalisert domenenavn. Dette er en kjøretids avhengighet. Hvis denne evnen er nødvendig, er instruksjonene for installasjon av libidn2 i BLFS libidn2 siden.
/etc/nsswitch.conf
filen må
opprettes fordi Glibc standardene ikke fungerer bra i et
nettverksmiljø.
Opprett en ny fil /etc/nsswitch.conf
ved å kjøre følgende:
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
Installer og sett opp tidssonedataene med følgende:
tar -xf ../../tzdata2022c.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward; do zic -L /dev/null -d $ZONEINFO ${tz} zic -L /dev/null -d $ZONEINFO/posix ${tz} zic -L leapseconds -d $ZONEINFO/right ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO
Betydningen av zic kommandoene:
zic -L
/dev/null ...
Dette skaper posix tidssoner uten noen skuddsekunder.
Det er konvensjonelt å legge disse i både
zoneinfo
og
zoneinfo/posix
. Det er
nødvendig for å legge POSIX tidssonene i zoneinfo
, ellers vil forskjellige
testpakker rapportere feil. På et innebygd system,
hvor plass er stramt og du aldri har tenkt å
oppdatere tidssonene, kan du spare 1,9 MB ved å ikke
bruke posix
mappen, men
noen applikasjoner eller testpakker kan produsere
noen feil.
zic -L
leapseconds ...
Dette skaper riktige tidssoner, inkludert
skuddsekunder. På en innebygd system, hvor det er
trangt om plass og du ikke har tenkt å oppdatere
tidssonene noen gang, eller ikke bryr deg om riktig
tid, kan du spar 1,9 MB ved å utelate right
mappen.
zic ...
-p ...
Dette oppretter posixrules
filen. Vi bruker New
York fordi POSIX krever at reglene for sommertid er i
samsvar med amerikanske regler.
En måte å bestemme den lokale tidssonen på er å kjøre følgende skript:
tzselect
Etter å ha svart på noen spørsmål om lokaliteten, vil
skriptet skrive ut navnet på tidssonen (f.eks. America/Edmonton). Det er også
noen andre mulige tidssoner oppført i /usr/share/zoneinfo
som for eksempel
Canada/Eastern eller
EST5EDT som ikke
identifiseres av skriptet, men kan brukes.
Deretter oppretter du /etc/localtime
filen med å kjøre:
ln -sfv /usr/share/zoneinfo/<xxx>
/etc/localtime
Erstatt <xxx>
med navnet på
den valgte tidssonen (f.eks. Canada/Eastern).
Som standard den dynamiske lasteren (/lib/ld-linux.so.2
) søker gjennom
/usr/lib
for dynamiske
biblioteker som trengs av programmer når de kjøres.
Imidlertid, hvis det er biblioteker i andre kataloger enn
/usr/lib
, må disse legges til
/etc/ld.so.conf
filen for at
den dynamiske lasteren skal finne dem. To kataloger som er
allment kjent å inneholde flere biblioteker er /usr/local/lib
og /opt/lib
, så legg disse mappene til den
dynamiske lasterens søkebane.
Opprett en ny fil /etc/ld.so.conf
ved å kjøre følgende:
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
Om ønskelig kan den dynamiske lasteren også søke i en mappe og inkludere innholdet i filene som finnes der. Vanligvis vil filene i denne mappen inkludere en linje som spesifiserer ønsket biblioteksti. For å legge til denne funksjonen, kjør følgende kommandoer:
cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d
Genererer meldingskataloger |
|
Viser systemkonfigurasjonsverdiene for filsystem spesifikke variabler |
|
Henter oppføringer fra en administrativ database |
|
Utfører tegnsettkonvertering |
|
Skaper hurtiglastings iconv modulkonfigurasjons filer |
|
Konfigurerer dynamiske lenker til kjøretidsbindingene |
|
Rapporter hvilke delte biblioteker som kreves av hvert gitt program eller delte bibliotek |
|
Assisterer ldd med objektfiler. Det eksisterer ikke på nyere arkitekturer som x86_64 |
|
Skriver ut forskjellig informasjon om gjeldende lokalitet |
|
Kompilerer lokalitets spesifikasjoner |
|
Oppretter en enkel database fra tekst inndata |
|
Leser og tolker en minnesporingsfil og viser et sammendrag i menneskelestbart format |
|
En nisse (daemon) som gir et hurtiglager for de vanligste navne tjenesteforespørsler |
|
Dumper informasjon generert av PC profiling |
|
Viser dynamiske delte objekter som brukes av kjørende prosesser |
|
En statisk koblet ln programm |
|
Sporer delte biblioteksprosedyrekall for en spesifisert kommando |
|
Leser og viser profileringsdata for delte objekter |
|
Spør brukeren om lokaliteten til systemet og rapporterer den tilsvarende tidssonebeskrivelsen |
|
Sporer kjøringen av et program ved å skrive ut gjeldende utført funksjon |
|
Tidssone dumperen |
|
Tidssonekompilatoren |
|
Hjelpeprogrammet for kjørbare delte biblioteker |
|
Brukes internt av Glibc som et grovt hack for å få
ødelagte programmer (f.eks. noen
Motif-applikasjoner) kjørende. Se kommentarer i
|
|
Et asynkront navneoppslagsbibliotek |
|
C hovedbiblioteket |
|
Slår på minneallokeringskontroll når den er forhåndslastet |
|
Kryptografibiblioteket |
|
Dummy bibliotek som ikke inneholder noen
funksjoner. Tidligere var den dynamisk
koblingsgrensesnittbibliotek, funksjonene er nå i
|
|
Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere var det et kjøretidsbibliotek for g++ |
|
Det matematiske biblioteket |
|
Matematisk vektorbibliotek, koblet inn etter behov
når |
|
Slår på minneallokeringskontroll når den er koblet til |
|
Brukt av memusage for å hjelpe til med å samle inn informasjon om minnebruken til et program |
|
Nettverkstjenestebiblioteket, nå avviklet |
|
Navnetjenestebrytermodulene, som inneholder
funksjoner for å løse vertsnavn, brukernavn,
gruppenavn, aliaser, tjenester, protokoller osv.
Lastet av |
|
Kan forhåndslastes til PC profile en kjørbar fil |
|
Dummy bibliotek som ikke inneholder noen
funksjoner. Tidligere inneholdt den funksjoner som
gir de fleste grensesnittene som er spesifisert av
POSIX.1b Realtime Extension, nå er funksjonene i
|
|
Inneholder funksjoner for å lage, sende og tolke pakker til domenenavnservere |
|
Inneholder funksjoner som gir de fleste grensesnittene som er spesifisert av POSIX.1b Realtime Extension |
|
Inneholder funksjoner som er nyttige for å bygge feilsøkere for flertrådede programmer |
|
Dummy bibliotek som ikke inneholder noen
funksjoner. Tidligere inneholdt den kode for
“standard” funksjoner
som brukes i mange forskjellige Unix verktøy. Disse
funksjonene er nå i |
Zlib pakken inneholder komprimerings- og dekompresjonsrutiner som brukes av noen programmer.
Forbered Zlib for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Fjern et ubrukelig statisk bibliotek:
rm -fv /usr/lib/libz.a
Bzip2 pakken inneholder programmer for komprimering og dekomprimering av filer. Komprimering av tekstfiler med bzip2 gir mye bedre kompresjonsprosent enn med den tradisjonelle gzip.
Bruk en oppdatering som vil installere dokumentasjonen for denne pakken:
patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch
Følgende kommando sikrer at installasjonen av symbolske lenker er relative:
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
Sørg for at man sidene er installert på riktig sted:
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
Forbered Bzip2 for kompilering med:
make -f Makefile-libbz2_so make clean
Betydningen av make parameteren:
-f
Makefile-libbz2_so
Vil føre til at Bzip2 bygges med en annen Makefile
fil, i dette tilfellet
Makefile-libbz2_so
filen,
som skaper en dynamisk libbz2.so
bibliotek og lenker Bzip2
verktøyene mot det.
Kompiler og test pakken:
make
Installer programmene:
make PREFIX=/usr install
Installer det delte biblioteket:
cp -av libbz2.so.* /usr/lib ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
Installer den delte bzip2 binær inn i
/usr/bin
mappen, og erstatt to
eksemplarer av bzip2 med symbolske lenker:
cp -v bzip2-shared /usr/bin/bzip2 for i in /usr/bin/{bzcat,bunzip2}; do ln -sfv bzip2 $i done
Fjern et ubrukelig statisk bibliotek:
rm -fv /usr/lib/libbz2.a
Dekomprimerer bzippede filer |
|
Dekomprimerer til standard utgang |
|
Kjører cmp på bzippede filer |
|
Kjører diff på bzippede filer |
|
Kjører egrep på bzippede filer |
|
Kjører fgrep på bzippede filer |
|
Kjører grep på bzippede filer |
|
Komprimerer filer ved å bruke Burrows-Wheeler sortering på blokktekst komprimeringsalgoritme med Huffman-koding; kompresjonshastigheten er bedre enn det som oppnås med mer konvensjonelle kompressorer som bruker “Lempel-Ziv” algoritmer, som gzip |
|
Prøver å gjenopprette data fra skadde bzippede filer |
|
Kjører less på bzippede filer |
|
Kjører more på bzippede filer |
|
Biblioteket implementerer tapsfri, blokksorterende data komprimering ved å bruke Burrows-Wheeler-algoritmen |
Xz pakken inneholder programmer for komprimering og dekomprimering av filer. Det gir muligheter for lzma og den nyere xz komprimerings formatene. Komprimering av tekstfiler med xz gir en bedre kompresjonsprosent enn med de tradisjonelle gzip eller bzip2 kommandoene.
Forbered Xz for kompilering med:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.6
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Dekomprimerer til standard utgang |
|
Kjører cmp på LZMA komprimerte filer |
|
Kjører diff på LZMA komprimerte filer |
|
Kjører egrep på LZMA komprimerte filer |
|
Kjører fgrep på LZMA komprimerte filer |
|
Kjører grep på LZMA komprimerte filer |
|
Kjører less på LZMA komprimerte filer |
|
Komprimerer eller dekomprimerer filer ved å bruke LZMA formatet |
|
En liten og rask dekoder for LZMA komprimerte filer |
|
Viser informasjon som er lagret i den komprimerte LZMA filoverskriften |
|
Kjører more på LZMA komprimerte filer |
|
Dekomprimerer filer ved å bruke LZMA formatet |
|
Dekomprimerer filer ved å bruke XZ formatet |
|
Komprimerer eller dekomprimerer filer ved å bruke XZ formatet |
|
Dekomprimerer til standard utgang |
|
Kjører cmp på XZ komprimerte filer |
|
En liten og rask dekoder for XZ komprimerte filer |
|
Kjører diff på XZ komprimerte filer |
|
Kjører egrep på XZ komprimerte filer |
|
Kjører fgrep på XZ komprimerte filer |
|
Kjører grep på XZ komprimerte filer |
|
Kjører less på XZ komprimerte filer |
|
Kjører more på XZ komprimerte filer |
|
Bibliotek som implementerer tapsfri, blokksorterende data komprimering ved å bruke Lempel-Ziv-Markov kjedealgoritmen |
Zstandard er en sanntidskomprimeringsalgoritme som gir høyt kompresjonsforhold. Den tilbyr et veldig bredt spekter av kompresjons/hastighets avveininger, samtidig som den støttes av en veldig rask dekoder.
Bruk en oppdatering for å fikse noen problemer identifisert av oppstrøms:
patch -Np1 -i ../zstd-1.5.2-upstream_fixes-1.patch
Kompiler pakken:
make prefix=/usr
I testutdataen er det flere steder som angir 'failed'. Disse er forventet og bare 'FAIL' er en reell testfeil. Det skal ikke være noen testfeil.
For å teste resultatene, utsted:
make check
Installer pakken:
make prefix=/usr install
Fjern det statiske biblioteket:
rm -v /usr/lib/libzstd.a
File pakken inneholder et verktøy for å bestemme typen av en gitt fil eller filer.
Forbered File for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Readline pakken er et sett med biblioteker som tilbyr kommandolinje redigerings- og historikkfunksjoner.
Å installere Readline på nytt vil føre til at de gamle bibliotekene flyttes til <libraryname>.old. Selv om dette normalt ikke er et problem, i noen tilfeller kan det utløse en koblingsfeil i ldconfig. Dette kan være unngås ved å utstede følgende to seds:
sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install
Forbered Readline for kompilering:
./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.1.2
Betydningen av konfigureringsalternativet:
--with-curses
Dette alternativet forteller Readline at det kan finne
termcap bibliotekfunksjoner i curses biblioteket, i
stedet for et separat termcap bibliotek. Det gjør det
mulig å generere en korrekt readline.pc
fil.
Kompiler pakken:
make SHLIB_LIBS="-lncursesw"
Betydningen av make alternativet:
SHLIB_LIBS="-lncursesw"
Dette alternativet tvinger Readline til å lenke mot
libncursesw
biblioteket.
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make SHLIB_LIBS="-lncursesw" install
Hvis ønskelig, installer dokumentasjonen:
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.1.2
M4 pakken inneholder en makroprosessor.
Forbered M4 for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Kopierer de gitte filene mens de utvider makroene som de inneholder. Disse makroene er enten innebygde eller brukerdefinerte og kan ta et hvilket som helst antall argumenter. Foruten å utføre makroutvidelse, m4 har innebygde funksjoner for å inkludere navngitte filer, kjører Unix kommandoer, utfører heltallsaritmetikk, manipulere tekst, rekursjon osv. m4 programmet kan brukes enten som en grenseflate til en kompilator eller som en makroprosessor på egen hånd |
Bc pakken inneholder et vilkårlig behandlingsspråk for numerisk presisjon.
Forbered Bc for kompilering:
CC=gcc ./configure --prefix=/usr -G -O3 -r
Betydningen av konfigureringsalternativene:
CC=gcc
Denne parameteren spesifiserer kompilatoren som skal brukes.
-G
Utelat deler av testpakken som ikke vil fungere uten GNU bc tilstede.
-O3
Spesifiser optimaliseringen som skal brukes.
-r
Aktiver bruk av Readline for å forbedre linjeredigeringsfunksjonen til bc.
Kompiler pakken:
make
For å teste bc, kjør
make test
Installer pakken:
make install
Flex pakken inneholder et verktøy for å generere programmerer som gjenkjenner mønstre i tekst.
Forbered Flex for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/flex-2.6.4 \ --disable-static
Kompiler pakken:
make
For å teste resultatene (ca. 0,5 SBU), utsted:
make check
Installer pakken:
make install
Noen få programmer vet ikke om flex ennå og prøver å kjøre
forgjengeren, lex. For å støtte de
programmene, opprett en symbolsk lenke kalt lex
som kjører flex
i lex emuleringsmodus:
ln -sv flex /usr/bin/lex
Et verktøy for å generere programmer som gjenkjenner mønstre i tekst; det gir mulighet for allsidigheten til å spesifisere reglene for mønstersøking, eliminere behovet for å utvikle et spesialisert program |
|
En utvidelse av flex brukes til å generere C++ kode og klasser. Det er en symbolsk kobling til flex |
|
En symbolsk lenke som kjører flex i lex emuleringsmodus |
|
|
Tcl pakken inneholder Tool Command Language, et robust skriptspråk for generelt bruk. Expect pakken er skrevet i Tcl språket.
Denne pakken og de to neste (Expect og DejaGNU) er installert for å støtte kjøring av testpakkene for binutils og GCC og andre pakker. Å installere tre pakker for testformål kan virke overdrevent, men det er veldig betryggende, om ikke avgjørende, å vite at de viktigste verktøyene fungerer som de skal.
Pakk først ut dokumentasjonen ved å gi følgende kommando:
tar -xf ../tcl8.6.12-html.tar.gz --strip-components=1
Forbered Tcl for kompilering:
SRCDIR=$(pwd) cd unix ./configure --prefix=/usr \ --mandir=/usr/share/man
Bygg pakken:
make sed -e "s|$SRCDIR/unix|/usr/lib|" \ -e "s|$SRCDIR|/usr/include|" \ -i tclConfig.sh sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.3|/usr/lib/tdbc1.1.3|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.3/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.3/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.3|/usr/include|" \ -i pkgs/tdbc1.1.3/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.2|/usr/lib/itcl4.2.2|" \ -e "s|$SRCDIR/pkgs/itcl4.2.2/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.2|/usr/include|" \ -i pkgs/itcl4.2.2/itclConfig.sh unset SRCDIR
De ulike “sed” instruksjonene etter “make” kommandoen fjerner referanser til byggemappen fra konfigurasjonsfilene og erstatter dem med installasjonsmappen. Dette er ikke obligatorisk for resten av LFS, men kan være nødvendig i tilfelle en pakke bygget senere bruker Tcl.
For å teste resultatene, kjør:
make test
Installer pakken:
make install
Gjør det installerte biblioteket skrivbart slik at feilsøkingssymboler kan fjernes senere:
chmod -v u+w /usr/lib/libtcl8.6.so
Installer Tcl sine deklarasjoner. Den neste pakken, Expect, krever dem.
make install-private-headers
Lag nå en nødvendig symbolsk kobling:
ln -sfv tclsh8.6 /usr/bin/tclsh
Gi nytt navn til en man side som er i konflikt med en man side for Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
Hvis du lastet ned den valgfrie dokumentasjonen, installer den ved å kjøre følgende kommandoer:
mkdir -v -p /usr/share/doc/tcl-8.6.12 cp -v -r ../html/* /usr/share/doc/tcl-8.6.12
Expect pakken inneholder verktøy for å automatisere, via skriptede dialoger, interaktive applikasjoner som f.eks telnet, ftp, passwd, fsck, rlogin, og tip. Expect er også nyttig for å teste disse samme applikasjoner i tillegg til å lette alle slags oppgaver som er uoverkommelige vanskelig med noe annet. DejaGnu rammeverket er skrevet i Expect.
Forbered Expect for kompilering:
./configure --prefix=/usr \ --with-tcl=/usr/lib \ --enable-shared \ --mandir=/usr/share/man \ --with-tclinclude=/usr/include
Betydningen av konfigureringsalternativene:
--with-tcl=/usr/lib
Denne parameteren er nødvendig for å fortelle configure hvor tclConfig.sh skriptet er plassert.
--with-tclinclude=/usr/include
Dette forteller Expect eksplisitt hvor du finner Tcls interne deklarasjoner.
Bygg pakken:
make
For å teste resultatene, utsted:
make test
Installer pakken:
make install ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
DejaGnu pakken inneholder et rammeverk for å kjøre test pakker på GNU-verktøy. Det er skrevet i expect, som selv bruker Tcl verktøykommandospråk (Tool Command Language).
Upstream anbefaler å bygge DejaGNU i en dedikert byggemappe :
mkdir -v build cd build
Forbered DejaGNU for kompilering:
../configure --prefix=/usr makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi
Bygg og installer pakken:
make install install -v -dm755 /usr/share/doc/dejagnu-1.6.3 install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3
For å teste resultatene, utsted:
make check
Binutils pakken inneholder en linker, en assembler og annet verktøy for håndtering av objektfiler.
Kontroller at PTY-ene fungerer som de skal inne i chroot miljøet ved å utføre en enkel test:
expect -c "spawn ls"
Denne kommandoen skal gi følgende utdata:
spawn ls
Hvis utdataene i stedet inkluderer meldingen nedenfor, er miljøet ikke satt opp for riktig PTY drift. Dette problemet må løses før testpakkene for Binutils og GCC kjøres:
The system has no more ptys.
Ask your system administrator to create more.
Binutils dokumentasjonen anbefaler å bygge Binutils i en dedikert byggemappe:
mkdir -v build cd build
Forbered Binutils for kompilering:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --enable-64-bit-bfd \ --with-system-zlib
Betydningen av konfigureringsparametrene:
--enable-gold
Bygg gold linken og installer den som ld.gold (ved siden av standard linker).
--enable-ld=default
Bygg den originale bfd linkeren og installer den som både ld (som er standard linker) og ld.bfd.
--enable-plugins
Aktiverer støtte for programtillegg for linkeren.
--enable-64-bit-bfd
Aktiverer 64 bits støtte (på verter med smalere ordstørrelser). Kanskje ikke nødvendig på 64 bits systemer, men skader ikke.
--with-system-zlib
Bruk det installerte zlib biblioteket i stedet for å bygge den inkluderte versjonen.
Kompiler pakken:
make tooldir=/usr
Betydningen av make parameteren:
tooldir=/usr
Vanligvis er verktøykatalogen (mappen der de kjørbare
filene vil til slutt bli lokalisert i) satt til
$(exec_prefix)/$(target_alias)
. For
eksempel, x86_64-maskiner vil utvide det til
/usr/x86_64-pc-linux-gnu
.
Fordi dette er et tilpasset system, er denne
målspesifikke katalogen i /usr
ikke påkrevd. $(exec_prefix)/$(target_alias)
ville
vært brukt hvis systemet ble brukt til å krysskompilere
(for eksempel kompilering av en pakke på en Intel
maskin som genererer kode som kan kjøres på PowerPC
maskiner).
Testpakken for Binutils i denne delen anses som kritisk. Ikke hopp over det under noen omstendigheter.
Test resultatene:
make -k check
Installer pakken:
make tooldir=/usr install
Fjern ubrukelige statiske biblioteker:
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes}.a
Oversetter programadresser til filnavn og linjenumre; gitt en adresse og navnet på en kjørbar fil, bruker den feilsøkings informasjonen i den kjørbare filen for å bestemme hvilken kildefil og linje nummer som er knyttet til adressen |
|
Oppretter, endrer og trekker ut fra arkiver |
|
En assembler som setter sammen utdataene til gcc inn i objektfiler |
|
Brukes av linkeren til å ikke ødelegge C++ og Java symboler og hindre overbelastede funksjoner å krasje |
|
DWARF pakkeverktøyet |
|
Oppdaterer ELF deklarasjonen til ELF filer |
|
Viser profildata for kallgrafen |
|
Samle og analyser ytelsesdata |
|
En linker som kombinerer en rekke objekt og arkivfiler inn i en enkelt fil, flytter dataene deres og rydder opp i symbolreferanser |
|
En nedskalert versjon av ld som bare støtter objektfil formatet elf |
|
Hardlenke til ld |
|
Viser symbolene som forekommer i en gitt objektfil |
|
Oversetter én type objektfil til en annen |
|
Viser informasjon om den gitte objektfilen, med alternativer kontrollerer den hvilken informasjonen som skal vises; informasjonen som vises er nyttig for programmerere som jobber med kompileringens verktøy |
|
Genererer en indeks over innholdet i et arkiv og lagrer det i arkivet; indeksen viser alle symbolene som er definert av arkivmedlemmer som er flyttbare objektfiler |
|
Viser informasjon om binærfiler av ELF typen |
|
Viser seksjonsstørrelsene og totalstørrelsen for de gitte objektfilene |
|
Utdata, for hver gitt fil, sekvensene av utskrivbare tegn som er av minst den angitte lengden (som standard til fire); for objektfiler skriver den som standard bare strengene fra initialiserings- og lastingsseksjonene mens for andre typer filer, skanner den hele filen |
|
Fjerner symboler fra objektfiler |
|
Biblioteket med binære filbeskrivelser |
|
Compat ANSI-C Type Format støttebibliotek for feilsøking |
|
En libctf variant som ikke bruker libbfd funksjonalitet |
|
Et bibliotek for å håndtere opkoder—the “leselig tekst” versjoner av instruksjoner for prosessoren; den brukes til å bygge verktøy som objdump |
GMP pakken inneholder matematikkbiblioteker. Disse har nyttige funksjoner for vilkårlig presisjonsaritmetikk.
Hvis du bygger for 32-bit x86, men du har en CPU som er i
stand til å kjøre 64-bits kode og du har spesifisert
CFLAGS
i miljøet vil
konfigureringsskriptet forsøk å konfigurere for 64-biter og
mislykkes. Unngå dette ved å påkalle configure kommandoen
nedenfor med
ABI=32
./configure ...
Standardinnstillingene til GMP produserer biblioteker optimalisert for vertsprosessoren. Hvis det er ønskelig med biblioteker egnet for prosessorer mindre kapable enn vertens CPU, kan generiske biblioteker bli opprettet ved å kjøre følgende:
cp -v configfsf.guess config.guess cp -v configfsf.sub config.sub
Forbered GMP for kompilering:
./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.2.1
Betydningen av de nye konfigureringsalternativene:
--enable-cxx
Denne parameteren aktiverer C++ støtte
--docdir=/usr/share/doc/gmp-6.2.1
Denne variabelen spesifiserer riktig sted for dokumentasjon.
Kompiler pakken og generer HTML dokumentasjonen:
make make html
Testpakken for GMP i denne delen anses som kritisk. Ikke hopp over det under noen omstendigheter.
Test resultatene:
make check 2>&1 | tee gmp-check-log
Koden i gmp er svært optimalisert for prosessoren hvor den er bygget. Noen ganger vil koden som oppdager prosessoren feilidentifisere systemets evner og det vil være feil i testene eller andre applikasjoner som bruker gmp bibliotekene med meldingen "Illegal instruction". I dette tilfellet bør gmp rekonfigureres med alternativet --build=x86_64-pc-linux-gnu og gjenoppbygges.
Sørg for at alle 197 testene i testpakken besto. Sjekk resultatene ved å gi følgende kommando:
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
Installer pakken og dens dokumentasjon:
make install make install-html
MPFR-pakken inneholder matematiske funksjoner med flere presisjoner.
Forbered MPFR for kompilering:
./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-4.1.0
Kompiler pakken og generer HTML dokumentasjonen:
make make html
Testpakken for MPFR i denne delen anses som kritisk. Ikke hopp over den under noen omstendigheter.
Test resultatene og sørg for at alle tester består:
make check
Installer pakken og dens dokumentasjon:
make install make install-html
MPC pakken inneholder et bibliotek for aritmetikk av komplekse tall med vilkårlig høy presisjon og korrekt avrunding av resultatet.
Forbered MPC for kompilering:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.2.1
Kompiler pakken og generer HTML dokumentasjonen:
make make html
For å teste resultatene, utsted:
make check
Installer pakken og dens dokumentasjon:
make install make install-html
Attr pakken inneholder verktøy for å administrere den utvidede attributter på filsystemobjekter.
Forbered Attr for kompilering:
./configure --prefix=/usr \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.5.1
Kompiler pakken:
make
Testene må kjøres på et filsystem som støtter utvidete attributter som filsystemene ext2, ext3 eller ext4. For å teste resultatene, utsted:
make check
Installer pakken:
make install
Acl pakken inneholder verktøy for å administrere tilgangskontrolllister, som brukes til å definere mer finmaskede skjønnsmessige tilgangsrettigheter for filer og mapper.
Forbered Acl for kompilering:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/acl-2.3.1
Kompiler pakken:
make
Acl testene må kjøres på et filsystem som støtter tilgangs kontroller etter Coreutils er bygget med Acl biblioteker. Hvis ønskelig, gå tilbake til denne pakken og kjør make check etter at Coreutils har blitt bygget senere i dette kapittelet.
Installer pakken:
make install
Libcap pakken implementerer brukerromsgrensesnittene til POSIX 1003.1e funksjoner tilgjengelig i Linux kjerner. Disse egenskapene er en partisjonering av det allmektige root privilegiet i et sett med distinkte privilegier.
Hindre at statiske biblioteker blir installert:
sed -i '/install -m.*STA/d' libcap/Makefile
Kompiler pakken:
make prefix=/usr lib=lib
Betydningen av make alternativet:
lib=lib
Denne parameteren setter bibliotekkatalogen til
/usr/lib
heller enn
/usr/lib64
på x86_64. Det
har ingen effekt på x86.
For å teste resultatene, utsted:
make test
Installer pakken:
make prefix=/usr lib=lib install
En skallinnpakning for å utforske og begrense kapasitetsstøtte |
|
Undersøker filfunksjoner |
|
Viser mulighetene for den forespurte prosessen(e) |
|
Angir filkapasiteter |
|
Inneholder bibliotekfunksjonene for å manipulere POSIX 1003.1e kapasiteter |
|
Inneholder funksjoner for å støtte POSIX semantikk for syscalls knyttet til pthread biblioteket |
Shadow pakken inneholder programmer for håndtering av passord på en sikker måte.
Hvis du ønsker å håndheve bruken av sterke passord, se
https://www.linuxfromscratch.org/blfs/view/11.2/postlfs/cracklib.html
for installasjon av CrackLib før du bygger Shadow. Legg så
til --with-libcrack
til configure
kommandoen under.
Deaktiver installasjonen av groups programmet og man sidene, ettersom Coreutils gir en bedre versjon. Også, forhindre installasjon av man sider som allerede var installert i Section 8.3, “Man-pages-5.13”:
sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
I stedet for å bruke standard
crypt metoden, bruk
den sikrere SHA-512
metode for passordkryptering, som også tillater passord
lengre enn 8 tegn. Det er også nødvendig å endre det
foreldede /var/spool/mail
plasseringen for brukerpostbokser som Shadow bruker som
standard til /var/mail
stedet
som brukes for øyeblikket. Og, kvitte seg med /bin
og /sbin
fra PATH
, siden de ganske enkelt
er symbolske lenker til motparten i /usr
.
Hvis /bin
og/eller
/sbin
foretrekkes å være i
PATH
av en eller annen grunn,
endre PATH
i .bashrc
etter at LFS er bygget.
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD SHA512:' \ -e 's:/var/spool/mail:/var/mail:' \ -e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \ -i etc/login.defs
Hvis du valgte å bygge Shadow med støtte for Cracklib, kjør følgende:
sed -i 's:DICTPATH.*:DICTPATH\t/lib/cracklib/pw_dict:' etc/login.defs
Forbered Shadow for kompilering:
touch /usr/bin/passwd ./configure --sysconfdir=/etc \ --disable-static \ --with-group-name-max-length=32
Betydningen av konfigureringsalternativet:
Filen /usr/bin/passwd
må
eksistere fordi plasseringen er hardkodet i noen
programmer, og hvis den ikke eksisterer, er ikke
standardplasseringen riktig.
--with-group-name-max-length=32
Maksimalt brukernavn er 32 tegn. Gjør det maksimale gruppenavnet det samme.
Kompiler pakken:
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make exec_prefix=/usr install make -C man install-man
Denne pakken inneholder verktøy for å legge til, endre og
slette brukere og grupper; angi og endre passordene deres; og
utføre annen administrativ oppgaver. For en fullstendig
forklaring av hva passordskygge betyr, se
doc/HOWTO
filen i den utpakkede
kildetreet. Hvis du bruker Shadow-støtte, husk at programmer
som trenger å bekrefte passord (skjermbehandlere,
FTP-programmer, pop3-nisser, etc.) må være Shadow-kompatibel.
Det vil si at de må kunne jobbe med skyggelagte passord.
For å aktivere skyggelagte passord, kjør følgende kommando:
pwconv
For å aktivere skyggelagte gruppepassord, kjør:
grpconv
Shadows standardkonfigurasjon for useradd verktøyet har noen
forbehold som trenger litt forklaring. Først standard
handling for useradd verktøyet er å lage
brukeren og en gruppe med samme navn som brukeren. Som
standard begynner bruker-ID (UID) og gruppe ID-numre (GID)
med 1000. Dette betyr at hvis du ikke sender parametere til
useradd, hver
bruker vil være medlem av en unik gruppe på systemet. Hvis
denne oppførselen er uønsket, trenger du å sende enten
-g
eller -N
parameter til useradd eller for å endre
innstillingen for USERGROUPS_ENAB
i /etc/login.defs
. Se useradd(8)
for mer informasjon.
For det andre, for å endre standardparametrene, filen
/etc/default/useradd
må lages
og skreddersys for å passe dine spesielle behov. Lag den med:
mkdir -p /etc/default useradd -D --gid 999
/etc/default/useradd
Parameterforklaringer
GROUP=999
Denne parameteren setter begynnelsen på gruppenumrene
som brukes i /etc/group
filen. Den spesielle verdien 999 kommer fra --gid
parameter ovenfor.
Du kan endre den til alt du ønsker. Noter at
useradd
vil aldri gjenbruke en UID eller GID. Hvis nummeret som
er identifisert i denne parameteren brukes, vil det
bruke neste ledige nummer. Merk også at hvis du ikke
har en gruppe med en ID lik dette nummeret på systemet
ditt første gang du bruker useradd uten
-g
parameteren,
du vil få en melding på terminalen som sier:
useradd: unknown GID
999
, selv om kontoen er riktig opprettet. Det er
derfor vi har opprettet gruppen users
med denne gruppe-IDen i
Section 7.6, “Opprette essensielle filer og
symbolkoblinger”.
CREATE_MAIL_SPOOL=yes
Denne parameteren gjør at useradd lager en
postboksfil for den nyopprettede brukeren. useradd vil gjøre
gruppe eierskap av denne filen til mail
gruppe med 0660 tillatelser.
Hvis du foretrekker at disse postboksfilene ikke blir
laget av useradd, utsted
følgende kommando:
sed -i '/MAIL/s/yes/no/' /etc/default/useradd
Velg et passord for brukeren root og sett det ved å kjøre:
passwd root
Brukes til å endre maksimalt antall dager mellom obligatoriske passordendringer |
|
Brukes til å endre en brukers fulle navn og annen informasjon |
|
Brukes til å oppdatere gruppepassord i skriptmodus |
|
Brukes til å oppdatere brukerpassord i skriptmodus |
|
Brukes til å endre en brukers standard påloggingsskall |
|
Sjekker og håndhever gjeldende retningslinjer for passordutløp |
|
Brukes til å undersøke loggen over påloggingsfeil, for å sette et maksimum antall feil før en konto blokkeres, eller for å tilbakestille antall feil |
|
Brukes til å liste de underordnede id-områdene for en bruker |
|
Brukes til å legge til og slette medlemmer og administratorer til grupper |
|
Oppretter en gruppe med det gitte navnet |
|
Sletter gruppen med oppgitt navn |
|
Lar en bruker administrere sin egen gruppemedlemsliste uten krav om superbrukerprivilegier. |
|
Brukes til å endre den gitte gruppens navn eller GID |
|
Verifiserer integriteten til gruppefilene
|
|
Oppretter eller oppdaterer skyggegruppefilen fra den normale gruppefilen |
|
Oppdaterer |
|
Rapporterer siste pålogging for alle brukere eller av en gitt bruker |
|
Brukes av systemet for å la brukere logge på |
|
Er en nisse som brukes til å håndheve restriksjoner på påloggingstid og portene |
|
Brukes til å angi gid-tilordning av et brukernavnområde |
|
Brukes til å endre gjeldende GID under en påloggingsøkt |
|
Brukes til å angi uid-tilordning av et brukernavnområde |
|
Brukes til å opprette eller oppdatere en hel serie med brukerkontoer |
|
Viser en melding om at en konto ikke er tilgjengelig; den er designet til å brukes som standard skall for kontoer som er blitt deaktivert |
|
Brukes til å endre passordet for en bruker- eller gruppekonto |
|
Verifiserer integriteten til passordfilene
|
|
Oppretter eller oppdaterer skyggepassordfilen fra den normale passordfilen |
|
Oppdaterer |
|
Utfører en gitt kommando mens brukerens GID er satt til den gitte gruppen |
|
Kjører et skall med erstatningsbruker- og gruppe-IDer |
|
Oppretter en ny bruker med det gitte navnet, eller oppdaterer standard informasjon om ny bruker |
|
Sletter den gitte brukerkontoen |
|
Brukes til å endre den gitte brukerens påloggingsnavn, bruker identifikasjon (UID), skall, startgruppe, hjemmekatalog, etc. |
|
Redigerer |
|
Redigerer |
|
bibliotek for å prosessere underordnede id-områder for brukere |
GCC pakken inneholder GNU kompilatorsamlingen, som inkluderer C og C++ kompilatorene.
Hvis du bygger på x86_64, endre standard katalognavn for 64-bit bibliotekene til “lib”:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
GCC dokumentasjonen anbefaler å bygge GCC i en dedikert byggemappe:
mkdir -v build cd build
Forbered GCC for kompilering:
../configure --prefix=/usr \ LD=ld \ --enable-languages=c,c++ \ --disable-multilib \ --disable-bootstrap \ --with-system-zlib
Merk at for andre programmeringsspråk er det noen forutsetninger som ikke er tilgjengelig ennå. Se BLFS Bokens GCC side for instruksjoner om hvordan du bygger alle GCCs støttede språk.
Betydningen av de nye konfigureringsparametrene:
LD=ld
Denne parameteren gjør at konfigureringsskriptet bruker ld installert av binutils bygget tidligere i dette kapittelet, i stedet for den kryssbygde versjonen som ellers ville blitt brukt.
--with-system-zlib
Denne bryteren forteller GCC å koble til den systeminstallerte kopien av zlib biblioteket, i stedet for sin egen interne kopi.
Kompiler pakken:
make
I denne delen vurderes testpakken for GCC å være viktig, men det tar lang tid. Førstegangsbyggere oppfordres til ikke å hoppe over dette. Tiden for å kjøre testene kan bli redusert betydelig ved å legge til -jx i make kommandoen nedenfor hvor x er antall kjerner på systemet ditt.
Et sett med tester i GCC testpakken er kjent for å bruke opp standard stabel (stack), så øk stabelstørrelsen før du kjører testene:
ulimit -s 32768
Test resultatene som en ikke-privilegert bruker, men ikke stopp ved feil:
chown -Rv tester . su tester -c "PATH=$PATH make -k check"
To receive a summary of the test suite results, run:
../contrib/test_summary
For bare sammendragene, kanaliser utdataene gjennom
grep -A7
Summ
.
Resultatene kan sammenlignes med de som ligger på https://www.linuxfromscratch.org/lfs/build-logs/11.2/ og https://gcc.gnu.org/ml/gcc-testresults/.
I g++ er det kjent at fire tester relatert til PR100400 er rapportert som både XPASS og FAIL. Det er fordi testfilen for dette kjente problemet ikke er godt skrevet.
Noen få uventede feil kan ikke alltid unngås. GCC utviklerne er vanligvis klar over disse problemene, men har ikke løst dem ennå. Med mindre testresultatene er svært forskjellige fra de på URLen ovenfor, er det trygt å fortsette.
Installer pakken:
make install
GCC byggekatalogen eies av tester
nå og eierskapet til den
installerte deklarasjonsmappen (og dens innhold) vil være
feil. Endre eierskapet til root
bruker og gruppe:
chown -v -R root:root \ /usr/lib/gcc/$(gcc -dumpmachine)/12.2.0/include{,-fixed}
Lag en symbolkobling som kreves av FHS av "historiske" grunner.
ln -svr /usr/bin/cpp /usr/lib
Legg til en kompatibilitetssymbolkobling for å aktivere byggeprogrammer med optimalisering av koblingstid (LTO):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/12.2.0/liblto_plugin.so \ /usr/lib/bfd-plugins/
Nå som vår endelige verktøykjede er på plass, er det viktig å sikre at kompilering og kobling vil fungere som forventet. Dette gjør vi ved å utføre noen sunnhetssjekker:
echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Det skal ikke være noen feil, og utgangen av den siste kommandoen vil være (som gir rom for plattformspesifikke forskjeller i det dynamiske linkernavnet):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
Forsikre deg om at det er konfigurert til å bruke de riktige startfilene:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Utdata fra den siste kommandoen skal være:
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/../../../../lib/crtn.o succeeded
Avhengig av maskinarkitekturen din, kan ovenstående avvike
litt. Forskjellen vil være navnet på mappen etter
/usr/lib/gcc
. Det viktige å se
etter her er det at gcc har funnet alle tre
crt*.o
filene under
/usr/lib
mappen.
Bekreft at kompilatoren søker etter riktig deklarasjonsfil:
grep -B4 '^ /usr/include' dummy.log
Denne kommandoen skal returnere følgende utdata:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include-fixed
/usr/include
Igjen, mappen oppkalt etter måltripletten kan være annerledes enn de ovennevnte, avhengig av systemarkitekturen.
Deretter bekrefter du at den nye linkeren brukes med de riktige søkebanene:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Referanser til stier som har komponenter med '-linux-gnu' bør ignoreres, men ellers skal utdata fra den siste kommandoen være:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Et 32-bits system kan se noen forskjellige kataloger. For eksempel her er utdata fra en i686-maskin:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32")
SEARCH_DIR("/usr/local/lib32")
SEARCH_DIR("/lib32")
SEARCH_DIR("/usr/lib32")
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
Forsikre deg om at vi bruker riktig libc:
grep "/lib.*/libc.so.6 " dummy.log
Utdata fra den siste kommandoen skal være:
attempt to open /usr/lib/libc.so.6 succeeded
Sørg for at GCC bruker riktig dynamisk linker:
grep found dummy.log
Utgangen fra den siste kommandoen skal være (som gir rom for plattformspesifikke forskjeller i dynamisk linkernavn):
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2
Hvis utdataen ikke vises som vist ovenfor eller ikke mottas i det hele tatt, så er det noe alvorlig galt. Undersøk og spor trinn for trinn for å finne ut hvor problemet er og rette det. Eventuelle problemer må løses før du fortsetter med prosessen.
Når alt fungerer som det skal, rydd opp i testfilene:
rm -v dummy.c a.out dummy.log
Til slutt flytter du en feilplassert fil:
mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
C++ kompilatoren |
|
C kompilatoren |
|
C-forprosessoren; den brukes av kompilatoren for å utvide #include, #define og lignende utsagn i kildefilene |
|
C++ kompilatoren |
|
C kompilatoren |
|
En innpakning rundt ar som legger til et programtillegg til kommandolinjen. Dette programmet brukes kun å legge til "koblingstidsoptimalisering (LTO "link time optimization")" og er ikke nyttig med standard byggealternativer |
|
En innpakning rundt nm som legger til et programtillegg til kommandolinjen. Dette programmet brukes kun å legge til "koblingstidsoptimalisering (LTO "link time optimization")" og er ikke nyttig med standard byggealternativer |
|
En innpakning rundt ranlib som legger til et programtillegg til kommandolinjen. Dette programmet brukes kun å legge til "koblingstidsoptimalisering (LTO "link time optimization")" og er ikke nyttig med standard byggealternativer |
|
Et dekningstestverktøy; den brukes til å analysere programmer å bestemme hvor optimaliseringer vil ha størst effekt |
|
Frakoblet (offline) gcda og gcno profildumpverktøy |
|
Frakoblet (offline) gcda profilbehandlingsverktøy |
|
Verktøy for dumping av objektfiler produsert av GCC med LTO aktivert |
|
Kjøretidsbiblioteket for adresserensing |
|
GCC atomic innebygde kjøretidsbibliotek |
|
C forbehandlingsbiblioteket |
|
Inneholder kjøretidsstøtte for gcc |
|
Dette biblioteket er koblet inn i et program når GCC blir instruert om å aktivere profilering |
|
GNU implementering av OpenMP API for multiplattform parallellprogrammering med delt minne i C/C++ og Fortran |
|
GNU transaksjonsminnebiblioteket |
|
Leak Sanitizer kjøretidsbibliotek |
|
GCC sitt LTO programtillegg som lar binutils behandle objektfiler produsert av GCC med LTO aktivert |
|
GCC Quad Precision Math Library API |
|
Inneholder rutiner som støtter GCCs stabelknusende beskyttelses funksjonalitet |
|
Standard C++ biblioteket |
|
ISO/IEC TS 18822:2015 filsystembibliotek |
|
Gir støttende rutiner for C++ programmeringsspråk |
|
Thread Sanitizer kjøretidsbibliotek |
|
Undefined Behavior Sanitizer kjøretidsbibliotek |
Pakken pkg-config inneholder et verktøy for å sende inkluderingsbanen og/eller bibliotekstier for å bygge verktøy under konfigurerings- og makefasene av pakkeinstallasjoner.
Forbered Pkg-config for kompilering:
./configure --prefix=/usr \ --with-internal-glib \ --disable-host-tool \ --docdir=/usr/share/doc/pkg-config-0.29.2
Betydningen av de nye konfigureringsalternativene:
--with-internal-glib
Dette vil tillate pkg-config å bruke sin interne versjon av Glib fordi en ekstern versjon ikke er tilgjengelig i LFS.
--disable-host-tool
Dette alternativet deaktiverer opprettelsen av en uønsket hard lenke til pkg-config programmet.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Ncurses pakken inneholder biblioteker for terminaluavhengig håndtering av karakterskjermer.
Forbered Ncurses for kompilering:
./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --with-cxx-shared \ --enable-pc-files \ --enable-widec \ --with-pkg-config-libdir=/usr/lib/pkgconfig
Betydningen av de nye konfigureringsalternativene:
--with-shared
Dette får Ncurses til å bygge og installere delte C biblioteker.
--without-normal
Dette forhindrer at Ncurses bygger og installerer statiske C biblioteker.
--without-debug
Dette forhindrer at Ncurses bygger og installerer feilsøkings biblioteker.
--with-cxx-shared
Dette får Ncurses til å bygge og installere delte C++ bindinger. Den forhindrer også at den bygger og installerer statiske C++ bindinger.
--enable-pc-files
Denne bryteren genererer og installerer .pc filer for pkg-config.
--enable-widec
Denne bryteren forårsaker at biblioteker med store tegn
(f.eks., libncursesw.so.6.3
) blir bygget i
stedet for vanlige (f.eks., libncurses.so.6.3
). Disse
bibliotekene med store tegn er brukbare i både
multibyte og tradisjonelle 8-biters lokaliteter, mens
vanlige biblioteker fungerer som de skal bare i
8-biters lokaliteter. Biblioteker med store tegn og
normale biblioteker er kildekompatibel, men ikke
binærkompatibel.
Kompiler pakken:
make
Denne pakken har en testpakke, men den kan bare kjøres etter
at pakken er installert. Testene ligger i test/
mappen. Se README
filen i den mappen for ytterligere
detaljer.
Installasjonen av denne pakken vil overskrive libncursesw.so.6.3
. Det kan krasje
skallprosessen som bruker kode og data fra bibliotekfilen.
Installer pakken med DESTDIR
, og
bytt ut bibliotekfilen riktig med install command. Et
ubrukelig statisk arkiv som ikke håndteres av configure er også fjernet:
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/libncursesw.so.6.3 /usr/lib rm -v dest/usr/lib/libncursesw.so.6.3 cp -av dest/* /
Mange applikasjoner forventer fortsatt at lenkeren skal kunne finne Ncurses biblioteker med non-wide karakterer. Lur slike applikasjoner til å koble til biblioteker med brede tegn ved hjelp av symbolkoblinger og lenkerskript:
for lib in ncurses form panel menu ; do rm -vf /usr/lib/lib${lib}.so echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc done
Til slutt, sørg for at gamle programmer som ser etter
-lcurses
ved byggetiden
fortsatt er byggbare:
rm -vf /usr/lib/libcursesw.so echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so ln -sfv libncurses.so /usr/lib/libcurses.so
Hvis ønskelig, installer Ncurses dokumentasjonen:
mkdir -pv /usr/share/doc/ncurses-6.3 cp -v -R doc/* /usr/share/doc/ncurses-6.3
Instruksjonene ovenfor oppretter ikke Ncurses med non-wide tegn biblioteker siden ingen pakke installert ved kompilering fra kilder ville kobles mot dem under kjøring. Imidlertid den eneste kjente bare binær applikasjonen som kobler mot Ncurses-biblioteker med non-wide karakterer krever versjon 5. Hvis du må ha slike biblioteker på grunn av noen bare binær applikasjon eller for å være kompatibel med LSB, bygg pakken på nytt med følgende kommandoer:
make distclean ./configure --prefix=/usr \ --with-shared \ --without-normal \ --without-debug \ --without-cxx-binding \ --with-abi-version=5 make sources libs cp -av lib/lib*.so.5* /usr/lib
Konverterer en termcap beskrivelse til en terminfo beskrivelse |
|
Tømmer skjermen hvis mulig |
|
Sammenligner eller skriver ut terminfo beskrivelser |
|
Konverterer en terminfo beskrivelse til en termcap beskrivelse |
|
Gir konfigurasjonsinformasjon for ncurses |
|
Reinitialiserer en terminal til standardverdiene |
|
Fjerner og setter tabulatorstopp på en terminal |
|
Terminfo entry-description kompilatoren som oversetter en terminfo fil fra kildeformat til det binære formatet som trengs for ncurses biblioteksrutiner [En terminfo fil inneholder informasjon om egenskapene til en bestemt terminal.] |
|
Viser alle tilgjengelige terminaltyper, med primærnavn og beskrivelse for hver |
|
Gjør verdiene til terminalavhengige funksjoner tilgjengelig for skallet; den kan også brukes til å tilbakestille eller initialisere en terminal eller rapporter det lange navnet |
|
Kan brukes til å initialisere terminaler |
|
En lenke til |
|
Inneholder funksjoner for å vise tekst på mange komplekse måter på en terminalskjerm; et godt eksempel på bruken av disse funksjonene er menyen som vises under kjernens make menuconfig |
|
Inneholder funksjoner for å implementere skjemaer |
|
Inneholder funksjoner for å implementere menyer |
|
Inneholder funksjoner for å implementere paneler |
Sed pakken inneholder en dataflyt (stream) redigerer.
Forbered Sed for kompilering:
./configure --prefix=/usr
Kompiler pakken og generer HTML dokumentasjonen:
make make html
For å teste resultatene, utsted:
chown -Rv tester . su tester -c "PATH=$PATH make check"
Installer pakken og dens dokumentasjon:
make install install -d -m755 /usr/share/doc/sed-4.8 install -m644 doc/sed.html /usr/share/doc/sed-4.8
Psmisc pakken inneholder programmer for å vise informasjon om kjørende prosesser.
Forbered Psmisc for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make install
Rapporterer prosessIDene (PIDene) til prosesser som bruker de gitte filer eller filsystemer |
|
Dreper prosesser ved navn; den sender et signal til alle prosesser som kjører noen av de gitte kommandoene |
|
Se på filbeskrivelser for en prosess som kjører, gitt dens PID |
|
Skriver ut informasjon om en prosess |
|
Rapporterer gjeldende loggbane for en prosess |
|
Viser kjørende prosesser som et tre |
|
Samme som pstree, bortsett fra at den venter på bekreftelse før den avslutter |
Gettext pakken inneholder verktøy for internasjonalisering og lokalisering. Disse gjør at programmer kan kompileres med NLS (Lokal Språk Støtte), slik at de kan sende ut meldinger i brukerens lokale språkformat.
Forbered Gettext for kompilering:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.21
Kompiler pakken:
make
For å teste resultatene (dette tar lang tid, rundt 3 SBU), utsted:
make check
Installer pakken:
make install chmod -v 0755 /usr/lib/preloadable_libintl.so
Kopierer standard Gettext infrastrukturfiler til en kildepakke |
|
Erstatter miljøvariabler i skallformatstrenger |
|
Oversetter en melding på det opprinnelige språket til brukerens språk ved å slå opp oversettelsen i en meldingskatalog |
|
Fungerer først og fremst som et skallfunksjonsbibliotek for gettext |
|
Kopierer alle standard Gettext filer til den gitte mappens toppnivå til en pakke for å begynne å internasjonalisere den |
|
Filtrerer meldingene i en oversettelsesmappe i henhold til deres attributter og manipulerer attributtene |
|
Sammenslår og slår sammen de gitte |
|
Sammenligner to |
|
Finner meldingene som er felles for de gitte
|
|
Konverterer en oversettelseskatalog til en annet tegnkoding |
|
Oppretter en engelsk oversettelseskatalog |
|
Bruker en kommando på alle oversettelser av en oversettelsesmappe |
|
Bruker et filter på alle oversettelser av en oversettelsesmappe |
|
Genererer en binær meldingskatalog fra en oversettelsesmappe |
|
Trekker ut alle meldinger fra en oversettelseskatalog som samsvarer med et gitt mønster eller tilhører noen gitte kildefiler |
|
Oppretter en ny |
|
Kombinerer to rå oversettelser til én enkelt fil |
|
Dekompilerer en binær meldingskatalog til rå oversettelsestekst |
|
Forener dupliserte oversettelser i en oversettelsesmappe |
|
Viser oversettelser på morsmål av en tekstmelding hvis grammatisk form avhenger av et tall |
|
Omkoder serbisk tekst fra kyrillisk til latinsk skrift |
|
Trekker ut de oversettbare meldingslinjene fra den gitte kildefilen for å lage den første oversettelsesmalen |
|
definerer autosprintf klassen, som gir C formaterte utdatarutiner som kan brukes i C++ programmer, for bruk med <string> strenger og <iostream> dataflyt |
|
et privat bibliotek som inneholder vanlige rutiner som brukes av ulike Gettext programmer; disse er ikke beregnet for generelt bruk |
|
Brukes til å skrive spesialiserte programmer som
behandler |
|
et privat bibliotek som inneholder vanlige rutiner som brukes av ulike Gettext programmer; disse er ikke beregnet for generelt bruk |
|
Tekststilbibliotek |
|
Et bibliotek, ment å brukes av LD_PRELOAD som
assisterer |
Bison pakken inneholder en parsergenerator.
Forbered Bison for kompilering:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
Kompiler pakken:
make
For å teste resultatene (about 5.5 SBU), utsted:
make check
Installer pakken:
make install
Genererer, fra en rekke regler, et program for å analysere struktur av tekstfiler; Bison er en erstatning for Yacc (Yet Another Compiler Compiler) |
|
En innpakning for bison,ment for
programmer som fortsatt kaller yacc i stedet for
bison; den kaller
bison
med |
|
Yacc biblioteket som inneholder implementeringer av
Yacc kompatibel |
Grep pakken inneholder programmer for å søke gjennom innholdet i filer.
Forbered Grep for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Bash pakken inneholder Bourne-Again Skallet (Bourne-Again SHell).
Forbered Bash for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/bash-5.1.16 \ --without-bash-malloc \ --with-installed-readline
Betydningen av det nye konfigureringsalternativet:
--with-installed-readline
Dette alternativet forteller Bash å bruke readline
biblioteket som allerede er
installert på systemet i stedet for å bruke sin egen
readline versjon.
Kompiler pakken:
make
Hopp ned til “Installer pakken” hvis du ikke kjører testpakken.
For å forberede testene, sørg for at brukeren tester
kan skrive til kildetreet:
chown -Rv tester .
Testpakken til pakken er designet for å kjøres som en
ikke-root
bruker som eier
terminalen koblet til standardinngang. For å tilfredsstille
krav, skap en ny pseudoterminal ved hjelp av Expect og kjør testene som bruker
tester
user:
su -s /usr/bin/expect tester << EOF set timeout -1 spawn make tests expect eof lassign [wait] _ _ _ value exit $value EOF
Installer pakken:
make install
Kjør den nylig kompilerte bash programmet (erstatter det som kjøres for øyeblikket):
exec /usr/bin/bash --login
En mye brukt kommandotolk; den utfører mange typer av utvidelser og erstatninger på en gitt kommandolinje før kjøringen gjøres , og dette gjør dermed denne tolken til et kraftig verktøy |
|
Et skallskript for å hjelpe brukeren med å skrive og sende standard formaterte feilrapporter vedrørende bash |
|
En symbolsk lenke til bash programmet; når det påkalles som sh, bash prøver å etterligne oppstartadferd av historiske versjoner av sh så nært som mulig, samtidig som den samsvarer med POSIX standarden også |
Libtool pakken inneholder GNU generiske bibliotekstøtteskript. Det omslutter kompleksiteten ved å bruke delte biblioteker i en konsistent, overførbart grensesnitt.
Forbered Libtool for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Testtiden for libtool kan reduseres betydelig på et system med flere kjerner. For å gjøre dette, legg til TESTSUITEFLAGS=-j<N> til linjen over. For eksempel kan bruk av -j4 redusere testtiden med over 60 prosent.
Fem tester er kjent for å mislykkes i LFS byggemiljøet pga en sirkulær avhengighet, men alle tester består hvis de sjekkes på nytt etter at automake er installert.
Installer pakken:
make install
Fjern et ubrukelig statisk bibliotek:
rm -fv /usr/lib/libltdl.a
GDBM pakken inneholder GNU Database Manager. Det er et bibliotek av databasefunksjoner som bruker utvidbar hashing og fungerer lignende som standard UNIX dbm. Biblioteket gir primitiver for lagring av nøkkel/data par, søker og henter dataene etter nøkkelen og sletter en nøkkel sammen med sine data.
Forbered GDBM for kompilering:
./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat
Betydningen av konfigureringsalternativet:
--enable-libgdbm-compat
Denne bryteren gjør det mulig å bygge libgdbm kompatibilitetsbiblioteket. Noen pakker utenfor LFS kan kreve det eldre DBM rutiner gir.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Gperf genererer en perfekt hashfunksjon fra et nøkkelsett.
Forbered Gperf for kompilering:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
Kompiler pakken:
make
Testene er kjent for å mislykkes hvis de kjører flere samtidige tester (-j alternativ større enn 1). Å teste resultatene, utsted:
make -j1 check
Installer pakken:
make install
Expat pakken inneholder et dataflytorientert C bibliotek for å analysere XML.
Forbered Expat for kompilering:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/expat-2.4.8
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Hvis ønskelig, installer dokumentasjonen:
install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.4.8
Inetutils pakken inneholder programmer for grunnleggende nettverksbygging.
Forbered Inetutils for kompilering:
./configure --prefix=/usr \ --bindir=/usr/bin \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers
Betydningen av konfigureringsalternativene:
--disable-logger
Dette alternativet forhindrer Inetutils fra å installere logger programmet, som brukes av skript til sende meldinger til Systemlogg nissen (System Log Daemon). Ikke installer det fordi Util-linux installerer en nyere versjon.
--disable-whois
Dette alternativet deaktiverer byggingen av Inetutils sin whois klient, som er utdatert. Instruksjoner for en bedre whois klienten er i BLFS boken.
--disable-r*
Disse parameterne deaktiverer bygging av foreldede programmer som ikke burde brukes på grunn av sikkerhetsproblemer. Funksjonene som tilbys av disse programmer kan leveres av openssh pakken i BLFS boken.
--disable-servers
Dette deaktiverer installasjonen av de forskjellige nettverksserverne inkludert som en del av Inetutils pakken. Disse serverne anses ikke som hensiktsmessig i et grunnleggende LFS system. Noen er usikre av natur og er ansett som trygt kun på pålitelige nettverk. Merk at bedre erstatninger er tilgjengelige for mange av disse serverne.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Flytt et program til riktig plassering:
mv -v /usr/{,s}bin/ifconfig
Vis systemets DNS domenenavn |
|
Er protokollprogrammet for filoverføringer |
|
Rapporterer eller angir navnet på verten |
|
Administrerer nettverksgrensesnitter |
|
Sender ekkoforespørselspakker og rapporterer hvor lenge svarene tar |
|
En versjon av ping for IPv6 nettverk |
|
Brukes til å snakke med en annen bruker |
|
Et grensesnitt til TELNET protokollen |
|
Et trivielt filoverføringsprogram |
|
Sporer ruten pakkene dine tar fra verten du jobber på videre til en annen vert på et nettverk, og viser alle mellomliggende hopp (porter) underveis |
Less pakken inneholder et tekstfilviser.
Forbered Less for kompilering:
./configure --prefix=/usr --sysconfdir=/etc
Betydningen av konfigureringsalternativene:
--sysconfdir=/etc
Dette alternativet forteller at programmene som er
opprettet av pakken, skal se i /etc
for konfigurasjonen filer.
Kompiler pakken:
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make install
Perl pakken inneholder den praktiske utvinnings og rapporterings språket (Practical Extraction and Report Language).
Denne versjonen av Perl bygger nå Compress::Raw::Zlib og Compress::Raw::BZip2 moduler. Som standard vil Perl bruke en intern kopi av kildene for å bygge. Utfør følgende kommando slik at Perl vil bruke bibliotekene installert på systemet:
export BUILD_ZLIB=False export BUILD_BZIP2=0
For å ha full kontroll over måten Perl er satt opp på, kan du fjerne “-des” alternativer fra følgende kommando og håndplukke måten denne pakken er bygget. Alternativt kan du bruke kommandoen nøyaktig som nedenfor for å bruke standardinnstillingene som Perl automatisk oppdager:
sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dprivlib=/usr/lib/perl5/5.36/core_perl \ -Darchlib=/usr/lib/perl5/5.36/core_perl \ -Dsitelib=/usr/lib/perl5/5.36/site_perl \ -Dsitearch=/usr/lib/perl5/5.36/site_perl \ -Dvendorlib=/usr/lib/perl5/5.36/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.36/vendor_perl \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib \ -Dusethreads
Betydningen av konfigureringsalternativene:
-Dvendorprefix=/usr
Dette sikrer at perl vet hvordan å fortelle pakker hvor de skal installere perl modulene sine.
-Dpager="/usr/bin/less
-isR"
Dette sikrer at less
brukes i stedet
for more
.
-Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3
Siden Groff ikke er installert ennå, Configure tror vi ikke ønsker man sider for Perl. Å utstede disse parametere overstyrer denne avgjørelsen.
-Duseshrplib
Bygger en delt libperl som trengs av noen perl moduler.
-Dusethreads
Bygg perl med støtte for tråder.
-Dprivlib,-Darchlib,-Dsitelib,...
Disse innstillingene definerer hvor Perl leter etter installerte moduler. LFS redaktørene valgte å legge dem i en katalogstruktur basert på Major.Minor-versjonen av Perl (5.36) hvilket tillater oppgradering av Perl til nyere Patch nivåer (5.36.0) uten behovet for å installere alle modulene på nytt.
Kompiler pakken:
make
For å teste resultatene (ca. 11 SBU), utsted:
make test
Installer pakken og rydd opp:
make install unset BUILD_ZLIB BUILD_BZIP2
En kommandolinjegrensesnitt til Module::CoreList |
|
Samhandler med Comprehensive Perl Archive Network (CPAN) fra kommandolinjen |
|
Bygger en Perl utvidelse for Encode modulen fra begge Unicode karaktertilordninger eller Tcl kodingsfiler |
|
Gjetter kodingstypen til en eller flere filer |
|
Konverterer |
|
Konverterer |
|
Skallskript for å undersøke installerte Perl moduler, og kan lage en tarball fra en installert modul |
|
Konverterer data mellom visse inndata og utdata formater |
|
Kan brukes til å konfigurere |
|
Kombinerer noen av de beste egenskapene til C, sed, awk og sh til et singelt swiss-army språk |
|
En hard lenke til perl |
|
Brukes til å generere feilrapporter om Perl, eller modulene som kommer med den, og sender dem |
|
Viser et stykke dokumentasjons i pod format som er innebygd i Perl installasjonstreet eller i et Perl skript |
|
Perl verifiseringsprosedyre for installasjonen; det kan brukes til bekrefte at Perl og dets biblioteker er installert riktig |
|
Brukes til å generere takkemeldinger på E-post til Perl utviklere |
|
En Perl versjon av tegnkodingskonverteren iconv |
|
Et grovt verktøy for å konvertere Perl4
|
|
Konverterer filer fra pod format til HTML format |
|
Konverterer pod data til formatert *roff inndata |
|
Konverterer pod data til formatert ASCII tekst |
|
Skriver ut bruksmeldinger fra innebygde pod dokumenter i filer |
|
Kontrollerer syntaksen til dokumentasjonsfiler i podformat |
|
Viser valgte deler av poddokumentasjonen |
|
Kommandolinjeverktøy for å kjøre tester mot Test::Harness moduler |
|
Et tar likt program skrevet i Perl |
|
Et Perl program som sammenligner et ekstrahert arkiv med et uekstrahert |
|
Et Perl program som bruker mønstertilpasning på innholdet av filer i et tararkiv |
|
Skriver ut eller kontrollerer SHA sjekksummer |
|
Brukes til å fremtvinge detaljert advarselsdiagnostikk i Perl |
|
Konverterer Perl XS-kode til C-kode |
|
Viser detaljer om den interne strukturen til en Zip-fil |
XML::Parser modulen er et Perl grensesnitt til James Clarks XML-parser, Expat.
Forbered XML::Parser for kompilering:
perl Makefile.PL
Kompiler pakken:
make
For å teste resultatene, utsted:
make test
Installer pakken:
make install
Intltool er et internasjonaliseringsverktøy som brukes til å trekke ut oversettbare strenger fra kildefiler.
Rett først en advarsel som er forårsaket av perl-5.22 og senere:
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
Det regulære uttrykket ovenfor ser uvanlig ut på grunn av alle skråstreker. Det den gjør er å legge til et skråstrek før høyre krøllparentes i sekvensen '\${' som resulterer i '\$\{'.
Forbered Intltool for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
Autoconf pakken inneholder programmer for å produsere skallskript som automatisk kan konfigurere kildekoden.
Forbered Autoconf for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Testtiden for autoconf kan reduseres betydelig på en system med flere kjerner. For å gjøre dette, legg til TESTSUITEFLAGS=-j<N> til linjen over. For eksempel ved å bruke -j4 kan testtiden reduseres med over 60 prosent.
Installer pakken:
make install
Produserer skallskript som automatisk konfigurerer programvares kildekodepakker for å tilpasse seg mange typer Unix-lignende systemer; konfigurasjonsskriptene den produserer er uavhengige— å kjøre de krever ikke autoconf programmet |
|
Et verktøy for å lage malfiler av C #define uttrykk for configure å bruke |
|
En innpakning for M4 makroprosessoren |
|
Kjører automatisk autoconf, autoheader, aclocal, automake, gettextize, og libtoolize i riktig rekkefølge for å spare tid når det gjøres endringer i autoconf og automake malfiler |
|
Hjelper med å lage en |
|
Endrer en |
|
Hjelper når det skrives |
Automake pakken inneholder programmer for å generere Make filer for bruk med Autoconf.
Forbered Automake for kompilering:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.5
Kompiler pakken:
make
Å bruke make -j4 alternativet øker hastigheten på testene, selv på systemer med kun én prosessor, på grunn av interne forsinkelser i individuelle tester. Å teste resultatene, utsted:
make -j4 check
Testen t/subobj.sh er kjent for å mislykkes.
Installer pakken:
make install
Genererer |
|
En hard lenke til aclocal |
|
Et verktøy for automatisk generering av
|
|
En hard lenke til automake |
OpenSSL pakken inneholder administrasjonsverktøy og relaterte biblioteker til kryptografi. Disse er nyttige for å tilby kryptografiske funksjoner til andre pakker, for eksempel OpenSSH, e-postapplikasjoner og nettlesere (for tilgang til HTTPS-nettsteder).
Forbered OpenSSL for kompilering:
./config --prefix=/usr \ --openssldir=/etc/ssl \ --libdir=lib \ shared \ zlib-dynamic
Kompiler pakken:
make
For å teste resultatene, utsted:
make test
En test, 30-test_afalg.t, er kjent for å mislykkes på noen kjerne konfigurasjoner (avhengig av inkonsistente verdier for CONFIG_CRYPTO_USER_API*-innstillinger.) Hvis det mislykkes, kan den trygt bli ignorert.
Installer pakken:
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile make MANSUFFIX=ssl install
Legg til versjonen i dokumentasjonskatalognavnet, for å være i samsvarer med andre pakker:
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.0.5
Hvis ønskelig, installer litt tilleggsdokumentasjon:
cp -vfr doc/* /usr/share/doc/openssl-3.0.5
Du bør oppdatere OpenSSL når en ny versjon som fikser
sårbarheter er annonsert. Siden OpenSSL 3.0.0,
OpenSSL-versjonsordningen følger
MAJOR.MINOR.PATCH-formatet. API/ABI-kompatibilitet er
garantert for samme MAJOR versjonsnummer. Fordi LFS
installerer kun de delte bibliotekene, er det ikke
nødvendig å rekompilere pakker som lenker til libcrypto.so
eller libssl.so
ved
oppgradering til en versjon med uendret MAJOR
versjonsnummer.
Imidlertid må alle kjørende programmer koblet til disse bibliotekene stoppes og startes på nytt. Les de relaterte oppføringene i Section 8.2.1, “Oppgraderingsproblemer” for detaljer.
er et Perl skript som skanner alle filer i en katalog og legger til symbolske lenker til deres hash-verdier. Bruk av c_rehash vurderes foreldet og bør erstattes av openssl rehash kommandoen |
|
er et kommandolinjeverktøy for bruk av de ulike kryptografifunksjonene til OpenSSL's kryptobibliotek fra skallet. Den kan brukes til ulike funksjoner som er dokumentert i man 1 openssl |
|
implementerer et bredt spekter av kryptografiske algoritmer som brukes i ulike Internett-standarder. Tjenestene som tilbys av dette biblioteket brukes av OpenSSL implementeringer av SSL, TLS og S/MIME, og de har også blitt brukt til å implementere OpenSSH, OpenPGP, og andre kryptografiske standarder |
|
implementerer protokollen Transport Layer Security (TLS v1). Det gir en rik API, dokumentasjon kan bli funnet ved å kjøre man 3 ssl |
Kmod pakken inneholder biblioteker og verktøy for lasting av kjerne moduler
Forbered Kmod for kompilering:
./configure --prefix=/usr \ --sysconfdir=/etc \ --with-openssl \ --with-xz \ --with-zstd \ --with-zlib
Betydningen av konfigureringsalternativene:
--with-openssl
Dette alternativet gjør det mulig for Kmod å håndtere PKCS7 signaturer for kjernemoduler.
--with-xz
, --with-zlib
, og --with-zstd
Disse alternativene gjør at Kmod kan håndtere komprimerte kjernemoduler.
Kompiler pakken:
make
Testpakken til denne pakken krever rå kjerneoverskrifter (ikke de “sanitiserte” kjernehodene installert tidligere), som er utenfor rammen av LFS.
Installer pakken og lag symbolkoblinger for kompatibilitet med Module-Init-Tools (pakken som tidligere håndterte Linux kjernemoduler):
make install for target in depmod insmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /usr/sbin/$target done ln -sfv kmod /usr/bin/lsmod
Oppretter en avhengighetsfil basert på symbolene den finner i eksisterende sett med moduler; denne avhengighetsfilen brukes av modprobe for automatisk å laste de nødvendige moduler |
|
Installerer en lastbar modul i kjernen som kjører |
|
Laster og laster ut kjernemoduler |
|
Viser innlastede moduler |
|
Undersøker en objektfil assosiert med en kjernemodul og viser all informasjon den kan hente |
|
Bruker en avhengighetsfil, opprettet av depmod, for automatisk å laste inn relevante moduler |
|
Laster ut moduler fra kjernen som kjører |
|
Dette biblioteket brukes av andre programmer til å laste inn og laste ut kjernemoduler |
Libelf er et bibliotek for håndtering av ELF (kjørbare og linkbare formater) filer.
Libelf er en del av elfutils-0.187 pakken. Bruk elfutils-0.187.tar.bz2 som kilde tarball.
Forbered Libelf for kompilering:
./configure --prefix=/usr \ --disable-debuginfod \ --enable-libdebuginfod=dummy
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer kun Libelf:
make -C libelf install install -vm644 config/libelf.pc /usr/lib/pkgconfig rm /usr/lib/libelf.a
Libffi-biblioteket gir et flyttbart programmeringsgrensesnitt på høyt nivå til ulike kallkonvensjoner. Dette lar en programmerer kalle enhver funksjon ved kjøring, spesifisert av en grensesnittbeskrivelse for et kall.
I likhet med GMP bygges libffi med spesifikke
optimaliseringer til prosessoren som er i bruk. Hvis du
bygger for et annet system, endre verdien av --with-gcc-arch=
parameteren
i følgende kommando til et arkitekturnavn fullt
implementert av CPU på det systemet. Hvis dette ikke
gjøres, vil alle applikasjoner som lenker til libffi utløse
ulovlige operasjonsfeil.
Forbered libffi for kompilering:
./configure --prefix=/usr \ --disable-static \ --with-gcc-arch=native \ --disable-exec-static-tramp
Betydningen av konfigureringsalternativet:
--with-gcc-arch=native
Sørger for at GCC optimerer for det gjeldende systemet. Hvis dette ikke er spesifisert, gjettes systemet og koden som genereres kanskje ikke er riktig for enkelte systemer. Hvis den genererte koden vil bli kopiert fra det opprinnelige systemet til et mindre kapabelt system system, bruk det mindre kapable systemet som parameter. For detaljer om alternative systemtyper, se x86 alternativene i GCC manualen.
--disable-exec-static-tramp
Deaktiver statisk trampolinestøtte. Det er en ny sikkerhet funksjon i libffi, men noen BLFS pakker (spesielt GJS) er ikke tilpasset for det.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Python 3 pakken inneholder Python utviklingsmiljøet. Den er nyttig for objektorientert programmering, skriving av skript, prototyping store programmer, eller utvikle hele applikasjoner.
Forbered Python for kompilering:
./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --with-system-ffi \ --enable-optimizations
Betydningen av konfigureringsalternativene:
--with-system-expat
Denne bryteren muliggjør kobling mot systemversjonen av Expat.
--with-system-ffi
Denne bryteren muliggjør kobling mot systemversjonen av libffi.
--enable-optimizations
Denne bryteren muliggjør stabile, men dyre, optimaliseringer.
Kompiler pakken:
make
Det anbefales ikke å kjøre testene på dette tidspunktet. Tester er kjent for å henge på ubestemt tid i det delvise LFS miljøet. Om ønskelig kan testene kjøres på nytt på slutten av dette kapittelet eller når Python 3 er reinstallert i BLFS. For å kjøre testene uansett, utsted make test.
Installer pakken:
make install
Flere steder bruker vi kommandoen pip3 for å installere
Python 3 programmer og moduler for alle brukere som
root
. Dette er i konflikt med
Python-utviklernes anbefaling om å installere pakker i en
virtuelt miljø eller hjemmemappen til en vanlig bruker (ved å
kjøre pip3 som
denne brukeren). For dette formål blir en advarsel med flere
linjer skrevet når du bruker pip3 som root
brukeren. Hovedgrunnen for denne
anbefalingen er å unngå konflikt med systemets
pakkebehandling (dpkg for eksempel), men LFS
har ikke en systemomfattende pakkebehandling, så dette er
ikke et problem. Og, pip3 vil prøve å se etter
en ny versjon av seg selv når den kjøres. Siden
domenenavnsløsning ikke er konfigurert i LFS chroot miljøet
ennå, vil den ikke se etter en ny versjon og gi en advarsel.
Når vi starter opp LFS systemet og setter opp
nettverkstilkobling, vil den deretter produsere en advarsel
som ber brukeren om å oppdatere den fra et forhåndsbygd hjul
på PyPI hvis en ny versjon er tilgjengelig. Men LFS betrakter
pip3 som en del
av Python 3, så den burde ikke oppdateres separat, og en
oppdatering fra et forhåndsbygd hjul vil avvike fra vårt
formål å bygge et Linux system fra kildekode. Så advarsel for
en ny pip3
versjon bør ignoreres om vi vil. Hvis ønskelig, undertrykk
disse advarslene ved å kjøre følgende kommandoer:
cat > /etc/pip.conf << EOF [global] root-user-action = ignore disable-pip-version-check = true EOF
I LFS og BLFS bygger og installerer vi normalt
Python-moduler med pip3 Vennligst pass på at
pip3 install
kommandoer i begge bøkene skal kjøres som root
brukeren med mindre det er for et
virtuelt Python-miljø. Å kjøre en pip3 install som en
ikke-root
bruker kan synes
å fungerer fint, men det vil føre til at den installerte
modulen blir utilgjengelig av andre brukere.
pip3 install
vil ikke installere en allerede installert modul som
standard. For å bruke pip3
install kommandoen for å oppgradere en
modul (for eksempel fra meson-0.61.3 til meson-0.62.0),
legg til --upgrade
til kommandolinjen. Hvis det virkelig er nødvendig å
nedgradere en modul eller installer samme versjon på nytt
av en eller annen grunn, sett inn --force-reinstall --no-deps
i
kommandolinjen.
Hvis ønskelig, installer den forhåndsformaterte dokumentasjonen:
install -v -dm755 /usr/share/doc/python-3.10.6/html tar --strip-components=1 \ --no-same-owner \ --no-same-permissions \ -C /usr/share/doc/python-3.10.6/html \ -xvf ../python-3.10.6-docs-html.tar.bz2
Betydningen av dokumentasjonsinstallasjons kommandoene:
--no-same-owner
og --no-same-permissions
Sørg for at de installerte filene har riktig eierskap og tillatelser. Uten disse alternativene, å bruke tar vil installere pakkefilene med oppstrøms skaperens verdier.
er et Python program som leser Python 2.x kildekoden og bruker en serie reparasjoner for å forvandle den til gyldig Python 3.x kode |
|
er et innpakningsskript som åpner en Python bevisst GUI tekstprogram. For at dette skriptet skal kjøre, må du ha installert Tk før Python slik at Tkinter Python modulen blir bygget |
|
Pakkeinstallasjonsprogrammet for Python. Du kan bruke pip til å installere pakker fra Python Pakke Indeks og andre indekser |
|
er Python dokumentasjonsverktøy |
|
er et tolket, interaktiv, objektorientert programmerings språk |
Wheel er et Python bibliotek som er referanse implementeringen av Python wheel pakkestandarden.
Installer wheel med følgende kommando:
pip3 install --no-index $PWD
Betydningen av pip3 alternativene:
Installer pakken
--no-index
Hindre pip fra å hente filer fra pakkens nettdepot (PyPI). Hvis pakkene er installert i riktig rekkefølge, da trenger den ikke å hente noen filer med det første, men dette alternativet gir en viss sikkerhet i tilfelle brukerfeil.
$PWD
Se etter filer som skal installeres i gjeldende arbeidsmappe.
Ninja er et lite byggesystem med fokus på hastighet.
Denne delen er ikke strengt nødvendig for LFS hvis den ikke brukes systemd. På den annen side, ninja knyttet til meson gir et kraftig byggesystemkombinasjon, som forventes å bli brukt stadig oftere. Det kreves for flere pakker i BLFS boken.
Når den kjøres, kjører ninja normalt et maksimalt antall prosesser parallelt. Som standard er dette antall kjerner på systemet pluss to. I noen tilfeller kan dette overopphete en CPU eller kjøre et system ut av minne. Hvis du kjører fra kommandolinjen, sender du en -jN-parameter vil det begrense antall parallelle prosesser, men noen pakker bygger inn utførelsen av ninja og sender ikke en -j parameter.
Ved å bruke optional prosedyren nedenfor lar en bruker begrense antall parallelle prosesser via en miljøvariabel, NINJAJOBS. For eksempel, å sette:
export NINJAJOBS=4
vil begrense ninja til fire parallelle prosesser.
Hvis ønskelig, legg til muligheten til å bruke miljøvariabelen NINJAJOBS ved å kjøre:
sed -i '/int Guess/a \ int j = 0;\ char* jobs = getenv( "NINJAJOBS" );\ if ( jobs != NULL ) j = atoi( jobs );\ if ( j > 0 ) return j;\ ' src/ninja.cc
Bygg Ninja med:
python3 configure.py --bootstrap
Betydningen av byggealternativet:
--bootstrap
Denne parameteren tvinger ninja til å gjenoppbygge seg selv for gjeldene system.
For å teste resultatene, utsted:
./ninja ninja_test ./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
Installer pakken:
install -vm755 ninja /usr/bin/ install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja
Meson er et åpen kildekode byggesystem ment å være både ekstremt raskt og så brukervennlig som mulig.
Denne delen er ikke strengt nødvendig for LFS hvis det ikke brukes systemd. På den annen side er meson/ninja et kraftig byggesystem, som forventes å bli brukt stadig oftere. Det kreves for flere pakker i the BLFS boken.
Kompiler Meson med følgende kommando:
pip3 wheel -w dist --no-build-isolation --no-deps $PWD
Testpakken krever noen pakker utenfor omfanget av LFS.
Installer pakken:
pip3 install --no-index --find-links dist meson install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson
Betydningen av installasjonsparametrene:
-w
dist
Putter det opprettede wheel inn i dist
directory.
--find-links dist
Installerer wheels fra dist
directory.
Pakken Coreutils inneholder verktøy for å vise og stille inn grunnleggende systemegenskaper.
POSIX krever at programmer fra Coreutils gjenkjenner karakter grenser riktig selv i multibyte lokaliteter. Følgende oppdateringer fikser dette misligholdet og andre internasjonaliseringsrelaterte feil.
patch -Np1 -i ../coreutils-9.1-i18n-1.patch
Tidligere ble det funnet mange feil i denne oppdateringen. Ved melding om nye feil til Coreutils vedlikeholdere, vennligst først sjekk om de er reproduserbare uten denne oppdateringen.
Forbered nå Coreutils for kompilering:
autoreconf -fiv FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
Betydningen av konfigureringsalternativene:
Oppdateringen for internasjonalisering har modifisert byggesystemet til pakken, slik at konfigurasjonsfilene må bli regenerert.
FORCE_UNSAFE_CONFIGURE=1
Denne miljøvariabelen lar pakken bli bygget som
root
brukeren.
--enable-no-install-program=kill,uptime
Hensikten med denne bryteren er å hindre Coreutils fra installere binærfiler som vil bli installert av andre pakker senere.
Kompiler pakken:
make
Hopp ned til “Installer pakken” hvis du ikke kjører testpakken.
Nå er testpakken klar til å kjøres. Kjør først testene som er
ment å kjøres som bruker root
:
make NON_ROOT_USERNAME=tester check-root
Vi kommer til å kjøre resten av testene som brukeren
tester
. Visse tester krever
at brukeren er medlem av mer enn én gruppe. Sånn at disse
testene ikke hoppes over, legg til en midlertidig gruppe og
gjør bruker tester
en del av
de:
echo "dummy:x:102:tester" >> /etc/group
Fiks noen av tillatelsene slik at ikke-root
brukeren kan kompilere og kjøre
testene:
chown -Rv tester .
Kjør nå testene:
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
Testen Sort-NaN-infloop er kjent for å mislykkes med GCC-12.
Fjern den midlertidige gruppen:
sed -i '/dummy/d' /etc/group
Installer pakken:
make install
Flytt programmer til stedene spesifisert av FHS:
mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8
Er faktisk en kommando, /usr/bin/[, det er et synonym for test kommandoen |
|
Koder og dekoder data i henhold til base32 spesifikasjonen (RFC 4648) |
|
Koder og dekoder data i henhold til base64 spesifikasjonen (RFC 4648) |
|
Skriver ut eller kontrollerer BLAKE2 (512-bit) sjekksummer |
|
Fjerner enhver bane og et gitt suffiks fra et filnavn |
|
Koder eller dekoder data ved hjelp av ulike algoritmer |
|
Slår sammen filer til standard utdata |
|
Endrer sikkerhetskontekst for filer og mapper |
|
Endrer gruppeeierskap for filer og mapper |
|
Endrer tillatelsene til hver fil til gitt modus; modusen kan enten være en symbolsk representasjon av endringene som skal gjøres eller en oktalt tall som representerer de nye tillatelsene |
|
Endrer bruker- og/eller gruppeeierskap av filer og mapper |
|
Kjører en kommando med den angitte mappen som
|
|
Skriver ut sjekksummen for syklisk redundanssjekk (CRC) og antall byte for hver spesifisert fil |
|
Sammenligner to sorterte filer, og skriver ut i tre kolonner, linjene som er unike og linjene som er vanlige |
|
Kopierer filer |
|
Deler en gitt fil i flere nye filer, og skiller dem i henhold til gitte mønstre eller linjenummer og skriver ut antall byte av hver nye fil |
|
Skriver ut seksjoner av linjer, og velger delene i henhold til gitte felt eller posisjoner |
|
Viser gjeldende tid i det gitte formatet, eller stiller inn systemdato |
|
Kopierer en fil med den gitte blokkstørrelsen og antallet, mens det valgfritt utføres konverteringer på den |
|
Rapporterer hvor mye diskplass som er tilgjengelig (og brukt) på alle monterte filsystemer, eller bare på filsystemene som inneholder de valgte filer |
|
Viser innholdet i hver gitt katalog (det samme som ls kommandoen) |
|
Skriver ut kommandoer for å angi |
|
Fjerner ikke-mappesuffikset fra et filnavn |
|
Rapporterer hvor mye diskplass som brukes av gjeldende katalog, av hver av de gitte katalogene (inkludert alle underkataloger) eller av hver av de gitte filene |
|
Viser de gitte strengene |
|
Kjører en kommando i et modifisert miljø |
|
Konverterer tabulatorer til mellomrom |
|
Evaluerer uttrykk |
|
Skriver ut primfaktorene til alle spesifiserte heltall |
|
Gjør ingenting, mislykket; den avsluttes alltid med en statuskode som indikerer feil |
|
Reformaterer avsnittene i de gitte filene |
|
Omslutter linjene i de gitte filene |
|
Rapporterer en brukers gruppemedlemskap |
|
Skriver ut de ti første linjene (eller gitt antall linjer) av hver gitt fil |
|
Rapporterer den numeriske identifikatoren (i heksadesimal) til verten |
|
Rapporterer effektiv brukerID, gruppeID og gruppemedlemskap av gjeldende bruker eller en spesifisert bruker |
|
Kopierer filer mens de angir tillatelsesmoduser og, hvis mulig, deres eier og gruppe |
|
Kobler sammen linjene som har identiske sammenføyningsfelt fra to separate filer |
|
Oppretter en hard lenke med det gitte navnet til en fil |
|
Lager harde koblinger eller myke (symbolske) koblinger mellom filer |
|
Rapporterer gjeldende brukers påloggingsnavn |
|
Viser innholdet i hver gitt katalog |
|
Rapporterer eller kontrollerer Message Digest 5 (MD5) sjekksummer |
|
Oppretter en mappe med gitt navn |
|
Oppretter først inn, først ut (FIFOs), en "navngitt kanal (pipe)" på UNIX-språk, med gitt navn |
|
Oppretter enhetsnoder med de gitte navnene; en enhetsnode er en spesialfil for tegn, en spesialfil for blokk eller en FIFO |
|
Oppretter midlertidige filer på en sikker måte; det brukes i skript |
|
Flytter eller gir nytt navn til filer eller kataloger |
|
Kjører et program med endret skjemaprioritet |
|
Nummerer linjene fra de gitte filene |
|
Kjører en kommando som er immun mot avbrudd, med utdata omdirigert til en loggfil |
|
Skriver ut antall tilgjengelige prosesseringsenheter for en prosess |
|
Konverterer tall til eller fra menneskelesbare strenger |
|
Dumper filer i oktale og andre formater |
|
Slår sammen de gitte filene og kobler sammen sekvensielt tilsvarende linjer side ved side, atskilt med tabulatortegn |
|
Sjekker om filnavn er gyldige eller flyttbare |
|
Er en lettvekts fingerklient; den rapporterer noe informasjon om de gitte brukerne |
|
Paginerer og spalter filer for utskrift |
|
Skriver ut miljøet |
|
Skriver ut de gitte argumentene i henhold til det gitte formatet, mye som C printf funksjonen |
|
Produserer en permutert indeks fra innholdet i de gitte filene, med hvert søkeord i sin kontekst |
|
Rapporterer navnet på gjeldende arbeidskatalog |
|
Rapporterer verdien av den gitte symbolske lenken |
|
Skriver ut den løste banen |
|
Fjerner filer eller mapper |
|
Fjerner mapper hvis de er tomme |
|
Kjører en kommando med spesifisert sikkerhetskontekst |
|
Skriver ut en sekvens av tall innenfor et gitt område og med en gitt økning |
|
Skriver ut eller sjekker 160-bits Secure Hash Algorithm 1 (SHA1) sjekksummer |
|
Skriver ut eller kontrollerer 224-biters Secure Hash Algoritme sjekksummer |
|
Skriver ut eller kontrollerer 256-biters Secure Hash Algoritme sjekksummer |
|
Skriver ut eller kontrollerer 384-biters Secure Hash Algoritme sjekksummer |
|
Skriver ut eller kontrollerer 512-biters Secure Hash Algoritme sjekksummer |
|
Overskriver de gitte filene gjentatte ganger med komplekse mønstre, som gjør det vanskelig å gjenopprette dataene |
|
Blander tekstlinjer |
|
Pauser i den gitte tiden |
|
Sorterer linjene fra de gitte filene |
|
Deler den gitte filen i biter, etter størrelse eller antall linjer |
|
Viser fil- eller filsystemstatus |
|
Kjører kommandoer med endrede bufferoperasjoner for standard dataflyt |
|
Angir eller rapporterer terminallinjeinnstillinger |
|
Skriver ut sjekksum og blokktellinger for hver gitt fil |
|
Tømmer filsystembuffere; den tvinger endrede blokker til disk og oppdaterer superblokken |
|
Sammenslår de gitte filene i revers |
|
Skriver ut de ti siste linjene (eller gitt antall linjer) av hver gitt fil |
|
Leser fra standard inngang mens du skriver både til standard utgang og til de gitte filene |
|
Sammenligner verdier og kontrollerer filtyper |
|
Kjører en kommando med en tidsbegrensning |
|
Endrer filtidsstempler, angir tilgang og endrings tider for de gitte filene til gjeldende tid; filer som ikke eksisterer opprettes med null lengde |
|
Oversetter, klemmer sammen og sletter de gitte tegnene fra standard inngang |
|
Gjør ingenting, vellykket; den avsluttes alltid med en statuskode som indikerer suksess |
|
Krymper eller utvider en fil til den angitte størrelsen |
|
Utfører en topologisk sortering; den skriver en fullstendig ordnet liste i henhold til delbestillingen i en gitt fil |
|
Rapporterer filnavnet til terminalen som er koblet til standard inngang |
|
Rapporterer systeminformasjon |
|
Konverterer mellomrom til tabulatorer |
|
Forkaster alle unntatt en av påfølgende identiske linjer |
|
Fjerner den gitte filen |
|
Rapporterer navnene på brukerne som er logget på |
|
Er det samme som ls -l |
|
Rapporterer antall linjer, ord og byte for hver gitt fil, samt det totale linjer når mer enn én fil er gitt |
|
Rapporterer hvem som er pålogget |
|
Rapporterer brukernavnet som er knyttet til gjeldende effektive brukerID |
|
Skriver ut “y” gjentatte ganger eller en gitt streng til den drepes |
|
Bibliotek brukt av stdbuf |
Check er et rammeverk for C enhetstesting.
Forbered sjekk for kompilering:
./configure --prefix=/usr --disable-static
Bygg pakken:
make
Samlingen er nå fullført. For å kjøre testpakkene for Check, utsted følgende kommando:
make check
Installer pakken:
make docdir=/usr/share/doc/check-0.15.2 install
Diffutils pakken inneholder programmer som viser forskjellene mellom filer eller mapper.
Forbered Diffutils for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Gawk pakken inneholder programmer for å manipulere tekstfiler.
Først, sørg for at noen unødvendige filer ikke blir installert:
sed -i 's/extras//' Makefile.in
Forbered Gawk for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Hvis ønskelig, installer dokumentasjonen:
mkdir -pv /usr/share/doc/gawk-5.1.1 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.1
Findutils pakken inneholder programmer for å finne filer. Disse programmene er gitt for å rekursivt søke gjennom et katalogtre og til å opprette, vedlikeholde og søke i en database (ofte raskere enn den rekursive letingen, men er upålitelig hvis databasen ikke nylig har blitt oppdatert).
Forbered Findutils for kompilering:
case $(uname -m) in i?86) TIME_T_32_BIT_OK=yes ./configure --prefix=/usr --localstatedir=/var/lib/locate ;; x86_64) ./configure --prefix=/usr --localstatedir=/var/lib/locate ;; esac
Betydningen av konfigureringsalternativene:
Denne innstillingen er nødvendig for å bygge et 32 bit system.
--localstatedir
Dette alternativet endrer plasseringen av locate databasen til
å være i /var/lib/locate
,
som er FHS kompatibel.
Kompiler pakken:
make
For å teste resultatene, utsted:
chown -Rv tester . su tester -c "PATH=$PATH make check"
Installer pakken:
make install
Søker i gitte katalogtrær etter filer som samsvarer med de spesifiserte kriterier |
|
Søker gjennom en database med filnavn og rapporterer navnene som inneholder en gitt streng eller samsvarer med et gitt mønster |
|
Oppdaterer locate databasen; den skanner hele filsystemet (inkludert andre filsystemer som for øyeblikket er montert, med mindre den blir bedt om å ikke gjøre det) og legger inn hvert filnavn den finner i databasen |
|
Kan brukes til å gi en gitt kommando til en liste over filer |
Groff pakken inneholder programmer for prosessering og formatering av tekst.
Groff forventer miljøvariabelen PAGE
å inneholde standard papirstørrelse. For
brukere i USA, PAGE=letter
er passende. Andre
steder, PAGE=A4
kan
være mer egnet. Mens standard papirstørrelsen konfigureres
under kompilering, kan den overstyres senere ved å sende
enten “A4” eller “letter” til /etc/papersize
filen.
Forbered Groff for kompilering:
PAGE=<paper_size>
./configure --prefix=/usr
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make install
Leser en troff fontfil og legger til noen ekstra fontmetrikk informasjon som brukes av groff systemet |
|
Oppretter en fontfil for bruk med groff og grops |
|
Groff forprosessor for å lage kjemiske strukturdiagrammer |
|
Kompilerer beskrivelser av ligninger innebygd i troff inndata filer i kommandoer som forstås av troff |
|
Konverterer en troff EQN (ligning) til et beskåret bilde |
|
Markerer forskjeller mellom groff/nroff/troff filer |
|
Forvandler noter skrevet på lilypond språket til groff språket |
|
Forprosessor for groff, tillater tillegg av perl kode inn i groff filer |
|
Forbehandler for groff, tillater tillegg av kinesisk Europeisk lignende språk pinyin til groff filer. |
|
Konverterer et grafdiagram til et beskåret punktgrafikkbilde |
|
En groff forbehandler for gremlin filer |
|
En driver for groff som produserer TeX dvi format |
|
En frontend til groff dokumentformateringssystem; normalt, kjøres troff program og en post-prosessor passende for den valgte enheten |
|
Viser groff filer og man sider på X og tty terminaler |
|
Leser filer og gjetter hvilke av groff
alternativer |
|
Er en groff driver for Canon CAPSL skrivere (laserskrivere i LBP-4 og LBP-8 serien) |
|
Er en driver for groff som produserer utdata i PCL5 formatet som passer for en HP LaserJet 4 skriver |
|
Oversetter utdataene for GNU troff til PDF |
|
Oversetter utdataene for GNU troff til PostScript |
|
Oversetter utdataene for GNU troff inn i en form som passer for skrivemaskinlignende enheter |
|
Oppretter en fontfil for bruk med groff -Tlj4 fra en HP merket font metrisk fil |
|
Oppretter en invertert indeks for de bibliografiske databasene med en spesifisert fil for bruk med refer, lookbib, og lkbib |
|
Søker i bibliografiske databaser etter referanser som inneholder spesifiserte nøkler og rapporterer eventuelle referanser som er funnet |
|
Skriver ut en melding om standardfeil (med mindre standardinndata). ikke er en terminal), leser en linje som inneholder et sett med nøkkelord fra standard inndata, søker i de bibliografiske databasene i en spesifisert fil for referanser som inneholder disse nøkkelordene, skriver da ut eventuelle referanser som er funnet på standardutgangen, og gjentar denne prosessen til slutten av inndataen |
|
En enkel forprosessor for groff |
|
Formaterer utdata ligninger for amerikansk standardkode for informasjon utveksling (ASCII) |
|
Et skript som emulerer nroff kommandoen ved hjelp av groff |
|
Er en innpakning rundt groff som letter produksjonen av PDF dokumenter fra filer formatert med mom makroene. |
|
Oppretter pdf dokumenter ved hjelp av groff |
|
Oversetter en PostScript font i |
|
Kompilerer beskrivelser av bilder innebygd i troff eller TeX inndatafiler til kommandoer som forstås av TeX eller troff |
|
Konverterer et PIC diagram til et beskåret bilde |
|
Oversetter utdataene til GNU troff til HTML |
|
Konverterer koding av inndatafiler til noe GNU troff forstår |
|
Oversetter utdataene til GNU troff til HTML |
|
Kopierer innholdet i en fil til standardutgang, unntatt de som går mellom .[ og .] tolkes som referanser, og linjer mellom .R1 og .R2 tolkes som kommandoer for hvordan referanser skal behandles |
|
Transformerer Roff filer til DVI format |
|
Transformerer Roff filer til HTML format |
|
Transformerer Roff filer til PDFer |
|
Transformerer Roff filer til ps filer |
|
Transformerer Roff filer til text filer |
|
Transformerer Roff filer til andre formater |
|
Leser filer og erstatter linjer i formatet .so filer av innholdet i nevnte filer |
|
Kompilerer beskrivelser av tabeller innebygd i troff inndata filer til kommandoer som forstås av troff |
|
Oppretter en fontfil for bruk med groff -Tdvi |
|
Er veldig kompatibel med Unix troff; den bør vanligvis startes ved hjelp av groff kommandoen, som også vil kjøre pre- og post-prosessorer i riktig rekkefølge og med passende alternativer |
GRUB pakken inneholder en oppstartslaster (GRand Unified Bootloader).
Hvis systemet ditt har UEFI støtte og du ønsker å starte LFS med UEFI, kan du hoppe over denne pakken i LFS, og installere GRUB med UEFI støtte (og dets avhengigheter) som følger the BLFS siden på slutten av dette kapittelet.
Forbered GRUB for kompilering:
./configure --prefix=/usr \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror
Betydningen av de nye konfigureringsalternativene:
--disable-werror
Dette gjør at bygget kan fullføres med advarsler fra nyere Flex versjoner.
--disable-efiemu
Dette alternativet minimerer det som bygges ved å deaktivere en funksjon og testprogrammer som ikke er nødvendig for LFS.
Kompiler pakken:
make
Testpakken for denne pakken anbefales ikke. Mesteparten av testene avhenger av pakker som ikke er tilgjengelige i det begrensete LFS miljøet. For å kjøre testene uansett, kjør make check.
Installer pakken:
make install mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
Bruk av GRUB for å gjøre LFS systemet oppstartbart vil bli diskutert i Section 10.4, “Bruke GRUB til å sette opp oppstartsprosessen”.
Er et hjelpeprogram for grub-install |
|
Et verktøy for å redigere miljøblokken |
|
Sjekker om FILE er av den angitte typen. |
|
Verktøy for å feilsøke filsystemdriveren |
|
Lim 32-biters og 64-biters binære inn i Apple universal one. |
|
Installer GRUB på harddisken din |
|
Skript som konverterer et xkb oppsett til et som gjenkjennes av GRUB |
|
Velsignelse i Mac-stil på HFS eller HFS+ filer |
|
Konverterer en GRUB Legacy |
|
Generer en grub konfigurasjonsfil |
|
Lager et oppstartbart bilde av GRUB |
|
Genererer en GRUB tastaturoppsettfil |
|
Forbereder en GRUB netboot mappe |
|
Genererer et kryptert PBKDF2 passord for bruk i oppstartsmenyen |
|
Gir et systembanenavn i forhold til roten |
|
Lager et oppstartbart bilde av GRUB som passer for en diskett eller CDROM/DVD |
|
Genererer et frittstående bilde |
|
Er et hjelpeprogram som skriver ut banen til en GRUBenhet |
|
Undersøk enhetsinformasjon for en gitt bane eller enhet |
|
Angir standard oppstartsoppføring for GRUB bare for neste oppstart |
|
Gjengi Apple .disk_label for Apple Mac-er |
|
Sjekker GRUB konfigurasjonsskriptet for syntaksfeil |
|
Angir standard oppstartsoppføring for GRUB |
|
Er et hjelpeprogram for grub-setup |
|
Forvandler en syslinux konfigurasjonsfil til grub.cfg format |
Gzip pakken inneholder programmer for komprimering og dekomprimering av filer.
Forbered Gzip for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Dekomprimerer gzippede filer |
|
Oppretter selvdekomprimerende kjørbare filer |
|
Komprimerer de gitte filene ved å bruke Lempel-Ziv (LZ77) koding |
|
Dekomprimerer komprimerte filer |
|
Dekomprimerer de gitte gzip filene til standard utgang |
|
Kjører cmp på gzippede filer |
|
Kjører diff på gzippede filer |
|
Kjører egrep på gzippede filer |
|
Kjører fgrep på gzippede filer |
|
Tvinger et |
|
Kjører grep på gzippede filer |
|
Kjører less på gzippede filer |
|
Kjører more på gzippede filer |
|
Re-komprimerer filer fra compress format
til gzip
format— |
IPRoute2 pakken inneholder programmer for grunnleggende og avansert IPV4 basert nettverk.
arpd programmet inkludert i denne pakken vil ikke bygges siden den er avhengig av Berkeley DB, som ikke er installert i LFS. Men en mappe for arpd og en man side vil fortsatt bli installert. Forhindre dette ved å kjøre kommandoene nedenfor. Hvis arpd binær er nødvendig, instruksjoner for kompilering av Berkeley DB finnes i BLFS-boken på https://www.linuxfromscratch.org/blfs/view/11.2/server/db.html.
sed -i /ARPD/d Makefile rm -fv man/man8/arpd.8
Kompiler pakken:
make NETNS_RUN_DIR=/run/netns
Denne pakken har ikke en fungerende testpakke.
Installer pakken:
make SBINDIR=/usr/sbin install
Hvis ønskelig, installer dokumentasjonen:
mkdir -pv /usr/share/doc/iproute2-5.19.0 cp -v COPYING README* /usr/share/doc/iproute2-5.19.0
Konfigurerer nettverksbroer |
|
Verktøy for tilkoblingsstatus |
|
Generisk verktøy for netlink grenseflate |
|
Et skall skriptinnpakning for ip kommando [Merk at det krever arping og rdisk programmer fra iputils pakken som finnes på http://www.skbuff.net/iputils/.] |
|
Viser grensesnittstatistikken, inkludert mengden av overførte og mottatte pakker via et grensesnitt |
|
Den viktigste kjørbare. Den har flere forskjellige funksjoner:
ip link ip addr lar brukere se på adresser og egenskapene deres, legge til nye adresser og slette gamle ip neighbor lar brukerne se på nabo bindinger og deres egenskaper, legge til nye nabooppføringer og slette gamle ip rule lar brukerne se på rutingspolitikken og endre dem ip route lar brukerne se på rutingtabellen og endre rutetabellregler ip tunnel lar brukere se på IP tunneler og deres egenskaper, og endre dem ip maddr lar brukerne se på multicast adresser og deres egenskaper, og endre dem ip mroute lar brukere angi, endre eller slette multicast rutingen ip monitor lar brukerne overvåke kontinuerlig tilstanden til enheter, adresser og ruter |
|
Gir Linux nettverksstatistikk; det er en generalisert og mer funksjonsfull erstatning for det gamle rtstat programmet |
|
Viser nettverksstatistikk |
|
En komponent av ip route. Dette er for å tømme rutetabellene |
|
En komponent av ip route. Dette er for liste rutetabellene |
|
Viser innholdet i |
|
Overvåkingsverktøy for Route |
|
Konverterer utdataene til ip -o tilbake til en lesbar form |
|
Statusverktøy for Route |
|
Ligner på netstat kommandoen; viser aktive forbindelser |
|
Trafikkkontrollerende kjørbar; dette er for Quality Of Service (QOS) og Class Of Service (COS) implementeringer tc qdisc lar brukere sette opp køen discipline tc class lar brukere sette opp klasser basert på køen til discipline planlegging tc estimator lar brukerne estimere nettverksflyt inn i et nettverk tc filter lar brukere sette opp QOS/COS pakkefiltrering tc policy lar brukere sette opp QOS/COS retningslinjer |
Kbd pakken inneholder nøkkeltabellfiler, konsollfonter og tastatur verktøy.
Oppførselen til tilbaketastene og slettetastene er ikke konsistent på tvers av nøkkelkartene i Kbd pakken. Følgende oppdatering fikser dette problem for i386 keymaps:
patch -Np1 -i ../kbd-2.5.1-backspace-1.patch
Etter oppdateringen, genererer tilbaketasten tegnet med kode 127, og slettetasten genererer en velkjent escape sekvens.
Fjern det overflødige resizecons programmet (det krever den nedlagte svgalib for å gi videomodusfilene - for normal bruk setfont gjør størrelsen på konsollen passende) sammen med dens Manside.
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
Forbered Kbd for kompilering:
./configure --prefix=/usr --disable-vlock
Betydningen av konfigureringsalternativet:
--disable-vlock
Dette alternativet forhindrer at vlock verktøyet blir bygget fordi det krever PAM biblioteket, som ikke er tilgjengelig i chroot miljøet.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
For noen språk (f.eks. hviterussisk) gir ikke Kbd pakken et nyttig nøkkelkart der standard keymap antar ISO-8859-5-kodingen og CP1251-tastaturet brukes vanligvis. Brukere av slike språk må laste ned fungerende keymaps separat.
Hvis ønskelig, installer dokumentasjonen:
mkdir -pv /usr/share/doc/kbd-2.5.1 cp -R -v docs/doc/* /usr/share/doc/kbd-2.5.1
Endrer den virtuelle terminalen som er i forgrunnen |
|
Fjerner ubrukte virtuelle terminaler |
|
Dumper tastaturoversettelsestabellene |
|
Skriver ut nummeret til den aktive virtuelle terminalen |
|
Skriver ut kjernens skanningskode til nøkkelkode tilordningstabellen |
|
Får informasjon om statusen til en konsoll |
|
Rapporterer eller stiller inn tastaturmodus |
|
Stiller inn repetisjons- og forsinkelseshastigheter for tastaturet |
|
Laster tastaturoversettelsestabellene |
|
Laster kjernens unicode til font kartleggingstabellen |
|
Et utdatert program som pleide å laste en brukerdefinert utgang tegnkartleggingstabell i konsolldriveren; dette er nå gjort av setfont |
|
Starter et program på en ny virtuell terminal (VT) |
|
Legger til en Unicode tegntabell til en konsollfont |
|
Trekker ut den innebygde Unicode tegntabellen fra en konsoll font |
|
Fjerner den innebygde Unicode tegntabellen fra en konsoll font |
|
Håndterer Unicode tegntabeller for konsollfonter |
|
Endrer den forbedrede grafikkadapteren (EGA) og videografikk matrise (VGA) fonter på konsollen |
|
Laster kjernens skanningskode til nøkkelkode kartleggingstabelloppføringer; dette er nyttig hvis det er uvanlige taster på tastaturet |
|
Stiller inn tastaturflagg og lysdioder (LED) |
|
Definerer tastaturets metanøkkel håndtering |
|
Stiller inn konsollfargekartet i alle virtuelle terminaler |
|
Viser gjeldende EGA/VGA konsollskjermskrift |
|
Rapporterer skanningskodene, nøkkelkodene og ASCII-kodene til tastene som trykkes på tastaturet |
|
Setter tastaturet og konsollen i UNICODE modus [Ikke bruk dette programmet med mindre tastaturfilen er i ISO-8859-1-kodingen. Til andre kodinger, gir dette verktøyet feil resultater.] |
|
Tilbakestiller tastatur og konsoll fra UNICODE modus |
Libpipeline pakken inneholder et bibliotek for å manipulere kanaler av delprosesser på en fleksibel og praktisk måte.
Forbered Libpipeline for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Make pakken inneholder et program for å kontrollere genereringen av kjørbare filer og andre ikke-kildefiler av en pakke fra kildefiler.
Forbered Make for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Patch pakken inneholder et program for å endre eller lage filer ved å bruke en “patch” fil som vanligvis opprettes av diff programmet.
Forbered patch for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Tar pakken gir muligheten til å lage tar arkiver også å utføre forskjellige andre typer arkivmanipulering. Tar kan brukes på tidligere opprettede arkiver for å trekke ut filer, for å lagre flere filer, eller for å oppdatere eller liste filer som allerede var lagret.
Forbered Tar for kompilering:
FORCE_UNSAFE_CONFIGURE=1 \ ./configure --prefix=/usr
Betydningen av konfigureringsalternativet:
FORCE_UNSAFE_CONFIGURE=1
Dette tvinger testen for mknod
å bli kjørt som root
. Det anses generelt som farlig
å kjøre denne testen som the root
bruker, men siden den kjøres
på et system som kun er delvis bygget, å overstyre det
er OK.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
En test, capabilities: binary store/restore, er kjent for å mislykkes hvis den kjøres (på grunn av at LFS mangler selinux), men vil bli hoppet over hvis vertskjernen ikke støtter utvidede attributter på filsystemet som brukes til å bygge LFS.
Installer pakken:
make install make -C doc install-html docdir=/usr/share/doc/tar-1.34
Texinfo pakken inneholder programmer for lesing, skriving og konvertere informasjonssider.
Forbered Texinfo for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Installer eventuelt komponentene som hører til i en TeX installasjon:
make TEXMF=/usr/share/texmf install-tex
Betydningen av make parameteren:
TEXMF=/usr/share/texmf
TEXMF
makefile variabelen
holder plasseringen av roten til TeX treet hvis for
eksempel en TeX pakke vil bli installert senere.
Infodokumentasjonssystemet bruker en ren tekstfil til å holde
listen over menyoppføringer. Filen ligger på /usr/share/info/dir
. Dessverre, på grunn av
sporadiske problemer i Makefiles for forskjellige pakker, kan
det noen ganger gå ut av synkronisering med infosidene som er
installert på systemet. Hvis /usr/share/info/dir
filen noen gang trenger
å bli gjenskapt, vil følgende valgfrie kommandoer utføre
oppgaven:
pushd /usr/share/info rm -v dir for f in * do install-info $f dir 2>/dev/null done popd
Brukes til å lese informasjonssider som ligner på man sider, men går ofte mye dypere enn bare å forklare alle tilgjengelige kommandoers linjealternativer [For eksempel, sammenlign man bison og info bison.] |
|
Brukes til å installere infosider; den oppdaterer oppføringer i info index file |
|
Oversetter de gitte Texinfo kildedokumentene til infosider, ren tekst eller HTML |
|
Brukes til å formatere det gitte Texinfo dokumentet til en flyttbart dokumentformat (PDF) fil |
|
Konverterer Pod til Texinfo format |
|
Oversett Texinfo kildedokumentasjon til forskjellige andre formater |
|
Brukes til å formatere det gitte Texinfo dokumentet til en enhetsuavhengig fil som kan skrives ut |
|
Brukes til å formatere det gitte Texinfo dokumentet til en flyttbart dokumentformat (PDF) fil |
|
Brukes til å sortere Texinfo indeksfiler |
Vim pakken inneholder en kraftig tekstredigerer.
Hvis du foretrekker en annen tekstredigerer—som Emacs, Joe, eller Nano—Vennligst se https://www.linuxfromscratch.org/blfs/view/11.2/postlfs/editors.html for foreslåtte installasjonsinstruksjoner.
Først endrer du standardplasseringen for vimrc
konfigurasjonsfil til /etc
:
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
Forbered vim for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å forberede testene, sørg for at brukeren tester
kan skrive til kildetreet:
chown -Rv tester .
Kjør nå testene som bruker tester
:
su tester -c "LANG=en_US.UTF-8 make -j1 test" &> vim-test.log
Testpakken sender ut mange binære data til skjermen. Dette kan forårsake problemer med innstillingene til gjeldende terminal. Problemet kan unngås ved å omdirigere utdataene til en loggfil som vist ovenfor. En vellykket test vil resultere i ordene "ALL DONE" i loggfilen ved ferdigstillelse.
Installer pakken:
make install
Mange brukere er vant til å bruke vi i stedet for vim. For å tillate kjøringen av vim når brukere vanligvis skriver vi, lage en symbolkobling for både binærsiden og man siden i det angitte språket:
ln -sv vim /usr/bin/vi for L in /usr/share/man/{,*/}man1/vim.1; do ln -sv vim.1 $(dirname $L)/vi.1 done
Som standard er vims dokumentasjon installert i /usr/share/vim
. Følgende symbolkobling gjør
det mulig å få tilgang til dokumentasjonen via /usr/share/doc/vim-9.0.0228
, gjør det
samsvar med plasseringen av dokumentasjonen for andre pakker:
ln -sv ../vim/vim90/doc /usr/share/doc/vim-9.0.0228
Hvis et X Window System skal installeres på LFS systemet, kan det være nødvendig å rekompilere vim etter installasjon av X. Vim kommer med en GUI versjon av tekstredigereren som krever X og noen flere biblioteker som skal installeres. For mer informasjon om denne prosessen, se vim dokumentasjonen og vim installasjonssiden i BLFS boka på https://www.linuxfromscratch.org/blfs/view/11.2/postlfs/vim.html.
Som standard, vim kjører i vi inkompatibel modus. Dette kan være nytt for brukere som har brukt andre tekstredigerere tidligere. “nocompatible” innstillingen er inkludert nedenfor for å fremheve faktum at en ny atferd blir brukt. Det minner også de som ville endre til “compatible” modus at det skal være den første innstilling i konfigurasjonsfilen. Dette er nødvendig fordi det endrer andre innstillinger og overstyringer må komme etter denne innstillingen. Opprett en standard vim konfigurasjonsfil ved å kjøre følgende:
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1
set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
set nocompatible
innstillingen gjør at vim oppfører seg på en mer
nyttig måte (standard) enn vi kompatibel måte. Fjern
“no” å beholde det gamle
vi oppførselen.
set backspace=2
innstillingen tillater tilbaketast over linjeskift,
autoinnrykk og starten på et innlegg. syntax on
parameter aktiverer
vim sin syntaks fremheving. set
mouse=
innstillingen aktiverer riktig liming av
tekst med musen når du jobber i chroot eller over en ekstern
tilkobling. Endelig, if erklæring med set background=dark
innstillingen korrigerer vim's gjetting om
bakgrunnsfargen til en eller annen terminal emulatorer. Dette
gir uthevingen et bedre fargevalg for bruk på svart bakgrunn
for disse programmene.
Dokumentasjon for andre tilgjengelige alternativer kan fås ved å kjører følgende kommando:
vim -c ':options'
Som standard installerer vim kun stavefiler for det
engelske språket. For å installere stavefiler for ditt
foretrukne språk, last ned *.spl
og eventuelt *.sug
filer for ditt språk og tegnkoding
fra ftp://ftp.vim.org/pub/vim/runtime/spell/
og lagre dem til /usr/share/vim/vim90/spell/
.
For å bruke disse stavefilene, noen konfigurasjoner i
/etc/vimrc
trengs, f.eks.:
set spelllang=en,ru
set spell
For mer informasjon, se den aktuelle README filen på URLen ovenfor.
Starter vim i ex modus |
|
Er en begrenset versjon av view; ikke noen skall kommandoer kan startes og view kan ikke suspenderes |
|
Er en begrenset versjon av vim; ikke noen skall kommandoer kan startes og vim kan ikke suspenderes |
|
Lenker til vim |
|
Starter vim i skrivebeskyttet modus |
|
Er tekstredigereren |
|
Redigerer to eller tre versjoner av en fil med vim og viser forskjellene |
|
Lærer de grunnleggende tastene og kommandoene til vim |
|
Oppretter en hex dump av den gitte filen; den kan også gjøre det motsatte, slik at det kan brukes til binær endring |
Eudev pakken inneholder programmer for dynamisk oppretting av enhetsnoder.
Forbered Eudev for kompilering:
./configure --prefix=/usr \ --bindir=/usr/sbin \ --sysconfdir=/etc \ --enable-manpages \ --disable-static
Kompiler pakken:
make
Opprett noen kataloger som er nødvendig for tester, men vil også bli brukt som en del av installasjonen:
mkdir -pv /usr/lib/udev/rules.d mkdir -pv /etc/udev/rules.d
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Installer noen tilpassede regler og støttefiler som er nyttige i et LFS miljø:
tar -xvf ../udev-lfs-20171102.tar.xz make -f udev-lfs-20171102/Makefile.lfs install
Informasjon om maskinvareenheter vedlikeholdes i /etc/udev/hwdb.d
og /usr/lib/udev/hwdb.d
mappene. Eudev trenger denne informasjonen for å
bli kompilert inn i en binær database /etc/udev/hwdb.bin
. Opprett oppstarts
databasen:
udevadm hwdb --update
Denne kommandoen må kjøres hver gang maskinvareinformasjonen blir oppdatert.
Generisk administrasjonsverktøy for udev: kontrollerer udevd nissen (daemon), gir informasjon fra Udev databasen, overvåker uevents, venter på at uevents fullføres, tester Udev konfigurasjonen og trigger uevents for en gitt enhet |
|
En nisse som lytter etter uevents på netlink kontakten, oppretter enheter og kjører de konfigurerte eksterne programmene i svar på disse hendelsene |
|
Et bibliotekgrensesnitt for udev enhetsinformasjon |
|
Inneholder Udev konfigurasjonsfiler, enhetstillatelser og regler for å navngi enheter |
Man-DB pakken inneholder programmer for å finne og se på man sider.
Forbered Man-DB for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.10.2 \ --sysconfdir=/etc \ --disable-setuid \ --enable-cache-owner=bin \ --with-browser=/usr/bin/lynx \ --with-vgrind=/usr/bin/vgrind \ --with-grap=/usr/bin/grap \ --with-systemdtmpfilesdir= \ --with-systemdsystemunitdir=
Betydningen av konfigureringsalternativene:
--disable-setuid
Dette deaktiverer å lage man program setuid
til bruker man
.
--enable-cache-owner=bin
Dette gjør at de systemomfattende hurtigbufferfilene
eies av brukeren bin
.
--with-...
Disse tre parameterne brukes til å angi noen standardprogrammer. lynx er en tekstbasert nettleser (se BLFS for installasjonsinstruksjoner), vgrind konverterer programkilder til Groff inndata, og grap er nyttig for å sette grafer i Groff dokumenter. vgrind og grap programmer er vanligvis ikke nødvendig for å vise man sider. De er ikke en del av LFS eller BLFS, men du bør kunne installere dem selv etter at du har fullført LFS hvis du ønsker å gjøre det.
--with-systemd...
Disse parameterne forhindrer installasjon av unødvendig systemd mapper og filer.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Følgende tabell viser tegnsettet som Man-DB antar manuelle
sider installert under /usr/share/man/<ll>
vil være kodet
med. I tillegg til dette, bestemmer Man-DB korrekt om
manualsider installert i den katalogen er UTF-8-kodet.
Table 8.1. Forventet tegnkoding av eldre 8-biters manualsider
Språk (Kode) | Koding | Språk (Kode) | Koding |
---|---|---|---|
Danish (da) | ISO-8859-1 | Croatian (hr) | ISO-8859-2 |
German (de) | ISO-8859-1 | Hungarian (hu) | ISO-8859-2 |
English (en) | ISO-8859-1 | Japanese (ja) | EUC-JP |
Spanish (es) | ISO-8859-1 | Korean (ko) | EUC-KR |
Estonian (et) | ISO-8859-1 | Lithuanian (lt) | ISO-8859-13 |
Finnish (fi) | ISO-8859-1 | Latvian (lv) | ISO-8859-13 |
French (fr) | ISO-8859-1 | Macedonian (mk) | ISO-8859-5 |
Irish (ga) | ISO-8859-1 | Polish (pl) | ISO-8859-2 |
Galician (gl) | ISO-8859-1 | Romanian (ro) | ISO-8859-2 |
Indonesian (id) | ISO-8859-1 | Greek (el) | ISO-8859-7 |
Icelandic (is) | ISO-8859-1 | Slovak (sk) | ISO-8859-2 |
Italian (it) | ISO-8859-1 | Slovenian (sl) | ISO-8859-2 |
Norwegian Bokmal (nb) | ISO-8859-1 | Serbian Latin (sr@latin) | ISO-8859-2 |
Dutch (nl) | ISO-8859-1 | Serbian (sr) | ISO-8859-5 |
Norwegian Nynorsk (nn) | ISO-8859-1 | Turkish (tr) | ISO-8859-9 |
Norwegian (no) | ISO-8859-1 | Ukrainian (uk) | KOI8-U |
Portuguese (pt) | ISO-8859-1 | Vietnamese (vi) | TCVN5712-1 |
Swedish (sv) | ISO-8859-1 | Simplified Chinese (zh_CN) | GBK |
Belarusian (be) | CP1251 | Simplified Chinese, Singapore (zh_SG) | GBK |
Bulgarian (bg) | CP1251 | Traditional Chinese, Hong Kong (zh_HK) | BIG5HKSCS |
Czech (cs) | ISO-8859-2 | Traditional Chinese (zh_TW) | BIG5 |
Manualsider på språk som ikke er på listen støttes ikke.
Dumper whatis databaseinnhold i menneskelig lesbar form |
|
Søker whatis database og viser de korte beskrivelsene av systemkommandoer som inneholder en gitt streng |
|
Oppretter eller oppdaterer de forhåndsformaterte manualsidene |
|
Viser én-linjes sammendragsinformasjon om en gitt manualside |
|
Formaterer og viser den forespurte manualsiden |
|
Konverterer manualsider til en annen koding |
|
Oppretter eller oppdaterer whatis databasen |
|
Viser innholdet i $MANPATH eller (hvis $MANPATH ikke er angitt) en passende søkebane basert på innstillingene i man.conf og brukerens miljø |
|
Søker whatis databasen og viser de korte beskrivelsene av systemkommandoer som inneholder de gitte nøkkelord som et eget ord |
|
Inneholder kjøretidsstøtte for man |
|
Inneholder kjøretidsstøtte for man |
Procps-ng pakken inneholder programmer for overvåking av prosesser.
Forbered procps-ng for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/procps-ng-4.0.0 \ --disable-static \ --disable-kill
Betydningen av konfigureringsalternativet:
--disable-kill
Denne bryteren deaktiverer bygging av kill kommandoen som vil bli installert av Util-linux pakken.
Kompiler pakken:
make
For å kjøre testpakken, kjør:
make check
En test kalt free with commit
kan mislykkes hvis noen applikasjoner med en tilpasset
minneallokator (for eksempel JVM og nettlesere) kjører på
vertsdistroen.
Installer pakken:
make install
Rapporterer mengden ledig og brukt minne (både fysisk og vekselminne) i systemet |
|
Slår opp prosesser basert på deres navn og andre attributter |
|
Rapporterer PID-ene til de gitte programmene |
|
Signaliserer prosesser basert på deres navn og andre attributter |
|
Rapporterer minnekartet for den gitte prosessen |
|
Lister gjeldende prosesser |
|
Venter til en prosess er ferdig før den utføres. |
|
Rapporterer gjeldende arbeidsmappe for en prosess |
|
Viser detaljert kjerne platebuffer (slab cache) informasjon i sanntid |
|
Endrer kjerneparametere under kjøretid |
|
Skriver ut en graf over gjeldende systembelastningsgjennomsnitt |
|
Viser en liste over de mest CPU intensive prosessene; den gir en kontinuerlig titt på prosessoraktivitet i sanntid |
|
Rapporterer hvor lenge systemet har kjørt, hvor mange brukere det er logget på, og systemets belastningsgjennomsnitt |
|
Rapporterer virtuelt minnestatistikk, gir informasjon om prosesser, minne, søking, blokk Input/Output (IO), feller og CPU aktivitet |
|
Viser hvilke brukere som for øyeblikket er pålogget, hvor og siden når |
|
Kjører en gitt kommando gjentatte ganger, og viser den første skjermen full av utdata; dette lar en bruker se utdataens endring over tid |
|
Inneholder funksjonene som brukes av de fleste programmer i denne pakken |
Util-linux pakken inneholder diverse hjelpeprogrammer. Blant dem er verktøy for håndtering av filsystemer, konsoller, partisjoner, og meldinger.
Forbered Util-linux for kompilering:
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \ --bindir=/usr/bin \ --libdir=/usr/lib \ --sbindir=/usr/sbin \ --docdir=/usr/share/doc/util-linux-2.38.1 \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ --without-systemd \ --without-systemdsystemunitdir
Alternativene --disable og --without forhindrer advarsler om bygningskomponenter som krever pakker som ikke er i LFS eller er inkonsistent med programmer installert av andre pakker.
Kompiler pakken:
make
Hvis ønskelig, kjør testpakken som en ikke-root
bruker:
Å kjører testpakken som root
bruker kan være skadelig for
systemet ditt. For å kjøre den, må CONFIG_SCSI_DEBUG
alternativet for kjernen være tilgjengelig i det gjeldende
systemet og må bygges som en modul. Å bygge den inn i
kjernen vil forhindre oppstart. For komplett dekning, må
andre BLFS pakker installeres. Om ønskelig kan denne testen
kjøres etter omstart i det fullførte LFS systemet og med å
kjøre:
bash tests/run.sh --srcdir=$PWD --builddir=$PWD
chown -Rv tester . su tester -c "make -k check"
hardlink testene vil mislykkes hvis vertens kjerne ikke har alternativet CONFIG_CRYPTO_USER_API_HASH satt.
Installer pakken:
make install
Informerer Linux kjernen om nye partisjoner |
|
Åpner en tty port, ber om et påloggingsnavn, og starter deretter login programmet |
|
Forkaster sektorer på en enhet |
|
Et kommandolinjeverktøy for å finne og skrive ut blokkenhets attributter |
|
Kjører zone kommandoen på den gitte blokkenheten |
|
Lar brukere kalle blokkenhet ioctls fra kommando linjen |
|
Viser en enkel kalender |
|
Manipulerer partisjonstabellen til den gitte enheten |
|
Endrer tilstanden til CPUer |
|
Konfigurerer minne |
|
Viser og justerer OOM-killer poeng |
|
Manipulerer sanntidsattributter til en prosess |
|
Filtrerer ut omvendt linjemating |
|
Filtrerer nroff utdata for terminaler som mangler noen muligheter, for eksempel overslag og halvlinjer |
|
Filtrerer ut de gitte kolonnene |
|
Formaterer en gitt fil i flere kolonner |
|
Setter funksjonen til tastekombinasjonen Ctrl+Alt+Del til en hard eller myk tilbakestilling |
|
Ber Linux kjernen om å fjerne en partisjon |
|
Dumper kjerneoppstartsmeldingene |
|
Løser ut flyttbare medier |
|
Forhåndstildeler plass til en fil |
|
Manipulerer partisjonstabellen til den gitte enheten |
|
Teller sider med filinnhold i kjernen |
|
Finner et filsystem etter etikett eller universell unik identifikator (UUID) |
|
Er et kommandolinjegrensesnitt til libmount biblioteket for arbeid med mountinfo, fstab og mtab filer |
|
Skaffer en fillås og utfører deretter en kommando med låsen holdt |
|
Brukes til å sjekke, og eventuelt reparere, filsystemer |
|
Utfører en konsistenssjekk på Cramfs filsystem på gitt enhet |
|
Utfører en konsistenssjekk på Minix filsystem på gitt enhet |
|
Er en veldig enkel innpakning rundt FIFREEZE/FITHAW ioctl kjernedriveroperasjoner |
|
Forkaster ubrukte blokker på et montert filsystem |
|
Analyserer alternativer i den gitte kommandolinjen |
|
Dumper den gitte filen i heksadesimal eller i et annen gitt format |
|
Leser eller stiller inn systemets maskinvareklokke, også kalt sanntidsklokken (RTC) eller grunnleggende inndata-utdata system (BIOS) klokke |
|
En symbolsk lenke til setarch |
|
Henter eller setter io planleggingsklasse og prioritet for et program |
|
Oppretter forskjellige IPC ressurser |
|
Fjerner den gitte IPC (Inter-Process Communication) ressursen |
|
Gir IPC statusinformasjon |
|
Viser informasjon om kjerneavbruddsteller i
|
|
Rapporterer størrelsen på et ISO9660 filsystem |
|
Sender signaler til prosesser |
|
Viser hvilke brukere som sist logget på (og ut),
søker tilbake gjennom |
|
Viser mislykkede påloggingsforsøk, som logget i
|
|
Fester en linjedisiplin til en seriellinje |
|
En symbolsk lenke til setarch |
|
En symbolsk lenke til setarch |
|
Legger inn den gitte meldingen i systemloggen |
|
Viser linjer som begynner med den gitte strengen |
|
Setter opp og kontrollerer sløyfeenheter |
|
Viser informasjon om alle eller utvalgte blokkenheter i et trelignende format |
|
Skriver ut CPU arkitekturinformasjon |
|
Skriver ut informasjon om IPC fasiliteter som for øyeblikket brukes i systemet |
|
Viser informasjon om kjerneavbruddsteller |
|
Viser lokale systemlåser |
|
Viser informasjon om brukere, grupper og systemkontoer |
|
Viser utvalg av tilgjengelig minne med deres tilkoblede status |
|
Viser navnerom |
|
Genererer magiske informasjonskapsler (128-bit tilfeldige heksadesimale tall) for xauth |
|
Styrer om andre brukere kan sende meldinger til den gjeldende brukers terminal |
|
Bygger et filsystem på en enhet (vanligvis en harddisk partisjon) |
|
Oppretter et Santa Cruz Operations (SCO) bfs filsystem |
|
Oppretter et cramfs filsystem |
|
Oppretter et Minix filsystem |
|
Initialiserer den gitte enheten eller filen til å brukes som et vekselminne område |
|
Et filter for å bla gjennom tekst et skjermbilde om gangen |
|
Fester filsystemet på den gitte enheten til en spesifisert mappe i filsystemtreet |
|
Sjekker om mappen er et monteringspunkt |
|
Viser de symbolske koblingene i de gitte stinavnene |
|
Kjører et program med navnerom for andre prosesser |
|
Forteller kjernen om tilstedeværelsen og nummereringen av diskens partisjoner |
|
Gjør det gitte filsystemet til det nye rotfilsystemet i gjeldende prosess |
|
Få og angi ressursgrenser til en prosess |
|
Leser informasjon om kjerneprofileringen |
|
Gi nytt navn til de gitte filene, erstatter en gitt streng med en annen |
|
Endrer prioriteten til kjørende prosesser |
|
Ber Linux kjernen om å endre størrelsen på en partisjon |
|
Reverserer linjene til en gitt fil |
|
Verktøy for å aktivere og deaktivere trådløse enheter |
|
Brukes til å gå inn i systemets hviletilstand til et spesifisert vekkingstidspunkt |
|
Lager et typeskript av en terminaløkt |
|
Kjøret sesjonens typeskript på nytt ved å bruke tidsinformasjon |
|
Spiller av typeskript ved hjelp av tidsinformasjon |
|
Endringer rapportert arkitektur i et nytt programmiljø og setter personlighetsflagg |
|
Kjører det gitte programmet i en ny økt |
|
Angir terminalattributter |
|
En manipulator for diskpartisjonstabeller |
|
Tillater |
|
Gjør det mulig å endre vekselmonneområdets UUID og etikett |
|
Deaktiverer enheter og filer for søking og bruk av vekselminne |
|
Aktiverer enheter og filer for søking og bruk av vekselminne og viser enhetene og filene som er i bruk |
|
Bytter til et annet filsystem som roten til monteringstreet |
|
Henter eller setter en prosess sin CPU tilhørighet |
|
Manipuler bruk av clamping attributtene til systemet eller en prosess |
|
Et filter for å oversette understrek til skiftesekvenser som indikerer understreking for terminalen som er i bruk |
|
Kobler et filsystem fra systemets filtre |
|
En symbolsk lenke til setarch |
|
Kjører et program med noen navnerom som ikke er delt fra overordnet |
|
Viser innholdet i den gitte påloggingsfilen i et mer brukervennlig format |
|
n nisse som brukes av UUID biblioteket for å generere tidsbasert UUID på en sikker og garantert unik måte |
|
Oppretter nye UUID. Hver ny UUID kan med rimelighet vurderes unik blant alle UUID som er opprettet, på det lokale systemet og på andre systemer, i fortiden og i fremtiden |
|
Et verktøy for å analysere unike identifikatorer |
|
Viser innholdet i en fil eller, som standard, dens standard inndata, på terminalene til alle påloggede brukere |
|
Viser maskinvareovervåkingsstatus |
|
Rapporterer plasseringen av binær, kilde og man siden for den gitte kommandoen |
|
Sletter en filsystemsignatur fra en enhet |
|
En symbolsk lenke til setarch |
|
Et program for å sette opp og kontrollere zram (komprimert ram disk) enheter |
|
Inneholder rutiner for enhetsidentifikasjon og symbol utdrag |
|
Inneholder rutiner for manipulering av partisjonstabeller |
|
Inneholder rutiner for montering og avmontering av en blokkenhet |
|
Inneholder rutiner for å hjelpe skjermutdata i tabulatorform |
|
Inneholder rutiner for å generere unike identifikatorer for objekter som kan være tilgjengelig utenfor det lokale systemet |
e2fsprogs pakken inneholder verktøyene for å håndtere
ext2
filsystem. Det støtter
også ext3
og ext4
journalførende filsystemer.
e2fsprogs dokumentasjonen anbefaler at pakken bygges i en undermappe til kildetreet:
mkdir -v build cd build
Forbered e2fsprogs for kompilering:
../configure --prefix=/usr \ --sysconfdir=/etc \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck
Betydningen av konfigureringsalternativene:
--enable-elf-shlibs
Dette oppretter de delte bibliotekene som noen programmer i denne pakken bruk.
--disable-*
Dette forhindrer e2fsprogs fra å bygge og installere
libuuid
og libblkid
bibliotekene, uuidd
nissen, og fsck innpakningen,
siden util-linux installerer nyere versjoner.
Kompiler pakken:
make
For å kjøre testene, utsted:
make check
En test, u_direct_io, er kjent for å mislykkes på noen systemer.
Installer pakken:
make install
Fjern ubrukelige statiske biblioteker:
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
Denne pakken installerer en gzipped .info
fil, men oppdaterer ikke systemets
dir
fil. Pakk ut denne filen og
oppdater deretter systemets dir
fil ved hjelp av følgende kommandoer:
gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
Hvis ønskelig, opprett og installer litt tilleggsdokumentasjon ved å utstede følgende kommandoer:
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
Søker en enhet (vanligvis en diskpartisjon) etter dårlige blokker |
|
Endrer attributtene til filer på et |
|
En feiltabellkompilator; den konverterer en tabell
med navn på feilkoder og meldinger til en
C-kildefil som er egnet for bruk med |
|
En feilsøker for filsystemet; den kan brukes til å
undersøke og endre tilstanden til et |
|
Skriver ut superblokken og informasjonen for gruppeblokkerer for filsystemet på en gitt enhet |
|
Rapporterer informasjon om fragmentering av ledig plass |
|
Brukes til å sjekke, og eventuelt reparere
|
|
Brukes til å lagre kritiske |
|
Viser eller endrer filsystemetiketten på et
|
|
Sjekker MMP status for et ext4 filsystem |
|
Sjekker innholdet i et montert ext[234] filsystem |
|
Sjekker alle monterte ext[234] filsystemer for feil |
|
Spiller angreloggen undo_log for et ext2/ext3/ext4 filsystem funnet på en enhet [Dette kan brukes til å angre en mislykket operasjon av et e2fsprogs program.] |
|
Ext4 filsystem krypteringsverktøy |
|
Tilkoblet defragmentering for ext4 filsystemer |
|
Rapporter om hvor dårlig fragmentert en bestemt fil kan være |
|
Som standard sjekker |
|
Som standard sjekker |
|
Som standard sjekker |
|
Lagrer utdata fra en kommando til en loggfil |
|
Viser attributtene til filene på et andre utvidet filsystem |
|
Konverterer en tabell med kommandonavn og
hjelpemeldinger til en C kildefil egnet for bruk
med |
|
Oppretter et |
|
Som standard oppretter |
|
Som standard oppretter |
|
Som standard oppretter |
|
Brukes til å lage en |
|
Kan brukes til å forstørre eller krympe et
|
|
Justerer justerbare filsystemparametere på et
|
|
Den vanlige feilvisningsrutinen |
|
Brukt av dumpe2fs, chattr, og lsattr |
|
Inneholder rutiner for å gjøre det mulig for
programmer på brukernivå å manipulere et
|
|
Brukt av debugfs |
Sysklogd pakken inneholder programmer for logging av systemmeldinger, slik som de kjernen gir når uvanlige ting skjer.
Først, fiks problemer som forårsaker en segmenteringsfeil under noen forhold i klogd og fiks en foreldet programkonstruksjon:
sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c sed -i 's/union wait/int/' syslogd.c
Kompiler pakken:
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make BINDIR=/sbin install
Lag en ny /etc/syslog.conf
fil
ved å kjøre følgende:
cat > /etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.emerg *
# End /etc/syslog.conf
EOF
En systemnisse (system daemon) for å avskjære og logge kjernemeldinger |
|
Logger meldingene for systemprogrammer som tilbyr logging [Hver logget melding inneholder minst et datostempel og et vertsnavn, og normalt programmets navn også, men det avhenger av hvor tillitsfull logging nissen blir fortalt å være.] |
Sysvinit pakken inneholder programmer for å kontrollere oppstarten, kjøring og avslutning av systemet.
Først bruker du en oppdatering som fjerner flere programmer installert av andre pakker, klargjør en melding og fikser en kompilatoradvarsel:
patch -Np1 -i ../sysvinit-3.04-consolidated-1.patch
Kompiler pakken:
make
Denne pakken kommer ikke med en testpakke.
Installer pakken:
make install
Logger oppstartsmeldinger til en loggfil |
|
Kjører en kommando med fstab kodede argumenter |
|
Påkaller vanligvis shutdown med
|
|
Den første prosessen som skal startes når kjernen har initialisert maskinvaren som tar over oppstartsprosessen og starter alle prosesser spesifisert i konfigurasjonsfilen |
|
Sender et signal til alle prosesser, bortsett fra prosessene i sin egen økt slik at den ikke dreper foreldreskallet |
|
Ber kjernen om å stoppe systemet og slå av datamaskinen (se halt) |
|
Ber kjernen om å starte systemet på nytt (se halt) |
|
Rapporterer forrige og nåværende kjørenivå, som
nevnt i siste kjørenivå oppføring i |
|
Får systemet ned på en sikker måte, og signaliserer alle prosesser og varsler alle påloggede brukere |
|
Forteller init hvilket kjørenivå å bytte til |
De fleste programmer og biblioteker er som standard kompilert
med feilsøkingssymboler inkludert (med gcc's -g
alternativ). Dette betyr at
når du feilsøker et program eller bibliotek som ble kompilert
med feilsøkingsinformasjon, kan feilsøkeren ikke bare gi
minneadresser, men også navnene på rutinene og variablene.
Inkludering av disse feilsøkingssymbolene forstørrer imidlertid et program eller bibliotek betydelig. Følgende er et eksempel på hvor mye plass disse symbolene opptar:
A bash binær med feilsøkingssymboler: 1200 KB
A bash binær uten feilsøkingssymboler: 480 KB
Glibc og GCC files (/lib
og
/usr/lib
) med feilsøkings
symboler: 87 MB
Glibc og GCC filer uten feilsøkingssymboler: 16 MB
Størrelser kan variere avhengig av hvilken kompilator og C-bibliotek som ble brukt, men når man sammenligner programmer med og uten feilsøkingssymboler vil forskjellen vanligvis være en faktor mellom to og fem.
Fordi de fleste brukere aldri vil bruke en debugger på systemprogramvaren, mye diskplass kan gjenvinnes ved å fjerne disse symbolene. Den neste delen viser hvordan du fjerner alle feilsøkingssymboler fra programmene og bibliotekene.
Denne delen er valgfri. Hvis den tiltenkte brukeren ikke er en programmerer og ikke planlegger å gjøre noen feilsøking på systemprogramvaren, kan systemstørrelsen reduseres med omtrent 2 GB ved å fjerne feilsøkingssymbolene og unødvendig symboltabell oppføringer fra binærfiler og biblioteker. Dette medfører ingen andre ulemper enn å ikke kunne feilsøke programvaren fullstendig lenger.
De fleste som bruker kommandoene nevnt nedenfor, opplever ikke noen vanskeligheter. Det er imidlertid lett å gjøre en skrivefeil og gjør det nye systemet ubrukelig, så før du kjører strip kommandoer, er det en god idé å lage en sikkerhetskopiering av LFS systemet i gjeldende tilstand.
En strip kommando
med --strip-unneeded
alternativet fjerner alle feilsøkingssymboler fra en binær
eller et bibliotek. Og det fjerner alle symboltabelloppføringer
som ikke er nødvendig for linkeren (for statiske biblioteker)
eller dynamisk linker (for dynamisk koblede binære filer og
delte biblioteker).
Feilsøkingssymbolene for utvalgte biblioteker er plassert i separate filer. Denne feilsøkingsinformasjonen er nødvendig hvis det kjøres regresjonstester som bruker valgrind eller gdb senere i BLFS.
Merk at strip vil
overskrive binær eller bibliotek filen den behandler. Dette kan
krasje prosessene som bruker kode eller data fra filen. Hvis
prosessen som kjører strip selv er påvirket, kan
binærfilen eller biblioteket som blir strippet bli ødelagt og
kan gjøre systemet helt ubrukelig. For å unngå det, kopierer vi
noen biblioteker og binærfiler inn i /tmp
, stripper dem der, og installer dem
tilbake med install kommandoen. Les den
relaterte oppføringen i Section 8.2.1,
“Oppgraderingsproblemer” for begrunnelsen for å
bruke install
kommandoen her.
ELF lasterens navn er ld-linux-x86-64.so.2 på 64-bits systemer og ld-linux.so.2 på 32-bits systemer. Konstruksjonen nedenfor velger riktig navn for gjeldende arkitektur, unntatt noe som slutter med “g”, i tilfelle kommandoene nedenfor allerede har vært kjør.
save_usrlib="$(cd /usr/lib; ls ld-linux*[^g]) libc.so.6 libthread_db.so.1 libquadmath.so.0.0.0 libstdc++.so.6.0.30 libitm.so.1.0.0 libatomic.so.1.2.0" cd /usr/lib for LIB in $save_usrlib; do objcopy --only-keep-debug $LIB $LIB.dbg cp $LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done online_usrbin="bash find strip" online_usrlib="libbfd-2.39.so libhistory.so.8.1 libncursesw.so.6.3 libm.so.6 libreadline.so.8.1 libz.so.1.2.12 $(cd /usr/lib; find libnss*.so* -type f)" for BIN in $online_usrbin; do cp /usr/bin/$BIN /tmp/$BIN strip --strip-unneeded /tmp/$BIN install -vm755 /tmp/$BIN /usr/bin rm /tmp/$BIN done for LIB in $online_usrlib; do cp /usr/lib/$LIB /tmp/$LIB strip --strip-unneeded /tmp/$LIB install -vm755 /tmp/$LIB /usr/lib rm /tmp/$LIB done for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \ $(find /usr/lib -type f -name \*.a) \ $(find /usr/{bin,sbin,libexec} -type f); do case "$online_usrbin $online_usrlib $save_usrlib" in *$(basename $i)* ) ;; * ) strip --strip-unneeded $i ;; esac done unset BIN LIB save_usrlib online_usrbin online_usrlib
Et stort antall filer vil bli rapportert som at filformatet ikke er gjenkjent. Disse advarslene kan trygt ignoreres. De indikerer at disse filene er skript i stedet for binære filer.
Til slutt, ryd opp i noen ekstra filer som er igjen etter å ha kjørt testene:
rm -rf /tmp/*
Det er også flere filer installert i /usr/lib og /usr/libexec mappene med filtypen .la. Disse er "libtool arkivfiler" . Som allerede sagt, er de bare nyttige når du kobler til statiske biblioteker. De er unødvendige, og potensielt skadelige, når du bruker dynamiske delte biblioteker, spesielt når du også bruker byggesystemer som ikke bruker autoverktøy. For å fjerne dem, kjør:
find /usr/lib /usr/libexec -name \*.la -delete
For mer informasjon om libtool arkivfiler, se BLFS delen "Om Libtool Arkiver (.la) filer".
Kompilatoren bygd i Kapittel 6 og Chapter 7 er fortsatt delvis installert og ikke nødvendig lenger. Fjern den med:
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
Til slutt fjerner du den midlertidige "tester" brukerkontoen som ble opprettet på begynnelsen av forrige kapittel.
userdel -r tester
Oppstart av et Linux system innebærer flere oppgaver. Prosessen må montere både virtuelle og ekte filsystemer, initialiser enheter, aktivere vekselfilen, sjekke filsystemer for integritet, montere eventuelle byttepartisjoner eller filer, sette systemklokken, få opp nettverk, start alle nisser (daemons) som kreves av systemet, og utføre alle andre tilpassede oppgaver brukeren trenger. Disse prosessene må organiseres for å sikre at oppgavene utføres på riktig måte , men samtidig utføres så raskt som mulig.
System V er den klassiske oppstartsprosessen som har blitt brukt i Unix og Unix lignende systemer som Linux siden ca 1983. Den består av et lite program, init, som setter opp grunnleggende programmer som f.eks login (via getty) og kjører et skript. Dette skriptet, vanligvis navngitt rc, kontrollerer utførelsen av et sett med ekstra skript som utfører oppgavene som kreves for å initialisere systemet.
The init
programmet er kontrollert av /etc/inittab
filen og er organisert i
kjørenivåer som kan kjøres av brukeren. I LFS brukes de som
følgende:
0 — stopp
1 — Enkeltbrukermodus
2 — Brukerdefinerbar
3 — Full flerbrukermodus
4 — Brukerdefinerbar
5 — Full flerbrukermodus med skjermbehandler
6 — omstart
Vanlig standard kjørenivå er 3 eller 5.
Etablert, godt forstått system.
Enkelt å tilpasse.
Kan være tregere å starte opp. Et middels hastighets LFS system tar 8-12 sekunder der oppstartstiden måles fra første kjernemelding til login ledeteksten. Nettverks tilkobling er vanligvis etablert ca. 2 sekunder etter påloggingsforespørselen.
Seriell behandling av oppstartsoppgaver. Dette er relatert til forrige punkt. En forsinkelse i enhver prosess, for eksempel en filsystemsjekk, vil forsinke hele oppstartsprosessen.
Støtter ikke direkte avanserte funksjoner som kontrollgrupper (cgroups) og planlegging av rettferdig andel per bruker.
Å legge til skript krever manuelle, statiske sekvensbeslutninger.
LFS-Bootscripts pakken inneholder et sett med skript for å starte/stoppe LFS systemet ved oppstart/avslutning. Konfigurasjonsfilene og prosedyrene som trengs for å tilpasse oppstartsprosessen er beskrevet i de følgende avsnittene.
Installer pakken:
make install
Kontrollerer integriteten til filsystemene før de monteres (med unntak av journal- og nettverksbaserte filsystemer) |
|
Fjerner filer som ikke skal bevares mellom omstart,
for eksempel som de i |
|
Laster inn riktig tastaturtabell for ønsket tastaturoppsett; den angir også skjermfonten |
|
Inneholder vanlige funksjoner, som feil- og statuskontroll, som brukes av flere bootscripts |
|
Stopper systemet |
|
Stopper en nettverksenhet |
|
Initialiserer en nettverksenhet |
|
Setter opp systemets vertsnavn og lokal tilbakekoblingsenhet |
|
Laster inn kjernemoduler som er oppført i
|
|
Monterer alle filsystemer, bortsett fra de som er merket noauto eller er nettverksbasert |
|
Monterer virtuelle kjernefilsystemer, som f.eks
|
|
Setter opp nettverksgrensesnitt, for eksempel nettverkskort, og setter opp standard innfallsport (gateway) (der det er aktuelt) |
|
Hovedkontrollskriptet på kjørenivå; den er ansvarlig for å kjøre alle de andre bootscriptene én etter én, i en bestemt sekvens ved navnet på de symbolske lenkene som behandles |
|
Starter systemet på nytt |
|
Sørger for at hver prosess avsluttes før systemet starter på nytt eller stopper |
|
Tilbakestiller kjerneklokken til lokal tid i tilfelle maskinvareklokken ikke er satt til UTC-tid |
|
Gir funksjonaliteten som trengs for å tildele et statisk Internett Protokoll (IP) adresse til et nettverksgrensesnitt |
|
Aktiverer og deaktiverer vekselfiler og partisjoner |
|
Laster systemkonfigurasjonsverdier fra |
|
Starter og stopper system- og kjernelogg nissene (daemons) |
|
En mal for å lage egendefinerte bootscripts for andre nisser |
|
Forbereder |
|
Forsøker på nytt mislykkede udev uevents, og kopier
genererte regelfiler fra |
I Chapter 8, installerte vi udev pakken når eudev ble bygget. Før vi går inn i detaljer om hvordan dette fungerer, er en kort historie om tidligere metoder for å håndtere utstyr i orden.
Generelt brukte Linux systemer tradisjonelt en statisk
enhetsopprettings metode, hvor mange enhetsnoder ble opprettet
under /dev
(noen ganger
bokstavelig talt tusenvis av noder), uavhengig av om de
tilsvarende maskinvareenhetene faktisk eksisterte. Dette ble
vanligvis gjort via en MAKEDEV skript, som
inneholder et antall anrop til mknod programmet med det
aktuelle hoved- og mindre enhetsnumre for alle mulige enheter
som kan eksistere i verden.
Ved å bruke udev metoden vil bare de enhetene som oppdages av
kjernen få enhetsnoder opprettet for dem. Fordi disse
enhetsnodene vil være opprettet hver gang systemet starter, vil
de bli lagret på et devtmpfs
filsystem (et virtuelt filsystem som ligger utelukkende i
systemminnet). Enhetsnoder krever ikke mye plass, så minnet som
brukes er ubetydelig.
I februar 2000 ble et nytt filsystem kalt devfs
flettet inn i 2.3.46-kjernen og ble
gjort tilgjengelig under 2.4-serien med stabile kjerner. Selv
om den var til stede i selve kjernekilden, fikk denne metoden
for å lage enheter dynamisk aldri overveldende støtte fra
kjerneutviklere.
Hovedproblemet med tilnærmingen vedtatt av devfs
var måten den håndterte enheten på
ved oppdagelse, opprettelse og navngivning. Det siste
problemet enhetsnavnet på en enhetsnode, var kanskje den mest
kritiske. Det er generelt akseptert at hvis enhetsnavn kan
konfigureres, så skal enhetsnavn politikken være opp til en
systemadministrator, og ikke pålagt dem av en spesiell(e)
utvikler(e). devfs
filsystemet led også av kjøreforhold som var iboende i
utformingen og ikke kunne fikses uten en betydelig revisjon
av kjernen. Den ble lenge merket som utdatert – på
grunn av manglende vedlikehold – og ble til slutt
fjernet fra kjernen i juni 2006.
Med utviklingen av det ustabile 2.5 kjernetreet, senere
utgitt som 2.6-serien med stabile kjerner, et nytt virtuelt
filsystem kalt sysfs
ble
opprettet. Jobben til sysfs
er å eksportere en visning av systemets
maskinvarekonfigurasjon til brukerprosesser. Med dette
brukersynlige representasjonen, ble muligheten for å utvikle
et brukerområde erstatning for devfs
mer realistisk.
sysfs
filsystemet ble kort
nevnt ovenfor. Man kan lure på hvordan sysfs
vet om enhetene som finnes på et
system og hvilke enhetsnumre som skal brukes for dem.
Drivere som har blitt kompilert inn i kjernen, registrerer
objektene deres direkte med sysfs
(devtmpfs internt) når de
oppdages av kjernen. For drivere kompilert som moduler, vil
registreringen skje når modulen blir lastet. Først når
sysfs
filsystemet er
montert (på /sys), data som driverne registrerer med
sysfs
er tilgjengelig for
brukerområdets prosesser og til udevd for behandling
(inkludert modifikasjoner av enhetens noder).
Enhetsfiler opprettes av kjernen av devtmpfs
filesystemet. Enhver driver
som ønsker å registrere en enhetsnode vil gå gjennom
devtmpfs
(via
driverkjernen) for å gjøre det. Når devtmpfs
forekomsten er montert på
/dev
, vil enhetsnoden i
utgangspunktet bli opprettet med et fast navn, tillatelser
og eier.
Kort tid senere vil kjernen sende en uevent til
udevd. Basert
på reglene spesifisert i filene i /etc/udev/rules.d
, /usr/lib/udev/rules.d
, og /run/udev/rules.d
mappene, udevd vil opprette flere
symbolkoblinger til enhetsnoden, eller endre tillatelsene,
eieren eller gruppen, eller endre den interne udevd databaseoppføring
(navn) for det objektet.
Reglene i disse tre katalogene er nummererte og alle tre
kataloger slås sammen. Hvis udevd ikke finner en
regel for enheten den oppretter, vil den opprettholde
tillatelsene og eierskapet som devtmpfs
brukte i utgangspunktet.
Enhetsdrivere kompilert som moduler kan ha innebygde
aliaser. Aliaser er synlige i utdataene til modinfo programmet og er
vanligvis relatert til de bussspesifikke identifikatorene
til enheter støttet av en modul. For eksempel snd-fm801 driveren støtter
PCI-enheter med leverandør-ID 0x1319 og enhets-ID 0x0801,
og har et alias “pci:v00001319d00000801sv*sd*bc04sc01i*”.
For de fleste enheter eksporterer bussdriveren aliaset til
driveren som vil håndtere enheten via sysfs
. F.eks /sys/bus/pci/devices/0000:00:0d.0/modalias
filen kan inneholde strengen “pci:v00001319d00000801sv00001319sd00001319bc04sc01i00”.
Standardreglene som følger med udev vil forårsake
udevd å kalle
/sbin/modprobe med
innholdet i MODALIAS
uevent
miljøvariabel (som skal være samme som innholdet i
modalias
filen i sysfs),
laster dermed alle moduler hvis aliaser samsvarer med denne
strengen etter jokertegn ekspansjonen.
I dette eksemplet betyr dette at i tillegg til snd-fm801, det foreldede (og uønskede) forte driveren vil bli lastet hvis den er tilgjengelig. Se nedenfor for måter lasting av uønskede drivere kan bli forhindret.
Kjernen selv er også i stand til å laste moduler for nettverks protokoller, filsystemer og NLS-støtte på forespørsel.
Det er noen mulige problemer når det kommer til å automatisk opprette enhetsnoder.
Udev vil bare laste en modul hvis den har et bussspesifikt
alias og bussdriveren eksporterer de nødvendige aliasene
til sysfs
. I andre
tilfeller bør man ordne modullasting på andre måter. Med
Linux-5.19.2, udev er kjent for å laste riktig skrevne
drivere for INPUT, IDE, PCI, USB, SCSI, SERIO- og
FireWire-enheter.
For å finne ut om enhetsdriveren du trenger har den
nødvendige støtten for udev, kjør modinfo med modulnavnet
som argument. Prøv nå å finne enhetskatalogen under
/sys/bus
og sjekk om det er a
modalias
filer der.
Hvis modalias
filen finnes i
sysfs
, driveren støtter
enheten og kan snakke med den direkte, men har ikke
aliaset, det er en feil i driveren. Last inn driveren uten
hjelp fra udev og forvent at problemet blir fikset senere.
Hvis det ikke er noen modalias
filer i den aktuelle mappen
under /sys/bus
, dette betyr
at kjerneutviklerne ennå ikke har lagt til støtte for
modalias for denne busstypen. Med Linux-5.19.2, dette er
tilfellet med ISA busser. Forvent at dette problemet blir
løst i senere kjerneversjoner.
Udev er ikke ment å laste “wrapper” drivere som f.eks snd-pcm-oss og ikke-maskinvaredrivere som f.eks loop i det hele tatt.
Hvis “wrapper” modulen forbedrer bare
funksjonalitet levert av en annen modul (f.eks.
snd-pcm-oss
forbedrer funksjonaliteten til snd-pcm ved å gjøre lydkortene
tilgjengelige for OSS applikasjoner), konfigurer
modprobe for
å laste inn innpakkningen etter at udev laster den
innpakket modulen. For å gjøre dette, legg til en
“softdep” linje til den
tilsvarende /etc/modprobe.d/
filen. For eksempel:
<filename>
.conf
softdep snd-pcm post: snd-pcm-oss
Merk at “softdep” kommandoen tillater
også pre:
avhengigheter, eller
en blanding av begge pre:
og
post:
avhengigheter. Se
modprobe.d(5)
manualside for
mer informasjon om “softdep” syntaks og muligheter.
Hvis den aktuelle modulen ikke er en innpakning og er
nyttig i seg selv, konfigurer modules oppstartsskriptet
til å laste denne modulen ved systemoppstart. For å gjøre
dette, legg til modulnavnet i /etc/sysconfig/modules
filen på en egen
linje. Dette fungerer også for innpakningsmoduler, men er
suboptimalt i så fall.
Enten ikke bygg modulen, eller svarteliste den i en
/etc/modprobe.d/blacklist.conf
fil som
gjort med forte
modulen i eksemplet nedenfor:
blacklist forte
Svartelistede moduler kan fortsatt lastes inn manuelt med eksplisitt modprobe kommando.
Dette skjer vanligvis hvis en regel uventet samsvarer med en enhet. For eksempel kan en dårlig skrevet regel matche både en SCSI-disk (som ønsket) og den tilsvarende generiske SCSI-enheten (feil) av leverandøren. Finn den krenkende regelen og gjør den mer spesifikk, ved hjelp av udevadm info kommandoen.
Dette kan være en annen manifestasjon av det forrige
problemet. Hvis ikke, og regelen din bruker sysfs
attributter, kan det være et
problem med kjernetiming, som bør fikses i senere kjerner.
Foreløpig kan du omgå det ved å lage en regel som venter på
den brukte sysfs
attributten og tilføye den til /etc/udev/rules.d/10-wait_for_sysfs.rules
filen (opprett denne filen hvis den ikke eksisterer). Gi
beskjed til LFS Utviklingsliste hvis du gjør det, og det
hjelper.
Videre tekst forutsetter at driveren er bygget statisk inn i kjernen eller allerede er lastet inn som en modul, og du allerede har sjekket at udev ikke oppretter en enhet med feil navn.
Udev har ingen nødvendig informasjon for å lage en
enhetsnode hvis en kjernedriver ikke eksporterer dataene
sine til sysfs
. Dette er
mest vanlig med tredjepartsdrivere utenfor kjernetreet. Lag
en statisk enhetsnode i /usr/lib/udev/devices
med passende
hoved/under nummer (se filen devices.txt
inne i kjernedokumentasjonen
eller dokumentasjon levert av tredjeparts
driverleverandør). Det statiske enhetsnoden vil bli kopiert
til /dev
av udev.
Dette skyldes det faktum at udev, etter design, håndterer uevents og laster moduler parallelt, og dermed i en uforutsigbar rekkefølge. Dette vil aldri bli “fikset”. Du bør ikke stole på kjerneenhetens navn er stabile. Lag heller dine egne regler som lager symbolkoblinger med stabile navn basert på noen stabile attributter til enheten, for eksempel et serienummer eller utdata fra forskjellige *_id-verktøy installert av udev. Se Section 9.4, “Administrere enheter” og Section 9.5, “Generell nettverkskonfigurasjon” for eksempler.
Ytterligere nyttig dokumentasjon er tilgjengelig på følgende nettsteder:
En brukerromsimplementering av devfs
http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf
sysfs
filsystemet
http://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf
Udev, som standard, navngir nettverksenheter i henhold til fastvare/BIOS data eller fysiske egenskaper som buss, spor eller MAC-adresse. Formålet med denne navnekonvensjonen er å sikre at nettverksenheter er navngitt konsekvent og ikke basert på tiden nettverkskortet var oppdaget. For eksempel på en datamaskin som har to nettverkskort laget av Intel og Realtek, nettverkskortet produsert av Intel kan bli eth0 og Realtek-kortet blir eth1. I noen tilfeller, etter en omstart kan kortene bli omnummerert omvendt.
I det nye navneskjemaet ville typiske nettverksenhetsnavn da være noe sånt som enp5s0 eller wlp3s0. Hvis denne navnekonvensjonen ikke er ønsket, kan det tradisjonelle navneskjemaet eller et tilpasset oppsett være implementert.
Det tradisjonelle navneskjemaet som bruker eth0, eth1, osv.
kan bli gjenopprettet ved å legge til net.ifnames=0
på kjernens
kommandolinje. Dette er mest passende for systemene som
bare har én Ethernet-enhet av samme type. Bærbare
datamaskiner har ofte flere ethernet-tilkoblinger som heter
eth0 og wlan0 og er også kandidater for denne metoden.
Kommandolinjen sendes i GRUB-konfigurasjonsfilen. Se
Section 10.4.4,
“Opprette GRUB konfigurasjonsfilen”.
Navneskjemaet kan tilpasses ved å lage tilpassete udev regler. Et skript er inkludert som genererer de første reglene. Generer disse reglene ved å kjøre:
bash /usr/lib/udev/init-net-rules.sh
Nå, inspiser /etc/udev/rules.d/70-persistent-net.rules
filen, for å finne ut hvilket navn som ble tildelt hvilken
nettverksenhet:
cat /etc/udev/rules.d/70-persistent-net.rules
I noen tilfeller som når MAC-adresser har blitt tildelt et nettverkskort manuelt eller i et virtuelt miljø som Qemu eller Xen, nettverksregelfilen kan bli generert fordi adresser ikke er konsekvent tildelt. I disse tilfellene kan denne metoden ikke bli brukt.
Filen begynner med en kommentarblokk etterfulgt av to linjer for hver NIC. Den første linjen for hvert NIC er en kommentert beskrivelse som viser dens maskinvare-IDer (f.eks. PCI leverandøren og enhets IDene, hvis det er et PCI-kort), sammen med driveren i parentes, hvis driveren kan bli funnet. Ingen maskinvare-IDer eller drivere brukes til å bestemme hvilket navn som skal gis grensesnittet; denne informasjonen er kun for referanse. Den andre linjen er udev regelen som samsvarer med dens NIC og faktisk tildeler det et navn.
Alle udev regler består av flere nøkler, atskilt med komma og valgfritt mellomrom. Denne regelens nøkler og en forklaring av hver av dem er som følger:
SUBSYSTEM=="net"
- Dette
forteller udev å ignorere enheter som ikke er
nettverkskort.
ACTION=="add"
- Dette
forteller udev å ignorere denne regelen for en
hendelse som ikke er en add ("remove" og "change"
hendelser , men trenger ikke å endre navn på
nettverksgrensesnitt).
DRIVERS=="?*"
- Dette
eksisterer slik at udev vil ignorer VLAN- eller et
bro undergrensesnitt (fordi disse undergrensesnittene
ikke har drivere). Disse undergrensesnittene hoppes
over på grunn av navnet som ville bli tildelt ville
kollidere med deres overordnede enheter.
ATTR{address}
- Verdien
av denne nøkkelen er NICs MAC adresse.
ATTR{type}=="1"
- Dette
sikrer at regelen kun samsvarer med det primære
grensesnittet for enkelte trådløse drivere som skaper
flere virtuelle grensesnitt. De sekundære
grensesnittene er hoppet over av samme grunn som VLAN
og bro undergrensesnitt er hoppet over: ellers ville
det vært en navnekollisjon.
NAME
- Verdien av denne
nøkkelen er navnet som udev vil tilordne til dette
grensesnittet.
Verdien av NAME
er den viktige
delen. Forsikre deg om at du vet hvilket navn som har blitt
tildelt hvert av nettverkskortene dine tidligere før du
fortsetter, og sørg for å bruke NAME
verdien når du opprette
konfigurasjonsfilene nedenfor.
Noe programvare som du kanskje vil installere senere (f.eks.
diverse mediespillere) forventer /dev/cdrom
og /dev/dvd
symbolkoblinger eksisterer, og å
peke på en CD-ROM- eller DVD-ROM-enhet. Dessuten kan det være
praktisk å sette referanser til disse symbolkoblingene i
/etc/fstab
. Udev kommer med et
skript som vil generere regelfiler for å lage disse
symbolkoblingene for deg, avhengig av egenskapene til hver
enhet, men du må bestemme hvilken av to operasjonsmoduser du
ønsker at skriptet skal bruke.
For det første kan skriptet operere i “by-path” modus (brukes som standard for USB- og FireWire-enheter), der reglene den oppretter avhenger av den fysiske banen til CD- eller DVD-enheten. For det andre kan den operere i “by-id” modus (standard for IDE- og SCSI-enheter), de reglene den oppretter avhenger av identifikasjonsstrenger som er lagret på selve CD eller DVD enheten. Banen bestemmes av udevs path_id skript, og identifikasjonsstrengene leses fra maskinvaren av ata_id eller scsi_id programmene, avhengig av hvilken type enhet du har.
Det er fordeler med hver tilnærming; riktig tilnærming til bruk vil avhenge av hva slags enhetsendringer som kan skje. Hvis du forventer at fysisk vei til enheten (det vil si portene og/eller sporene som den kobler til ) endres, for eksempel fordi du planlegger å flytte stasjonen til en annen IDE-port eller en annen USB-kontakt, så bør du bruke “by-id” modus. På den annen side, hvis du forventer at enhetens identifikasjon endres, for eksempel fordi det kan dø, og du vil erstatte den med en annen enhet med de samme egenskapene og som er koblet til de samme kontaktene, bør du bruke “by-path” modus.
Hvis en av endringene er mulig med stasjonen din, velg en modus basert på typen endring du forventer skal skje oftest.
Eksterne enheter (for eksempel en USB-tilkoblet CD-stasjon) bør ikke vedvarende bruke by-path, fordi hver gang enheten kobles til en ny ekstern port, vil dens fysiske bane endres. Alle eksternt tilkoblede enheter vil ha dette problemet hvis du skriver udev-regler som gjenkjenner dem på deres fysiske sti; problemet er ikke begrenset til CD og DVD-stasjoner.
Hvis du ønsker å se verdiene som udev-skriptene vil bruke,
for den aktuelle CD-ROM-enheten, finn den tilsvarende
katalogen under /sys
(f.eks.
kan dette være /sys/block/hdd
)
og kjør en kommando som ligner på følgende:
udevadm test /sys/block/hdd
Se på linjene som inneholder utdata fra forskjellige *_id programmer. “by-id” modus vil bruke ID_SERIAL verdien hvis den finnes og ikke er tom, ellers vil den bruke en kombinasjon av ID_MODEL og ID_REVISJON. “by-path” modus vil bruke ID_PATH verdien.
Hvis standardmodusen ikke passer for din situasjon, så kan
følgende modifikasjoner gjøres på /etc/udev/rules.d/83-cdrom-symlinks.rules
filen, som følgende (hvor mode
er en av “by-id”
eller “by-path”):
sed -e 's/"write_cd_rules"/"write_cd_rules mode
"/' \
-i /etc/udev/rules.d/83-cdrom-symlinks.rules
Merk at det ikke er nødvendig å lage regelfilene eller
symbolkoblingene på dette tidspunktet fordi du har
bind-montert vertens /dev
mappe
inn i LFS systemet og vi antar at symbolkoblingene finnes på
verten. Reglene og symbolkoblingene vil opprettes første gang
du starter opp LFS systemet.
Men hvis du har flere CD-ROM-enheter, kan symbolkoblingene
generert på det tidspunktet peke på andre enheter enn de
peker på hos verten din fordi enheter ikke oppdages i en
forutsigbar rekkefølge. Den første tildelingen opprettet når
du starter opp LFS systemet vil være stabile, så dette er
bare et problem hvis du trenger symbolkoblingene på begge
systemene til å peke på samme enhet. Hvis du trenger det,
inspiser (og muligens rediger) den genererte /etc/udev/rules.d/70-persistent-cd.rules
filen etter oppstart, for å sikre at de tilordnede
symbolkoblingene samsvarer med det du trenger.
Som forklart i Section 9.3,
“Oversikt over enhets- og modulhåndtering”,
rekkefølgen i hvilke enheter med samme funksjon vises i
/dev
er i hovedsak tilfeldig.
Hvis du for eksempel har et USB-webkamera og en TV-tuner,
noen ganger /dev/video0
refererer til kameraet og /dev/video1
refererer til tuneren, og noen
ganger etter en omstart endres rekkefølgen. For alle klasser
av maskinvare unntatt lydkort og nettverkskort kan dette
fikses ved å lage udev-regler for egendefinerte vedvarende
symbolkoblinger. Tilfellet med nettverkskort dekkes separat i
Section 9.5,
“Generell nettverkskonfigurasjon”, og
lydkortkonfigurasjon kan finnes i
BLFS.
For hver av enhetene dine som sannsynligvis vil ha dette
problemet (selv om problemet ikke eksisterer i din nåværende
Linux distribusjon), finn den tilhørende mappen under
/sys/class
eller /sys/block
. For videoenheter kan dette være
/sys/class/video4linux/video
. Finn ut
attributtene som identifiserer enheten unikt (vanligvis
fungerer, leverandør- og produkt-IDer og/eller serienumre):
X
udevadm info -a -p /sys/class/video4linux/video0
Skriv så regler som lager symbolkoblingene, f.eks.:
cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"
# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", SYMLINK+="tvtuner"
EOF
Resultatet er at /dev/video0
og
/dev/video1
enheter refererer
fortsatt tilfeldig til tuneren og webkameraet (og bør derfor
aldri brukes direkte), men det finnes symbolkoblinger
/dev/tvtuner
og /dev/webcam
som alltid peker på den rette
enheten.
Hvilke grensesnitt bringes opp og ned av nettverksskriptet
avhenger vanligvis av filene i /etc/sysconfig/
. Denne mappen bør inneholde
en fil for hvert grensesnitt som skal konfigureres, for
eksempel ifconfig.xyz
, hvor
“xyz” skal beskrive
nettverkskortet. Grensesnittnavnet (f.eks. eth0) er vanligvis
passende. Inne i denne filen er attributter til dette
grensesnittet, for eksempel dets IP adresse(r),
nettverksmasker og så videre. Det er nødvendig at stammen av
filnavnet er ifconfig.
Hvis prosedyren i forrige avsnitt ikke ble brukt, udev vil tildele nettverkskortgrensesnittnavn basert på systemets fysiske egenskaper som enp2s1. Hvis du ikke er sikker på hva grensesnittetnavnet ditt er, kan du alltid kjøre ip link eller ls /sys/class/net etter at du har startet opp systemet.
Grensesnittnavnene avhenger av implementeringen og konfigurasjon av udev nissen (daemon) som kjører på systemet. udev nissen for LFS (installert i Section 8.70, “Eudev-3.2.11”) vil ikke kjøre før LFS systemet er startet opp. Så det er upålitelig å bestemme grensesnittnavnene som brukes i LFS systemet ved å kjøre disse kommandoene på vertsdistroen, selv om det er i chroot miljøet.
Følgende kommando oppretter en eksempelfil for eth0 enheten med en statisk IP-adresse:
cd /etc/sysconfig/ cat > ifconfig.eth0
<< "EOF"ONBOOT=
EOFyes
IFACE=eth0
SERVICE=ipv4-static
IP=192.168.1.2
GATEWAY=192.168.1.1
PREFIX=24
BROADCAST=192.168.1.255
Verdiene i kursiv må endres i hver fil for å samsvare med riktig oppsett.
Hvis ONBOOT
variabelen er satt til
“yes” System V nettverksskript vil
hente opp nettverksgrensesnittkortet (NIC) under systemets
oppstartsprosess. Hvis satt til noe annet enn “yes”
NIC vil bli ignorert av nettverksskriptet og ikke automatisk
hentet frem. Grensesnittet kan startes eller stoppes manuelt
med ifup og
ifdown
kommandoene.
IFACE
variabelen definerer
grensesnittnavnet, for eksempel eth0. Det kreves for all
konfigurasjon av nettverksenhets filer. Filnavnet må samsvare
med denne verdien.
SERVICE
variabelen definerer
metoden som brukes for få IP adressen. LFS-Bootscripts pakken
har en modulær IP tildelingsformat, og oppretter flere filer
i /lib/services/
katalogen
tillater annen IP tildelingsmetoder. Dette brukes ofte for
dynamisk vertskonfigurasjon Protokoll (DHCP), som er
adressert i BLFS boken.
GATEWAY
variabelen skal inneholde
standard standardruter (gateway) IP adresse, hvis en er til
stede. Hvis ikke, så kommenter variabelen helt ut.
PREFIX
variabelen inneholder
antall biter som brukes i subnettet. Hver oktett i en
IP-adresse er 8 bits. Hvis subnettets nettmaske er
255.255.255.0, bruker den deretter de tre første oktettene
(24 bits) for å spesifisere nettverksnummeret. Hvis
nettmasken er 255.255.255.240, ville det være å bruke de
første 28 bitene. Prefikser lengre enn 24 biter er ofte brukt
av DSL- og kabelbaserte Internett-leverandører (ISP). I dette
eksemplet (PREFIX=24) er nettmasken 255.255.255.0. Juster
PREFIX
variabel i henhold til ditt
spesifikke undernett. Hvis det utelates, er PREFIX sin
standard 24.
For mer informasjon se ifup man side.
Systemet vil trenge noen midler for å få domenenavntjeneste
(DNS) navneoppløsning for å løse Internett domenenavn til IP
adresser, og omvendt. Dette oppnås best ved å plassere IP
adressen til DNS server, tilgjengelig fra Internett
leverandøren eller nettverksadministratoren, til /etc/resolv.conf
. Opprett filen ved å kjøre
følgende:
cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf
domain <Ditt domenenavn>
nameserver <IP adressen til din primære navneserver>
nameserver <IP adressen til din sekundære navneserver>
# End /etc/resolv.conf
EOF
domain
erklæringen kan utelates
eller erstattet med en search
erklæring. Se man siden for resolv.conf for flere detaljer.
Erstatt <IP adressen til din
navneserver>
med IP adressen til DNS som
passer best for oppsettet. Det vil ofte være mer enn én
oppføring (krever sekundære servere for reservefunksjon).
Hvis du bare trenger eller vil ha én DNS-server, fjern andre
nameserver linjen fra
filen. IP adressen kan også være en ruter på det lokale
nettverket.
Googles offentlige IPv4 DNS adresser er 8.8.8.8 og 8.8.4.4.
Under oppstartsprosessen vil filen /etc/hostname
brukes til å etablere
systemets vertsnavn.
Opprett /etc/hostname
filen og
skriv inn et vertsnavn ved å kjøre:
echo "<lfs>
" > /etc/hostname
<lfs>
må
erstattes med navnet til datamaskinen. Ikke skriv inn det
fullt kvalifiserte domenenavnet (FQDN) her. Den informasjonen
er i /etc/hosts
filen.
Bestem deg for IP adressen, fullt kvalifisert domenenavn
(FQDN) og mulige aliaser for bruk i filen /etc/hosts
. Syntaks er:
IP_addresse minvert.eksempel.org aliaser
Med mindre datamaskinen skal være synlig for Internett (dvs. det er et registrert domene og en gyldig blokk med tildelte IP adresser—de fleste brukere har ikke dette), sørg for at IP adressen er i den private nettverkets IP adresseområde. Gyldige områder er:
Privat nettverk Adresseområde Normalt prefiks
10.0.0.1 - 10.255.255.254 8
172.x.0.1 - 172.x.255.254 16
192.168.y.1 - 192.168.y.254 24
x kan være et hvilket som helst tall i området 16-31. y kan være et hvilket som helst tall i område 0-255.
En gyldig privat IP adresse kan være 192.168.1.1. Et gyldig FQDN for denne IPen kan være lfs.example.org.
Selv om du ikke bruker et nettverkskort, kreves det fortsatt et gyldig FQDN. Dette er nødvendig for at enkelte programmer skal fungere korrekt.
Opprett /etc/hosts
filen ved å
kjøre:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 <FQDN>
<HOSTNAME>
<192.168.1.1>
<FQDN>
<HOSTNAME>
[alias1] [alias2 ...]
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF
<192.168.1.1>
,
<FQDN>
, og
<HOSTNAME>
verdiene må være endret for spesifikke bruksområder eller
krav (hvis tildelt en IP-adresse av en
nettverks-/systemadministrator og maskinen kobles til en
eksisterende nettverk). De valgfrie aliasnavnene kan
utelates.
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 i LFS:
0: stopper datamaskinen
1: enkeltbrukermodus
2: reservert for tilpasning, ellers gjøres det det samme som 3
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 GNOME's gdm eller LXDE's lxdm)
6: starter datamaskinen på nytt
Klassisk ble kjørenivå 2 ovenfor definert som "flerbrukermodus uten nettverk", men dette var bare tilfelle for mange år siden da flere brukere kunne logge på et system koblet via serielle porter. I dagens miljø gir det ingen mening og vi betegner det nå som "reservert".
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:S06:once:/sbin/sulogin
s1:1:respawn:/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 rcS.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.
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 blir 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
), the
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.19.2 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@lists.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 the
/etc/sysconfig/rc.site
filen
ovenfor.
Under oppstartsskriptet udev
, er det 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
or running
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, bruk -t0 parameteren 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.
Skallprogrammet /bin/bash (heretter referert
som “skallet”) bruker en samling
oppstartsfiler for å hjelpe til å lag et miljø å kjøre i. Hver
fil har en spesifikk bruk og kan påvirke pålogging og
interaktive miljøer annerledes. Filene i /etc
mappen gir globale innstillinger. Hvis
en tilsvarende fil finnes i hjemmemappen, kan den overstyre de
globale innstillingene.
Et interaktivt påloggingsskall startes etter en vellykket
pålogging ved hjelp av /bin/login, ved å lese
/etc/passwd
filen. Et interaktivt
ikke-påloggingsskall startet på kommandolinjen (f.eks.,
[prompt]$
/bin/bash). Et
ikke-interaktiv skall er vanligvis tilstede når et skallskript
kjører. Det er ikke-interaktivt fordi det behandler et skript
og ikke venter på brukerinndata mellom kommandoer.
For mer informasjon, se info bash under Bash Startup Files and Interactive Shells seksjonen.
Filene /etc/profile
og
~/.bash_profile
leses når skallet
er startet som et interaktivt påloggingsskall.
Grunnfilen /etc/profile
nedenfor
setter noen miljøvariabler som er nødvendige for
morsmålsstøtte. Å sette de riktig resulterer i:
Utdataene fra programmer oversatt til morsmålet
Riktig klassifisering av tegn i bokstaver, sifre og andre klasser. Dette er nødvendig for bash å akseptere ordentlig ikke-ASCII tegn i kommandolinjer i ikke-engelske språk
Riktig alfabetisk sorteringsrekkefølge for landet
Passende standard papirstørrelse
Riktig formatering av penge-, tids- og datoverdier
Erstatt <ll>
nedenfor med koden på to bokstaver for ønsket språk (f.eks.,
“en”) og <CC>
med tobokstavskoden
for det aktuelle land (f.eks., “GB”).
<charmap>
bør
erstattes med den kanoniske tegntabellen for din valgte
lokalitet. Valgfri modifikatorer som f.eks “@euro”
kan også være tilstede.
Listen over alle lokaliteter som støttes av Glibc kan fås ved å kjøre følgende kommando:
locale -a
Tegntabeller kan ha en rekke aliaser, f.eks., “ISO-8859-1” er også referert til
som “iso8859-1” og “iso88591”. Noen applikasjoner kan
ikke håndtere de forskjellige synonymene riktig (f.eks. kreves
det at “UTF-8” er skrevet som “UTF-8”,
ikke “utf8”), så det er tryggest i de
fleste tilfeller for å velge det kanoniske navnet for en
bestemt lokalitet. Å bestemme det kanoniske navnet, kjør
følgende kommando, hvor <locale name>
er utdataen
gitt av locale -a
til din foretrukne lokalitet (“en_GB.iso88591” i vårt eksempel).
LC_ALL=<locale name>
locale charmap
For “en_GB.iso88591” lokaliteten, kommandoen over vil skrive ut:
ISO-8859-1
Dette resulterer i en endelig lokaleinnstilling på “en_GB.ISO-8859-1”. Det er viktig at lokaliteten funnet ved hjelp av heuristikken ovenfor testes på forhånd før det legges til Bash oppstartsfilene:
LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix
Kommandoene ovenfor skal skrive ut språknavnet, tegnkoding som brukes av lokaliteten, den lokale valutaen og prefikset før telefonnummeret for å ringe inn i landet. Hvis noen av kommandoene ovenfor mislykkes med en melding som ligner på den som vises nedenfor, betyr dette at lokaliteten din enten ikke var installert i Section 8.5, “Glibc-2.36” eller ikke støttes av standardinstallasjonen av Glibc.
locale: Cannot set LC_* to default locale: No such file or directory
Hvis dette skjer, bør du enten installere ønsket lokalitet ved å bruke localedef kommandoen, eller vurder å velge en annen lokalitet. Ytterligere instruksjoner forutsetter at det ikke er slike feilmeldinger fra Glibc.
Andre pakker kan også fungere feil (men kanskje ikke nødvendigvis vise eventuelle feilmeldinger) hvis lokalenavnet ikke oppfyller deres forventninger. I disse tilfellene, å undersøke hvordan andre Linux distribusjoner støtter lokaliteten din kan gi noe nyttig informasjon.
Når de riktige lokale innstillingene er bestemt, oppretter du
/etc/profile
filen:
cat > /etc/profile << "EOF"
# Begin /etc/profile
export LANG=<ll>_<CC>.<charmap><@modifiers>
# End /etc/profile
EOF
“C” (standard) og “en_US.utf8” (det anbefalte for engelske brukere i USA) lokalitetene er forskjellige. “C” bruker US-ASCII 7-biters tegnsett, og behandler byte med det høye bitsettet som ugyldige tegn. Det er derfor, f.eks ls kommandoen erstatter dem med spørsmålstegn i det lokalet. Også et forsøk på å sende post med slike tegn fra Mutt eller Pine resulterer i ikke-RFC samsvars meldinger som sendes (tegnsettet i den utgående posten er indikert som “unknown 8-bit”). Så du kan bruke “C” bare hvis du er sikker på at du aldri trenger 8-bits tegn.
UTF-8 baserte lokaliteter støttes ikke godt av noen programmer. Det pågår arbeid med å dokumentere og om mulig fikse slike problemer, se https://www.linuxfromscratch.org/blfs/view/11.2/introduction/locale-issues.html.
inputrc
filen er
konfigurasjonsfilen for readline biblioteket, som gir
redigeringsmuligheter mens brukeren skriver en linje fra
terminalen. Det fungerer ved å oversette tastaturinndata inn i
spesifikke handlinger. Readline brukes av bash og de fleste
andre skall som samt mange andre applikasjoner.
De fleste trenger ikke brukerspesifikk funksjonalitet så
kommandoen nedenfor skaper en global /etc/inputrc
som brukes av alle som logger
på. Hvis du senere bestemmer deg for at du må overstyre
standardinnstillingene på et per bruker grunnlag, kan du lage
en .inputrc
fil i brukerens
hjemmemappe med de modifiserte tilordningene.
For mer informasjon om hvordan du redigerer inputrc
filen, se info bash under Readline Init File seksjonen.
info readline er
også en god informasjonskilde.
Nedenfor er en generisk global inputrc
sammen med kommentarer for å forklare
hva de ulike alternativene gjør. Merk at kommentarer ikke kan
være på den samme linjen som kommandoer. Opprett filen ved å
bruke følgende kommando:
cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>
# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off
# Enable 8-bit input
set meta-flag On
set input-meta On
# Turns off 8th bit stripping
set convert-meta Off
# Keep the 8th bit for display
set output-meta On
# none, visible or audible
set bell-style none
# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word
# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line
# End /etc/inputrc
EOF
shells
filen inneholder en liste
over påloggingsskall på systemet. Programmer bruker denne filen
til å bestemme om et skall er gyldig. For hvert skall skal det
være en enkelt linje tilstede, bestående av skallets bane i
forhold til roten av katalogstrukturen (/).
For eksempel konsulteres denne filen av chsh for å avgjøre om en uprivilegert bruker kan endre påloggingsskallet for sin egen konto. Hvis kommandonavnet ikke er oppført, vil brukeren bli nektet evnen til å skifte skall.
Det er et krav for applikasjoner som f.eks GDM som ikke fyller ut ansiktsnettleseren
(face browser) hvis den ikke finner /etc/shells
, eller FTP nisser (daemons) som
tradisjonelt nekter brukere tilgang med skall som ikke er
inkludert i denne filen.
cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
# End /etc/shells
EOF
Det er på tide å gjøre LFS systemet oppstartbart. Dette
kapittelet diskuterer å opprette /etc/fstab
filen, bygge en kjerne for det nye
LFS systemet, og installere GRUB oppstartslasteren slik at LFS
systemet kan velges for oppstart ved oppstart.
/etc/fstab
filen brukes av noen
programmer til bestemme hvor filsystemer skal monteres som
standard, i hvilken rekkefølge, og hvilke som må kontrolleres
(for integritetsfeil) før montering. Lag en ny filsystemtabell
som denne:
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
/dev/<xxx>
/ <fff>
defaults 1 1
/dev/<yyy>
swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF
Erstatt <xxx>
,
<yyy>
, og
<fff>
med
verdiene som passer for systemet, for eksempel, sda2
, sda5
, og
ext4
. For detaljer om de seks
feltene i denne filen, se man 5
fstab.
Filsystemer med MS-DOS eller Windows opprinnelse (dvs. vfat,
ntfs, smbfs, cifs, iso9660, udf) trenger et spesielt
alternativ, utf8, for ikke-ASCII tegn i filnavn som skal tolkes
riktig. For ikke-UTF-8-lokaliteter, verdien av iocharset
bør settes til å være det samme som
tegnsettet for lokaliteten, justert på en slik måte at kjernen
forstår det. Dette fungerer hvis den relevante
tegnsettdefinisjonen (funnet under Filsystemer -> Støtte for
morsmål ved konfigurering av kjernen) har blitt kompilert inn i
kjernen eller bygget som en modul. Imidlertid, hvis tegnsettet
til lokaliteten er UTF-8, det tilsvarende alternativet
iocharset=utf8
ville gjøre at
filsystemet skille mellom store og små bokstaver. For å fikse
dette, bruk spesialalternativet utf8
i stedet for iocharset=utf8
, for UTF-8 lokaliteter.
“codepage” alternativet er også
nødvendig for vfat- og smbfs-filsystemer. Det bør settes til
tegnsettnummeret som brukes under MS-DOS i ditt land. For
eksempel, for å montere USB-flash-stasjoner, ville en
ru_RU.KOI8-R bruker trenge følgende i alternativdelen av
monteringslinjen i /etc/fstab
:
noauto,user,quiet,showexec,codepage=866,iocharset=koi8r
Det tilsvarende opsjonsfragmentet for ru_RU.UTF-8 brukere er:
noauto,user,quiet,showexec,codepage=866,utf8
Merk at å bruke iocharset
er
standard for iso8859-1
(så
filsystemet skiller mellom store og små bokstaver) , og
utf8
alternativet forteller kjernen
å konvertere filnavnene ved hjelp av UTF-8 slik at de kan være
tolket i UTF-8 lokaliteten.
Det er også mulig å spesifisere standard kodesett og iocharset
verdier for noen filsystemer under kjernekonfigurasjon. De
relevante parameterne er navngitt “Standard NLS
alternativ” (CONFIG_NLS_DEFAULT)
, “Standard eksternt NLS
alternativ” (CONFIG_SMB_NLS_DEFAULT
), “Standard kodeside for
FAT” (CONFIG_FAT_DEFAULT_CODEPAGE
), and “Standard iocharset for
FAT” (CONFIG_FAT_DEFAULT_IOCHARSET
). Det er ingen
måte å spesifisere disse innstillingene for ntfs filsystem på
kjernekompileringstidspunktet.
Det er mulig å gjøre ext3 filsystemet pålitelig på tvers av
strømfeil for enkelte harddisktyper. For å gjøre dette, legg
til barrier=1
monteringsalternativet til den aktuelle oppføringen i
/etc/fstab
. For å sjekke om
diskstasjonen støtter dette alternativet, kjør
hdparm på den aktuelle diskstasjonen. For eksempel hvis:
hdparm -I /dev/sda | grep NCQ
returnerer ikke-tom utdata, støttes alternativet.
Merk: Logical Volume Management (LVM) baserte partisjoner kan
ikke bruke barrier
valget.
Linux pakken inneholder Linux kjernen.
Å bygge kjernen innebærer noen få trinn—konfigurasjon,
kompilering og installasjon. Les README
filen i kjernekildetreet for
alternative metoder til måten denne boken konfigurerer
kjernen på.
Forbered deg på kompilering ved å kjøre følgende kommando:
make mrproper
Dette sikrer at kjernetreet er helt rent. Kjerne teamet anbefaler at denne kommandoen utstedes før hver kjernekompilering. Ikke stol på at kildetreet er rent etter utpakking.
Det er flere måter å konfigurere kjernealternativene på. Vanligvis, gjøres dette for eksempel gjennom et menydrevet grensesnitt:
make menuconfig
Betydningen av valgfrie make miljøvariabler:
LANG=<host_LANG_value>
LC_ALL=
Dette etablerer lokalinnstillingen til den som brukes på verten. Dette kan være nødvendig for et riktig menyconfig ncurses grensesnitt linjetegning på en UTF-8 linux tekstkonsoll.
Hvis brukt, sørg for å erstatte <host_LANG_value>
med verdien av $LANG
variabel fra verten din. Du kan alternativt bruke
vertens verdi av $LC_ALL
eller $LC_CTYPE
.
Dette starter et ncurses menydrevet grensesnitt. For andre (grafiske) grensesnitt, skriv make help.
For generell informasjon om kjernekonfigurasjon se https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt. BLFS har litt informasjon angående spesielle kjernekonfigurasjonskrav for pakker utenfor av LFS på https://www.linuxfromscratch.org/blfs/view/11.2/longindex.html#kernel-config-index. Ytterligere informasjon om konfigurering og bygging av kjernen finner du på http://www.kroah.com/lkn/
Et godt utgangspunkt for å sette opp kjernekonfigurasjonen er å kjøre make defconfig. Dette vil sette grunnleggende konfigurasjon til en god tilstand som tar din nåværende systemarkitektur i betraktning.
Sørg for å aktivere/deaktivere/stille inn følgende funksjoner, ellers kan systemet ikke fungere riktig eller starte opp i det hele tatt:
General setup --> [ ] Compile the kernel with warnings as errors [CONFIG_WERROR] < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS] Device Drivers ---> Graphics support ---> Frame buffer Devices ---> [*] Support for frame buffer devices ---- Generic Driver Options ---> [ ] Support for uevent helper [CONFIG_UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS] [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT]
Aktiver noen tilleggsfunksjoner hvis du bygger et 64-bit
system. Hvis du bruker menuconfig, aktiver dem i
rekkefølgen CONFIG_PCI_MSI
først,
deretter CONFIG_IRQ_REMAP
, til sist
CONFIG_X86_X2APIC
fordi kun et alternativ vises etter at avhengighetene er
valgt.
Processor type and features ---> [*] Support x2apic [CONFIG_X86_X2APIC] Memory Management options ---> [ ] Enable userfaultfd() system call [CONFIG_USERFAULTFD] Device Drivers ---> [*] PCI Support ---> [CONFIG_PCI] [*] Message Signaled Interrupts (MSI and MSI-X) [CONFIG_PCI_MSI] [*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT] [*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]
Det er flere andre alternativer som kan være ønsket avhengig av kravene til systemet. For en liste over nødvendige alternativer for BLFS pakker, se BLFS Indeks over kjerneinnstillinger (https://www.linuxfromscratch.org/blfs/view/11.2/longindex.html#kernel-config-index).
Hvis vertsmaskinvaren din bruker UEFI og du ønsker å starte opp LFS-system med det, bør du justere noen kjernekonfigurasjon som på følgende BLFS side.
Begrunnelsen for de ovennevnte konfigurasjonselementene:
Compile
the kernel with warnings as errors
Dette kan forårsake bygningsfeil hvis kompilatoren og/eller konfigurasjonen er forskjellig fra kjernens utviklere.
Enable
kernel headers through
/sys/kernel/kheaders.tar.xz
Dette vil kreve cpio for å bygge kjernen. cpio is not installed by LFS.
Support
for uevent helper
Å ha dette alternativet satt kan forstyrre enhetens behandling ved bruk av Udev/Eudev.
Maintain a
devtmpfs
Dette vil opprette automatiserte enhetsnoder som er befolket av kjerne, selv uten at Udev kjører. Udev kjører så på toppen av dette, administrere tillatelser og legge til symbolkoblinger. Denne konfigurasjonen element er nødvendig for alle brukere av Udev/Eudev.
Automount
devtmpfs at /dev
Dette vil montere kjernevisningen til enhetene på /dev ved bytte til rotfilsystem rett før start av init.
Support
x2apic
Støtte for å kjøre avbruddskontrolleren for 64-bit x86 prosessorer i x2APIC-modus. x2APIC kan være aktivert av fastvare på 64-bit x86-systemer, og en kjerne uten dette alternativet aktivert vil få panikk ved oppstart hvis x2APIC er aktivert av fastvare. Dette alternativet har ingen effekt, men gjør heller ingen skade hvis x2APIC er deaktivert av fastvare.
Enable
userfaultfd() system call
Hvis dette alternativet er aktivert, er det et sikkerhetsproblem som ikke er løst i Linux-5.19.2 som kan utnyttes. Deaktiver dette alternativet for å unngå sårbarheten. Dette systemanropet brukes ikke av LFS eller BLFS.
Alternativt, make
oldconfig er kanskje mer hensiktsmessig i
noen situasjoner. Se README
filen for mer informasjon.
Hvis ønskelig, hopp over kjernekonfigurasjonen ved å kopiere
kjernens konfigurasjonsfil, .config
, fra vertssystemet (forutsatt at
den er tilgjengelig) til den utpakkede linux-5.19.2
mappen. Derimot, vi anbefaler
ikke dette alternativet. Det er ofte bedre å utforske alle
konfigurasjonsmenyer og lage kjernekonfigurasjonen fra
grunnen av.
Kompiler kjernebildet og modulene:
make
Hvis du bruker kjernemoduler, modulkonfigurasjon i
/etc/modprobe.d
kan være
nødvendig. Informasjon knyttet til moduler og
kjernekonfigurasjon er lokalisert i Section 9.3,
“Oversikt over enhets- og modulhåndtering” og
kjerne dokumentasjon i linux-5.19.2/Documentation
mappen. Også,
modprobe.d(5)
kan være av
interesse.
Med mindre modulstøtte er deaktivert i kjernekonfigurasjonen, installere modulene med:
make modules_install
Etter at kjernekompileringen er fullført, er flere trinn
nødvendig for å fullføre installasjonen. Noen filer må
kopieres til /boot
mappen.
Hvis vertssystemet har en separat /boot partisjon, kopieres
filene nedenfor dit. Den enkleste måten å gjøre det på er å
binde /boot på verten (utenfor chroot) til /mnt/lfs/boot
før du fortsetter. Som root
user in the vertssytemet:
mount --bind /boot /mnt/lfs/boot
Stien til kjernebildet kan variere avhengig av plattformen som er brukt. Filnavnet nedenfor kan endres for å passe din smak, men stammen av filnavnet skal være vmlinuz for å være kompatibel med det automatiske oppsettet av oppstartsprosessen beskrevet i neste avsnitt. De følgende kommandoene antar et x86 arkitektur:
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.19.2-lfs-11.2
System.map
er en symbolfil for
kjernen. Den kartlegger funksjonsinngangspunktene til hver
funksjon i kjernens API, samt adressene til
kjernedatastrukturene for kjøringen av kjernen. Den brukes
som en ressurs når man undersøker kjerneproblemer. Utfør
følgende kommando for å installere kartfilen:
cp -iv System.map /boot/System.map-5.19.2
Kjernens konfigurasjonsfil .config
produsert av make menuconfig steget
ovenfor inneholder alle konfigurasjonsvalgene for kjernen som
nettopp ble kompilert. Det er en god idé å beholde denne
filen for fremtidig referanse:
cp -iv .config /boot/config-5.19.2
Installer dokumentasjonen for Linux kjernen:
install -d /usr/share/doc/linux-5.19.2 cp -r Documentation/* /usr/share/doc/linux-5.19.2
Det er viktig å merke seg at filene i kjernekildens mappen ikke eies av root. Når en pakke pakkes ut som bruker root som vi gjorde inne i chroot), filene har bruker- og gruppe-IDer for hva som helst de var på pakkerens datamaskin. Dette er vanligvis ikke et problem for enhver pakke som skal installeres fordi kildetreet blir fjernet etter installasjonen. Imidlertid er Linux kildetreet ofte beholdt i lang tid. På grunn av dette er det en sjanse at hvilken bruker-ID pakkeren brukte vil bli tildelt noen på maskinen. Den personen ville da ha skrivetilgang til kjernens kilde.
I mange tilfeller må konfigurasjonen av kjernen være oppdatert for pakker som vil bli installert senere i BLFS. I motsetning til andre pakker, er det ikke nødvendig å fjerne kjernekildetreet etter at den nybygde kjernen er installert.
Hvis kjernekildetreet skal beholdes, kjør chown -R 0:0 på
linux-5.19.2
mappen å
forsikre seg om at alle filer eies av brukeren root.
Noe kjernedokumentasjon anbefaler å opprette en
symbolkobling fra /usr/src/linux
som peker på kjernens
kildemappe. Dette er spesifikt for kjerner før 2.6-serien
og må ikke opprettes
på et LFS system, for det kan forårsake problemer for
pakker du kanskje ønsker å bygge når basis LFS systemet er
fullstendig.
Deklarasjonene i systemets include
mappe (/usr/include
) bør alltid være de som Glibc ble
kompilert mot, det vil si de desinfiserte deklarasjonene
installert i Section 5.4,
“Linux-5.19.2 API Headers”. Derfor bør de
aldri erstattes av
enten de rå kjernedeklarasjonene eller andre kjernerensede
deklarasjoner.
Mesteparten av tiden lastes Linux moduler automatisk, men
noen ganger trenger den en bestemt retning. Programmet som
laster moduler, modprobe eller insmod, bruker /etc/modprobe.d/usb.conf
for dette
formålet. Denne filen må opprettes slik at hvis USB-driverne
(ehci_hcd, ohci_hcd og uhci_hcd) har blitt bygget som
moduler, vil de bli lastet inn i riktig rekkefølge; ehci_hcd
må lastes før ohci_hcd og uhci_hcd i rekkefølge for å unngå
at det sendes ut en advarsel ved oppstart.
Opprett en ny fil /etc/modprobe.d/usb.conf
ved å kjøre
følgende:
install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf
install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
# End /etc/modprobe.d/usb.conf
EOF
Inneholder alle konfigurasjonsvalgene for kjernen |
|
Motoren til Linux systemet. Når du slår på datamaskinen, er kjernen den første delen av operativsystemet som blir lastet. Den oppdager og initialiserer alle komponenter i datamaskinens maskinvare, gjør deretter disse komponentene tilgjengelige som et tre med filer til programvarer og forvandler en enkelt CPU til en multitasking-maskin med å kjøre mange programmer tilsynelatende samtidig |
|
En liste over adresser og symboler; den kartlegger inngangspunktene og adresser til alle funksjonene og datastrukturene i kjernen |
Hvis systemet ditt har UEFI støtte og du ønsker å starte LFS med UEFI, bør du hoppe over denne siden og konfigurere GRUB med UEFI støtte ved å bruke instruksjonene i BLFS siden.
Å konfigurere GRUB feil kan gjøre systemet ditt ubrukelig uten en alternativ oppstartsenhet som en CD-ROM eller oppstartbar USB-stasjon. Denne delen er ikke nødvendig for å starte opp LFS systemet. Du kan bare endre din nåværende oppstartslaster, f.eks. Grub-Legacy, GRUB2 eller LILO.
Sørg for at en nødoppstartsdiskett er klar til å “redde”
datamaskinen hvis datamaskinen blir ubrukelig
(ikke-oppstartbar). Hvis du ikke allerede har en
oppstartsenhet, kan du opprette en. For at prosedyren
nedenfor skal fungere, så må du hoppe til BLFS og installere
xorriso
fra
libisoburn pakken.
cd /tmp grub-mkrescue --output=grub-img.iso xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso
GRUB bruker sin egen navnestruktur for stasjoner og
partisjoner i formen (hdn,m), hvor n er harddisknummeret og
m er
partisjonensnummeret. Harddisknummeret starter fra null, men
partisjonsnummeret starter fra en for vanlige partisjoner og
fem for utvidede partisjoner. Merk at dette er forskjellig
fra tidligere versjoner hvor begge tallene startet fra null.
For eksempel partisjon sda1
er
(hd0,1) for GRUB og
sdb3
er (hd1,3). I motsetning til Linux
anser ikke GRUB CD-ROM-stasjoner som harddisker. For eksempel
hvis du bruker en CD på hdb
og
en ekstra harddisk på hdc
, vil
den andre harddisken fortsatt være (hd1).
GRUB fungerer ved å skrive data til det første fysiske sporet til en hardisk. Dette området er ikke en del av noe filsystem. programmene der gir tilgang til GRUB moduler i oppstartspartisjonen. Standardplasseringen er /boot/grub/.
Plasseringen av oppstartspartisjonen er et valg av brukeren
som påvirker konfigurasjonen. En anbefaling er å ha en egen
liten (foreslått størrelse er 200 MB) partisjon kun for
oppstartsinformasjon. På den måten hver bygging, enten LFS
eller en kommersiell distro, kan få tilgang til den samme
oppstartsfilen og tilgang kan gjøres fra hvilket som helst
oppstartssystem. Hvis du velger å gjøre dette må du montere
den separate partisjonen, flytte alle filene i nåværende
/boot
mappen (f.eks
linuxkjernen du nettopp bygde i forrige seksjon) til den nye
partisjonen. Du må da avmontere partisjonen og montere den på
nytt som /boot
. Hvis du gjør
dette, sørg for å oppdatere /etc/fstab
.
Bruk av gjeldende lfs partisjon vil også fungere, men konfigurasjon for flere systemer er vanskeligere.
Bruk informasjonen ovenfor, finn ut hva som er riktig
designator for rotpartisjonen (eller oppstartspartisjonen,
hvis en separat er brukt). For det følgende eksempelet antas
det at rot (eller separat oppstart) partisjon er sda2
.
Installer GRUB filene i /boot/grub
og sett opp oppstartssporet:
Følgende kommando vil overskrive gjeldende oppstartslaster. Ikke kjør kommandoen hvis dette ikke er ønsket, for eksempel hvis du bruker en tredjeparts boot manager for å administrere Master Boot Record (MBR).
grub-install /dev/sda
Hvis systemet har blitt startet opp med UEFI, grub-install vil prøve å
installere filer for x86_64-efi målet, men disse
filene er ikke installert i
Chapter 8. Hvis dette er tilfelle, legg til
--target i386-pc
til kommandoen
ovenfor.
Generer /boot/grub/grub.cfg
:
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 5.19.2-lfs-11.2" {
linux /boot/vmlinuz-5.19.2-lfs-11.2 root=/dev/sda2 ro
}
EOF
Fra GRUB sitt perspektiv, kjernefilene er i forhold til partisjonen som brukes. Hvis du brukte en separat /boot-partisjon, fjern /boot fra ovenstående linux linjen. Du må også endre set root linjen for å peke på oppstartspartisjonen.
GRUB-betegnelsen for en partisjon kan endres hvis du la til
eller fjernet noen disker (inkludert flyttbare disker som
USB-enheter). Endringen kan forårsake oppstartsfeil pga
grub.cfg
refererer til noen
“gamle” betegnelser. Hvis du
ønsker å unngå et slikt problem, kan du bruke UUID for
partisjon og filsystem i stedet for GRUB betegnelser til å
angi en partisjon. Kjør lsblk
-o UUID,PARTUUID,PATH,MOUNTPOINT for å vise
UUID-ene til filsystemene dine (i UUID
kolonnen) og partisjoner (i
PARTUUID
kolonnen). Bytt
deretter ut set root=(hdx,y)
med search --set=root --fs-uuid
, og erstatt
<UUID av filsystemet der
kjernen er installert>
root=/dev/sda2
med
root=PARTUUID=
.
<UUID av partisjonen der LFS er
bygget>
Merk at partisjonens UUID og filsystemets UUID i denne
partisjonen er helt annerledes. Noen nettressurser kan
instruere deg om å bruke root=UUID=
i stedet for <filesystem
UUID>
root=PARTUUID=
, men å gjøre det vil kreve en
initramfs som er utenfor omfanget av LFS.
<partition
UUID>
Navnet på enhetsnoden for en partisjon i /dev
kan også endres (mer usannsynlig enn
GRUB-betegnelsesendring). Du kan også bytte ut stier til
enhetsnoder som /dev/sda1
med
PARTUUID=
, in <partition
UUID>
/etc/fstab
, for å unngå en potensiell
oppstartsfeil i tilfelle enhetens nodenavn er endret.
GRUB er et ekstremt kraftig program og det gir en enorm antall alternativer for oppstart fra et bredt utvalg av enheter, operativ systemer og partisjonstyper. Det er også mange muligheter for tilpasning som grafiske splash-skjermer, avspilling av lyder, museinngang, etc. Detaljer om disse alternativene er utenfor rammen av disse introduksjonene.
Det er en kommando, grub-mkconfig, som kan skrive en konfigurasjonsfil automatisk. Den bruker et sett med skript i /etc/grub.d/ og vil ødelegge eventuelle tilpasninger du gjør. Disse skriptene er først og fremst designet for distribusjoner uten kilder og anbefales ikke for LFS. Hvis du installerer en kommersiell Linux distribusjon, er det en god sjanse at dette programmet skal kjøres. Sørg for å sikkerhetskopiere grub.cfg filen.
Bra gjort! Det nye LFS systemet er installert! Vi ønsker deg mye suksess med ditt skinnende nye spesialbygde Linux-system.
Det kan være lurt å lage en /etc/lfs-release
fil. Ved å ha denne filen,
er det veldig lett for deg (og for oss hvis du trenger å be om
hjelp på et tidspunkt) å finne ut hvilken LFS versjon som er
installert på systemet. Opprett denne filen med å kjøre:
echo 11.2 > /etc/lfs-release
To filer som beskriver det installerte systemet kan brukes av pakker som kan installeres på systemet senere, enten i binær form eller ved å bygge dem.
Den første viser statusen til ditt nytt system med hensyn til Linux Standards Base (LSB). For å lage denne filen, kjør:
cat > /etc/lsb-release << "EOF" DISTRIB_ID="Linux From Scratch" DISTRIB_RELEASE="11.2" DISTRIB_CODENAME="<your name here>" DISTRIB_DESCRIPTION="Linux From Scratch" EOF
Den andre inneholder omtrent samme informasjon, og brukes av systemd og noen grafiske skrivebordsmiljøer. For å lage denne filen, kjør:
cat > /etc/os-release << "EOF" NAME="Linux From Scratch" VERSION="11.2" ID=lfs PRETTY_NAME="Linux From Scratch 11.2" VERSION_CODENAME="<your name here>" EOF
Sørg for å sette inn en form for tilpasning for feltene 'DISTRIB_CODENAME' og 'VERSION_CODENAME' for å gjøre systemet ditt unikt.
Nå som du er ferdig med boken, ønsker du å bli regnet som en LFS bruker? Gå over til https://www.linuxfromscratch.org/cgi-bin/lfscounter.php og registrer deg som LFS bruker ved å skrive inn navnet ditt og den første LFS versjonen du har brukt.
La oss restarte inn i LFS nå.
Nå som all programvaren er installert, er det på tide å starte datamaskinen din på nytt. Du bør imidlertid være klar over et par ting. Systemet du har skapt i denne boken er ganske minimal, og vil mest sannsynlig ikke ha funksjonaliteten du trenger for å kunne fortsette fremover. Ved å installere noen ekstra pakker fra BLFS boken mens du fortsatt er i det nåværende chroot miljøet, kan du etterlate deg selv i en mye bedre posisjon til å fortsette når du starter på nytt i den nye LFS installasjonen. Her er noen forslag:
En tekstnettleser som f.eks Lynx lar deg enkelt vise BLFS boken i en virtuell terminal, mens du bygger pakker i en annen.
make-ca pakken vil tillate deg å sette opp lokale pålitelige ankersertifikater, slik at systemet kan bekrefte SSL-sertifikater levert av eksterne servere (for eksempel et nettsted som bruker HTTPS).
GPM pakken vil tillate deg til å utføre kopier/lim inn handlinger i dine virtuelle terminaler.
Hvis du er i en situasjon med statisk IP-konfigurasjon som ikke oppfyller nettverkskravene dine, installerer en pakke som for eksempel dhcpcd eller klientdelen av dhcp kan være nyttig.
Installere
sudo kan være nyttig for å bygge pakker som en
ikke-root
bruker og
enkelt installere de resulterende pakker i ditt nye
system.
Hvis du ønsker å få tilgang til det nye systemet fra et eksternt system i et komfortabelt GUI-miljø, installer openssh.
For å gjøre det enklere å hente filer over internett, installer wget.
For å koble til et trådløst tilgangspunkt for nettverk, installere wpa_supplicant.
Installer firmwares hvis kjernendriveren for maskinvaren din krever noe fastvare for å fungere ordentlig.
Til slutt en gjennomgang av følgende konfigurasjonsfiler er også passende på dette punktet.
/etc/bashrc
/etc/dircolors
/etc/fstab
/etc/hosts
/etc/inputrc
/etc/profile
/etc/resolv.conf
/etc/vimrc
/root/.bash_profile
/root/.bashrc
/etc/sysconfig/ifconfig.eth0
Nå som vi har sagt det, la oss gå videre til å starte opp vår skinnende nye LFS installasjon for første gang! Første gå ut av chroot-miljøet:
logout
Deretter avmonterer de virtuelle filsystemene:
umount -v $LFS/dev/pts umount -v $LFS/dev umount -v $LFS/run umount -v $LFS/proc umount -v $LFS/sys
Hvis flere partisjoner ble opprettet, avmonter den andre partisjoner før du demonterer den viktigste, slik som dette:
umount -v $LFS/usr umount -v $LFS/home umount -v $LFS
Avmonter selve LFS filsystemet:
umount -v $LFS
Start nå systemet på nytt med:
shutdown -r now
Forutsatt at GRUB oppstartslasteren ble satt opp som skissert tidligere, er menyen satt til å starte opp LFS 11.2 automatisk.
Når omstarten er fullført, er LFS systemet klart til bruk og mer programvare kan legges til for å passe dine behov.
Takk for at du leste denne LFS boken. Vi håper at du fant denne boken nyttig og har lært mer om systemets opprettelsesprosess.
Nå som LFS systemet er installert, lurer du kanskje på “Hva nå?” For å svare på det spørsmålet har vi satt sammen en liste over ressurser for deg.
Vedlikehold
Feil og sikkerhetsmeldinger rapporteres regelmessig for all programvare. Siden et LFS system er kompilert fra kilden, er det opp til deg å holde det ajour med slike rapporter. Det er flere nettressurser som sporer slike rapporter, hvorav noen er vist nedenfor:
CERT (Computer Emergency Response Team)
CERT har en E-postliste som publiserer sikkerhetsvarsler vedr ulike operativsystemer og applikasjoner. Abonnementsinformasjon er tilgjengelig i http://www.us-cert.gov/cas/signup.html.
Bugtraq
Bugtraq er en fullstendig avslørende E-postliste for datasikkerhet. Den publiserer nylig oppdagede sikkerhetsproblemer, og noen ganger potensielle fikser for dem. Abonnementsinformasjon er tilgjengelig på http://www.securityfocus.com/archive.
Beyond Linux From Scratch
Boken Beyond Linux From Scratch dekker installasjons prosedyrer for et bredt spekter av programvare utenfor omfanget av LFS boken. BLFS prosjektet ligger på https://www.linuxfromscratch.org/blfs/view/11.2/.
LFS Tips
LFS tipsene er en samling pedagogiske dokumenter sendt inn av frivillige i LFS miljøet. Hintene er tilgjengelige på https://www.linuxfromscratch.org/hints/downloads/files/.
E-postlister
Det er flere LFS E-postlister du kan abonnere på hvis du har behov for hjelp, ønsker å holde deg oppdatert med den siste utviklingen, ønsker å bidra til prosjektet, med mer. Se Chapter 1 - Mailing Lists for mer informasjon.
Linux dokumentasjonsprosjektet
Målet med Linux dokumentasjonsprosjektet (TLDP) er å samarbeide om alle problemene med Linux dokumentasjon. TLDP funksjonene en stor samling av HOWTOer, guider og man sider. Den ligger på http://www.tldp.org/.
ABI |
Binært applikasjonsgrensesnitt (Application Binary Interface) |
ALFS |
Automatisert Linux fra bunnen (Automated Linux From Scratch) |
API |
Applikasjonsprogrammeringsgrensesnitt (Application Programming Interface) |
ASCII |
Amerikansk standardkode for informasjonsutveksling (American Standard Code for Information Interchange) |
BIOS |
Grunnleggende system for inndata/utdata (Basic Input/Output System) |
BLFS |
Utover Linux fra bunnen (Beyond Linux From Scratch) |
BSD |
Berkeley programvaredistribusjon (Berkeley Software Distribution) |
chroot |
endre rot (change root) |
CMOS |
Komplementær metalloksyd halvleder (Complementary Metal Oxide Semiconductor) |
COS |
Tjenesteklasse (Class Of Service) |
CPU |
Sentral prosesseringsenhet (Central Processing Unit) |
CRC |
Syklisk redundanssjekk (Cyclic Redundancy Check) |
CVS |
System for samtidige versjoner (Concurrent Versions System) |
DHCP |
Dynamisk vertskonfigurasjonsprotokoll (Dynamic Host Configuration Protocol) |
DNS |
Domenenavntjeneste (Domain Name Service) |
EGA |
Forbedret grafikkadapter (Enhanced Graphics Adapter) |
ELF |
Kjørbart og koblingsbart format (Executable and Linkable Format) |
EOF |
Slutt på fil (End of File) |
EQN |
ligning (equation) |
ext2 |
andre utvidede filsystemet (second extended file system) |
ext3 |
tredje utvidede filsystemet (third extended file system) |
ext4 |
fjerde utvidede filsystemet (fourth extended file system) |
FAQ |
Ofte stilte spørsmål (Frequently Asked Questions) |
FHS |
Standard for Filsystemhierarkiet (Filesystem Hierarchy Standard) |
FIFO |
Først inn først ut (First-In, First Out) |
FQDN |
Fullt kvalifisert domenenavn (Fully Qualified Domain Name) |
FTP |
Filoverføringsprotokoll (File Transfer Protocol) |
GB |
Gigabyte (Gigabytes) |
GCC |
GNU kompilatorsamling (GNU Compiler Collection) |
GID |
Gruppeidentifikator (Group Identifier) |
GMT |
Greenwich gjennomsnittstid (Greenwich Mean Time) |
HTML |
Hypertekst markeringsspråk (Hypertext Markup Language) |
IDE |
Integrert drivelektronikk (Integrated Drive Electronics) |
IEEE |
Institutt for elektriske og elektroniske ingeniører (Institute of Electrical and Electronic Engineers) |
IO |
Inndata/utdata (Input/Output) |
IP |
Internett protokoll (Internet Protocol) |
IPC |
Kommunikasjon mellom prosesser (Inter-Process Communication) |
IRC |
Internett relé nettprat (Internet Relay Chat) |
ISO |
Internasjonal organisasjon for standardisasjon (International Organization for Standardization) |
ISP |
Internett tjenesteleverandør (Internet Service Provider) |
KB |
Kilobyte (Kilobytes) |
LED |
Lysemitterende diode (Light Emitting Diode) |
LFS |
Linux fra bunnen (Linux From Scratch) |
LSB |
Linux standardbase (Linux Standard Base) |
MB |
Megabyte (Megabytes) |
MBR |
Master oppstart opptak (Master Boot Record) |
MD5 |
Meldingssammendrag 5 (Message Digest 5) |
NIC |
Nettverksgrensesnittkort (Network Interface Card) |
NLS |
Støtte for morsmål (Native Language Support) |
NNTP |
Transportprotokoll for nettverksnyheter (Network News Transport Protocol) |
NPTL |
Innebygd POSIX trådbibliotek (Native POSIX Threading Library) |
OSS |
Åpent lydsystem (Open Sound System) |
PCH |
Forhåndskompilerte deklarasjonsfiler (Pre-Compiled Headers) |
PCRE |
Perlkompatibelt regulært uttrykk (Perl Compatible Regular Expression) |
PID |
Prosessidentifikator (Process Identifier) |
PTY |
pseudoterminal (pseudo terminal) |
QOS |
Tjenestekvalitet (Quality Of Service) |
RAM |
Tilfeldig tilgangsminne (Random Access Memory) |
RPC |
Anrop for ekstern prosedyre (Remote Procedure Call) |
RTC |
Sanntidsklokke (Real Time Clock) |
SBU |
Standard byggeenhet (Standard Build Unit) |
SCO |
Santa Cruz operasjonen (The Santa Cruz Operation) |
SHA1 |
Sikker nøkkel algoritme 1 (Secure-Hash Algorithm 1) |
TLDP |
Linux dokumentasjonsprosjekt (The Linux Documentation Project) |
TFTP |
Triviell filoverføringsprotokoll (Trivial File Transfer Protocol) |
TLS |
Trådlokal lagring (Thread-Local Storage) |
UID |
Brukeridentifikator (User Identifier) |
umask |
maske for opprettelse av brukerfil (user file-creation mask) |
USB |
Universell seriebuss (Universal Serial Bus) |
UTC |
Koordinert universell tid (Coordinated Universal Time) |
UUID |
Universell unik identifikator (Universally Unique Identifier9 |
VC |
Virtuell konsoll (Virtual Console) |
VGA |
Videografikkmatrise (Video Graphics Array) |
VT |
Virtuell terminal (Virtual Terminal) |
Vi vil takke følgende personer og organisasjoner for deres bidrag til Linux From Scratch Project.
Gerard Beekmans <gerard AT linuxfromscratch D0T org> – LFS skaper
Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> – LFS Administrerende Redaktør
Jim Gifford <jim AT linuxfromscratch D0T org> – CLFS Prosjekt Medleder
Pierre Labastie <pierre AT linuxfromscratch D0T org> – BLFS redaktør og ALFS leder
DJ Lucas <dj AT linuxfromscratch D0T org> – LFS og BLFS redaktør
Ken Moffat <ken AT linuxfromscratch D0T org> – BLFS redaktør
Utallige andre personer på de ulike LFS og BLFS postlistene som bidro til å gjøre denne boken mulig ved å gi sine forslag, teste boken, og sende inn feilrapporter, instruksjoner og deres erfaringer med installasjon av ulike pakker.
Manuel Canales Esparcia <macana AT macana-es D0T com> – Spanish LFS translation project
Johan Lenglet <johan AT linuxfromscratch D0T org> – French LFS translation project until 2008
Jean-Philippe Mengual <jmengual AT linuxfromscratch D0T org> – French LFS translation project 2008-2016
Julien Lepiller <jlepiller AT linuxfromscratch D0T org> – French LFS translation project 2017-present
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Portuguese LFS translation project
Thomas Reitelbach <tr AT erdfunkstelle D0T de> – German LFS translation project
Scott Kveton <scott AT osuosl D0T org> – lfs.oregonstate.edu mirror
William Astle <lost AT l-w D0T net> – ca.linuxfromscratch.org mirror
Eujon Sellers <jpolen@rackspace.com> – lfs.introspeed.com mirror
Justin Knierim <tim@idge.net> – lfs-matrix.net mirror
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – lfsmirror.lfs-es.info mirror
Luis Falcon <Luis Falcon> – torredehanoi.org mirror
Guido Passet <guido AT primerelay D0T net> – nl.linuxfromscratch.org mirror
Bastiaan Jacques <baafie AT planet D0T nl> – lfs.pagefault.net mirror
Sven Cranshoff <sven D0T cranshoff AT lineo D0T be> – lfs.lineo.be mirror
Scarlet Belgium – lfs.scarlet.be mirror
Sebastian Faulborn <info AT aliensoft D0T org> – lfs.aliensoft.org mirror
Stuart Fox <stuart AT dontuse D0T ms> – lfs.dontuse.ms mirror
Ralf Uhlemann <admin AT realhost D0T de> – lfs.oss-mirror.org mirror
Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> – at.linuxfromscratch.org mirror
Fredrik Danerklint <fredan-lfs AT fredan D0T org> – se.linuxfromscratch.org mirror
Franck <franck AT linuxpourtous D0T com> – lfs.linuxpourtous.com mirror
Philippe Baque <baque AT cict D0T fr> – lfs.cict.fr mirror
Vitaly Chekasin <gyouja AT pilgrims D0T ru> – lfs.pilgrims.ru mirror
Benjamin Heil <kontakt AT wankoo D0T org> – lfs.wankoo.org mirror
Anton Maisak <info AT linuxfromscratch D0T org D0T ru> – linuxfromscratch.org.ru mirror
Satit Phermsawang <satit AT wbac D0T ac D0T th> – lfs.phayoune.org mirror
Shizunet Co.,Ltd. <info AT shizu-net D0T jp> – lfs.mirror.shizu-net.jp mirror
Init World <http://www.initworld.com/> – lfs.initworld.com mirror
Jason Andrade <jason AT dstc D0T edu D0T au> – au.linuxfromscratch.org mirror
Christine Barczak <theladyskye AT linuxfromscratch D0T org> – LFS Book Editor
Archaic <archaic@linuxfromscratch.org> – LFS Technical Writer/Editor, HLFS Project Leader, BLFS Editor, Hints and Patches Project Maintainer
Matthew Burgess <matthew AT linuxfromscratch D0T org> – LFS Project Leader, LFS Technical Writer/Editor
Nathan Coulson <nathan AT linuxfromscratch D0T org> – LFS-Bootscripts Maintainer
Timothy Bauscher
Robert Briggs
Ian Chilton
Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – Website Developer, FAQ Maintainer
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – LFS/BLFS/HLFS XML and XSL Maintainer
Alex Groenewoud – LFS Technical Writer
Marc Heerdink
Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – LFS Technical Writer, LFS LiveCD Maintainer
Bryan Kadzban <bryan AT linuxfromscratch D0T org> – LFS Technical Writer
Mark Hymers
Seth W. Klein – FAQ maintainer
Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – Wiki Maintainer
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Website Backend-Scripts Maintainer
Randy McMurchy <randy AT linuxfromscratch D0T org> – BLFS Project Leader, LFS Editor
Dan Nicholson <dnicholson AT linuxfromscratch D0T org> – LFS and BLFS Editor
Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> – LFS Technical Writer, LFS Internationalization Editor, LFS Live CD Maintainer
Simon Perreault
Scot Mc Pherson <scot AT linuxfromscratch D0T org> – LFS NNTP Gateway Maintainer
Douglas R. Reno <renodr AT linuxfromscratch D0T org> – Systemd Editor
Ryan Oliver <ryan AT linuxfromscratch D0T org> – CLFS Project Co-Leader
Greg Schafer <gschafer AT zip D0T com D0T au> – LFS Technical Writer and Architect of the Next Generation 64-bit-enabling Build Method
Jesse Tie-Ten-Quee – LFS Technical Writer
James Robertson <jwrober AT linuxfromscratch D0T org> – Bugzilla Maintainer
Tushar Teredesai <tushar AT linuxfromscratch D0T org> – BLFS Book Editor, Hints and Patches Project Leader
Jeremy Utley <jeremy AT linuxfromscratch D0T org> – LFS Technical Writer, Bugzilla Maintainer, LFS-Bootscripts Maintainer
Zack Winkles <zwinkles AT gmail D0T com> – LFS Technical Writer
Hver pakke bygget i LFS er avhengig av en eller flere andre pakker for å bygges og installeres riktig. Noen pakker deltar til og med i sirkulære avhengigheter, det vil si at den første pakken avhenger av den andre i sin tur avhenger av den første. På grunn av disse avhengighetene er rekkefølgen som pakkene bygges i LFS veldig viktig. Formålet med denne siden er å dokumentere avhengighetene til hver pakke bygget i LFS.
For hver pakke som bygges er det tre, og noen ganger opptil fem typer avhengigheter oppført nedenfor. Den første viser hvilke andre pakker må være tilgjengelig for å kompilere og installere den aktuelle pakken. Den andre viser pakkene som må være tilgjengelige når noen programmer eller biblioteker fra pakken brukes under kjøring. Den tredje viser hvilke pakker, i tillegg til de på den første listen, må være tilgjengelige for å kjøre testpakkene. Den fjerde listen over avhengigheter er pakker som krever at denne pakken bygges og installeres på den endelige plasseringen før de blir bygget og installert. I de fleste tilfeller er dette fordi disse pakkene hardkoder kodebaner til binærfiler i skriptene deres. Hvis ikke dette blir bygget i en bestemt rekkefølge, kan det føre til at stier til /tools/bin/[binær] blir plassert inne i skript installert i det endelige systemet. Dette er åpenbart ikke ønskelig.
Den siste listen over avhengigheter er valgfrie pakker som ikke er adressert i LFS, men kan være nyttig for brukeren. Disse pakkene kan ha ekstra obligatoriske eller valgfrie avhengigheter. For disse avhengigheter, er den anbefalte praksisen å installere dem etter fullføring av LFS boken og gå tilbake og gjenoppbygg LFS pakken. I flere tilfeller, er reinstallasjon adressert i BLFS.
Skriptene i dette vedlegget er oppført etter mappene der de er
normalt er. Rekkefølgen er /etc/rc.d/init.d
, /etc/sysconfig
, /etc/sysconfig/network-devices
, og /etc/sysconfig/network-devices/services
.
Innenfor hver seksjon vises filene i den rekkefølgen de vanligvis
kalles.
Er det rc
første skriptet som
kalles av init og starter
oppstartsprosessen.
#!/bin/bash ######################################################################## # Begin rc # # Description : Main Run Level Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # : DJ Lucas - dj AT linuxfromscratch D0T org # Updates : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Updates March 24th, 2022: new semantics of S/K files # - Instead of testing that S scripts were K scripts in the # previous runlevel, test that they were not S scripts # - Instead of testing that K scripts were S scripts in the # previous runlevel, test that they were not K scripts # - S scripts in runlevel 0 or 6 are now run with # "script start" (was "script stop" previously). ######################################################################## . /lib/lsb/init-functions print_error_msg() { log_failure_msg # $i is set when called MSG="FAILURE:\n\nYou should not be reading this error message.\n\n" MSG="${MSG}It means that an unforeseen error took place in\n" MSG="${MSG}${i},\n" MSG="${MSG}which exited with a return value of ${error_value}.\n" MSG="${MSG}If you're able to track this error down to a bug in one of\n" MSG="${MSG}the files provided by the ${DISTRO_MINI} book,\n" MSG="${MSG}please be so kind to inform us at ${DISTRO_CONTACT}.\n" log_failure_msg "${MSG}" log_info_msg "Press Enter to continue..." wait_for_user } check_script_status() { # $i is set when called if [ ! -f ${i} ]; then log_warning_msg "${i} is not a valid symlink." SCRIPT_STAT="1" fi if [ ! -x ${i} ]; then log_warning_msg "${i} is not executable, skipping." SCRIPT_STAT="1" fi } run() { if [ -z $interactive ]; then ${1} ${2} return $? fi while true; do read -p "Run ${1} ${2} (Yes/no/continue)? " -n 1 runit echo case ${runit} in c | C) interactive="" ${i} ${2} ret=${?} break; ;; n | N) return 0 ;; y | Y) ${i} ${2} ret=${?} break ;; esac done return $ret } # Read any local settings/overrides [ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site DISTRO=${DISTRO:-"Linux From Scratch"} DISTRO_CONTACT=${DISTRO_CONTACT:-"lfs-dev@lists.linuxfromscratch.org (Registration required)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"} IPROMPT=${IPROMPT:-"no"} # These 3 signals will not cause our script to exit trap "" INT QUIT TSTP [ "${1}" != "" ] && runlevel=${1} if [ "${runlevel}" == "" ]; then echo "Usage: ${0} <runlevel>" >&2 exit 1 fi previous=${PREVLEVEL} [ "${previous}" == "" ] && previous=N if [ ! -d /etc/rc.d/rc${runlevel}.d ]; then log_info_msg "/etc/rc.d/rc${runlevel}.d does not exist.\n" exit 1 fi if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; then IPROMPT="no"; fi # Note: In ${LOGLEVEL:-7}, it is ':' 'dash' '7', not minus 7 if [ "$runlevel" == "S" ]; then [ -r /etc/sysconfig/console ] && source /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}" fi if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; then # The total length of the distro welcome string, without escape codes wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"Welcome to ${INFO}${DISTRO}${NORMAL}"} # The total length of the interactive string, without escape codes ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )} i_message=${i_message:-"Press '${FAILURE}I${NORMAL}' to enter interactive startup"} # dcol and icol are spaces before the message to center the message # on screen. itime is the amount of wait time for the user to press a key wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 )) icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) itime=${itime:-"3"} echo -e "\n\n" echo -e "\\033[${wcol}G${welcome_message}" echo -e "\\033[${icol}G${i_message}${NORMAL}" echo "" read -t "${itime}" -n 1 interactive 2>&1 > /dev/null fi # Make lower case [ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive="" # Read the state file if it exists from runlevel S [ -r /run/interactive ] && source /run/interactive # Stop all services marked as K, except if marked as K in the previous # runlevel: it is the responsibility of the script to not try to kill # a non running service if [ "${previous}" != "N" ]; then for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) do check_script_status if [ "${SCRIPT_STAT}" == "1" ]; then SCRIPT_STAT="0" continue fi suffix=${i#/etc/rc.d/rc${runlevel}.d/K[0-9][0-9]} [ -e /etc/rc.d/rc${previous}.d/K[0-9][0-9]$suffix ] && continue run ${i} stop error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done fi if [ "${previous}" == "N" ]; then export IN_BOOT=1; fi if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; then touch /fastboot fi # Start all services marked as S in this runlevel, except if marked as # S in the previous runlevel # it is the responsabily of the script to not try to start an already running # service for i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) do if [ "${previous}" != "N" ]; then suffix=${i#/etc/rc.d/rc${runlevel}.d/S[0-9][0-9]} [ -e /etc/rc.d/rc${previous}.d/S[0-9][0-9]$suffix ] && continue fi check_script_status if [ "${SCRIPT_STAT}" == "1" ]; then SCRIPT_STAT="0" continue fi run ${i} start error_value=${?} if [ "${error_value}" != "0" ]; then print_error_msg; fi done # Store interactive variable on switch from runlevel S and remove if not if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; then echo "interactive=\"i\"" > /run/interactive else rm -f /run/interactive 2> /dev/null fi # Copy the boot log on initial boot only if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; then cat $BOOTLOG >> /var/log/boot.log # Mark the end of boot echo "--------" >> /var/log/boot.log # Remove the temporary file rm -f $BOOTLOG 2> /dev/null fi # End rc
#!/bin/sh ######################################################################## # # Begin /lib/lsb/init-funtions # # Description : Run Level Control Functions # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # : DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : With code based on Matthias Benkmann's simpleinit-msb # http://winterdrache.de/linux/newboot/index.html # # The file should be located in /lib/lsb # ######################################################################## ## Environmental setup # Setup default values for environment umask 022 export PATH="/bin:/usr/bin:/sbin:/usr/sbin" ## Set color commands, used via echo # 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 NORMAL="\\033[0;39m" # Standard console grey SUCCESS="\\033[1;32m" # Success is green WARNING="\\033[1;33m" # Warnings are yellow FAILURE="\\033[1;31m" # Failures are red INFO="\\033[1;36m" # Information is light cyan BRACKET="\\033[1;34m" # Brackets are blue # Use a colored prefix BMPREFIX=" " SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " FAILURE_PREFIX="${FAILURE}*****${NORMAL} " WARNING_PREFIX="${WARNING} *** ${NORMAL} " SKIP_PREFIX="${INFO} S ${NORMAL}" SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}" FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}" WARNING_SUFFIX="${BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}" SKIP_SUFFIX="${BRACKET}[${INFO} SKIP ${BRACKET}]${NORMAL}" BOOTLOG=/run/bootlog KILLDELAY=3 SCRIPT_STAT="0" # Set any user specified environment variables e.g. HEADLESS [ -r /etc/sysconfig/rc.site ] && . /etc/sysconfig/rc.site ## Screen Dimensions # Find current screen size if [ -z "${COLUMNS}" ]; then COLUMNS=$(stty size) COLUMNS=${COLUMNS##* } fi # When using remote connections, such as a serial port, stty size returns 0 if [ "${COLUMNS}" = "0" ]; then COLUMNS=80 fi ## Measurements for positioning result messages COL=$((${COLUMNS} - 8)) WCOL=$((${COL} - 2)) ## Set Cursor Position Commands, used via echo SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP="\\033[1A\\033[0G" # Up one line, at the 0'th char CURS_ZERO="\\033[0G" ################################################################################ # start_daemon() # # Usage: start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] # # # # Purpose: This runs the specified program as a daemon # # # # Inputs: -f: (force) run the program even if it is already running. # # -n nicelevel: specify a nice level. See 'man nice(1)'. # # -p pidfile: use the specified file to determine PIDs. # # pathname: the complete path to the specified program # # args: additional arguments passed to the program (pathname) # # # # Return values (as defined by LSB exit codes): # # 0 - program is running or service is OK # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # ################################################################################ start_daemon() { local force="" local nice="0" local pidfile="" local pidlist="" local retval="" # Process arguments while true do case "${1}" in -f) force="1" shift 1 ;; -n) nice="${2}" shift 2 ;; -p) pidfile="${2}" shift 2 ;; -*) return 2 ;; *) program="${1}" break ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Execute if [ -z "${force}" ]; then if [ -z "${pidfile}" ]; then # Determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibilty # to log messages! case "${retval}" in 0) # Program is already running correctly, this is a # successful start. return 0 ;; 1) # Program is not running, but an invalid pid file exists # remove the pid file and continue rm -f "${pidfile}" ;; 3) # Program is not running and no pidfile exists # do nothing here, let start_deamon continue. ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac fi # Do the start! nice -n "${nice}" "${@}" } ################################################################################ # killproc() # # Usage: killproc [-p pidfile] pathname [signal] # # # # Purpose: Send control signals to running processes # # # # Inputs: -p pidfile, uses the specified pidfile # # pathname, pathname to the specified program # # signal, send this signal to pathname # # # # Return values (as defined by LSB exit codes): # # 0 - program (pathname) has stopped/is already stopped or a # # running program has been sent specified signal and stopped # # successfully # # 1 - generic or unspecified error # # 2 - invalid or excessive argument(s) # # 5 - program is not installed # # 7 - program is not running and a signal was supplied # ################################################################################ killproc() { local pidfile local program local prefix local progname local signal="-TERM" local fallback="-KILL" local nosig local pidlist local retval local pid local delay="30" local piddead local dtime # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then signal="${2}" fallback="" else nosig=1 fi # Error on additional arguments if [ -n "${3}" ]; then return 2 else break fi ;; esac done # Check for a valid program if [ ! -e "${program}" ]; then return 5; fi # Check for a valid signal check_signal "${signal}" if [ "${?}" -ne "0" ]; then return 2; fi # Get a list of pids if [ -z "${pidfile}" ]; then # determine the pid by discovery pidlist=`pidofproc "${1}"` retval="${?}" else # The PID file contains the needed PIDs # Note that by LSB requirement, the path must be given to pidofproc, # however, it is not used by the current implementation or standard. pidlist=`pidofproc -p "${pidfile}" "${1}"` retval="${?}" fi # Return a value ONLY # It is the init script's (or distribution's functions) responsibilty # to log messages! case "${retval}" in 0) # Program is running correctly # Do nothing here, let killproc continue. ;; 1) # Program is not running, but an invalid pid file exists # Remove the pid file. progname=${program##*/} if [[ -e "/run/${progname}.pid" ]]; then pidfile="/run/${progname}.pid" rm -f "${pidfile}" fi # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7 fi ;; 3) # Program is not running and no pidfile exists # This is only a success if no signal was passed. if [ -n "${nosig}" ]; then return 0 else return 7 fi ;; *) # Others as returned by status values shall not be interpreted # and returned as an unspecified error. return 1 ;; esac # Perform different actions for exit signals and control signals check_sig_type "${signal}" if [ "${?}" -eq "0" ]; then # Signal is used to terminate the program # Account for empty pidlist (pid file still exists and no # signal was given) if [ "${pidlist}" != "" ]; then # Kill the list of pids for pid in ${pidlist}; do kill -0 "${pid}" 2> /dev/null if [ "${?}" -ne "0" ]; then # Process is dead, continue to next and assume all is well continue else kill "${signal}" "${pid}" 2> /dev/null # Wait up to ${delay}/10 seconds to for "${pid}" to # terminate in 10ths of a second while [ "${delay}" -ne "0" ]; do kill -0 "${pid}" 2> /dev/null || piddead="1" if [ "${piddead}" = "1" ]; then break; fi sleep 0.1 delay="$(( ${delay} - 1 ))" done # If a fallback is set, and program is still running, then # use the fallback if [ -n "${fallback}" -a "${piddead}" != "1" ]; then kill "${fallback}" "${pid}" 2> /dev/null sleep 1 # Check again, and fail if still running kill -0 "${pid}" 2> /dev/null && return 1 fi fi done fi # Check for and remove stale PID files. if [ -z "${pidfile}" ]; then # Find the basename of $program prefix=`echo "${program}" | sed 's/[^/]*$//'` progname=`echo "${program}" | sed "s@${prefix}@@"` if [ -e "/run/${progname}.pid" ]; then rm -f "/run/${progname}.pid" 2> /dev/null fi else if [ -e "${pidfile}" ]; then rm -f "${pidfile}" 2> /dev/null; fi fi # For signals that do not expect a program to exit, simply # let kill do its job, and evaluate kill's return for value else # check_sig_type - signal is not used to terminate program for pid in ${pidlist}; do kill "${signal}" "${pid}" if [ "${?}" -ne "0" ]; then return 1; fi done fi } ################################################################################ # pidofproc() # # Usage: pidofproc [-p pidfile] pathname # # # # Purpose: This function returns one or more pid(s) for a particular daemon # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program # # # # Return values (as defined by LSB status codes): # # 0 - Success (PIDs to stdout) # # 1 - Program is dead, PID file still exists (remaining PIDs output) # # 3 - Program is not running (no output) # ################################################################################ pidofproc() { local pidfile local program local prefix local progname local pidlist local lpids local exitstatus="0" # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) program="${1}" if [ -n "${2}" ]; then # Too many arguments # Since this is status, return unknown return 4 else break fi ;; esac done # If a PID file is not specified, try and find one. if [ -z "${pidfile}" ]; then # Get the program's basename prefix=`echo "${program}" | sed 's/[^/]*$//'` if [ -z "${prefix}" ]; then progname="${program}" else progname=`echo "${program}" | sed "s@${prefix}@@"` fi # If a PID file exists with that name, assume that is it. if [ -e "/run/${progname}.pid" ]; then pidfile="/run/${progname}.pid" fi fi # If a PID file is set and exists, use it. if [ -n "${pidfile}" -a -e "${pidfile}" ]; then # Use the value in the first line of the pidfile pidlist=`/bin/head -n1 "${pidfile}"` # This can optionally be written as 'sed 1q' to repalce 'head -n1' # should LFS move /bin/head to /usr/bin/head else # Use pidof pidlist=`pidof "${program}"` fi # Figure out if all listed PIDs are running. for pid in ${pidlist}; do kill -0 ${pid} 2> /dev/null if [ "${?}" -eq "0" ]; then lpids="${lpids}${pid} " else exitstatus="1" fi done if [ -z "${lpids}" -a ! -f "${pidfile}" ]; then return 3 else echo "${lpids}" return "${exitstatus}" fi } ################################################################################ # statusproc() # # Usage: statusproc [-p pidfile] pathname # # # # Purpose: This function prints the status of a particular daemon to stdout # # # # Inputs: -p pidfile, use the specified pidfile instead of pidof # # pathname, path to the specified program # # # # Return values: # # 0 - Status printed # # 1 - Input error. The daemon to check was not specified. # ################################################################################ statusproc() { local pidfile local pidlist if [ "${#}" = "0" ]; then echo "Usage: statusproc [-p pidfle] {program}" exit 1 fi # Process arguments while true; do case "${1}" in -p) pidfile="${2}" shift 2 ;; *) if [ -n "${2}" ]; then echo "Too many arguments" return 1 else break fi ;; esac done if [ -n "${pidfile}" ]; then pidlist=`pidofproc -p "${pidfile}" $@` else pidlist=`pidofproc $@` fi # Trim trailing blanks pidlist=`echo "${pidlist}" | sed -r 's/ +$//'` base="${1##*/}" if [ -n "${pidlist}" ]; then /bin/echo -e "${INFO}${base} is running with Process" \ "ID(s) ${pidlist}.${NORMAL}" else if [ -n "${base}" -a -e "/run/${base}.pid" ]; then /bin/echo -e "${WARNING}${1} is not running but" \ "/run/${base}.pid exists.${NORMAL}" else if [ -n "${pidfile}" -a -e "${pidfile}" ]; then /bin/echo -e "${WARNING}${1} is not running" \ "but ${pidfile} exists.${NORMAL}" else /bin/echo -e "${INFO}${1} is not running.${NORMAL}" fi fi fi } ################################################################################ # timespec() # # # # Purpose: An internal utility function to format a timestamp # # a boot log file. Sets the STAMP variable. # # # # Return value: Not used # ################################################################################ timespec() { STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) " return 0 } ################################################################################ # log_success_msg() # # Usage: log_success_msg ["message"] # # # # Purpose: Print a successful status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_success_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG} return 0 } log_success_msg2() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" echo " OK" >> ${BOOTLOG} return 0 } ################################################################################ # log_failure_msg() # # Usage: log_failure_msg ["message"] # # # # Purpose: Print a failure status message to the screen and # # a boot log file. # # # # Inputs: $@ - Message # # # # Return values: Not used # ################################################################################ log_failure_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" # Strip non-printable characters from log file timespec logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo -e "${STAMP} ${logmessage} FAIL" >> ${BOOTLOG} return 0 } log_failure_msg2() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" echo "FAIL" >> ${BOOTLOG} return 0 } ################################################################################ # log_warning_msg() # # Usage: log_warning_msg ["message"] # # # # Purpose: Print a warning status message to the screen and # # a boot log file. # # # # Return values: Not used # ################################################################################ log_warning_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG} return 0 } log_skip_msg() { /bin/echo -n -e "${BMPREFIX}${@}" /bin/echo -e "${CURS_ZERO}${SKIP_PREFIX}${SET_COL}${SKIP_SUFFIX}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo "SKIP" >> ${BOOTLOG} return 0 } ################################################################################ # log_info_msg() # # Usage: log_info_msg message # # # # Purpose: Print an information message to the screen and # # a boot log file. Does not print a trailing newline character. # # # # Return values: Not used # ################################################################################ log_info_msg() { /bin/echo -n -e "${BMPREFIX}${@}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` timespec /bin/echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG} return 0 } log_info_msg2() { /bin/echo -n -e "${@}" # Strip non-printable characters from log file logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` /bin/echo -n -e "${logmessage}" >> ${BOOTLOG} return 0 } ################################################################################ # evaluate_retval() # # Usage: Evaluate a return value and print success or failure as appropriate # # # # Purpose: Convenience function to terminate an info message # # # # Return values: Not used # ################################################################################ evaluate_retval() { local error_value="${?}" if [ ${error_value} = 0 ]; then log_success_msg2 else log_failure_msg2 fi } ################################################################################ # check_signal() # # Usage: check_signal [ -{signal} ] # # # # Purpose: Check for a valid signal. This is not defined by any LSB draft, # # however, it is required to check the signals to determine if the # # signals chosen are invalid arguments to the other functions. # # # # Inputs: Accepts a single string value in the form of -{signal} # # # # Return values: # # 0 - Success (signal is valid # # 1 - Signal is not valid # ################################################################################ check_signal() { local valsig # Add error handling for invalid signals valsig=" -ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2" valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN" valsig="${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP" valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 -4 -5 -6 -8 -9" valsig="${valsig} -11 -13 -14 -15 " echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################ # check_sig_type() # # Usage: check_signal [ -{signal} | {signal} ] # # # # Purpose: Check if signal is a program termination signal or a control signal # # This is not defined by any LSB draft, however, it is required to # # check the signals to determine if they are intended to end a # # program or simply to control it. # # # # Inputs: Accepts a single string value in the form or -{signal} or {signal} # # # # Return values: # # 0 - Signal is used for program termination # # 1 - Signal is used for program control # ################################################################################ check_sig_type() { local valsig # The list of termination signals (limited to generally used items) valsig=" -ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15 " echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; then return 0 else return 1 fi } ################################################################################ # wait_for_user() # # # # Purpose: Wait for the user to respond if not a headless system # # # ################################################################################ wait_for_user() { # Wait for the user by default [ "${HEADLESS=0}" = "0" ] && read ENTER return 0 } ################################################################################ # is_true() # # # # Purpose: Utility to test if a variable is true | yes | 1 # # # ################################################################################ is_true() { [ "$1" = "1" ] || [ "$1" = "yes" ] || [ "$1" = "true" ] || [ "$1" = "y" ] || [ "$1" = "t" ] } # End /lib/lsb/init-functions
#!/bin/sh ######################################################################## # Begin mountvirtfs # # Description : Ensure proc, sysfs, run, and dev are mounted # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: mountvirtfs # Required-Start: $first # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Mounts various special fs needed at start # Description: Mounts /sys and /proc virtual (kernel) filesystems. # Mounts /run (tmpfs) and /dev (devtmpfs). # This is done only if they are not already mounted. # with the kernel config proposed in the book, dev # should be automatically mounted by the kernel. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) # Make sure /run is available before logging any messages if ! mountpoint /run >/dev/null; then mount /run || failed=1 fi mkdir -p /run/lock /run/shm chmod 1777 /run/shm /run/lock log_info_msg "Mounting virtual file systems: ${INFO}/run" if ! mountpoint /proc >/dev/null; then log_info_msg2 " ${INFO}/proc" mount -o nosuid,noexec,nodev /proc || failed=1 fi if ! mountpoint /sys >/dev/null; then log_info_msg2 " ${INFO}/sys" mount -o nosuid,noexec,nodev /sys || failed=1 fi if ! mountpoint /dev >/dev/null; then log_info_msg2 " ${INFO}/dev" mount -o mode=0755,nosuid /dev || failed=1 fi ln -sfn /run/shm /dev/shm (exit ${failed}) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End mountvirtfs
#!/bin/sh ######################################################################## # Begin modules # # Description : Module auto-loading script # # Authors : Zack Winkles # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: modules # Required-Start: mountvirtfs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Loads required modules. # Description: Loads modules listed in /etc/sysconfig/modules. # X-LFS-Provided-By: LFS ### END INIT INFO # Assure that the kernel has module support. [ -e /proc/modules ] || exit 0 . /lib/lsb/init-functions case "${1}" in start) # Exit if there's no modules file or there are no # valid entries [ -r /etc/sysconfig/modules ] || exit 0 grep -E -qv '^($|#)' /etc/sysconfig/modules || exit 0 log_info_msg "Loading modules:" # Only try to load modules if the user has actually given us # some modules to load. while read module args; do # Ignore comments and blank lines. case "$module" in ""|"#"*) continue ;; esac # Attempt to load the module, passing any arguments provided. modprobe ${module} ${args} >/dev/null # Print the module name if successful, otherwise take note. if [ $? -eq 0 ]; then log_info_msg2 " ${module}" else failedmod="${failedmod} ${module}" fi done < /etc/sysconfig/modules # Print a message about successfully loaded modules on the correct line. log_success_msg2 # Print a failure message with a list of any modules that # may have failed to load. if [ -n "${failedmod}" ]; then log_failure_msg "Failed to load modules:${failedmod}" exit 1 fi ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac exit 0 # End modules
#!/bin/sh ######################################################################## # Begin udev # # Description : Udev cold-plugging script # # Authors : Zack Winkles, Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev $time # Required-Start: localnet # Should-Start: modules # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Populates /dev with device nodes. # Description: Mounts a tempfs on /dev and starts the udevd daemon. # Device nodes are created as defined by udev. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Populating /dev with device nodes... " if ! grep -q '[[:space:]]sysfs' /proc/mounts; then log_failure_msg2 msg="FAILURE:\n\nUnable to create " msg="${msg}devices without a SysFS filesystem\n\n" msg="${msg}After you press Enter, this system " msg="${msg}will be halted and powered off.\n\n" log_info_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop fi # Start the udev daemon to continually watch for, and act on, # uevents /sbin/udevd --daemon # Now traverse /sys in order to "coldplug" devices that have # already been discovered /sbin/udevadm trigger --action=add --type=subsystems /sbin/udevadm trigger --action=add --type=devices /sbin/udevadm trigger --action=change --type=devices # Now wait for udevd to process the uevents we triggered if ! is_true "$OMIT_UDEV_SETTLE"; then /sbin/udevadm settle fi # If any LVM based partitions are on the system, ensure they # are activated so they can be used. if [ -x /sbin/vgchange ]; then /sbin/vgchange -a y >/dev/null; fi log_success_msg2 ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0 # End udev
#!/bin/sh ######################################################################## # Begin swap # # Description : Swap Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: swap # Required-Start: udev # Should-Start: modules # Required-Stop: localnet # Should-Stop: $local_fs # Default-Start: S # Default-Stop: 0 6 # Short-Description: Mounts and unmounts swap partitions. # Description: Mounts and unmounts swap partitions defined in # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Activating all swap files/partitions..." swapon -a evaluate_retval ;; stop) log_info_msg "Deactivating all swap files/partitions..." swapoff -a evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) log_success_msg "Retrieving swap status." swapon -s ;; *) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End swap
#!/bin/sh ######################################################################## # Begin setclock # # Description : Setting Linux Clock # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: # Required-Start: # Should-Start: modules # Required-Stop: # Should-Stop: $syslog # Default-Start: S # Default-Stop: # Short-Description: Stores and restores time from the hardware clock # Description: On boot, system time is obtained from hwclock. The # hardware clock can also be set on shutdown. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/clock ] && . /etc/sysconfig/clock case "${UTC}" in yes|true|1) CLOCKPARAMS="${CLOCKPARAMS} --utc" ;; no|false|0) CLOCKPARAMS="${CLOCKPARAMS} --localtime" ;; esac case ${1} in start) hwclock --hctosys ${CLOCKPARAMS} >/dev/null ;; stop) log_info_msg "Setting hardware clock..." hwclock --systohc ${CLOCKPARAMS} >/dev/null evaluate_retval ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac exit 0
#!/bin/sh ######################################################################## # Begin checkfs # # Description : File System Check # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # A. Luebke - luebke@users.sourceforge.net # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Based on checkfs script from LFS-3.1 and earlier. # # From man fsck # 0 - No errors # 1 - File system errors corrected # 2 - System should be rebooted # 4 - File system errors left uncorrected # 8 - Operational error # 16 - Usage or syntax error # 32 - Fsck canceled by user request # 128 - Shared library error # ######################################################################### ### BEGIN INIT INFO # Provides: checkfs # Required-Start: udev swap # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Checks local filesystems before mounting. # Description: Checks local filesystmes before mounting. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) if [ -f /fastboot ]; then msg="/fastboot found, will omit " msg="${msg} file system checks as requested.\n" log_info_msg "${msg}" exit 0 fi log_info_msg "Mounting root file system in read-only mode... " mount -n -o remount,ro / >/dev/null if [ ${?} != 0 ]; then log_failure_msg2 msg="\n\nCannot check root " msg="${msg}filesystem because it could not be mounted " msg="${msg}in read-only mode.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "${msg}" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop else log_success_msg2 fi if [ -f /forcefsck ]; then msg="/forcefsck found, forcing file" msg="${msg} system checks as requested." log_success_msg "$msg" options="-f" else options="" fi log_info_msg "Checking file systems..." # Note: -a option used to be -p; but this fails e.g. on fsck.minix if is_true "$VERBOSE_FSCK"; then fsck ${options} -a -A -C -T else fsck ${options} -a -A -C -T >/dev/null fi error_value=${?} if [ "${error_value}" = 0 ]; then log_success_msg2 fi if [ "${error_value}" = 1 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been corrected.\n" msg="${msg} You may want to double-check that " msg="${msg}everything was fixed properly." log_warning_msg "$msg" fi if [ "${error_value}" = 2 -o "${error_value}" = 3 ]; then msg="\nWARNING:\n\nFile system errors " msg="${msg}were found and have been been " msg="${msg}corrected, but the nature of the " msg="${msg}errors require this system to be rebooted.\n\n" msg="${msg}After you press enter, " msg="${msg}this system will be rebooted\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user reboot -f fi if [ "${error_value}" -gt 3 -a "${error_value}" -lt 16 ]; then msg="\nFAILURE:\n\nFile system errors " msg="${msg}were encountered that could not be " msg="${msg}fixed automatically.\nThis system " msg="${msg}cannot continue to boot and will " msg="${msg}therefore be halted until those " msg="${msg}errors are fixed manually by a " msg="${msg}System Administrator.\n\n" msg="${msg}After you press Enter, this system will be " msg="${msg}halted and powered off.\n\n" log_failure_msg "$msg" log_info_msg "Press Enter to continue..." wait_for_user /etc/rc.d/init.d/halt stop fi if [ "${error_value}" -ge 16 ]; then msg="FAILURE:\n\nUnexpected failure " msg="${msg}running fsck. Exited with error " msg="${msg} code: ${error_value}.\n" log_info_msg $msg exit ${error_value} fi exit 0 ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End checkfs
#!/bin/sh ######################################################################## # Begin mountfs # # Description : File System Mount Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $local_fs # Required-Start: udev checkfs # Should-Start: modules # Required-Stop: localnet # Should-Stop: # Default-Start: S # Default-Stop: 0 6 # Short-Description: Mounts/unmounts local filesystems defined in /etc/fstab. # Description: Remounts root filesystem read/write and mounts all # remaining local filesystems defined in /etc/fstab on # start. Remounts root filesystem read-only and unmounts # remaining filesystems on stop. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Remounting root file system in read-write mode..." mount --options remount,rw / >/dev/null evaluate_retval # Remove fsck-related file system watermarks. rm -f /fastboot /forcefsck # Make sure /dev/pts exists mkdir -p /dev/pts # This will mount all filesystems that do not have _netdev in # their option list. _netdev denotes a network filesystem. log_info_msg "Mounting remaining file systems..." failed=0 mount --all --test-opts no_netdev >/dev/null || failed=1 evaluate_retval exit $failed ;; stop) # Don't unmount virtual file systems like /run log_info_msg "Unmounting all other currently mounted file systems..." # Ensure any loop devies are removed losetup -D umount --all --detach-loop --read-only \ --types notmpfs,nosysfs,nodevtmpfs,noproc,nodevpts >/dev/null evaluate_retval # Make sure / is mounted read only (umount bug) mount --options remount,ro / # Make all LVM volume groups unavailable, if appropriate # This fails if swap or / are on an LVM partition #if [ -x /sbin/vgchange ]; then /sbin/vgchange -an > /dev/null; fi if [ -r /etc/mdadm.conf ]; then log_info_msg "Mark arrays as clean..." mdadm --wait-clean --scan evaluate_retval fi ;; *) echo "Usage: ${0} {start|stop}" exit 1 ;; esac # End mountfs
#!/bin/sh ######################################################################## # Begin udev_retry # # Description : Udev cold-plugging script (retry) # # Authors : Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # Bryan Kadzban - # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: udev_retry # Required-Start: udev # Should-Start: $local_fs cleanfs # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Replays failed uevents and creates additional devices. # Description: Replays any failed uevents that were skipped due to # slow hardware initialization, and creates those needed # device nodes # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Retrying failed uevents, if any..." # As of udev-186, the --run option is no longer valid #rundir=$(/sbin/udevadm info --run) rundir=/run/udev # From Debian: "copy the rules generated before / was mounted # read-write": for file in ${rundir}/tmp-rules--*; do dest=${file##*tmp-rules--} [ "$dest" = '*' ] && break cat $file >> /etc/udev/rules.d/$dest rm -f $file done # Re-trigger the uevents that may have failed, # in hope they will succeed now /bin/sed -e 's/#.*$//' /etc/sysconfig/udev_retry | /bin/grep -v '^$' | \ while read line ; do for subsystem in $line ; do /sbin/udevadm trigger --subsystem-match=$subsystem --action=add done done # Now wait for udevd to process the uevents we triggered if ! is_true "$OMIT_UDEV_RETRY_SETTLE"; then /sbin/udevadm settle fi evaluate_retval ;; *) echo "Usage ${0} {start}" exit 1 ;; esac exit 0 # End udev_retry
#!/bin/sh ######################################################################## # Begin cleanfs # # Description : Clean file system # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: cleanfs # Required-Start: $local_fs # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Cleans temporary directories early in the boot process. # Description: Cleans temporary directories /run, /var/lock, and # optionally, /tmp. cleanfs also creates /run/utmp # and any files defined in /etc/sysconfig/createfiles. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Function to create files/directory on boot. create_files() { # Input to file descriptor 9 and output to stdin (redirection) exec 9>&0 < /etc/sysconfig/createfiles while read name type perm usr grp dtype maj min junk do # Ignore comments and blank lines. case "${name}" in ""|\#*) continue ;; esac # Ignore existing files. if [ ! -e "${name}" ]; then # Create stuff based on its type. case "${type}" in dir) mkdir "${name}" ;; file) :> "${name}" ;; dev) case "${dtype}" in char) mknod "${name}" c ${maj} ${min} ;; block) mknod "${name}" b ${maj} ${min} ;; pipe) mknod "${name}" p ;; *) log_warning_msg "\nUnknown device type: ${dtype}" ;; esac ;; *) log_warning_msg "\nUnknown type: ${type}" continue ;; esac # Set up the permissions, too. chown ${usr}:${grp} "${name}" chmod ${perm} "${name}" fi done # Close file descriptor 9 (end redirection) exec 0>&9 9>&- return 0 } case "${1}" in start) log_info_msg "Cleaning file systems:" if [ "${SKIPTMPCLEAN}" = "" ]; then log_info_msg2 " /tmp" cd /tmp && find . -xdev -mindepth 1 ! -name lost+found -delete || failed=1 fi > /run/utmp if grep -q '^utmp:' /etc/group ; then chmod 664 /run/utmp chgrp utmp /run/utmp fi (exit ${failed}) evaluate_retval if grep -E -qv '^(#|$)' /etc/sysconfig/createfiles 2>/dev/null; then log_info_msg "Creating files and directories... " create_files # Always returns 0 evaluate_retval fi exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End cleanfs
#!/bin/sh ######################################################################## # Begin console # # Description : Sets keymap and screen font # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # Alexander E. Patrakov # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: console # Required-Start: $local_fs # Should-Start: udev_retry # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Sets up a localised console. # Description: Sets up fonts and language settings for the user's # local as defined by /etc/sysconfig/console. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions # Native English speakers probably don't have /etc/sysconfig/console at all [ -r /etc/sysconfig/console ] && . /etc/sysconfig/console failed=0 case "${1}" in start) # See if we need to do anything if [ -z "${KEYMAP}" ] && [ -z "${KEYMAP_CORRECTIONS}" ] && [ -z "${FONT}" ] && [ -z "${LEGACY_CHARSET}" ] && ! is_true "${UNICODE}"; then exit 0 fi # There should be no bogus failures below this line! log_info_msg "Setting up Linux console..." # Figure out if a framebuffer console is used [ -d /sys/class/graphics/fb0 ] && use_fb=1 || use_fb=0 # Figure out the command to set the console into the # desired mode is_true "${UNICODE}" && MODE_COMMAND="echo -en '\033%G' && kbd_mode -u" || MODE_COMMAND="echo -en '\033%@\033(K' && kbd_mode -a" # On framebuffer consoles, font has to be set for each vt in # UTF-8 mode. This doesn't hurt in non-UTF-8 mode also. ! is_true "${use_fb}" || [ -z "${FONT}" ] || MODE_COMMAND="${MODE_COMMAND} && setfont ${FONT}" # Apply that command to all consoles mentioned in # /etc/inittab. Important: in the UTF-8 mode this should # happen before setfont, otherwise a kernel bug will # show up and the unicode map of the font will not be # used. for TTY in `grep '^[^#].*respawn:/sbin/agetty' /etc/inittab | grep -o '\btty[[:digit:]]*\b'` do openvt -f -w -c ${TTY#tty} -- \ /bin/sh -c "${MODE_COMMAND}" || failed=1 done # Set the font (if not already set above) and the keymap [ "${use_fb}" == "1" ] || [ -z "${FONT}" ] || setfont $FONT || failed=1 [ -z "${KEYMAP}" ] || loadkeys ${KEYMAP} >/dev/null 2>&1 || failed=1 [ -z "${KEYMAP_CORRECTIONS}" ] || loadkeys ${KEYMAP_CORRECTIONS} >/dev/null 2>&1 || failed=1 # Convert the keymap from $LEGACY_CHARSET to UTF-8 [ -z "$LEGACY_CHARSET" ] || dumpkeys -c "$LEGACY_CHARSET" | loadkeys -u >/dev/null 2>&1 || failed=1 # If any of the commands above failed, the trap at the # top would set $failed to 1 ( exit $failed ) evaluate_retval exit $failed ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End console
#!/bin/sh ######################################################################## # Begin localnet # # Description : Loopback device # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: localnet # Required-Start: mountvirtfs # Should-Start: modules # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: 0 6 # Short-Description: Starts the local network. # Description: Sets the hostname of the machine and starts the # loopback interface. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions [ -r /etc/sysconfig/network ] && . /etc/sysconfig/network [ -r /etc/hostname ] && HOSTNAME=`cat /etc/hostname` case "${1}" in start) log_info_msg "Bringing up the loopback interface..." ip addr add 127.0.0.1/8 label lo dev lo ip link set lo up evaluate_retval log_info_msg "Setting hostname to ${HOSTNAME}..." hostname ${HOSTNAME} evaluate_retval ;; stop) log_info_msg "Bringing down the loopback interface..." ip link set lo down evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) echo "Hostname is: $(hostname)" ip link show lo ;; *) echo "Usage: ${0} {start|stop|restart|status}" exit 1 ;; esac exit 0 # End localnet
#!/bin/sh ######################################################################## # Begin sysctl # # Description : File uses /etc/sysctl.conf to set kernel runtime # parameters # # Authors : Nathan Coulson (nathan AT linuxfromscratch D0T org) # Matthew Burgress (matthew AT linuxfromscratch D0T org) # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sysctl # Required-Start: mountvirtfs # Should-Start: console # Required-Stop: # Should-Stop: # Default-Start: S # Default-Stop: # Short-Description: Makes changes to the proc filesystem # Description: Makes changes to the proc filesystem as defined in # /etc/sysctl.conf. See 'man sysctl(8)'. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) if [ -f "/etc/sysctl.conf" ]; then log_info_msg "Setting kernel runtime parameters..." sysctl -q -p evaluate_retval fi ;; status) sysctl -a ;; *) echo "Usage: ${0} {start|status}" exit 1 ;; esac exit 0 # End sysctl
#!/bin/sh ######################################################################## # Begin sysklogd # # Description : Sysklogd loader # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $syslog # Required-Start: $first localnet # Should-Start: # Required-Stop: $local_fs # Should-Stop: sendsignals # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts kernel and system log daemons. # Description: Starts kernel and system log daemons. # /etc/fstab. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting system log daemon..." parms=${SYSKLOGD_PARMS-'-m 0'} start_daemon /sbin/syslogd $parms evaluate_retval log_info_msg "Starting kernel log daemon..." start_daemon /sbin/klogd evaluate_retval ;; stop) log_info_msg "Stopping kernel log daemon..." killproc /sbin/klogd evaluate_retval log_info_msg "Stopping system log daemon..." killproc /sbin/syslogd evaluate_retval ;; reload) log_info_msg "Reloading system log daemon config file..." pid=`pidofproc syslogd` kill -HUP "${pid}" evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; status) statusproc /sbin/syslogd statusproc klogd ;; *) echo "Usage: ${0} {start|stop|reload|restart|status}" exit 1 ;; esac exit 0 # End sysklogd
#!/bin/sh ######################################################################## # Begin network # # Description : Network Control Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: $network # Required-Start: $local_fs localnet swap # Should-Start: $syslog firewalld iptables nftables # Required-Stop: $local_fs localnet swap # Should-Stop: $syslog firewalld iptables nftables # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts and configures network interfaces. # Description: Starts and configures network interfaces. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in start) # if the default route exists, network is already configured if ip route | grep -q "^default"; then return 0; fi # Start all network interfaces for file in /etc/sysconfig/ifconfig.* do interface=${file##*/ifconfig.} # Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ]; then continue; fi /sbin/ifup ${interface} done ;; stop) # Unmount any network mounted file systems umount --all --force --types nfs,cifs,nfs4 # Reverse list net_files="" for file in /etc/sysconfig/ifconfig.* do net_files="${file} ${net_files}" done # Stop all network interfaces for file in ${net_files} do interface=${file##*/ifconfig.} # Skip if $file is * (because nothing was found) if [ "${interface}" = "*" ]; then continue; fi # See if interface exists if [ ! -e /sys/class/net/$interface ]; then continue; fi # Is interface UP? ip link show $interface 2>/dev/null | grep -q "state UP" if [ $? -ne 0 ]; then continue; fi /sbin/ifdown ${interface} done ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End network
#!/bin/sh ######################################################################## # Begin sendsignals # # Description : Sendsignals Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## ### BEGIN INIT INFO # Provides: sendsignals # Required-Start: # Should-Start: # Required-Stop: $local_fs swap localnet # Should-Stop: # Default-Start: # Default-Stop: 0 6 # Short-Description: Attempts to kill remaining processes. # Description: Attempts to kill remaining processes. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in stop) omit=$(pidof mdmon) [ -n "$omit" ] && omit="-o $omit" log_info_msg "Sending all processes the TERM signal..." killall5 -15 $omit error_value=${?} sleep ${KILLDELAY} if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi log_info_msg "Sending all processes the KILL signal..." killall5 -9 $omit error_value=${?} sleep ${KILLDELAY} if [ "${error_value}" = 0 -o "${error_value}" = 2 ]; then log_success_msg else log_failure_msg fi ;; *) echo "Usage: ${0} {stop}" exit 1 ;; esac exit 0 # End sendsignals
#!/bin/sh ######################################################################## # Begin reboot # # Description : Reboot Scripts # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Updates : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Update March 24th, 2022: change "stop" to "start". # Add the $last facility to Required-start # ######################################################################## ### BEGIN INIT INFO # Provides: reboot # Required-Start: $last # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 6 # Default-Stop: # Short-Description: Reboots the system. # Description: Reboots the System. # X-LFS-Provided-By: LFS ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Restarting system..." reboot -d -f -i ;; *) echo "Usage: ${0} {start}" exit 1 ;; esac # End reboot
#!/bin/sh ######################################################################## # Begin halt # # Description : Halt Script # # Authors : Gerard Beekmans - gerard AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # : Pierre Labastie - pierre AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : Update March 24th, 2022: change "stop" to "start". # Add the $last facility to Required-start # ######################################################################## ### BEGIN INIT INFO # Provides: halt # Required-Start: $last # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 0 # Default-Stop: # Short-Description: Halts the system. # Description: Halts the System. # X-LFS-Provided-By: LFS ### END INIT INFO case "${1}" in start) halt -d -f -i -p ;; *) echo "Usage: {start}" exit 1 ;; esac # End halt
#!/bin/sh ######################################################################## # Begin scriptname # # Description : # # Authors : # # Version : LFS x.x # # Notes : # ######################################################################## ### BEGIN INIT INFO # Provides: template # Required-Start: # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: # Default-Stop: # Short-Description: # Description: # X-LFS-Provided-By: ### END INIT INFO . /lib/lsb/init-functions case "${1}" in start) log_info_msg "Starting..." # if it is possible to use start_daemon start_daemon fully_qualified_path # if it is not possible to use start_daemon # (command to start the daemon is not simple enough) if ! pidofproc daemon_name_as_reported_by_ps >/dev/null; then command_to_start_the_service fi evaluate_retval ;; stop) log_info_msg "Stopping..." # if it is possible to use killproc killproc fully_qualified_path # if it is not possible to use killproc # (the daemon shoudn't be stopped by killing it) if pidofproc daemon_name_as_reported_by_ps >/dev/null; then command_to_stop_the_service fi evaluate_retval ;; restart) ${0} stop sleep 1 ${0} start ;; *) echo "Usage: ${0} {start|stop|restart}" exit 1 ;; esac exit 0 # End scriptname
######################################################################## # Begin /etc/sysconfig/modules # # Description : Module auto-loading configuration # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # <module> [<arg1> <arg2> ...] # # Each module should be on its own line, and any options that you want # passed to the module should follow it. The line deliminator is either # a space or a tab. ######################################################################## # End /etc/sysconfig/modules
######################################################################## # Begin /etc/sysconfig/createfiles # # Description : Createfiles script config file # # Authors : # # Version : 00.00 # # Notes : The syntax of this file is as follows: # if type is equal to "file" or "dir" # <filename> <type> <permissions> <user> <group> # if type is equal to "dev" # <filename> <type> <permissions> <user> <group> <devtype> # <major> <minor> # # <filename> is the name of the file which is to be created # <type> is either file, dir, or dev. # file creates a new file # dir creates a new directory # dev creates a new device # <devtype> is either block, char or pipe # block creates a block device # char creates a character deivce # pipe creates a pipe, this will ignore the <major> and # <minor> fields # <major> and <minor> are the major and minor numbers used for # the device. ######################################################################## # End /etc/sysconfig/createfiles
######################################################################## # Begin /etc/sysconfig/udev_retry # # Description : udev_retry script configuration # # Authors : # # Version : 00.00 # # Notes : Each subsystem that may need to be re-triggered after mountfs # runs should be listed in this file. Probable subsystems to be # listed here are rtc (due to /var/lib/hwclock/adjtime) and sound # (due to both /var/lib/alsa/asound.state and /usr/sbin/alsactl). # Entries are whitespace-separated. ######################################################################## rtc # End /etc/sysconfig/udev_retry
#!/bin/sh ######################################################################## # Begin /sbin/ifup # # Description : Interface Up # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # DJ Lucas - dj AT linuxfromscratch D0T org # # Version : LFS 7.7 # # Notes : The IFCONFIG variable is passed to the SERVICE script # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## up() { log_info_msg "Bringing up the ${1} interface..." if ip link show $1 > /dev/null 2>&1; then link_status=`ip link show $1` if [ -n "${link_status}" ]; then if ! echo "${link_status}" | grep -q UP; then ip link set $1 up fi fi else log_failure_msg "Interface ${IFACE} doesn't exist." exit 1 fi evaluate_retval } RELEASE="7.7" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifup, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; *) break ;; esac done if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifup is used to bring up a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi file=/etc/sysconfig/ifconfig.${1} # Skip backup files [ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions if [ ! -r "${file}" ]; then log_failure_msg "Unable to bring up ${1} interface! ${file} is missing or cannot be accessed." exit 1 fi . $file if [ "$IFACE" = "" ]; then log_failure_msg "Unable to bring up ${1} interface! ${file} does not define an interface [IFACE]." exit 1 fi # Do not process this service if started by boot, and ONBOOT # is not set to yes if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then exit 0 fi # Bring up the interface if [ "$VIRTINT" != "yes" ]; then up ${IFACE} fi for S in ${SERVICE}; do if [ ! -x "/lib/services/${S}" ]; then MSG="\nUnable to process ${file}. Either " MSG="${MSG}the SERVICE '${S} was not present " MSG="${MSG}or cannot be executed." log_failure_msg "$MSG" exit 1 fi done if [ "${SERVICE}" = "wpa" ]; then log_success_msg; fi # Create/configure the interface for S in ${SERVICE}; do IFCONFIG=${file} /lib/services/${S} ${IFACE} up done # Set link up virtual interfaces if [ "${VIRTINT}" == "yes" ]; then up ${IFACE} fi # Bring up any additional interface components for I in $INTERFACE_COMPONENTS; do up $I; done # Set MTU if requested. Check if MTU has a "good" value. if test -n "${MTU}"; then if [[ ${MTU} =~ ^[0-9]+$ ]] && [[ $MTU -ge 68 ]] ; then for I in $IFACE $INTERFACE_COMPONENTS; do ip link set dev $I mtu $MTU; done else log_info_msg2 "Invalid MTU $MTU" fi fi # Set the route default gateway if requested if [ -n "${GATEWAY}" ]; then if ip route | grep -q default; then log_warning_msg "Gateway already setup; skipping." else log_info_msg "Adding default gateway ${GATEWAY} to the ${IFACE} interface..." ip route add default via ${GATEWAY} dev ${IFACE} evaluate_retval fi fi # End /sbin/ifup
#!/bin/bash ######################################################################## # Begin /sbin/ifdown # # Description : Interface Down # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # # Notes : the IFCONFIG variable is passed to the scripts found # in the /lib/services directory, to indicate what file the # service should source to get interface specifications. # ######################################################################## RELEASE="7.0" USAGE="Usage: $0 [ -hV ] [--help] [--version] interface" VERSTR="LFS ifdown, version ${RELEASE}" while [ $# -gt 0 ]; do case "$1" in --help | -h) help="y"; break ;; --version | -V) echo "${VERSTR}"; exit 0 ;; -*) echo "ifup: ${1}: invalid option" >&2 echo "${USAGE}" >& 2 exit 2 ;; *) break ;; esac done if [ -n "$help" ]; then echo "${VERSTR}" echo "${USAGE}" echo cat << HERE_EOF ifdown is used to bring down a network interface. The interface parameter, e.g. eth0 or eth0:2, must match the trailing part of the interface specifications file, e.g. /etc/sysconfig/ifconfig.eth0:2. HERE_EOF exit 0 fi file=/etc/sysconfig/ifconfig.${1} # Skip backup files [ "${file}" = "${file%""~""}" ] || exit 0 . /lib/lsb/init-functions if [ ! -r "${file}" ]; then log_warning_msg "${file} is missing or cannot be accessed." exit 1 fi . ${file} if [ "$IFACE" = "" ]; then log_failure_msg "${file} does not define an interface [IFACE]." exit 1 fi # We only need to first service to bring down the interface S=`echo ${SERVICE} | cut -f1 -d" "` if ip link show ${IFACE} > /dev/null 2>&1; then if [ -n "${S}" -a -x "/lib/services/${S}" ]; then IFCONFIG=${file} /lib/services/${S} ${IFACE} down else MSG="Unable to process ${file}. Either " MSG="${MSG}the SERVICE variable was not set " MSG="${MSG}or the specified service cannot be executed." log_failure_msg "$MSG" exit 1 fi else log_warning_msg "Interface ${1} doesn't exist." fi # Leave the interface up if there are additional interfaces in the device link_status=`ip link show ${IFACE} 2>/dev/null` if [ -n "${link_status}" ]; then if [ "$(echo "${link_status}" | grep UP)" != "" ]; then if [ "$(ip addr show ${IFACE} | grep 'inet ')" == "" ]; then log_info_msg "Bringing down the ${IFACE} interface..." ip link set ${IFACE} down evaluate_retval fi fi fi # End /sbin/ifdown
#!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static # # Description : IPV4 Static Boot Script # # Authors : Nathan Coulson - nathan AT linuxfromscratch D0T org # Kevin P. Fleming - kpfleming@linuxfromscratch.org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} if [ -z "${IP}" ]; then log_failure_msg "\nIP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" -a -z "${PEER}" ]; then log_warning_msg "\nPREFIX variable missing from ${IFCONFIG}, assuming 24." PREFIX=24 args="${args} ${IP}/${PREFIX}" elif [ -n "${PREFIX}" -a -n "${PEER}" ]; then log_failure_msg "\nPREFIX and PEER both specified in ${IFCONFIG}, cannot continue." exit 1 elif [ -n "${PREFIX}" ]; then args="${args} ${IP}/${PREFIX}" elif [ -n "${PEER}" ]; then args="${args} ${IP} peer ${PEER}" fi if [ -n "${LABEL}" ]; then args="${args} label ${LABEL}" fi if [ -n "${BROADCAST}" ]; then args="${args} broadcast ${BROADCAST}" fi case "${2}" in up) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" = "" ]; then log_info_msg "Adding IPv4 address ${IP} to the ${1} interface..." ip addr add ${args} dev ${1} evaluate_retval else log_warning_msg "Cannot add IPv4 address ${IP} to ${1}. Already present." fi ;; down) if [ "$(ip addr show ${1} 2>/dev/null | grep ${IP}/)" != "" ]; then log_info_msg "Removing IPv4 address ${IP} from the ${1} interface..." ip addr del ${args} dev ${1} evaluate_retval fi if [ -n "${GATEWAY}" ]; then # Only remove the gateway if there are no remaining ipv4 addresses if [ "$(ip addr show ${1} 2>/dev/null | grep 'inet ')" != "" ]; then log_info_msg "Removing default gateway..." ip route del default evaluate_retval fi fi ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static
#!/bin/sh ######################################################################## # Begin /lib/services/ipv4-static-route # # Description : IPV4 Static Route Script # # Authors : Kevin P. Fleming - kpfleming@linuxfromscratch.org # DJ Lucas - dj AT linuxfromscratch D0T org # Update : Bruce Dubbs - bdubbs AT linuxfromscratch D0T org # # Version : LFS 7.0 # ######################################################################## . /lib/lsb/init-functions . ${IFCONFIG} case "${TYPE}" in ("" | "network") need_ip=1 need_gateway=1 ;; ("default") need_gateway=1 args="${args} default" desc="default" ;; ("host") need_ip=1 ;; ("unreachable") need_ip=1 args="${args} unreachable" desc="unreachable " ;; (*) log_failure_msg "Unknown route type (${TYPE}) in ${IFCONFIG}, cannot continue." exit 1 ;; esac if [ -n "${GATEWAY}" ]; then MSG="The GATEWAY variable cannot be set in ${IFCONFIG} for static routes.\n" log_failure_msg "$MSG Use STATIC_GATEWAY only, cannot continue" exit 1 fi if [ -n "${need_ip}" ]; then if [ -z "${IP}" ]; then log_failure_msg "IP variable missing from ${IFCONFIG}, cannot continue." exit 1 fi if [ -z "${PREFIX}" ]; then log_failure_msg "PREFIX variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} ${IP}/${PREFIX}" desc="${desc}${IP}/${PREFIX}" fi if [ -n "${need_gateway}" ]; then if [ -z "${STATIC_GATEWAY}" ]; then log_failure_msg "STATIC_GATEWAY variable missing from ${IFCONFIG}, cannot continue." exit 1 fi args="${args} via ${STATIC_GATEWAY}" fi if [ -n "${SOURCE}" ]; then args="${args} src ${SOURCE}" fi case "${2}" in up) log_info_msg "Adding '${desc}' route to the ${1} interface..." ip route add ${args} dev ${1} evaluate_retval ;; down) log_info_msg "Removing '${desc}' route from the ${1} interface..." ip route del ${args} dev ${1} evaluate_retval ;; *) echo "Usage: ${0} [interface] {up|down}" exit 1 ;; esac # End /lib/services/ipv4-static-route
Reglene i dette vedlegget er listet opp for enkelhets skyld. Installasjon gjøres normalt via instruksjoner i Section 8.70, “Eudev-3.2.11”.
# /etc/udev/rules.d/55-lfs.rules: Rule definitions for LFS. # Core kernel devices # This causes the system clock to be set as soon as /dev/rtc becomes available. SUBSYSTEM=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start" KERNEL=="rtc", ACTION=="add", MODE="0644", RUN+="/etc/rc.d/init.d/setclock start" # Comms devices KERNEL=="ippp[0-9]*", GROUP="dialout" KERNEL=="isdn[0-9]*", GROUP="dialout" KERNEL=="isdnctrl[0-9]*", GROUP="dialout" KERNEL=="dcbri[0-9]*", GROUP="dialout"
Denne boken er lisensiert under Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Lisensen.
Datainstruksjoner kan trekkes ut fra boken under MIT Lisensen.
Creative Commons Legal Code
Attribution-NonCommercial-ShareAlike 2.0
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
License
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
Definitions
"Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
"Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
"Licensor" means the individual or entity that offers the Work under the terms of this License.
"Original Author" means the individual or entity who created the Work.
"Work" means the copyrightable work of authorship offered under the terms of this License.
"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
"License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike.
Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
to create and reproduce Derivative Works;
to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works;
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f).
Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested.
You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
For the avoidance of doubt, where the Work is a musical composition:
Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. 6. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.
Representations, Warranties and Disclaimer
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Termination
This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
Miscellaneous
Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.
Creative Commons may be contacted at http://creativecommons.org/.
Copyright © 1999-2022 Gerard Beekmans
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.