Detaljer om denne pakken finner du i Section 8.19.2, “Innhold i Binutils”
Copyright © 1999-2024 Gerard Beekmans
Opphavsrett © 1999-2024, Gerard Beekmans
Alle rettigheter forbeholdt.
Denne boken er lisensiert under Creative Commons License.
Datainstruksjoner kan trekkes ut fra boken under MIT Lisensen.
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ør 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. Du dikterer alle aspekter av systemet ditt.
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 problemet 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.
Den 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.
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 minutter 3.6 GB
64-bit 233.2 minutter 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, en gang for et 32-bitssystem og en 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 riktig utføre kommandoene som er oppført. Spesielt som et absolutt minimum, bør du allerede vite hvordan du bruker kommandolinjen (skallet) 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 sannsynligvis vil 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 https://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 https://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) Versjon 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 å samsvare med LSB spesifikasjoner for IA32 (32-bit x86) eller AMD64 (x86_64) 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: |
Ingen |
LSB Kjøretidsspråk: |
Perl, Python |
LSB Bildebehandling: |
Ingen |
LSB Gtk3 og LSB Grafikk (Prøvebruk): |
Ingen |
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 |
Målet med LFS er å bygge en komplett og brukbart system på fundamentnivå—inkludert alle pakkene som trengs for å replikere seg selv—og gi en relativt minimal base for å tilpasse et mer komplett system basert på brukerens valg. Dette betyr ikke at LFS er det minste systemet som er mulig. Flere viktige pakker er inkludert som strengt tatt ikke er påkrevd. Listen nedenfor dokumenterer grunner til at hver pakke i boken er inkludert.
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.
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.
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 (lexical analyzer) 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 bygges av LFS.
GDBM
Denne pakken inneholder GNU biblioteket for databasebehandling. 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 hashfunksjon fra et nøkkelsett. Den kreves av Udev .
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 mansider.
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.
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 den andre vanlige verktæypakken for nettverk (net-tools) for sine IPv6-funksjoner.
Kbd
Denne pakken inneholder tastaturtabellfiler, 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. Mange pakker bruker den til å søke på utdataene.
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ørbar 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. Den kreves av Man-DB pakken.
Libtool
Denne pakken inneholder GNU skriptet for generisk bibliotekstøtte. Det omslutter kompleksiteten ved å bruke delte biblioteker i en konsekvent, flyttbart grensesnitt. Det trengs av testpakker i andre LFS pakker.
Libxcrypt
Denne pakken gir libcrypt
bibliotek nødvendig av forskjellige pakker (spesielt
Shadow) for hashing av passord. Den erstatter det foreldede
libcrypt
implementering i
Glibc.
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 mansider. 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 grunnleggende mansider for Linux.
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 byggesystemet. 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 multipresisjons 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 byggesystem, 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 Linuxkjernen.
Patch
Denne pakken inneholder et program for å endre eller lage filer ved å bruke en oppdateringsfil (patch) 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.
Pkgconf
Denne pakken inneholder et program som hjelper til med å konfigurere kompilator- og linkerflagg for utviklingsbiblioteker. Programmet kan brukes som drop-in erstatning for pkg-config, som trengs av byggesystemet for mange pakker. Det vedlikeholdes mer aktivt og er litt raskere enn den originale Pkg-config pakken.
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 systemadministrasjon.
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 gir init programmet, som er overordnet for alle andre prosesser på et Linux system.
Udev
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.
Tar
Denne pakken gir arkiverings- og utpakkingssmuligheter av praktisk talt alle pakker som brukes i LFS.
Tcl
Denne pakken inneholder Verktøykommandospråk (Tool Command Language) som brukes i mange testpakker i LFS pakker.
Texinfo
Denne pakken inneholder programmer for å lese, skrive til og konvertere informasjonssider. Den brukes i installasjonsprosedyrer 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.
Vim
Denne pakken inneholder et redigeringsprogram. Den ble valgt på grunn av sin kompatibilitet med det klassiske vi redigeringsprogrammet og dens enormt antall kraftige kapasiteter. Et redigeringsprogram er et veldig personlig valg for mange brukere og andre redigeringsprogram kan brukes om ønskelig.
Wheel
Denne pakken inneholder Python modulen Wheel som er referanseimplementering av Python wheel pakkingsstandarden.
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 et svært bredt utvalg av kompresjon/hastighets avveininger.
For å gjøre ting lettere å følge, er 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. Den 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.
Dette formatet brukes til å referere til en spesifikk manual
(manside). Tallet innenfor parentes indikerer en bestemt del i
håndbøkene. For eksempel, passwd har to mansider. I
henhold til LFS installasjonsinstruksjoner, disse to mansidene
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 mansiden den finner som stemmer med “passwd”, som vil bli
/usr/share/man/man1/passwd.1
. For
dette eksemplet trenger du å kjøre man 5 passwd for å lese siden
som blir spesifisert. Merk at de fleste mansider ikke har
duplikate sidenavn i forskjellige seksjoner. Derfor, man <programnavn>
er generelt tilstrekkelig. I LFS boken er disse referansene til
mansider også hyperkoblinger, så klikk på en slik referanse vil
åpne mansiden gjengitt i HTML fra Arch Linux manual pages.
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 en etter en, 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 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 boken, 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—å reparere sikkerhetssårbarheter eller for å fikse andre feil—besøk https://www.linuxfromscratch.org/lfs/errata/12.1/ før du fortsetter med byggingen. Du bør merke deg 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 å lese listen, besøk https://www.linuxfromscratch.org/lfs/advisories/ før du fortsetter med byggingen. Du bør anvende endringene foreslått av rådene til de relevante delene av boken mens du bygger LFS systemet. Og hvis du vil bruke LFS systemet som et ekte skrivebord eller serversystem, bør du fortsette å konsultere råd og fikse eventuelle sikkerhetssårbarheter, selv når LFS systemet er ferdig bygget.
LFS systemet vil bli bygget ved å bruke en allerede installert Linuxdistribusjon (som Debian, OpenMandriva, Fedora eller openSUSE). Denne eksisterende Linuxsystemet (verten) vil bli brukt som utgangspunkt for å gi nødvendige programmer, inkludert en kompilator, linker og skall, for å bygge det nye systemet. Velg “development” alternativet under distribusjonsinstallasjonen for å kunne få tilgang til disse verktøyene.
Det er mange måter å installere en Linuxdistribusjon på og standardinnstillingene er vanligvis ikke optimale for å bygge et LFS system. For forslag til å sette opp en kommersiell distribusjon, se: https://www.linuxfromscratch.org/hints/downloads/files/partitioning-for-lfs.txt.
Som et alternativ til å installere en separat distribusjon på din maskin, kan det være lurt å 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 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 krysskompileringsteknikker for å isolere de nye verktøyene fra vertssystemet.
Kapittel 6 viser hvordan du krysskompiler grunnleggende verktøy ved å bruke den nettopp bygde kryssverktøykjeden.
Kapittel 7 går deretter inn et "chroot" miljø, der vi bruker de nye verktøyene til å bygge resten av verktøyene som trengs for å lage LFS systemet.
Denne innsatsen for å isolere det nye systemet fra vertsdistribusjonen kan virke overdreven. En fullstendig teknisk forklaring på hvorfor dette gjøres er gitt i Verktøykjedens tekniske merknader.
I Kapittel 8 blir det fulle LFS system 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 blir opprettet 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.
Her er en liste over pakkene som er oppdatert siden forrige utgivelse av LFS.
Oppgradert til:
Acl-2.3.2
Attr-2.5.2
Autoconf-2.72
Bash-5.2.21
Bc-6.7.5
Binutils-2.42
Coreutils-9.4
Expat-2.6.0
Gawk-5.3.0
Gettext-0.22.4
Glibc-2.39
GRUB-2.12
Gzip-1.13
Iana-Etc-20240125
Inetutils-2.5
IPRoute2-6.7.0
Jinja2-3.1.3
Kbd-2.6.4
Kmod-31
Libelf fra Elfutils-0.190
Linux-6.7.4
Man-DB-2.12.0
Man-pages-6.06
MarkupSafe-2.1.5
Meson-1.3.2
MPFR-4.2.1
Ncurses-6.4-20230520
OpenSSL-3.2.1
Perl-5.38.2
Pkgconf-2.1.1
Procps-ng-4.0.4
Python-3.12.2
Setuptools-69.1.0
Shadow-4.14.5
SysVinit-3.08
Texinfo-7.1
Tzdata-2024a
Util-linux-2.39.3
Vim-9.1.0041
Wheel-0.42.0
XML::Parser-2.47
Xz-5.4.6
Zlib-1.3.1
Lagt til:
bash-5.2.21-upstream_fixes-1.patch
readline-8.2-upstream_fixes-3.patch
setuptools-69.1.0
systemd-255-upstream_fixes-1.patch
Fjernet:
glibc-2.38-memalign_fix-1.patch
grub-2.06-upstream_fixes-1.patch
readline-8.2-upstream_fix-1.patch
Dette er versjon 12.1 av Linux From Scratch-boken, datert 1. Mars 2024. Hvis denne boken er mer enn seks måneder gammel, er en nyere og bedre versjonen 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:
01.03.2024
[bdubbs] - LFS-12.1 utgitt.
14.02.2024
[bdubbs] - Oppdatert til meson-1.3.2. Fikser #5442.
12.02.2024
[bdubbs] - Oppdatert til shadow-4.14.4. Fikser #5437.
[bdubbs] - Oppdatert til setuptools-69.1.0 (Python modul). Fikser #5439.
[bdubbs] - Oppdatert til python-3.12.2. Fikser #5434.
[bdubbs] - Oppdatert til pkgconf-2.1.1. Fikser #5432.
[bdubbs] - Oppdatert til MarkupSafe-2.1.5 (Python modul). Fikser #5431.
[bdubbs] - Oppdatert til man-pages-6.06. Fikser #5438.
[bdubbs] - Oppdatert til expat-2.6.0. Fikser #5435.
[bdubbs] - Oppdatert til linux-6.7.4. Fikser #5433.
02.02.2024
01.02.2024
[bdubbs] - Oppdatert til openssl-3.2.1 (sikkerhetsfiks). Fikser #5425.
[bdubbs] - Oppdatert til zlib-1.3.1. Fikser #5419.
[bdubbs] - Oppdatert til xz-5.4.6. Fikser #5423.
[bdubbs] - Oppdatert til linux-6.7.2. Fikser #5422.
[bdubbs] - Oppdatert til iana-etc-20240125. Adresserer #5006.
[bdubbs] - Oppdatert til binutils-2.42. Fikser #5424.
[bdubbs] - Oppdatert til acl-2.3.2. Fikser #5421.
[bdubbs] - Oppdater oppstrøms fiks for readline-8.2. Fikser #5420.
[bdubbs] - Bruk oppstrøms fiks for bash-5.2.21. Fikser #5420.
21.01.2024
[xry111] - Bruk oppstrøms rettelse for pkgconf-2.1.0 regresjon. Fikser #5414.
[xry111] - Oppdatert til jinja2-3.1.3 (sikkerhetsfiks). Fikser #5411.
[xry111] - Oppdatert til bc-6.7.5. Fikser #5408.
[xry111] - Oppdatert til attr-2.5.2. Fikser #5412.
[xry111] - Oppdatert til ncurses-6.4-20230520 (sikkerhetsfiks). Fikser #5416.
[xry111] - Oppdatert til markupsafe-2.1.4. Fikser #5418.
[xry111] - Oppdatert til linux-6.7.1. Fikser #5406.
[xry111] - Oppdatert til iproute2-6.7.0. Fikser #5410.
[xry111] - Oppdatert til vim-9.1.0041. Adresserer #4500.
[xry111] - Oppdatert til iana-etc-20240117. Adresserer #5006.
[xry111] - Oppdatert til shadow-4.14.3. Fikser #5413.
[xry111] - Fiks CVE-2024-0684 for coreutils-9.4. Fikser #5417.
18.01.2024
[xry111] - Rediger en ncurses deklarasjoner for alltid å bruke wide-character ABI kompatibel med libncursesw.so fordi vi faker 8-biters libncurses.so med den. Fikser #5415.
09.01.2024
[renodr] - Fiks definisjonen av C.UTF-8 lokaliteten. Fikser #5409.
31.12.2023
[xry111] - Legg til --enable-default-hash-style=gnu konfigurere binutils. Fikser #5401.
[xry111] - Fiks CVE-2023-7008 for systemd-255. Fikser #5405.
[xry111] - Oppdatert til iana-etc-20231205. Adresserer #5006.
[xry111] - Oppdatert til tzdata-2023d. Fikser #5399.
[xry111] - Oppdatert til linux-6.6.8. Fikser #5397.
[xry111] - Oppdatert til meson-1.3.1. Fikser #5402.
[xry111] - Oppdatert til grub-2.12. Fikser #5396.
[xry111] - Oppdatert til inetutils-2.5. Fikser #5404.
[xry111] - Oppdatert til setuptools-69.0.3. Fikser #5400.
[xry111] - Oppdatert til xml-parser-2.47. Fikser #5403.
[xry111] - Oppdatert til vim-9.0.2189. Adresserer #4500.
[xry111] - Oppdatert til autoconf-2.72. Fikser #5398.
16.12.2023
[xry111] - Oppdatert til udev fra systemd-255. Fikser #5390.
14.12.2023
[bdubbs] - Oppdatert til util-linux v2.39.3. Fikser #5388.
[bdubbs] - Oppdatert til python3-3.12.1. Fikser #5392.
[bdubbs] - Oppdatert til linux-6.6.7. Fikser #5387.
[bdubbs] - Oppdatert til kbd-2.6.4. Fikser #5393.
[bdubbs] - Oppdatert til bc-6.7.4. Fikser #5389.
[bdubbs] - Reformater util-linux konfigureringsparametere. Fikser #5395.
04.12.2023
[thomas] - Endre kommandoer for installering av Python dokumenter for å unngå for restriktive tillatelser på filene og mappene.
01.12.2023
[xry111] - Gjenopprett NIC navngivning basert på det fysiske systemets kjennetegn. Fikser #5386.
30.11.2023
[bdubbs] - Oppdatert til vim-9.0.2136. Adresserer #4500.
[bdubbs] - Oppdatert til iana-etc-20231117. Adresserer #5006.
[bdubbs] - Oppdatert til bc-6.7.3. Fikser #5385.
[bdubbs] - Oppdatert til wheel-0.42.0 (Python Module). Fikser #5384.
[bdubbs] - Oppdatert til perl-5.38.2. Fikser #5383.
[bdubbs] - Oppdatert til pkgconf-2.1.0. Fikser #5382.
[bdubbs] - Oppdatert til readline oppdateringer 002 gjennom 007. Fikser #5381.
[bdubbs] - Oppdatert til openssl-3.2.0. Fikser #5380.
[bdubbs] - Oppdatert til setuptools-69.0.2. Fikser #5379.
[bdubbs] - Oppdatert til linux-6.6.3. Fikser #5378.
[bdubbs] - Oppdatert til meson-1.3.0. Fikser #5377.
[bdubbs] - Oppdatert til gettext-0.22.4. Fikser #5376.
13.11.2023
[xry111] - Oppdatert til elfutils-0.190. Fikser #5373.
[xry111] - Oppdatert til vim-9.0.2103. Adresserer #4500.
[xry111] - Oppdatert til linux-6.6.1. Fikser #5369.
[xry111] - Oppdatert til xz-5.4.5. Fikser #5371.
[xry111] - Oppdatert til iana-etc-20231107. Adresserer #5006.
[xry111] - Oppdatert til gawk-5.3.0. Fikser #5372.
[xry111] - Oppdatert til bash-5.2.21. Fikser #5375.
[xry111] - Oppdatert til iproute2-6.6.0. Fikser #5374.
01.11.2023
[bdubbs] - Oppdatert til iana-etc-20231019. Adresserer #5006.
[bdubbs] - Oppdatert til wheel-0.41.3. Fikser #5370.
[bdubbs] - Oppdatert til shadow-4.14.2. Fikser #5368.
[bdubbs] - Oppdatert til openssl-3.1.4. Fikser #5367.
[bdubbs] - Oppdatert til texinfo-7.1. Fikser #5364.
[bdubbs] - Oppdatert til meson-1.2.3. Fikser #5366.
[bdubbs] - Oppdatert til bc-6.7.2. Fikser #5363.
[bdubbs] - Oppdatert til linux-6.5.9. Fikser #5365.
[bdubbs] - Oppdatert til Python-3.12.0. Fikser #5357.
[bdubbs] - Lagt til setuptools-68.2.2. Fikser #5358.
15.10.2023
03.10.2023
[xry111] - Oppdater Glibc oppstrøms fikser oppdatering for å fikse CVE-2023-4911.
01.10.2023
[bdubbs] - Deaktiver byggingen av nscd i glibc. Fikser #5349.
[bdubbs] - Oppdatert til iana-etc-20230929. Adresserer #5006.
[bdubbs] - Oppdatert til vim-9.0.1968. Adresserer #4500.
[bdubbs] - Oppdatert til openssl-3.1.3. Fikser #5350.
[bdubbs] - Oppdatert til meson-1.2.2. Fikser #5356.
[bdubbs] - Oppdatert til man-db-2.12.0. Fikser #5354.
[bdubbs] - Oppdatert til linux-6.5.5. Fikser #5352.
[bdubbs] - Oppdatert til kmod-31. Fikser #5355.
[bdubbs] - Oppdatert til kbd-2.6.3. Fikser #5361.
[bdubbs] - Oppdatert til gettext-0.22.2. Fikser #5348.
[bdubbs] - Oppdatert til bc-6.7.0. Fikser #5353.
24.09.2023
[xry111] - Oppdater Glibc oppstrøms oppdatering for å tette en minnelekkasje introdusert av sikkerhetsfiksen.
17.09.2023
13.09.2023
[xry111] - Fiks CVE-2023-4806 for Glibc-2.38. Fikser #5347.
12.09.2023
[xry111] - Fiks CVE-2023-4527 for Glibc-2.38. Fikser #5346.
07.09.2023
[xry111] - Løs et problem i pkgconf-2.0.3 som forårsaker at BLFS pakker ikke kan bygges. Fikser #5341.
05.09.2023
04.09.2023
[bdubbs] - Flytt vær forsiktig med å bygge ved å blande annen versjon av LFS til Generelle kompilasjonsinstruksjoner. Fikser #5338.
02.09.2023
[xry111] - Lagt til --no-cache-dir valget for pip3 wheel kommandoer. Addresserer BLFS #18466.
[bdubbs] - Oppdatert til vim-9.0.1837. Adresserer #4500.
[bdubbs] - Oppdatert til zlib-1.3. Fikser #5324.
[bdubbs] - Oppdatert til wheel-0.41.2 (Python Modul). Fikser #5328.
[bdubbs] - Oppdatert til util-linux-2.39.2. Fikser #5322.
[bdubbs] - Oppdatert til sysvinit-3.08. Fikser #5321.
[bdubbs] - Oppdatert til shadow-4.14.0. Fikser #5319.
[bdubbs] - Oppdatert til Python-3.11.5. Fikser #5330.
[bdubbs] - Update to procps-ng-4.0.4 (sikkerhetsfiks for 32-bit systemer). Fikser #5335.
[bdubbs] - Oppdatert til pkgconf-2.0.2. Fikser #5323.
[bdubbs] - Oppdatert til mpfr-4.2.1. Fikser #5326.
[bdubbs] - Oppdatert til kbd-2.6.2. Fikser #5318.
[bdubbs] - Oppdatert til gzip-1.13. Fikser #5325.
[bdubbs] - Oppdatert til coreutils-9.4. Fikser #5334.
[bdubbs] - Fjern ubrukt usb gruppe. Fikser #5331.
01.09.2023
[bdubbs] - LFS-12.0 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, arkivsteder 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. Besøk LFS nettstedet på https://www.linuxfromscratch.org/mirrors.html for en liste av nåværende speil.
I tilfelle du har et problem med å bygge en pakke med LFS instruksjoner fraråder vi på det sterkeste å legge ut problemet direkte på oppstrøms støttekanalen før diskusjon via en LFS støttekanal oppført i Section 1.4, “Ressurser”. Å gjøre det er ofte ganske ineffektivt fordi oppstrøms vedlikeholdere sjelden er kjent med LFS byggeprosedyre. Selv om du virkelig har truffet et oppstrømsproblem, kan LFS-fellesskapet fortsatt hjelpe å isolere informasjonen ønsket av oppstrøms vedlikeholdere og lage en skikkelig rapport.
Hvis du må stille et spørsmål direkte via en oppstrøms støttekanal, skal du i det minste merke deg at mange oppstrømsprosjekter har støttekanaler atskilt fra feilsporeren. “bug” rapporter for å stille spørsmål anses som ugyldige og kan irritere oppstrømsutviklere for disse prosjektene.
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 FAQ, 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, enhver forespørsel om hjelp bør inkludere disse viktige tingene:
Versjonen av boken som brukes (i dette tilfellet 12.1)
Vertsdistribusjonen og versjonen som brukes til å lage LFS
Utdata fra Systemkrav for verten skriptet
Pakken eller seksjonen problemet ble oppdaget i
Den nøyaktige feilmeldingen, eller en tydelig beskrivelse av problemet
Gi beskjed om du i det hele tatt har avveket 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 skriptet,
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, lager et filsystem på den og monter den.
LFS redaktørene anbefaler at CPUen har minst fire kjerner og at systemet har minst 8 GB minne. Eldre systemer som ikke oppfyller disse kravene vil fortsatt fungere, men tiden for å bygge pakker vil bli betydelig lengre enn dokumentert.
Vertssystemet ditt bør ha følgende programvare med
minimumsversjoner angitt. Dette burde ikke være et problem
for de fleste moderne Linuxdistribusjoner. Vær også
oppmerksom på at mange distribusjoner vil plassere
programvaredeklarasjoner i separate pakker, ofte i form av
eller <pakkenavn>
-devel
.
Sørg for å installere disse hvis distribusjonen din gir dem.
<pakkenavn>
-dev
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.42 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-8.1
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1 (/usr/bin/awk bør være en link til gawk)
GCC-5.2 inkludert C++ kompilatoren, g++ (Versjoner større enn 13.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-4.19
Grunnen til kravet om kjerneversjon er at vi spesifiserer den versjonen når du bygger glibc i Kapittel 5 og Kapittel 8, så løsningene for eldre kjerner er ikke aktivert og det kompilerte glibc er litt raskere og mindre. Fra Feb 2024, 4.19 er fortsatt den eldste kjerneutgivelsen støttet av kjerneutviklerne. Noen kjerneutgivelser som er eldre enn 4.19 kan fortsatt støttes av tredjepartsteam, men de regnes ikke som offisielle oppstrøms kjerneutgivelser; les https://kernel.org/category/releases.html for detaljer.
Hvis vertskjernen er tidligere enn 4.19 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 4.19 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.
Vi krever at vertskjernen støtter UNIX 98
pseudoterminal (PTY). Det bør være aktivert på all
distribusjoner, skrivebord eller server med Linux 4.19
eller en nyere kjerne. Hvis du bygger en egendefinert
vertskjerne, sørg for at CONFIG_UNIX98_PTYS
er satt til
y
i kjernekonfigurasjonen.
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-5.0
Xz-5.0.0
Merk at symbollenkene nevnt ovenfor er nødvendige for å bygge et LFS system ved å bruke instruksjonene i denne boken. Symbollinker 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
# A script to list version numbers of critical development tools
# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort /dev/null || bail "sort does not work"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERROR: Cannot find $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: Linux Kernel $kver >= $1\n"; return 0;
else
printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver";
return 1;
fi
}
# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils too old, stop"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 4.19
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERROR: nproc is not available or it produces empty output"
else
echo "OK: nproc reports $(nproc) logical cores are available"
fi
EOF
bash version-check.sh
LFS er designet for å bygges i en økt. Det er det instruksjonene forutsetter, at systemet ikke vil bli slått av under prosessen. Det betyr ikke at byggingen av 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 sikker på en ting:
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 kommando 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 Generelle kompileringsinstruksjoner er kritiske. Hvis det er noen tvil om installerte pakker, sørg for at tidligere utpakkede tarballer 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 etter at du er gått inn i chroot
miljøet.
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ører kommandoene i
Section 7.3.1,
“Montering og fylling av /dev” og
Section 7.3.2, “Montering av det 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 ide å bruke en liten
diskpartisjon som swap
. 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åmdash;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
partisjonen. 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 diskveksling.
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. Med en SSD vil du ikke kunne høre veksling, men du kan se hvor mye vekslingsplass som brukes ved å kjøre top eller free programmene. Bruken av en SSD 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 er normalt, er den beste løsningen å kjøpe mer RAM til ditt system.
Hvis boot disk 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 oppstartslasteren. Denne partisjonen vil normalt være merket 'BIOS Boot' hvis den opprettes av fdisk eller har en kode på EF02 hvis du bruker gdisk kommandoen.
Grub Bios partisjonen må være på stasjonen som BIOS bruker for å starte opp systemet. Dette er ikke nødvendigvis den stasjonen som holder LFS rotpartisjon. Disker på et system kan bruke forskjellig partisjonstabelltyper. Nødvendigheten av Grub Bios 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 oppstartsproblemer 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 tilstrekkelig.
/boot/efi – EFI systempartisjonen, som er nødvendig for å starte opp systemet med UEFI. Les BLFS siden for detaljer.
/home – Sterkt anbefalt. Del hjemmemappen 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
motparter 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 lager det uansett, 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 en gigabyte) i denne
konfigurasjonen, så det er egnet for en tynnklient
eller diskløs arbeidsstasjon (hvor /usr
monteres fra en fjernserver).
Du bør imidlertid være oppmerksom på at initramfs
(ikke dekket av LFS) vil være nødvendig for å starte
et system med en separat /usr
partisjon.
/opt – Denne mappen er mest nyttig for BLFS der flere store pakker som KDE eller Texlive kan installeres uten å bygge inn filene i /usr hierarkiet. Hvis den brukes, er 5 til 10 gigabyte generelt tilstrekkelig.
/tmp – En separat /tmp partisjon er sjeldent, men
nyttig hvis du konfigurerer en tynnklient. Denne
partisjonen, hvis brukt, vil vanligvis ikke trenge å
overstige et par gigabyte. Hvis du har nok RAM, kan
du montere en tmpfs
på /tmp å lage tilgangen til midlertidige filer
raskere.
/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 som du ønsker automatisk montert
når systemet starter må spesifiseres i /etc/fstab
file. Detaljer om hvordan du
spesifiserer partisjoner vil bli diskutert i Section 10.2,
“Opprette /etc/fstab filen”.
En partisjon er bare en rekke sektorer på en diskstasjon, avgrenset med grenser satt i en partisjonstabell. Før operativsystemet kan bruke en partisjon for å lagre alle filer, må partisjonen formateres til å inneholde et filsystem , vanligvis bestående av en etikett, katalogblokker, datablokker og et indekseringsskjema for å finne en bestemt fil på forespørsel. Filsystemet hjelper også OS med å holde styr på ledig plass på partisjonen, reservere nødvendige sektorer når en ny fil opprettes eller en eksisterende fil utvides, og resirkuler de ledige datasegmentene som opprettes når filer slettes. Det kan også gi støtte for dataredundans og for feilgjenoppretting.
LFS kan bruke et hvilket som helst filsystem som gjenkjennes av Linuxkjernen, men de vanligste typene er ext3 og ext4. Valget av riktig filsystem kan være kompleks; det 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-familien til filsystemer. Det gir flere nye funksjoner, inkludert nano-sekunders tidsstempler, opprettelse og bruk av svært store filer (opptil 16 TB), og hastighetsforbedringer.
Andre filsystemer, inkludert FAT32, NTFS, ReiserFS, JFS og XFS er nyttig for spesialiserte formål. Mer informasjon om disse filsystemene. og mange andre finner du på https://en.wikipedia.org/wiki/Comparison_of_file_systems.
LFS antar at rotfilsystemet (/) er av typen ext4. å lage et
ext4
filsystemet på LFS
partisjonen, utsted fælgende kommando:
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, vil miljøvariabelen LFS
brukes flere ganger. Du bør sørge for at
denne variabelen alltid er definert gjennom hele LFS
byggeprosessen. Den bør settes til navnet på mappen hvor du
skal bygge LFS systemet ditt - vi vil bruke /mnt/lfs
som et eksempel, men du kan velg et
hvilket som helst mappenavn du ønsker. 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 denne variabelen satt er fordelaktig ved at kommandoer som f.eks mkdir -v $LFS/tools kan skrives bokstavelig. Skallet vil automatisk erstatte “$LFS” med “/mnt/lfs” (eller hvilken verdi 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
byggeplassering, 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
filen i både din personlig
hjemmemappe og i /root/.bash_profile
og skriv inn export
kommandoen ovenfor. I tillegg, skallet spesifisert i
/etc/passwd
filen 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 bruk
en "if" test, og kjører ikke de resterende .bashrc
instruksjoner for en
ikke-interaktiv bash påkallelse. Pass på å plassere export
kommandoen foran testen for ikke interaktiv bruk.
Nå som et filsystem er opprettet, må partisjonen monteres slik
at vertssystemet kan få tilgang til det. Denne boken
forutsetter at filsystemet er montert i katalogen spesifisert
av LFS
miljøvariabel beskrevet i
forrige avsnitt.
Strengt tatt kan man ikke “montere en partisjon”. Man monterer filsystemet innebygd i den partisjonen. Men siden en enkelt partisjon ikke kan inneholde mer enn ett filsystem, folk snakker ofte om partisjonen og tilhørende filsystem som om de var ett og samme.
Opprett monteringspunktet og monter LFS filsystemet med disse kommandoene:
mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx>
$LFS
Erstatt <xxx>
med navnet for LFS partisjon.
Hvis du bruker flere partisjoner for LFS (f.eks. en for
/
og en annen for /home
), monter dem som dette:
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, må partisjonene monteres på
nytt.
Instruksjonene ovenfor forutsetter at du ikke starter
datamaskinen på nytt din gjennom hele LFS prosessen. Hvis du
slår av systemet, må du enten montere LFS partisjonen på nytt
hver gang du starter byggeprosessen på nytt eller modifisere
vertssystemets /etc/fstab
filen
til å automatisk monter den på nytt når du starter på nytt.
Du kan for eksempel legge til denne linjen i /etc/fstab
filen:
/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 den nye LFS partisjonen er klar til bruk, 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 en 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 nedlastingsplasseringen har endret seg siden denne boken ble publisert, Google (https://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
arbeidsmappe. 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). “Sticky” 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 for å 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 wgetliste 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.
Hvis pakkene og oppdateringene er lastet ned som
ikke-root
bruker, vil disse
filene eies av brukeren. Filsystemet registrerer eier ved hjelp
av UID, og UID til en vanlig bruker i vertsdistroen er ikke
tildelt i LFS. Så filene vil bli eid av en ikke navngitt UID i
det endelige LFS systemet. Hvis du ikke vil tilordne samme UID
for brukeren din i LFS systemet, endre eierne av disse filene
til root
nå for å unngå dette
problemet:
chown root:root $LFS/sources/*
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 kilder kan fjerne gamle utgivelser, spesielt når de utgivelser inneholder en sikkerhetssårbarhet. Hvis en 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, er det ikke en god ide å 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
Nedlasting: https://download.savannah.gnu.org/releases/acl/acl-2.3.2.tar.xz
MD5 sum: 590765dee95907dbc3c856f7255bd669
Hjemmeside: https://savannah.nongnu.org/projects/attr
Nedlasting: https://download.savannah.gnu.org/releases/attr/attr-2.5.2.tar.gz
MD5 sum: 227043ec2f6ca03c0948df5517f9c927
Hjemmeside: https://www.gnu.org/software/autoconf/
Nedlasting: https://ftp.gnu.org/gnu/autoconf/autoconf-2.72.tar.xz
MD5 sum: 1be79f7106ab6767f18391c5e22be701
Hjemmeside: https://www.gnu.org/software/automake/
Nedlasting: https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz
MD5 sum: 4017e96f89fca45ca946f1c5db6be714
Hjemmeside: https://www.gnu.org/software/bash/
Nedlasting: https://ftp.gnu.org/gnu/bash/bash-5.2.21.tar.gz
MD5 sum: ad5b38410e3bf0e9bcc20e2765f5e3f9
Hjemmeside: https://git.gavinhoward.com/gavin/bc
Nedlasting: https://github.com/gavinhoward/bc/releases/download/6.7.5/bc-6.7.5.tar.xz
MD5 sum: e249b1f86f886d6fb71c15f72b65dd3d
Hjemmeside: https://www.gnu.org/software/binutils/
Nedlasting: https://sourceware.org/pub/binutils/releases/binutils-2.42.tar.xz
MD5 sum: a075178a9646551379bfb64040487715
Hjemmeside: https://www.gnu.org/software/bison/
Nedlasting: https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz
MD5 sum: c28f119f405a2304ff0a7ccdcc629713
Nedlasting: https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
MD5 sum: 67e051268d0c475ea773822f7500d0e5
Hjemmeside: https://libcheck.github.io/check
Nedlasting: 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/
Nedlasting: https://ftp.gnu.org/gnu/coreutils/coreutils-9.4.tar.xz
MD5 sum: 459e9546074db2834eefe5421f250025
Hjemmeside: https://www.gnu.org/software/dejagnu/
Nedlasting: https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz
MD5 sum: 68c5208c58236eba447d7d6d1326b821
Hjemmeside: https://www.gnu.org/software/diffutils/
Nedlasting: https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz
MD5 sum: 2745c50f6f4e395e7b7d52f902d075bf
Hjemmeside: http://e2fsprogs.sourceforge.net/
Nedlasting: https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.47.0/e2fsprogs-1.47.0.tar.gz
MD5 sum: 6b4f18a33873623041857b4963641ee9
Hjemmeside: https://sourceware.org/elfutils/
Nedlasting: https://sourceware.org/ftp/elfutils/0.190/elfutils-0.190.tar.bz2
MD5 sum: 79ad698e61a052bea79e77df6a08bc4b
Hjemmeside: https://libexpat.github.io/
Nedlasting: https://prdownloads.sourceforge.net/expat/expat-2.6.0.tar.xz
MD5 sum: bd169cb11f4b9bdfddadf9e88a5c4d4b
Hjemmeside: https://core.tcl.tk/expect/
Nedlasting: https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz
MD5 sum: 00fce8de158422f5ccd2666512329bd2
Hjemmeside: https://www.darwinsys.com/file/
Nedlasting: https://astron.com/pub/file/file-5.45.tar.gz
MD5 sum: 26b2a96d4e3a8938827a1e572afd527a
Hjemmeside: https://www.gnu.org/software/findutils/
Nedlasting: https://ftp.gnu.org/gnu/findutils/findutils-4.9.0.tar.xz
MD5 sum: 4a4a547e888a944b2f3af31d789a1137
Hjemmeside: https://github.com/westes/flex
Nedlasting: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
MD5 sum: 2882e3179748cc9f9c23ec593d6adc8d
Hjemmeside: https://pypi.org/project/flit-core/
Nedlasting: https://pypi.org/packages/source/f/flit-core/flit_core-3.9.0.tar.gz
MD5 sum: 3bc52f1952b9a78361114147da63c35b
Hjemmeside: https://www.gnu.org/software/gawk/
Nedlasting: https://ftp.gnu.org/gnu/gawk/gawk-5.3.0.tar.xz
MD5 sum: 97c5a7d83f91a7e1b2035ebbe6ac7abd
Hjemmeside: https://gcc.gnu.org/
Nedlasting: https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz
MD5 sum: e0e48554cc6e4f261d55ddee9ab69075
Hjemmeside: https://www.gnu.org/software/gdbm/
Nedlasting: https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz
MD5 sum: 8551961e36bf8c70b7500d255d3658ec
Hjemmeside: https://www.gnu.org/software/gettext/
Nedlasting: https://ftp.gnu.org/gnu/gettext/gettext-0.22.4.tar.xz
MD5 sum: 2d8507d003ef3ddd1c172707ffa97ed8
Hjemmeside: https://www.gnu.org/software/libc/
Nedlasting: https://ftp.gnu.org/gnu/glibc/glibc-2.39.tar.xz
MD5 sum: be81e87f72b5ea2c0ffe2bedfeb680c6
Glibc utviklerne opprettholder en Git branch som inneholder oppdateringer som anses verdig Glibc-2.39 men utviklet seg dessverre etter Glibc-2.39 utgivelsen. LFS redaksjonen vil utstede en sikkerhetsrådgivning hvis noen sikkerhetsfiks legges til i grenen, men ingen handlinger vil bli utført for andre oppdateringer som legges til. Du kan gjennomgå oppdateringene selv og inkludere noen oppdateringer hvis du anser dem som viktige.
Hjemmeside: https://www.gnu.org/software/gmp/
Nedlasting: https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz
MD5 sum: 956dc04e864001a9c22429f761f2c283
Hjemmeside: https://www.gnu.org/software/gperf/
Nedlasting: https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
MD5 sum: 9e251c0a618ad0824b51117d5d9db87e
Hjemmeside: https://www.gnu.org/software/grep/
Nedlasting: https://ftp.gnu.org/gnu/grep/grep-3.11.tar.xz
MD5 sum: 7c9bbd74492131245f7cdb291fa142c0
Hjemmeside: https://www.gnu.org/software/groff/
Nedlasting: https://ftp.gnu.org/gnu/groff/groff-1.23.0.tar.gz
MD5 sum: 5e4f40315a22bb8a158748e7d5094c7d
Hjemmeside: https://www.gnu.org/software/grub/
Nedlasting: https://ftp.gnu.org/gnu/grub/grub-2.12.tar.xz
MD5 sum: 60c564b1bdc39d8e43b3aab4bc0fb140
Hjemmeside: https://www.gnu.org/software/gzip/
Nedlasting: https://ftp.gnu.org/gnu/gzip/gzip-1.13.tar.xz
MD5 sum: d5c9fc9441288817a4a0be2da0249e29
Hjemmeside: https://www.iana.org/protocols
Nedlasting: https://github.com/Mic92/iana-etc/releases/download/20240125/iana-etc-20240125.tar.gz
MD5 sum: aed66d04de615d76c70890233081e584
Hjemmeside: https://www.gnu.org/software/inetutils/
Nedlasting: https://ftp.gnu.org/gnu/inetutils/inetutils-2.5.tar.xz
MD5 sum: 9e5a6dfd2d794dc056a770e8ad4a9263
Hjemmeside: https://freedesktop.org/wiki/Software/intltool
Nedlasting: 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/
Nedlasting: https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-6.7.0.tar.xz
MD5 sum: 35d8277d1469596b7edc07a51470a033
Hjemmeside: https://jinja.palletsprojects.com/en/3.1.x/
Nedlasting: https://pypi.org/packages/source/J/Jinja2/Jinja2-3.1.3.tar.gz
MD5 sum: caf5418c851eac59e70a78d9730d4cea
Hjemmeside: https://kbd-project.org/
Nedlasting: https://www.kernel.org/pub/linux/utils/kbd/kbd-2.6.4.tar.xz
MD5 sum: e2fd7adccf6b1e98eb1ae8d5a1ce5762
Hjemmeside: https://github.com/kmod-project/kmod
Nedlasting: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-31.tar.xz
MD5 sum: 6165867e1836d51795a11ea4762ff66a
Hjemmeside: https://www.greenwoodsoftware.com/less/
Nedlasting: https://www.greenwoodsoftware.com/less/less-643.tar.gz
MD5 sum: cf05e2546a3729492b944b4874dd43dd
Nedlasting: https://www.linuxfromscratch.org/lfs/downloads/12.1/lfs-bootscripts-20230728.tar.xz
MD5 sum: a236eaa9a1f699bc3fb6ab2acd7e7b6c
Hjemmeside: https://sites.google.com/site/fullycapable/
Nedlasting: https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.69.tar.xz
MD5 sum: 4667bacb837f9ac4adb4a1a0266f4b65
Hjemmeside: https://sourceware.org/libffi/
Nedlasting: https://github.com/libffi/libffi/releases/download/v3.4.4/libffi-3.4.4.tar.gz
MD5 sum: 0da1a5ed7786ac12dcbaf0d499d8a049
Hjemmeside: https://libpipeline.nongnu.org/
Nedlasting: https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.7.tar.gz
MD5 sum: 1a48b5771b9f6c790fb4efdb1ac71342
Hjemmeside: https://www.gnu.org/software/libtool/
Nedlasting: https://ftp.gnu.org/gnu/libtool/libtool-2.4.7.tar.xz
MD5 sum: 2fc0b6ddcd66a89ed6e45db28fa44232
Hjemmeside: https://github.com/besser82/libxcrypt/
Nedlasting: https://github.com/besser82/libxcrypt/releases/download/v4.4.36/libxcrypt-4.4.36.tar.xz
MD5 sum: b84cd4104e08c975063ec6c4d0372446
Hjemmeside: https://www.kernel.org/
Nedlasting: https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.7.4.tar.xz
MD5 sum: 370e1b6155ae63133380e421146619e0
Linuxkjernen oppdateres ganske ofte, mange ganger pga oppdagelser av sikkerhetssårbarheter. Den siste tilgjengelige stabile kjerneversjonen kan bli 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/
Nedlasting: https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz
MD5 sum: 0d90823e1426f1da2fd872df0311298d
Hjemmeside: https://www.gnu.org/software/make/
Nedlasting: https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz
MD5 sum: c8469a3713cbbe04d955d4ae4be23eeb
Hjemmeside: https://www.nongnu.org/man-db/
Nedlasting: https://download.savannah.gnu.org/releases/man-db/man-db-2.12.0.tar.xz
MD5 sum: 67e0052fa200901b314fad7b68c9db27
Hjemmeside: https://www.kernel.org/doc/man-pages/
Nedlasting: https://www.kernel.org/pub/linux/docs/man-pages/man-pages-6.06.tar.xz
MD5 sum: 26b39e38248144156d437e1e10cb20bf
Hjemmeside: https://palletsprojects.com/p/markupsafe/
Nedlasting: https://pypi.org/packages/source/M/MarkupSafe/MarkupSafe-2.1.5.tar.gz
MD5 sum: 8fe7227653f2fb9b1ffe7f9f2058998a
Hjemmeside: https://mesonbuild.com
Nedlasting: https://github.com/mesonbuild/meson/releases/download/1.3.2/meson-1.3.2.tar.gz
MD5 sum: 2d0ebd3a24249617b1c4d30026380cf8
Hjemmeside: https://www.multiprecision.org/
Nedlasting: https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz
MD5 sum: 5c9bc658c9fd0f940e8e3e0f09530c62
Hjemmeside: https://www.mpfr.org/
Nedlasting: https://ftp.gnu.org/gnu/mpfr/mpfr-4.2.1.tar.xz
MD5 sum: 523c50c6318dde6f9dc523bc0244690a
Hjemmeside: https://www.gnu.org/software/ncurses/
Nedlasting: https://anduin.linuxfromscratch.org/LFS/ncurses-6.4-20230520.tar.xz
MD5 sum: c5367e829b6d9f3f97b280bb3e6bfbc3
Hjemmeside: https://ninja-build.org/
Nedlasting: https://github.com/ninja-build/ninja/archive/v1.11.1/ninja-1.11.1.tar.gz
MD5 sum: 32151c08211d7ca3c1d832064f6939b0
Hjemmeside: https://www.openssl.org/
Nedlasting: https://www.openssl.org/source/openssl-3.2.1.tar.gz
MD5 sum: c239213887804ba00654884918b37441
Hjemmeside: https://savannah.gnu.org/projects/patch/
Nedlasting: https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz
MD5 sum: 78ad9937e4caadcba1526ef1853730d5
Hjemmeside: https://www.perl.org/
Nedlasting: https://www.cpan.org/src/5.0/perl-5.38.2.tar.xz
MD5 sum: d3957d75042918a23ec0abac4a2b7e0a
Hjemmeside: http://pkgconf.org/
Nedlasting: https://distfiles.ariadne.space/pkgconf/pkgconf-2.1.1.tar.xz
MD5 sum: bc29d74c2483197deb9f1f3b414b7918
Hjemmeside: https://gitlab.com/procps-ng/procps/
Nedlasting: https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-4.0.4.tar.xz
MD5 sum: 2f747fc7df8ccf402d03e375c565cf96
Hjemmeside: https://gitlab.com/psmisc/psmisc
Nedlasting: https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.6.tar.xz
MD5 sum: ed3206da1184ce9e82d607dc56c52633
Hjemmeside: https://www.python.org/
Nedlasting: https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
MD5 sum: e7c178b97bf8f7ccd677b94d614f7b3c
Nedlasting: https://www.python.org/ftp/python/doc/3.12.2/python-3.12.2-docs-html.tar.bz2
MD5 sum: 8a6310f6288e7f60c3565277ec3b5279
Hjemmeside: https://tiswww.case.edu/php/chet/readline/rltop.html
Nedlasting: https://ftp.gnu.org/gnu/readline/readline-8.2.tar.gz
MD5 sum: 4aa1b31be779e6b84f9a96cb66bc50f6
Hjemmeside: https://www.gnu.org/software/sed/
Nedlasting: https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz
MD5 sum: 6aac9b2dbafcd5b7a67a8a9bcb8036c3
Hjemmeside: https://pypi.org/project/setuptools/
Nedlasting: https://pypi.org/packages/source/s/setuptools/setuptools-69.1.0.tar.gz
MD5 sum: 6f6eb780ce12c90d81ce243747ed7ab0
Hjemmeside: https://github.com/shadow-maint/shadow/
Nedlasting: https://github.com/shadow-maint/shadow/releases/download/4.14.5/shadow-4.14.5.tar.xz
MD5 sum: 452b0e59f08bf618482228ba3732d0ae
Hjemmeside: https://www.infodrom.org/projects/sysklogd/
Nedlasting: https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz
MD5 sum: c70599ab0d037fde724f7210c2c8d7f8
Hjemmeside: https://www.freedesktop.org/wiki/Software/systemd/
Nedlasting: https://github.com/systemd/systemd/archive/v255/systemd-255.tar.gz
MD5 sum: 521cda27409a9edf0370c128fae3e690
Hjemmeside: https://www.freedesktop.org/wiki/Software/systemd/
Nedlasting: https://anduin.linuxfromscratch.org/LFS/systemd-man-pages-255.tar.xz
MD5 sum: 1ebe54d7a80f9abf8f2d14ddfeb2432d
Linux From Scratch teamet genererer sin egen tarball av mansider som bruker systemd kilden. Dette gjøres for å unngå unødvendige avhengigheter.
Hjemmeside: https://savannah.nongnu.org/projects/sysvinit
Nedlasting: https://github.com/slicer69/sysvinit/releases/download/3.08/sysvinit-3.08.tar.xz
MD5 sum: 81a05f28d7b67533cfc778fcadea168c
Hjemmeside: https://www.gnu.org/software/tar/
Nedlasting: https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz
MD5 sum: a2d8042658cfd8ea939e6d911eaf4152
Hjemmeside: http://tcl.sourceforge.net/
Nedlasting: https://downloads.sourceforge.net/tcl/tcl8.6.13-src.tar.gz
MD5 sum: 0e4358aade2f5db8a8b6f2f6d9481ec2
Nedlasting: https://downloads.sourceforge.net/tcl/tcl8.6.13-html.tar.gz
MD5 sum: 4452f2f6d557f5598cca17b786d6eb68
Hjemmeside: https://www.gnu.org/software/texinfo/
Nedlasting: https://ftp.gnu.org/gnu/texinfo/texinfo-7.1.tar.xz
MD5 sum: edd9928b4a3f82674bcc3551616eef3b
Hjemmeside: https://www.iana.org/time-zones
Nedlasting: https://www.iana.org/time-zones/repository/releases/tzdata2024a.tar.gz
MD5 sum: 2349edd8335245525cc082f2755d5bf4
Nedlasting: https://anduin.linuxfromscratch.org/LFS/udev-lfs-20230818.tar.xz
MD5 sum: acd4360d8a5c3ef320b9db88d275dae6
Hjemmeside: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/
Nedlasting: https://www.kernel.org/pub/linux/utils/util-linux/v2.39/util-linux-2.39.3.tar.xz
MD5 sum: f3591e6970c017bb4bcd24ae762a98f5
Hjemmeside: https://www.vim.org
Nedlasting: https://github.com/vim/vim/archive/v9.1.0041/vim-9.1.0041.tar.gz
MD5 sum: 79dfe62be5d347b1325cbd5ce2a1f9b3
Versjonen av vim endres daglig. For å få den nyeste versjonen, gå til https://github.com/vim/vim/tags.
Hjemmeside: https://pypi.org/project/wheel/
Nedlasting: https://pypi.org/packages/source/w/wheel/wheel-0.42.0.tar.gz
MD5 sum: 802ad6e5f9336fcb1c76b7593f0cd22d
Hjemmeside: https://github.com/chorny/XML-Parser
Nedlasting: https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.47.tar.gz
MD5 sum: 89a8e82cfd2ad948b349c0a69c494463
Hjemmeside: https://tukaani.org/xz
Nedlasting: https://github.com/tukaani-project/xz/releases/download/v5.4.6/xz-5.4.6.tar.xz
MD5 sum: 7ade7bd1181a731328f875bec62a9377
Hjemmeside: https://zlib.net/
Nedlasting: https://zlib.net/fossils/zlib-1.3.1.tar.gz
MD5 sum: 9855b6d802d7fe5b7bd5b196a2271655
Hjemmeside: https://facebook.github.io/zstd/
Nedlasting: https://github.com/facebook/zstd/releases/download/v1.5.5/zstd-1.5.5.tar.gz
MD5 sum: 63251602329a106220e0a5ad26ba656f
Total størrelse på disse pakkene: ca 504 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:
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/bash-5.2.21-upstream_fixes-1.patch
MD5 sum: 2d1691a629c558e894dbb78ee6bf34ef
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/bzip2-1.0.8-install_docs-1.patch
MD5 sum: 6a5ac7e89b791aae556de0f745916f7f
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/coreutils-9.4-i18n-1.patch
MD5 sum: cca7dc8c73147444e77bc45d210229bb
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/glibc-2.39-fhs-1.patch
MD5 sum: 9a5997c3452909b1769918c759eff8a2
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/kbd-2.6.4-backspace-1.patch
MD5 sum: f75cca16a38da6caa7d52151f7136895
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/readline-8.2-upstream_fixes-3.patch
MD5 sum: 9ed497b6cb8adcb8dbda9dee9ebce791
Nedlasting: https://www.linuxfromscratch.org/patches/lfs/12.1/sysvinit-3.08-consolidated-1.patch
MD5 sum: 17ffccbb8e18c39e8cedc32046f3a475
Total størrelse på disse oppdateringene: ca 203.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/ og anskaffe eventuelle tilleggoppdateringer som passer dine systembehov.
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
(hvor
vi vil installere midlertidige verktøy, legg til en
uprivilegert brukerå bli forklare tidsenhetene (“SBU”) som vi bruker
til å måle hvor lang tid det tar å bygge LFS pakker, og gi litt
informasjon om testpakkene til pakkene.
I denne delen begynner vi å fylle LFS filsystemet med deler som vil utgjøre det endelige Linuxsystemet. Det første trinnet er å opprette et begrenset kataloghierarki, slik at programmene som kompileres i Kapittel 6 (i tillegg til glibc og libstdc++ i Kapittel 5) kan installeres i deres endelige plassering. Vi gjør dette slik at de midlertidige programmene vil bli overskrevet når de endelige versjonene bygges i Kapittel 8.
Create the required directory layout by issuing the following
commands as 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 kan bli funnet i avsnitt Verktøykjedens tekniske
merknader). Denne krysskompilatoren vil bli installert i en
spesiell katalog for å skille den fra de andre programmene.
Fortsatt som root
, lag den
mappen med denne kommandoen:
mkdir -pv $LFS/tools
LFS redaksjonen har bevisst besluttet å ikke bruke en
/usr/lib64
mappe. Flere skritt
tas for å være sikker på at verktøykjeden ikke vil bruke den.
Hvis for noen grunn denne katalogen vises (enten fordi du
gjorde en feil når du fulgte instruksjonene, eller fordi du
installerte en binær pakke som opprettet det etter å ha
fullført LFS), kan det ødelegge systemet ditt. Du bør alltid
være sikker på at denne katalogen ikke eksisterer.
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
et rent arbeidsmiljø, opprett en ny bruker kalt lfs
som medlem av en ny gruppe (også kalt
lfs
) og kjøre kommandoer som
lfs
under
installasjonsprosessen. Som root
, utflr fllgende kommandoer for å legge
til den nye brukeren:
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs
Dette er hva kommandolinjealternativene betyr:
-s
/bin/bash
Dette gjør bash til 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 skjelettmappe (standard er /etc/skel
) ved å endre
inndataplasseringen til den spesielle nullenheten.
lfs
Dette er navnet til den nye brukeren.
Hvis du vil logge inn som lfs
eller bytte til lfs
fra en
ikke-root
bruker (i motsetning
til å bytte til bruker lfs
når
du er logget inn som root
, som
ikke krever at lfs
brukeren har
et passord), må du angi et passord for lfs
. Utsted følgende kommando som
root
bruker for å angi
passordet:
passwd lfs
Bevilg lfs
full tilgang til
alle mapper under $LFS
ved å
gjøre lfs
eieren:
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, følgende su kommando fullføres ikke
riktig og suspenderer påloggingen for lfs
bruker i bakgrunnen. Hvis ledeteksten
"lfs:~$" ikke vises umiddelbart, å skrive inn fg kommandoen vil løse
problemet.
Deretter starter du et skall som kjører som bruker lfs
. Dette kan gjøres ved å logge inn som
lfs
på en virtuell konsoll,
eller med følgende bytt ut/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 for å 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 pålogget som bruker lfs
, eller når du bytter til lfs
bruker med en su kommando med “-
” alternativet,
det første skallet er et login skall som leser /etc/profile
til 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 et 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.
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 sin 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 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, nye filer vil ende opp med tillatelsesmodus 644 og mapper med modus 755).
LFS=/mnt/lfs
LFS
variabelen skal settes til
det valgte monteringenspunktet.
LC_ALL=POSIX
LC_ALL
variabelen styrer
lokaliseringen av visse programmer, slik at meldingene
deres fllger konvensjonene i et spesifisert land.
Innstillingen LC_ALL
til
“POSIX” eller “C” (de to er
likeverdige) sikrer at alt fungerer som forventet i
chroot miljlet.
LFS_TGT=$(uname
-m)-lfs-linux-gnu
The LFS_TGT
variabel setter en
ikkestandard, men kompatibel maskinbeskrivelse 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 Verktøykjedens
tekniske merknader.
PATH=/usr/bin
Mange moderne Linux distribusjoner har slått sammen
/bin
og /usr/bin
. Når dette er tilfelle,
standard PATH
variabel burde
settes til /usr/bin/
for
Kapittel 6 miljøet. Når dette ikke er tilfelle,
legger følgende linje /bin
til stien.
if [ ! -L
/bin ]; then PATH=/bin:$PATH; fi
Hvis /bin
ikke er en
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, for å gjøre dem synlige innenfor eventuelle underskall, eksporterer vi dem.
Flere kommersielle distribusjoner legger til en ikke
dokumentert instansiering av /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 tilstedeværelse av /etc/bash.bashrc
og flytt den hvis den er
tilstede Som root
bruker,
kjør:
[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE
Når lfs
brukeren ikke lenger
er nødvendig (i begynnelsen av
Kapittel 7), kan du trygt gjenopprette /etc/bash.bashrc
(hvis ønsket).
Legg merke til at LFS Bash pakken vi bygger i Section 8.35, “Bash-5.2.21”
ikke er konfigurert til å laste eller kjøre /etc/bash.bashrc
, så denne filen er
ubrukelig på et fullført LFS system.
For mange moderne systemer med flere prosessorer (eller
kjerner) kan kompileringstiden for en pakke reduseres ved å
utføre en "parallell make" ved å fortelle make programmet hvor
mange prosessorer som er tilgjengelige via et
kommandolinjealternativ eller en miljøvariabel. For eksempel en
Intel Core i9-13900K-prosessor har 8 P (ytelse) kjerner og 16 E
(effektivitet) kjerner, og en P-kjerne kan kjøre to tråder
samtidig så hver P-kjerne er modellert som to logiske kjerner
av Linuxkjernen. Som et resultat er det totalt 32 logiske
kjerner. En åpenbar måte å bruke alle disse logiske kjernene er
å tillate make å
gjøre opptil 32 byggejobber. Dette kan gjøres ved å sende
-j32
alternativet til
make:
make -j32
Eller angi MAKEFLAGS
miljøvariabel
og dens innhold vil automatisk bli brukt av make som
kommandolinjealternativer:
export MAKEFLAGS=-j32
Aldri send en -j
alternativ uten nummer til make eller angi et slikt
alternativ i MAKEFLAGS
. Å gjøre
det vil tillate make å skape uendelige
byggejobber og forårsake problemer med systemstabilitet.
For å bruke alle logiske kjerner som er tilgjengelige for å
bygge pakker i Kapittel 5
og
Kapittel 6, sett MAKEFLAGS
nå i .bashrc
:
cat >> ~/.bashrc << "EOF"
export MAKEFLAGS=-j$(nproc)
EOF
Erstatt $(nproc)
med
antallet logiske kjerner du vil bruke hvis du ikke vil bruke
alle de logiske kjernene.
Til slutt, å ha miljøet fullt forberedt for å bygge midlertidige verktøy, tving bash skallet å lese den nye 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 5 minutter på de raskeste systemene, men kan ta flere 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. Tiden det tar å kompilere med en kjerne er det vi vil referere til som standard byggenhet eller SBU. Alle andre kompileringstider vil bli uttrykt i forhold til denne tidsenheten.
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 en SBU.
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.
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.
Tidene som presenteres her er basert på bruk av fire kjerner (-j4). Tidene i kapittel 8 inkluderer også tiden det skal kjøres regresjonstestene for pakken med mindre annet er spesifisert.
De fleste pakkene gir en testpakke. å kjøre testpakken for en nybygd pakke er en god ide fordi den kan gi en “tilregnelighetssjekk ” som indikerer at alt er kompilert riktig. En testpakke som består kontrollene sine, 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øre testpakkene i Kapittel 5 og Kapittel 6 er meningsløst; siden testprogrammene er kompilert med en krysskompilator, kan de sannsynligvis ikke 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 testpakker til en pakke 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/12.1/ 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 til å 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 å bruke tee verktøyet for å sende terminalutdataen til en fil. Dette gjør feilsøkingen enklere hvis noe går galt.
Den neste delen er en teknisk introduksjon til byggeprosessen, mens den følgende presenterer 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, kompilasjonene i de resterende kapitlene vil være isolert 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å 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 er også referert til som “verten”.
er maskinen/systemet der de bygde programmene skal kjøres. Merk at denne bruken av “verten” 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 bygg og vertent.
Som et eksempel, la oss forestille oss følgende scenario (noen ganger referert til som “Canadian Cross”). vi har 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.
Alle de krysskompilerte pakkene i denne boken bruker en autoconf basert byggesystem. Det autoconf baserte byggesystemet godtar systemtyper i formen cpu-vendor-kernel-os, referert til som systemtripletten. Siden leverandørfeltet ofte er irrelevant, autoconf lar deg utelate det.
En klok leser kan lure på hvorfor en “triplett”
refererer til et firekomponents navn. Kjernefeltet og
os-feltet begynte som et enkelt “system” felt. Et
slikt trefeltsskjema er fortsatt gyldig i dag for noen
systemer, for eksempel, x86_64-unknown-freebsd
. Men to systemer
kan dele samme kjerne og fortsatt være for forskjellige for
å bruke den samme tripletten for å beskrive dem. For
eksempel Android kjørende på en mobiltelefon er helt
forskjellig fra Ubuntu som kjører på en ARM64 server, selv
om de begge kjører på samme type CPU (ARM64) og bruker
samme kjerne (Linux).
Uten et emuleringslag kan du ikke kjøre en kjørbar fil for
en server på en mobiltelefon eller omvendt. Så “system” feltet
har blitt delt inn i kjerne- og os-felt, for å angi disse
systemene entydig. I vårt eksempel, Android systemet er
angitt aarch64-unknown-linux-android
, og Ubuntu
systemet er angitt aarch64-unknown-linux-gnu
.
Ordet “triplett” forblir innebygd i
leksikonet. En enkel måte å bestemme din systemtriplett er
å kjøre config.guess skript som
følger med kilden for mange pakker. Pakk ut binutils sine
kilder, kjør skriptet ./config.guess
, og merk
utdaten. 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. På de
fleste Linux systemer den enklere gcc -dumpmachine kommando
vil gi deg lignende informasjon.
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 <navn på binær> | grep
interpreter
og legg 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
variabel så det står
"lfs". 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ø.
Dette er ennå ikke slutten på historien. C-språket er ikke bare en kompilator; den definerer også et standardbibliotek. I denne boken er det GNU C-biblioteket, kalt glibc, som brukes (det finnes et alternativ, "musl"). Dette biblioteket må kompileres for LFS-maskinen; det vil si å bruke krysskompilatoren cc1. Men kompilatoren selv bruker et internt bibliotek som gir komplekse subrutiner for funksjoner som ikke er tilgjengelige i assembler-instruksjonssettet. Dette interne biblioteket heter libgcc, og det må være koblet til glibc for at biblioteket skal være fullt funksjonelt. Videre standardbiblioteket for C++ (libstdc++) må også være koblet til glibc. Løsningen på dette kylling og egg problemet er først å bygge en nedgradert cc1-basert libgcc, mangler noen funksjoner som tråder og unntakshåndtering, og da å bygge glibc ved å bruke denne nedgraderte kompilatoren (glibc selv er ikke nedgradert), og også for å bygge libstdc++. Dette siste biblioteket vil mangle noe av funksjonaliteten til libgcc.
Resultatet av det foregående avsnittet er at cc1 ikke er i stand til å bygge et fullt funksjonell libstdc++ med den nedgraderte libgcc, men cc1 er den eneste kompilatoren som er tilgjengelig for å bygge C/C++-bibliotekene under fase 2. Det er to grunner til at vi ikke umiddelbart bruker kompilator bygget i trinn 2, cc-lfs, for å bygge disse bibliotekene.
Generelt sett kan ikke cc-lfs kjøre på pc (vertssystemet). Selv om triplettene for pc og lfs er kompatible med hverandre, en kjørbar fil for lfs må avhenge av glibc-2.39; vertsdistroen kan bruke en annen implementering av libc (for eksempel musl), eller en tidligere utgivelse av glibc (for eksempel, glibc-2.13).
Selv om cc-lfs kan kjøre på pc, vil det å bruke det på pc skape en risiko for å koble til pc-bibliotekene, siden cc-lfs er en lokal kompilator.
Så når vi bygger gcc trinn 2, instruerer vi byggesystemet til å gjenoppbygge libgcc og libstdc++ med cc1, men vi kobler libstdc++ til den nye gjenoppbygde libgcc i stedet for den gamle, nedgraderte konstruksjonen. Dette gjør den ombygde libstdc++ fullt funksjonell.
I Kapittel 8 (eller “stage 3”), alle pakkene som trengs for LFS systemet er bygget. Selv om en pakke allerede er installert i LFS systemet i et tidligere kapittel, bygger vi fortsatt pakken på nytt. Hovedårsaken til å gjenoppbygge disse pakkene er å gjøre dem stabile: hvis vi installerer en LFS pakke på nytt på et fullført LFS system, det reinstallerte innholdet i pakken skal være det samme som innholdet i den samme pakken når den først installeres i Kapittel 8. De midlertidige pakkene installert i Kapittel 6 eller Kapittel 7 kan ikke tilfredsstille dette kravet, fordi noen av dem er bygget uten valgfrie avhengigheter, og autoconf kan ikke utføre noen funksjonsinnsjekker Kapittel 6 på grunn av krysskompilering, forårsaker at de midlertidige pakkene mangler valgfrie funksjoner, eller bruker suboptimale koderutiner. I tillegg en mindre grunn til gjenoppbygging av pakkene er å kjøre testpakkene.
Krysskompilatoren vil bli installert i en separat
$LFS/tools
mappe, siden den
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. (Merk at dette eksempelet kan
kjøres som vist kun mens du er logget på som bruker
lfs
. Hvis du kommer tilbake
til denne siden senere, bytt ut $LFS_TGT-ld med
ld).
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 STI (PATH) mapper for å finne hvilke verktøy det skal bruke. Imidlertid under selve kjøringen av gcc er 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. (En gang til, fjern $LFS_TGT- prefikset hvis du kommer tilbake til dette seinere.)
Detaljert informasjon kan fås fra gcc med å gi alternativet
-v
på kommandolinjen
under kompilering av et program. For eksempel, $LFS_TGT-gcc -v example.c
(eller uten $LFS_TGT- hvis du kommer
tilbake senere) vises detaljert informasjon om
forprosessoren, kompileringen og sammenstillings stadier,
inkludert gcc
sine søkestier for inkluderte deklarasjoner og deres
rekkefølge.
Neste, desinfiserte Linux API deklarasjoner (headers). Disse tillater standard C-bibliotek (Glibc) å bruke funksjoner som Linux kjernen vil gi.
Neste kommer glibc. Det viktigste hensynet 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
flagg for å
kontrollere kompilatorens inkluderte søkeveier. Disse
elementene fremhever et viktig aspekt ved Glibc pakken—en 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 andre programmer som må
krysskompileres for å bryte sirkulære avhengigheter på
byggetidspunktet. Installasjonstrinnet for alle disse pakkene
bruker DESTDIR
variabel for å
tvinge installasjonen inn i LFS filsystemet.
Ved slutten av
Kapittel 6 den lokale lfs kompilatoren er
installert. Første binutils-pass2 blir bygget, med den samme
DESTDIR
mappen 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
erklært eksplisitt som et av konfigurasjonsalternativene.
Når du kommer inn i chroot-miljøet i Kapittel 7, de midlertidige installasjonene av programmer som trengs for riktig betjening av verktøykjeden utføres. Fra dette tidspunktet og fremover er kjerneverktøykjeden selvstendig og selvhostet. I Kapittel 8, endelige versjoner av alle pakker som trengs for et fullt funksjonelt system bygges, testes og installert.
Under en utviklingssyklus av LFS er instruksjonene i boken ofte modifisert for å tilpasse seg en pakkeoppdatering eller dra nytte av nye funksjoner fra oppdaterte pakker. Å blande sammen instruksjonene til forskjellige versjoner av LFS boken kan fororsake subtile brudd. Denne typen problem er vanligvis et resultat av gjenbruk av et eller annet opprettet skript for en tidligere LFS utgivelse. Slik gjenbruk frarodes sterkt. Hvis du gjenbruker skript for en tidligere LFS utgivelse av en eller annen grunn, mo du være veldig forsiktig med o oppdatere skriptene for o matche gjeldende versjon av LFS boken.
Her er noen ting du bør vite om å bygge hver pakke:
Flere pakker oppdateres før kompilering, men bare nor oppdateringen er nødvendig for o omgo et problem. En oppdatering er ofte nødvendig i bode gjeldende og følgende kapitler, men noen ganger, nor den samme pakken er bygget mer enn en gang, er ikke oppdateringen nødvendig med en gang. 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, noen advarsler vil rulle forbi på skjermen. Disse er normale og kan trygt bli ignorert. Disse advarslene handler vanligvis om utdatert, men ikke ugyldig, bruk av C- eller C++-syntaksen. C-standardene endres ganske ofte, og noen pakker er ennå ikke oppdatert. Dette er ikke et alvorlig problem, men det fører til at advarslene vises.
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 verten, 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.
Her er en oversikt over byggeprosessen.
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 /mnt/lfs/sources/
mappen.
Bruk tar programmet, pakke ut pakken som skal bygges. I Kapittel 5 og Kapittel 6, sikre at du er lfs brukeren når du pakker ut pakken.
Ikke bruk noen metode bortsett fra tar kommandoen for å trekke ut kildekoden. Spesielt ved å bruke cp -R kommandoen for å kopiere kildekodetre et annet sted kan ødelegge lenker og tidsstempler i kildetreet, og føre til at byggingen mislykkes.
Bytt til mappen som ble opprettet da pakken ble pakket ut.
Følg bokens instruksjoner for å bygge pakken.
Bytt tilbake til kildemappen når byggingen er ferdig.
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 Generelle kompileringsinstruksjoner. å 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 \ --enable-default-hash-style=gnu
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.
--enable-default-hash-style=gnu
Som standard vil linkeren generere både GNU-stil hash tabell og det klassiske ELF-hash tabellen for delte biblioteker og dynamisk koblede kjørbare filer. Hash tabellene er kun ment for en dynamisk linker for å utføre symboloppslag. På LFS er dynamikken at linkeren (levert av Glibc-pakken) vil alltid bruke GNU-stil hashtabell som er raskere å spørre. Så klassikeren ELF hash-tabell er helt ubrukelig. Dette gjør at linkeren generer bare hashtabellen i GNU-stil som standard, slik at vi kan unngå å kaste bort tid på å generere den klassiske ELF-hash-tabellen når vi bygger pakkene, eller kaster bort diskplass for å lagre den.
Fortsett med å kompilere pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.19.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 byggeprosedyrene 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). Først pakker du ut gcc-13.2.0 tarballen fra kildemappen , og endre deretter til den opprettede mappen. Først da bør du fortsett med instruksjonene nedenfor.
tar -xf ../mpfr-4.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.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.39 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --enable-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-shared \ --disable-multilib \ --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.39
Dette alternativet spesifiserer versjonen av glibc som vil bli 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årt formål vil disse deklarasjonene ikke være nødvendige. Denne bryteren hindrer GCC i å lete etter dem.
--enable-default-pie and
--enable-default-ssp
Disse bryterne lar GCC kompilere programmer med noen herdende sikkerhetsfunksjoner (mer informasjon om de i note on PIE and SSP kapittel 8) som standard. De er strengt tatt ikke nædvendig på dette stadiet, siden kompilatoren bare vil produsere midlertidige kjørbare filer. Men det er renere å ha de midlertidige pakkene så nær de endelige som mulig.
--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 ikke en multilib konfigurasjon. Denne bryteren er ufarlig for x86.
--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 krysskompilator 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
Dette bygget av GCC har installert et par interne
systemdeklarasjoner. Normalt vil en av dem, limits.h
, i sin tur inkludere den
tilsvarende system limits.h
systemdeklarasjonen, 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 deklarasjonen som nettopp har blitt installert er
en delvis, selvstendig fil og inkluderer ikke de utvidede
funksjonene til systemdeklarasjonen. Dette er tilstrekkelig
for å bygge glibc, men den fullstendige interne deklarasjonen
vil være nødvendig senere. Lag en fullversjon av den interne
deklarasjonen ved å bruke en kommando som er identisk med det
GCC byggesystemet gjør under normale omstendigheter:
Kommandoen nedenfor viser et eksempel på nestet
kommandoerstatning ved å bruke to metoder: backquotes og a
$()
konstruksjon. Det kan
skrives om ved å bruke samme metode for begge
erstatningene, men vises på denne måten for å demonstrere
hvordan de kan blandes. Som regel er $()
metoden foretrukket.
cd .. cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
Detaljer om denne pakken finner du i Section 8.28.2, “Innhold i GCC”
Linux API deklarasjonene (i linux-6.7.4.tar.xz) eksponerer kjernens API for bruk av Glibc.
Linux-kjernen må eksponere et applikasjonsprogrammeringsgrensesnitt (Application Programming Interface(API)) som systemets C bibliotek (Glibc i LFS) kan bruke. Dette har blitt gjort ved å rense ulike C deklarasjonsfiler som er i Linux sin 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. Deklarasjonene 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. ln kommandoen har flere syntaktiske versjoner, så sørg for å sjekke info coreutils ln og ln(1) før du rapporterer hva som kan se ut til å være en feil.
Noen Glibc programmer bruker den FHS inkompatible
/var/db
mappen for å lagre
deres kjøretidsdata. Bruk følgende oppdatering for å få slike
programmer til å lagre sine kjøretidsdata på FHS kompatible
steder:
patch -Np1 -i ../glibc-2.39-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
Neste, forbered Glibc for kompilering:
../configure \ --prefix=/usr \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=4.19 \ --with-headers=$LFS/usr/include \ --disable-nscd \ 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=4.19
Dette forteller Glibc å kompilere biblioteket med støtte for 4.19 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.
--disable-nscd
Ikke bygg navnetjenesten cache daemon som ikke er brukt lenger.
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
den bygges som en “parallel make”. Hvis dette skjer,
kjør make kommandoen på nytt med et -j1
alternativ.
Kompiler pakken:
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, og at du ikke er root
, før du kjører følgende kommando.
make DESTDIR=$LFS install
Betydningen av make install alternativet:
DESTDIR=$LFS
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 root (/
) mappen. Her spesifiserer vi at
pakken installeres i $LFS
, som vil bli rotmappen i Section 7.4,
“Gå inn i Chroot miljøet”.
Fiks en hardkodet bane til den kjørbare lasteren i ldd skriptet:
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(){}' | $LFS_TGT-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 du fortsetter.
Når alt er bra, rydd opp i testfilene:
rm -v a.out
Byggingen av pakkene i neste kapittel vil fungere som en ekstra sjekk at verktøykjeden er riktig bygget. Hvis noen pakker, spesielt binutils-pass2 eller gcc-pass2, ikke klarer å bygges, er det en indikasjon på at noe har gått galt med tidligere Binutils-, GCC- eller Glibc-installasjoner.
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 Libstdc++ 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-13.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++/13.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 forhåndskompilerte include filer som ikke er nødvendige på dette stadiet.
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/13.2.0
Dette spesifiserer installasjonsmappen for include
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++ include 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 når GCC pass 1 ble
bygget) til å inkludere filsøkebanen, så den vil
faktisk søke i $LFS/tools/$LFS_TGT/include/c++/13.2.0
.
Kombinasjonen av DESTDIR
variabelen (i
make
install kommandoen 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++{,exp,fs},supc++}.la
Detaljer om denne pakken finner du i Section 8.28.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 at Ncurses installerer komprimerte manualsider, noe som kan skje hvis selve vertsdistribusjonen har komprimerte manualsider.
--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økingsbiblioteker.
--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 kompilatoren 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 fra å bruke strip programmet fra verten. Bruk av vertsverktøy på krysskompilerte programmer kan forårsake feil.
--enable-widec
Denne bryteren gjør at biblioteker med brede tegn
(wide-character) f.eks., libncursesw.so.6.4-20230520
) skal
bygges i stedet for vanlige (f.eks., libncurses.so.6.4-20230520
). 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 ln -sv libncursesw.so $LFS/usr/lib/libncurses.so sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i $LFS/usr/include/curses.h
Betydningen av installasjonsalternativene:
TIC_PATH=$(pwd)/build/progs/tic
Vi må sende stien til den nettopp bygde tic programmet som kjører på byggemaskinen, slik at terminaldatabasen kan opprettes uten feil.
libncurses.so
biblioteket
trengs av noen få pakker vi skal bygge snart. Vi lager
denne symbolkoblingen for å bruke libncursesw.so
som en erstatning.
Deklarasjonsfilen curses.h
inneholder definisjonen av
ulike Ncurses datastrukturer. Med forskjellige
preprocessor makro definisjoner to forskjellige sett
med data strukturdefinisjon kan brukes: 8-biters
definisjon er kompatibel med libncurses.so
og definisjon av
wide-character er kompatibel med libncursesw.so
. Siden vi bruker
libncursesw.so
som
erstatning for libncurses.so
, rediger
deklarasjonsfilen slik at den alltid vil bruke
datastrukturdefinisjonen med wide-character kompatibel
med libncursesw.so
.
Detaljer om denne pakken finner du i Section 8.29.2, “Innhold i Ncurses”
Bash pakken inneholder Bourne-Again Skallet (Bourne-Again SHell).
Forbered Bash for kompilering:
./configure --prefix=/usr \ --build=$(sh support/config.guess) \ --host=$LFS_TGT \ --without-bash-malloc
Betydningen av konfigureringsalternativene:
--without-bash-malloc
Dette alternativet slår av bruken av Bash
minnetildelingsfunksjon (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.35.2, “Innholdet i Bash”
Coreutils pakken inneholder de grunnleggende hjelpeprogrammene som trengs av hvert operativsystem.
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.57.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 \ --build=$(./build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.59.2, “Innhold i Diffutils”
File pakken inneholder et verktøy for å bestemme typen av en gitt fil eller filer.
file kommandoen på byggevertens må være samme versjon som den vi bygger for å opprette signaturfilen. Kjør følgende kommandoer for å lage en midlertidig kopi av file kommandoen:
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. Programmer er tilgjengelig for å søke gjennom alle filene i et katalogtre og til opprette, vedlikeholde og søke i en database (ofte raskere enn den rekursive find, men upålitelig med mindre databasen nylig har blitt oppdatert). Findutils leverer også xargs programmet, som kan brukes til å kjøre en spesifisert kommando på hver fil valgt av et søk.
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.61.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.60.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 \ --build=$(./build-aux/config.guess)
Kompiler pakken:
make
Installer pakken:
make DESTDIR=$LFS install
Detaljer om denne pakken finner du i Section 8.34.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.64.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.68.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.69.2, “Innhold i oppdateringen”
Sed pakken inneholder en dataflyt (stream) redigerer.
Forbered Sed 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.30.2, “Innhold i Sed”
Tar pakken gir muligheten til å lage tar arkiver og å 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 er 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.70.2, “Innhold i Tar”
Xz pakken inneholder programmer for komprimering og dekomprimering av filer. Det gir muligheter for lzma og den nyere xz komprimeringsformatene. 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.4.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 byggesystem er avhengig av en medsendt libtool kopi å lenke mot interne statiske biblioteker, men liberty- og zlib-kopiene sendt i pakken bruker ikke libtool. Denne inkonsekvensen kan forårsake at produserte binærfiler feilaktig kobler mot biblioteker fra vertens distro. 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 \ --enable-default-hash-style=gnu
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,sframe}.{a,la}
Detaljer om denne pakken finner du i Section 8.19.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.2.1.tar.xz mv -v mpfr-4.2.1 mpfr tar -xf ../gmp-6.3.0.tar.xz mv -v gmp-6.3.0 gmp tar -xf ../mpc-1.3.1.tar.gz mv -v mpc-1.3.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 å tillate byggingen av 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-default-pie \ --enable-default-ssp \ --disable-nls \ --disable-multilib \ --disable-libatomic \ --disable-libgomp \ --disable-libquadmath \ --disable-libsanitizer \ --disable-libssp \ --disable-libvtv \ --enable-languages=c,c++
Betydningen av de nye konfigureringsalternativene:
--with-build-sysroot=$LFS
Normalt, å bruke --host
sørger 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
Vi krysskompilerer GCC, så det er umulig å bygge
målbibliotekene (libgcc
og libstdc++
) med
tidligere kompilerte GCC binærfiler—disse binærfilene
vil ikke kjøre på verten. GCC byggesystemet vil forsøke
å bruke vertens C og C++ kompilatorer som en standard
løsning. Å bygge GCC målbibliotekene med en annen
versjonen av GCC støttes ikke, så bruk av vertens
kompilatorer kan føre til at byggingen mislykkes. Denne
parameteren sikrer at bibliotekene bygges av GCC pass
1.
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++ unntakshåndtering.
--disable-libsanitizer
Deaktiver GCC rensende kjøretidsbiblioteker. De er ikke
nødvendig for den midlertidige installasjonen. Denne
bryteren er nødvendig for å bygge GCC uten libcrypt
installert for målet. I
gcc-pass1 det var
underforstått ved --disable-libstdcxx
, men
nå må vi eksplisitt angi det.
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.28.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 de 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 kommandoen.
Inntil Section 7.4, “Gå inn i
Chroot miljøet”, må kommandoene kjøres som root
, med LFS
variabelen satt. 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årlige 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
Applikasjoner som kjører i brukerområdet bruker forskjellige filsystemer opprettet av kjernen for å kommunisere med selve kjernen. Disse filsystemene er virtuelle: ingen diskplass brukes til dem. Innholdet i disse filsystemene ligger i minnet. Disse filsystemene må monteres i $LFS katalogtreet slik at applikasjonene kan finne dem i chroot miljøet.
Begynn med å lage mappene som disse virtuelle filsystemene vil være montert på:
mkdir -pv $LFS/{dev,proc,sys,run}
Under en normal oppstart av et LFS systemet vil kjernen
automatisk montere devtmpfs
filsystemet på /dev
mappen;
kjernen oppretter enhetsnoder på det virtuelle filsystemet
under oppstartsprosessen, eller når en enhet først oppdages
eller åpnes. Udev nissen kan endre eierskapet eller
tillatelsene til enhetsnodene opprettet av kjernen, og lage
nye enhetsnoder eller symbolkoblinger for å lette arbeidet
til distro vedlikeholdere og systemadministratorer. (Se
Section 9.3.2.2,
“Oppretting av enhetsnode” for detaljer.) Hvis
vertskjernen støtter devtmpfs
, kan vi enkelt montere en
devtmpfs
på $LFS/dev
og stole på at kjernen fyller den.
Men noen vertskjerner mangler devtmpfs
støtte; disse vertsdistroene
bruker forskjellige metoder for å lage innholdet i
/dev
. Så den eneste
verts-agnostiske måten å fylle $LFS/dev
mappen er ved å bind-montere
vertssystemets /dev
mappe. En
bind-montering er en spesiell type montering som lager et
mappeundertre eller en fil synlig på et annet sted. Bruk
følgende kommando for å gjøre dette.
mount -v --bind /dev $LFS/dev
Monter nå de gjenværende virtuelle kjernefilsystemene:
mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
Betydningen av monteringsalternativene for devpts:
gid=5
Dette sikrer at alle devpts opprettede enhetsnoder eies
av gruppe ID 5. Dette er IDen vi skal bruke senere for
tty
gruppen. Vi bruker
gruppe-ID i stedet for et navn, siden vertssystemet kan
bruke en annen ID for sitt tty
gruppen.
mode=0620
Dette sikrer at alle devpts opprettede enhetsnoder har modus 0620 (bruker lesbar og skrivbar, gruppeskrivbar). Sammen med alternativet ovenfor, sikrer dette at devpts vil opprette enhetsnoder som oppfylle kravene til grantpt(), som betyr Glibc pt_chown hjelper binær (som ikke er installert som standard) ikke er nødvendig.
I noen vertssystemer, /dev/shm
er en symbolsk lenke til en mappe, vanligvis /run/shm
. /run tmpfs ble montert ovenfor,
så i dette tilfellet er det bare en mappe som må opprettes
med de riktige tillatelsene.
I andre vertssystemer /dev/shm
er et monteringspunkt for en tmpfs. I så fall vil monteringen
av /dev ovenfor bare opprette /dev/shm i chroot miljøet som
en mappe. I denne situasjonen monterer vi eksplisitt en
tmpfs:
if [ -h $LFS/dev/shm ]; then install -v -d -m 1777 $LFS$(realpath /dev/shm) else mount -vt tmpfs -o nosuid,nodev tmpfs $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 \ MAKEFLAGS="-j$(nproc)
" \ TESTSUITEFLAGS="-j$(nproc)
" \ /bin/bash --login
Hvis du ikke vil bruke alle tilgjengelige logiske kjerner, bytt
ut $(nproc)
med
antall logiske kjerner du ønsker å bruke til å bygge pakker i
dette kapittelet og de følgende kapitler. Testpakkene til noen
pakker (spesielt Autoconf, Libtool, og Tar) i
Kapittel 8 er ikke berørt av MAKEFLAGS
, de bruker en TESTSUITEFLAGS
miljøvariabel i stedet. Vi setter
det her også for å kjøre disse testpakkene med flere kjerner.
-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 setter TERM
variabelen inne i chroot til samme verdi som utenfor chroot.
Denne variabelen er nødvendig for at programmer som
vim og
less kan fungere
skikkelig. Hvis andre variabler ønskes, som f.eks CFLAGS
eller CXXFLAGS
, er dette et bra sted å sette dem.
Fra dette tidspunktet er det ikke nødvendig å bruke
LFS
variabelen lenger fordi alt
arbeid vil være begrenset til LFS filsystemet. chroot kommandoen kjører Bash
skallet med rot (/
) mappen satt
til $LFS
.
Merk at /tools/bin
ikke er i
PATH
. Dette betyr at
kryssverktøykjeden ikke lenger vil bli brukt.
Merk at bash
ledeteksten 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 det 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 hjemmemappen for brukeren
root
, 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
mappene, 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
. I LFS, oppretter vi kun
mapper som trengs. Du må imidlertid gjerne lage disse
mappene.
FHS gir ikke mandat til at mappen /usr/lib64
skal eksistere, og LFS
redaktørene har bestemt seg for å ikke bruke den. For at
instruksjonene i LFS og BLFS skal fungere riktig, er det
viktig at denne mappen ikke eksisterer. Fra tid til annen
bør du bekrefte at den ikke eksisterer, fordi det er enkelt
å lage den utilsiktet, og dette vil sannsynligvis ødelegge
systemet ditt.
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 å finne
/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
settes
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:
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å https://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
brukernavneområ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 Kapittel 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 loggfiler 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 utlogginger. /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 er
opprettet dynamisk i oppstartsskriptene.
utmp
, wtmp
, btmp
,
og lastlog
filene bruker
32-biters heltall for tidsstempler og de vil være
fundamentalt ødelagte etter år 2038. Mange pakker har sluttet
å bruke dem og andre pakker kommer til å slutte å bruke dem.
Det er sannsynligvis best å betrakte dem som avviklet.
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.32.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.33.2, “Innholdet i Bison”
Perl pakken inneholder den praktiske utvinnings og rapporteringsspråket (Practical Extraction and Report Language).
Forbered Perl for kompilering:
sh Configure -des \ -Dprefix=/usr \ -Dvendorprefix=/usr \ -Duseshrplib \ -Dprivlib=/usr/lib/perl5/5.38/core_perl \ -Darchlib=/usr/lib/perl5/5.38/core_perl \ -Dsitelib=/usr/lib/perl5/5.38/site_perl \ -Dsitearch=/usr/lib/perl5/5.38/site_perl \ -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl
Betydningen av 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-essensiell utdata.
-Dvendorprefix=/usr
Dette sikrer at perl vet hvordan å fortelle pakker hvor de skal installere perl modulene sine.
-Duseshrplib
Bygger libperl
som
trengs av noen perl moduler som et delt bibliotek, i
stedet for et statisk bibliotek.
-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.38) hvilket tillater oppgradering av Perl til nyere Patch nivåer (Patchnivået er den siste punktseparerte delen i den fullstendige versjonenstrengen som 5.38.2) uten å installere alle modulene på nytt.
Kompiler pakken:
make
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.42.2, “Innhold i Perl”
Python 3 pakken inneholder Python utviklingsmiljøet. Den er nyttig for objektorientert programmering, skriving av skript, prototyping av store programmer, eller utvikle hele applikasjoner. Python er et tolket dataspråk.
Det er to pakkefiler som navnet begynner med “python” prefiks
. Den å pakke ut er Python-3.12.2.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 at
avhengighetene ikke er installert ennå. For ssl
modulen, en melding Python requires a OpenSSL 1.1.1 or
newer
sendes ut. 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
Kapittel 8.
Installer pakken:
make install
Detaljer om denne pakken finner du i Section 8.51.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.71.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 --libdir=/usr/lib \ --runstatedir=/run \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.39.3
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 at .so
målrettes direkte mot
symbolkoblinger i den delte bibliotekfilen i samme
mappe (/usr/lib
).
--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.78.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, på et moderne Linuxsystem, er libtool .la-filene bare nyttig for libltdl. Ingen biblioteker i LFS forventes å bli lastet av libltdl, og det er kjent at noen .la-filer kan forårsake at BLFS pakker feiler under byggingen. 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, det 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 Kapittel 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 burde plasseres innenfor $LFS
hierarkiet.
Hvis du har bestemt deg for å ta en sikkerhetskopi, forlat chroot miljøet:
exit
Alle følgende instruksjoner utføres av root
på vertssystemet ditt. Vær ekstra
forsiktig med kommandoene du skal kjøre ettersom feil her
kan endre vertssystemet ditt. Vær oppmerksom på at
miljøvariabelen LFS
er satt for
bruker 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 det virtuelle filsystemet:
mountpoint -q $LFS/dev/shm && umount $LFS/dev/shm 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
vertssystemets bruker root
som vanligvis finnes på rotfilsystemet. Erstatt $HOME
med 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-12.1.tar.xz .
Hvis du fortsetter til kapittel 8, ikke glem å gå inn i chroot miljøet på nytt som forklart i “Viktig” boksen under.
I 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-12.1.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, “Forberede det 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 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
kompileringsvanskeligheter 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 det er komplekse interaksjoner 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.
På den annen side holder vi optimaliseringene aktivert som
standard konfigurasjon av pakkene. I tillegg aktiverer vi noen
ganger eksplisitt en optimalisert konfigurasjon levert av en
pakke, men ikke aktivert som standard. Pakkevedlikeholderne har
allerede testet disse konfigurasjonene og anser dem som trygge,
så det er ikke sannsynlig at de vil bryte byggingen. Vanligvis
aktiverer standardkonfigurasjonen allerede -O2
eller -O3
, så
det resulterende systemet vil fortsatt kjøre veldig raskt uten
noen tilpasset optimalisering, og være stabil 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 som kreves under denne byggeprosessen. Etter installasjonsinstruksene , 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 Kapittel 8. SBU verdier har blitt beregnet ved å bruke fire CPU kjerner (-j4) for alle operasjoner med mindre annet er spesifisert.
Generelt fraråder LFS redaktørene å bygge og installere statiske biblioteker. De fleste statiske biblioteker er gjort foreldet i et moderne Linuxsystem. I tillegg å koble et statisk bibliotek inn i et program kan være skadelig. Hvis en oppdatering til biblioteket er nødvendig for å fjerne et sikkerhetsproblem, må hvert program som bruker det statiske biblioteket kobles sammen med det nye biblioteket. Siden bruken av statiske biblioteker ikke alltid er åpenbart, de relevante programmene (og prosedyrene som trengs for å gjøre 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 pakkebyggeprosessen.
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. En god pakkebehandler vil også håndtere konfigurasjonsfiler spesielt for å beholde brukerkonfigurasjonen når pakken installeres på nytt eller oppgraderes. Før du begynner å lure, 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—å lære 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 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 blir 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 å oppgraderes ved siden av kjernen. Du må starte systemet på nytt for å bruke den oppgraderte kjernen.
Hvis Glibc må oppgraderes til en nyere versjon, (f.eks. fra Glibc-2.36 til Glibc-2.39), noen ekstra trinn er nødvendig for å unngå å ødelegge systemet. Les Section 8.5, “Glibc-2.39” for detaljer.
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 er (direkte eller indirekte) er knyttet
til både de gamle og nye navnene av et delt bibliotek
(for eksempel pakken lenker til både libfoo.so.2
og libbar.so.1
, mens sistnevnte linker
til libfoo.so.3
), pakken
kan fungere feil fordi de forskjellige revisjonene av
det delte biblioteket presenterer uforenlige
definisjoner for noen symbolnavn. Dette kan være
forårsaket av rekompilering av noen, men ikke alle,
pakkene knyttet til et gammelt delt bibliotek etter at
pakken som gir det delte biblioteket er oppgradert. For
å unngå problemet, må brukere gjenoppbygge hver pakke
koblet til et delt bibliotek med en oppdatert revisjon
(f.eks. libfoo.so.2 til libfoo.so.3) så snart som
mulig.
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). Ellers, et ldconfig kommando
(påkalt av deg selv fra kommandolinjen , 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
oppstå hvis du må nedgradere en pakke, eller hvis
forfatterne endrer versjonsskjema for bibliotekfiler.
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 '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 igjen 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 SpiderMonkey 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 undersøkelser på de forskjellige teknikkene, 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 mappe. For eksempel pakke foo-1.1
er installert i /opt/foo-1.1
og en symbolkobling er laget fra /opt/foo
til /opt/foo-1.1
. Når en ny versjon foo-1.2
kommer, blir den installert i /opt/foo-1.2
og den forrige
symbolkoblingen erstattes av en symbolkobling til den nye
versjonen.
Miljøvariabler som f.eks PATH
,
MANPATH
, INFOPATH
, PKG_CONFIG_PATH
, CPPFLAGS
, LDFLAGS
, og konfigurasjonsfilen /etc/ld.so.conf
må kanskje utvides til
inkludere de tilsvarende undermappene i /opt/foo-x.y
.
Denne ordningen brukes av BLFS boken for å installere noen veldig store pakker for å gjøre det enklere å oppgradere dem. Hvis du installerer mer enn noen få pakker, blir denne ordningen uhåndterlig. Og noen pakker (for eksempel Linux API deklarasjoner og Glibc) fungerer kanskje ikke bra med denne ordningen. Bruk aldri denne ordningen systemomfattende.
Dette er en variant av den tidligere
pakkehåndteringsteknikken. Hver pakke er installert som i
forrige skjema. Men i stedet for å lage symbolkoblingen via
et generisk pakkenavn, er hver fil symlinket til
/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 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 gjøre at pakken ikke installeres 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
strategien for å forfalske
installasjon av pakken. Denne 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 en 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 g 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 denne tilnærmingen er RPM (som for øvrig kreves av Linux Standard Base Specification), pkg-utils, Debian sin apt, og Gentoo sin 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 https://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. 900MB
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 kjernekonfigurasjonen.
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 2400 mansider..
Fjern to mansider for passordhashingsfunksjoner. Libxcrypt vil gi en bedre versjon av disse mansidene:
rm -v man3/crypt*
Installer Man-pages 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.39-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=4.19 \ --enable-stack-protector=strong \ --disable-nscd \ 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=4.19
Dette alternativet forteller byggesystemet at denne glibc kan brukes med kjerner så gamle som 4.19. 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. Merk at Glibc alltid eksplisitt overstyrer
standarden til GCC, så dette alternativet er fortsatt
nødvendig selv om vi har allerede spesifisert
--enable-default-ssp
for
GCC.
--disable-nscd
Ikke bygg navnetjenesten cache daemon som ikke er brukt lenger.
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 5000 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.
Noen tester, for eksempel nss/tst-nss-files-hosts-multi og nptl/tst-thread-affinity* er kjent for å mislykkes på grunn av et tidsavbrudd (spesielt når systemet er relativt sakte og/eller kjører testpakken med flere parallelle make jobber). Disse testene kan identifiseres med:
grep "Timed out" -l $(find -name \*.out)
Det er mulig å kjøre en enkelt test på nytt med større
tidsavbrudd med TIMEOUTFACTOR=<factor>
make
test t=<test
name>
. For eksempel,
TIMEOUTFACTOR=10 make
test t=nss/tst-nss-files-hosts-multi
vil kjøre på nytt nss/tst-nss-files-hosts-multi
med ti ganger det opprinnelige tidsavbruddet.
I tillegg kan noen tester mislykkes med en relativt gammel CPU modell (For eksempel elf/tst-cpu-features-cpuinfo) eller vertskjerne versjon (for eksempel stdlib/tst-arc4random-thread).
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 Makefile for å hoppe over en utdatert tilregnlighetssjekk som mislykkes med en moderne Glibc-konfigurasjon:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
Hvis du oppgraderer Glibc til en ny mindre versjon (for eksempel fra Glibc-2.36 to Glibc-2.39) på et kjørende LFS system, må du ta noen ekstra forholdsregler for å unngå å ødelegge systemet:
Oppgradering av Glibc på et LFS system før 11.0 (eksklusivt) er ikke støttet. Bygg LFS på nytt hvis du kjører et så gammelt LFS system, men du trenger en nyere Glibc.
Hvis du oppgraderer på et LFS system før 12.0
(eksklusivt), installer Libxcrypt med å følge Section 8.26,
“Libxcrypt-4.4.36” I tillegg til en normal
Libxcrypt
installasjon, du MÅ følge
notatet i Libxcrypt delen for å installere
libcrypt.so.1*
(ved å
erstatte libcrypt.so.1
fra den tidligere Glibc
installasjonen).
Hvis du oppgraderer på et LFS-system før 12.1 (eksklusivt), fjern nscd programmet:
rm -f /usr/sbin/nscd
Oppgrader kjernen og start på nytt hvis den er eldre enn 4.19 (sjekk gjeldende versjon med uname -r) eller hvis du vil oppgradere den likevel, følg Section 10.3, “Linux-6.7.4”
Oppgrader kjerne API deklarasjonene hvis de er eldre
enn 4.19 (sjekk gjeldende versjon med cat
/usr/include/linux/version.h) eller
hvis du vil oppgradere den likevel, følg Section 5.4,
“Linux-6.7.4 API Deklarasjoner” (men fjern
$LFS
fra cp kommandoen).
Utfør en DESTDIR
installasjon og oppgrader Glibc delte biblioteker på
systemet ved hjelp av en enkelt install kommando:
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/*.so.* /usr/lib
Det er viktig å strengt følge disse trinnene ovenfor med mindre du forstår helt hva du gjør. Ethvert uventet avvik kan gjøre systemet helt ubrukelig. DU ER ADVART.
Fortsett deretter å kjøre make install kommandoen,
sed
kommandoen mot /usr/bin/ldd
,
og kommandoene som skal installere lokalitetene. Når de er
ferdige, start systemet på nytt med en gang.
Installer pakken:
make install
Fiks en hardkodet bane til den kjørbare lasteren i ldd skriptet:
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
Installer deretter lokalitetene som kan få systemet til å svare i et annet språk. Ingen av disse stedene er påkrevd, men hvis noen av dem mangler, vil testpakkene til noen pakker hoppe over viktige testsaker.
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 C -f UTF-8 C.UTF-8 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.39/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.39/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 C -f UTF-8 C.UTF-8 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 ../../tzdata2024a.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. Europe/Oslo).
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 lokalitetsspesifikasjoner |
|
Oppretter en enkel database fra tekst inndata |
|
Leser og tolker en minnesporingsfil og viser et sammendrag i menneskelestbart format |
|
Dumper informasjon generert av PC profiling |
|
Viser dynamiske delte objekter som brukes av kjørende prosesser |
|
En statisk koblet ln program |
|
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
|
|
Dummy bibliotek som ikke inneholder noen
funksjoner. Tidligere var det asynkront
navneoppslagsbibliotek, hvor funksjoner nå er i
|
|
C hovedbiblioteket |
|
Slår på minneallokeringskontroll når den er forhåndslastet |
|
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.1c Threads Extensions og
semaforgrensesnittene spesifisert av POSIX.1b
Real-time Extensions, 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 Real-time Extensions |
|
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 mansidene 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 datakomprimering ved å bruke Burrows-Wheeler-algoritmen |
Xz pakken inneholder programmer for komprimering og dekomprimering av filer. Det gir muligheter for lzma og den nyere xz komprimeringsformatene. 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.4.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.
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 redigerings- og historikkfunksjoner på kommandolinjen.
Å 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 unngås ved å utstede følgende to seds:
sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install
Løs nå et problem identifisert oppstrøms:
patch -Np1 -i ../readline-8.2-upstream_fixes-3.patch
Forbered Readline for kompilering:
./configure --prefix=/usr \ --disable-static \ --with-curses \ --docdir=/usr/share/doc/readline-8.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.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øre 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 før bc programmet er installert.
-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, og
opprett også mansiden til lex som en symlenke:
ln -sv flex /usr/bin/lex ln -sv flex.1 /usr/share/man/man1/lex.1
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 (uttales "tickle").
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.
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.5|/usr/lib/tdbc1.1.5|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5/library|/usr/lib/tcl8.6|" \ -e "s|$SRCDIR/pkgs/tdbc1.1.5|/usr/include|" \ -i pkgs/tdbc1.1.5/tdbcConfig.sh sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.3|/usr/lib/itcl4.2.3|" \ -e "s|$SRCDIR/pkgs/itcl4.2.3/generic|/usr/include|" \ -e "s|$SRCDIR/pkgs/itcl4.2.3|/usr/include|" \ -i pkgs/itcl4.2.3/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 manside som er i konflikt med en manside for Perl:
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
Eventuelt kan du installere dokumentasjonen ved å utstede følgende kommandoer:
cd .. tar -xf ../tcl8.6.13-html.tar.gz --strip-components=1 mkdir -v -p /usr/share/doc/tcl-8.6.13 cp -v -r ./html/* /usr/share/doc/tcl-8.6.13
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.
Expect forventer at PTY-er skal fungere. Kontroller at PTY-ene fungerer riktig inne i chroot miljøet ved å utføre en enkel test:
python3 -c 'from pty import spawn; spawn(["echo", "ok"])'
Denne kommandoen skal sende ut ok
. Hvis i stedet utdataen inkluderer
OSError: out of pty
devices
, da er ikke miljøet satt opp for ordentlig PTY
operasjon. Du må gå ut av chroot miljøet, les Section 7.3,
“Forberede det virtuelle kjernefilsystemer” igjen, og
sørg for at devpts
filsystemet (og andre virtuelle kjernefilsystemer) er montert
på riktig måte. Gå deretter inn i chroot miljøet igjen ved å
følge Section 7.4, “Gå inn
i Chroot miljøet”. Dette problemet må løses før du
fortsetter, ellers vil testpakkene som krever Expect (for
eksempel testpakkene til Bash, Binutils, GCC, GDBM, og
selvfølgelig Expect seg selv) vil mislykkes katastrofalt, og
andre subtile brudd kan også skje.
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
For å teste resultatene, kjør:
make check
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
Pkgconf pakken er en etterfølger til pkg-config og inneholder et verktøy for å sende inkluderingsbanen og/eller bibliotekstier for å bygge verktøy under konfigurerings- og makefasene av pakkeinstallasjoner.
Forbered Pkgconf for kompilering:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/pkgconf-2.1.1
Forbered Pkgconf for kompilering:
make
Installer pakken:
make install
For å opprettholde kompatibilitet med den originale Pkg-config oppretter du to symbolkoblinger:
ln -sv pkgconf /usr/bin/pkg-config ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1
Binutils pakken inneholder en linker, en assembler og annet verktøy for håndtering av objektfiler.
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 \ --enable-default-hash-style=gnu
Betydningen av nye konfigureringsparametrene:
--enable-gold
Bygg gold linkeren 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 stltte for programtillegg for linkeren.
--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øymappen (mappen der de kjørbare
filene til slutt vil 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
For en liste over mislykkede tester, kjør:
grep '^FAIL:' $(find -name '*.log')
Tolv tester mislykkes i gold testpakken når --enable-default-pie
og --enable-default-ssp
alternativene sendes til
GCC.
Installer pakken:
make tooldir=/usr install
Fjern ubrukelige statiske biblioteker:
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a
Oversetter programadresser til filnavn og linjenumre; gitt en adresse og navnet på en kjørbar fil, bruker den feilsøkingsinformasjonen i den kjørbare filen for å bestemme hvilken kildefil og linjenummer 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 å dekode C++ og Java symboler og hindre overbelastede funksjoner å krasje |
|
DWARF pakkeverktøyet |
|
Oppdaterer ELF deklarasjonen til ELF filer |
|
Viser profildata for kallgrafen |
|
Samler 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 |
|
Lister symbolene som forekommer i en gitt objektfil |
|
Oversetter en 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 som inneholder de fleste rutiner som brukes av gprofng |
|
Et bibliotek for å håndtere opkoder—“leselig tekst” versjoner av instruksjoner for prosessoren; den brukes til å bygge verktøy som objdump |
|
Et bibliotek for å støtte tilbakesporing på nettet ved hjelp av en enkel avvikling |
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øke å 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 å
legge til --host=none-linux-gnu
alternativet til configure kommandoen.
Forbered GMP for kompilering:
./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.3.0
Betydningen av de nye konfigureringsalternativene:
--enable-cxx
Denne parameteren aktiverer C++ støtte
--docdir=/usr/share/doc/gmp-6.3.0
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
--host=none-linux-gnu
og
gjenoppbygges.
Sørg for at minst 199 tester 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.2.1
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 198 testene 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.3.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 utvidede attributter på filsystemobjekter.
Forbered Attr for kompilering:
./configure --prefix=/usr \ --disable-static \ --sysconfdir=/etc \ --docdir=/usr/share/doc/attr-2.5.2
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.2
Kompiler pakken:
make
Acl testene må kjøres på et filsystem som støtter tilgangskontroller, men ikke før Coreutils pakken er bygget, ved å bruke Acl biblioteker. Hvis ønskelig, gå tilbake til denne pakken og kjør make check etter at Coreutils pakken er bygget.
Installer pakken:
make install
Libcap pakken implementerer brukergrensesnittet 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 bibliotekmappen til
/usr/lib
i stedet for
/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 funksjonsstøtte |
|
Undersøker filfunksjoner |
|
Viser egenskapene til de forespurte prosessen(e) |
|
Angir filfunksjoner |
|
Inneholder bibliotekfunksjonene for å manipulere POSIX 1003.1e funksjoner |
|
Inneholder funksjoner for å støtte POSIX semantikk for syscalls knyttet til pthread biblioteket |
Libxcrypt pakken inneholder et moderne bibliotek for enveis hashing av passord.
Forbered Libxcrypt for kompilering:
./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=no \ --disable-static \ --disable-failure-tokens
Betydningen av de nye konfigureringsalternativene:
--enable-hashes=strong,glibc
Bygg sterke hash-algoritmer som anbefales for
sikkerhetsbruk og hash-algoritmene levert av
tradisjonelle Glibc libcrypt
for kompatibilitet.
--enable-obsolete-api=no
Deaktiver foreldede API-funksjoner. De trengs ikke for et moderne Linuxsystem bygget fra kilden.
--disable-failure-tokens
Deaktiver funksjonen for feiltoken. Det trengs for kompatibilitet med de tradisjonelle hash-bibliotekene til noen plattformer, men et Linuxsystem basert på Glibc trenger ikke den.
Kompiler pakken:
make
For å teste resultatene, utsted:
make check
Installer pakken:
make install
Instruksjonene ovenfor har deaktivert foreldede API-funksjoner siden ingen pakke installert ved å kompilere fra kilder ville lenke mot dem under kjøring. Imidlertid er de eneste kjente bare binære applikasjonene som koblingen mot disse funksjonene krever ABI versjon 1. Hvis du må ha slike funksjoner på grunn av en eller annen binær applikasjon eller for å være kompatibel med LSB, bygg pakken på nytt med følgende kommandoer:
make distclean ./configure --prefix=/usr \ --enable-hashes=strong,glibc \ --enable-obsolete-api=glibc \ --disable-static \ --disable-failure-tokens make cp -av --remove-destination .libs/libcrypt.so.1* /usr/lib
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/12.1/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 mansidene, ettersom Coreutils gir en bedre versjon. Også forhindre installasjon av mansider som allerede var installert i Section 8.3, “Man-pages-6.06”:
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 mye
sikrere YESCRYPT
metode for passordkryptering, som også tillater passord
lengre enn 8 tegn. It is also necessary to change det
foreldede /var/spool/mail
plasseringen for brukerpostbokser som Shadow bruker som
standard til /var/mail
stedet
som brukes for øyeblikket. Og, fjerne /bin
og /sbin
fra PATH
, siden de ganske enkelt
er symbolske lenker til motparten i /usr
.
Hvis du ønsker å inkludere /bin
og/eller /sbin
i PATH
av en eller annen grunn, endre PATH
i .bashrc
etter at LFS er bygget.
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \ -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-{b,yes}crypt \ --without-libbsd \ --with-group-name-max-length=32
Betydningen av konfigureringsalternativet:
Filen /usr/bin/passwd
må
eksistere fordi plasseringen er hardkodet i noen
programmer; hvis den ikke eksisterer allerede, vil
installasjonsskriptet lage den på feil sted.
--with-{b,yes}crypt
Skallet utvider dette til to brytere, --with-bcrypt
og
--with-yescrypt
. De lar
shadow bruke Bcrypt- og Yescrypt-algoritmene
implementert av Libxcrypt for hashing av passord.
Disse algoritmene er sikrere (spesielt mye mer
motstandsdyktig mot GPU-baserte angrep) enn den
tradisjonelle SHA algoritmer.
--with-group-name-max-length=32
Det lengste tillatte brukernavnet er 32 tegn. Gjør det maksimale lengden på et gruppenavn til det samme.
--without-libbsd
Ikke bruk readpassphrase funksjonen fra libbsd som ikke er i LFS. Bruk den interne kopien i stedet.
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 passordskygging betyr, se
doc/HOWTO
filen i den utpakkede
kildetreet. Hvis du bruker Shadowstøtte, husk at programmer
som trenger å bekrefte passord (skjermbehandlere,
FTP-programmer, pop3-nisser, etc.) må være Shadowkompatibel.
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 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 brukerID (UID) og gruppeID 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 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
parameteren
ovenfor. Du kan endre den til alt du ønsker. Merk at
useradd
vil aldri gjenbruke en UID eller GID. Hvis nummeret som
er identifisert i denne parameteren brukes, vil den
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,
vil en feilmelding bli generert—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 ikke vil opprette disse filene, gi 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 |
|
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 som sier at en konto ikke er tilgjengelig; den er designet til å brukes som standard skall for deaktiverte kontoer |
|
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 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
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++ \ --enable-default-pie \ --enable-default-ssp \ --disable-multilib \ --disable-bootstrap \ --disable-fixincludes \ --with-system-zlib
GCC støtter syv forskjellige dataspråk, men forutsetningene for de fleste av dem er ikke installert 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.
--disable-fixincludes
Som standard, under installasjonen av GCC noen systemdeklarasjoner vil være “låst” for bruk med GCC. Dette er ikke nødvendig for et moderne Linuxsystem, og potensielt skadelig hvis en pakke installeres på nytt etter installasjon av GCC. Denne bryteren hindrer GCC fra å “låse” deklarasjonene.
--with-system-zlib
Denne bryteren forteller GCC å koble til den systeminstallerte kopien av zlib biblioteket, i stedet for sin egen interne kopi.
PIE (position independent executable) er en teknikk for å produsere binære programmer som kan lastes hvor som helst i minnet. Uten PIE, sikkerhetsfunksjonen kalt ASLR (Address Space Layout Randomization) kan legges til for de delte bibliotekene, men ikke de kjørbare filen. Aktivering av PIE tillater ASLR for de kjørbare filene i tillegg til de delte bibliotekene, og reduserer noen angrep basert på faste adresser til sensitiv kode eller data i de kjørbare filene.
SSP (Stack Smashing Protection) er en teknikk for å sikre at parameterstabelen ikke er ødelagt. Stabelkorrupsjon kan for eksempel endre returadressen til en subrutine, som ville tillate overføring av kontroll til en eller annen farlig kode (som eksisterer i programmet eller delte biblioteker, eller injisert av en angriper på en eller annen måte) i stedet for den originale.
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 til make -k check 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 -R tester . su tester -c "PATH=$PATH make -k check"
For å trekke ut et sammendrag av resultatene for testpakken, kjør:
../contrib/test_summary
For å filtrere ut bare sammendragene, kanaliser utdataene
gjennom grep -A7
Summ
.
Resultatene kan sammenlignes med de som ligger på https://www.linuxfromscratch.org/lfs/build-logs/12.1/ og https://gcc.gnu.org/ml/gcc-testresults/.
Åtte gcc tester (av over 185 000): pr56837.c
og syv tester i analyzer
mappen er kjent for å mislykkes.
En libstdc++ test (av over 15000), copy.cc
, er kjent for å mislykkes. For g++,
21 tester (ut av omtrentlig 250,000): 14 “AddressSanitizer*”
tester og 7 interception-malloc-test-1.C
tester, er
kjent for å mislykkes. I tillegg flere tester i vect
mappen er kjent for å mislykkes hvis
maskinvaren ikke støtter AVX.
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 byggemappen 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)/13.2.0/include{,-fixed}
Lag en symbolkobling som kreves av FHS av "historiske" grunner.
ln -svr /usr/bin/cpp /usr/lib
Mange pakker bruker navnet cc for å kalle C kompilatoren. Vi har allerede opprettet cc som en symlenke i gcc-pass2, opprette mansiden til den som en symbolkobling også
ln -sv gcc.1 /usr/share/man/man1/cc.1
Legg til en kompatibilitetssymbolkobling for å aktivere byggeprogrammer med optimalisering av koblingstid (LTO (Link Time Optimization)):
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/13.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 bør ikke være noen feil, og utdataen 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]
Sørg nå for at vi er konfigurert til å bruke de riktige startfilene:
grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log
Utdata fra den siste kommandoen bør være:
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/../../../../lib/Scrt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/13.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 riktige deklarasjonsfiler:
grep -B4 '^ /usr/include' dummy.log
Denne kommandoen bør returnere følgende utdata:
#include <...> search starts here:
/usr/lib/gcc/x86_64-pc-linux-gnu/13.2.0/include
/usr/local/include
/usr/lib/gcc/x86_64-pc-linux-gnu/13.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 bør 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 mapper. 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");
Neste forsikre deg om at vi bruker riktig libc:
grep "/lib.*/libc.so.6 " dummy.log
Utdata fra den siste kommandoen bør være:
attempt to open /usr/lib/libc.so.6 succeeded
Sørg for at GCC bruker riktig dynamisk linker:
grep found dummy.log
Utdataen fra den siste kommandoen bør 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 for å legge til "koblingstidsoptimalisering (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 for å legge til "koblingstidsoptimalisering (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 for å legge til "koblingstidsoptimalisering (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 |
|
Et bibliotek som lar GDB bruke GCC |
|
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 |
|
Maskinvareassistert kjøretidsbibliotek for Adresserensing |
|
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 beskyttelsesfunksjonalitet. Normalt er det ubrukt fordi glibc også gir disse rutinene |
|
Standard C++ biblioteket |
|
Eksperimentelt C++ kontraktsbibliotek |
|
ISO/IEC TS 18822:2015 filsystembibliotek |
|
Gir støttende rutiner for C++ programmeringsspråk |
|
Thread Sanitizer kjøretidsbibliotek |
|
Undefined Behavior Sanitizer kjøretidsbibliotek |
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økingsbiblioteker.
--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 brede tegn
(f.eks., libncursesw.so.6.4
) blir bygget i
stedet for vanlige (f.eks., libncurses.so.6.4
). Disse
bibliotekene med brede 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 brede 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.4
. Det kan krasje
skallprosessen som bruker kode og data fra bibliotekfilen.
Installer pakken med DESTDIR
, og
bytt ut bibliotekfilen riktig med install command
(deklarasjonen curses.h
er også
redigert for å sikre ABI med wide-character skal brukes som
det vi har gjort i Section 6.3,
“Ncurses-6.4-20230520”):
make DESTDIR=$PWD/dest install install -vm755 dest/usr/lib/libncursesw.so.6.4 /usr/lib rm -v dest/usr/lib/libncursesw.so.6.4 sed -e 's/^#if.*XOPEN.*$/#if 1/' \ -i dest/usr/include/curses.h cp -av dest/* /
Mange applikasjoner forventer fortsatt at lenkeren skal kunne
finne non-wide-character Ncurses biblioteker. Lure slike
applikasjoner til å koble til biblioteker med wide-character
ved hjelp av symbolkoblinger (merk at .so
lenker er bare trygt med curses.h
redigert for alltid å bruke ABI
med wide-character):
for lib in ncurses form panel menu ; do ln -sfv lib${lib}w.so /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:
ln -sfv libncursesw.so /usr/lib/libcurses.so
Hvis ønskelig, installer Ncurses dokumentasjonen:
cp -v -R doc -T /usr/share/doc/ncurses-6.4-20230520
Instruksjonene ovenfor oppretter ikke Ncurses med ikke-brede 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 ikke-brede 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 |
|
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 C++ binding for andre biblioteker i denne pakken |
|
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 -R tester . su tester -c "PATH=$PATH make check"
Installer pakken og dens dokumentasjon:
make install install -d -m755 /usr/share/doc/sed-4.9 install -m644 doc/sed.html /usr/share/doc/sed-4.9
Psmisc pakken inneholder programmer for å vise informasjon om kjørende prosesser.
Forbered Psmisc for kompilering:
./configure --prefix=/usr
Kompiler pakken:
make
For å kjøre testpakken, kjør:
make check
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.22.4
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 meldingsmappe fra en oversettelsesmappe |
|
Trekker ut alle meldinger fra en oversettelsesmappe som samsvarer med et gitt mønster eller tilhører noen gitte kildefiler |
|
Oppretter en ny |
|
Kombinerer to rå oversettelser til en 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 |
|
Inneholder vanlige rutiner som brukes av ulike Gettext programmer; disse er ikke beregnet for generelt bruk |
|
Brukes til å skrive spesialiserte programmer som
behandler |
|
Gir 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.
Fjern først en advarsel om bruk av egrep og fgrep som gjør at tester på noen pakker mislykkes:
sed -i "s/echo/#echo/" src/egrep.sh
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).
Først, fiks noen problemer identifisert oppstrøms:
patch -Np1 -i ../bash-5.2.21-upstream_fixes-1.patch
Forbered Bash for kompilering:
./configure --prefix=/usr \ --without-bash-malloc \ --with-installed-readline \ --docdir=/usr/share/doc/bash-5.2.21
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 -R tester .
Testpakken til pakken er designet for å kjøres som en
ikke-root
bruker som eier
terminalen koblet til standardinngang. For å tilfredsstille
kravet, skap en ny pseudoterminal ved hjelp av Expect og kjør testene som bruker
tester
:
su -s /usr/bin/expect tester << "EOF" set timeout -1 spawn make tests expect eof lassign [wait] _ _ _ value exit $value EOF
Testpakken bruker diff for å oppdage
forskjellen mellom utdata fra testskriptet og forventet
utdata. Enhver utdata fra diff (prefikset med
<
og >
) indikerer en testfeil, med
mindre det er en melding som sier at forskjellen kan
ignoreres. En test med navnet run-builtins
er kjent for å mislykkes på
noen vertsdistroer med en forskjell på den første linjen i
utdataen.
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, prøver bash å etterligne oppstartadferd av historiske versjoner av sh så nært som mulig, samtidig som den også samsvarer med POSIX standarden |
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 -k check
Fem tester er kjent for å mislykkes i LFS byggemiljøet pga en sirkulær avhengighet, men disse testene består hvis de sjekkes på nytt etter at automake har blitt installert. I tillegg, med grep-3.8 eller nyere, to tester vil utløse en advarsel for ikke-POSIX regulære uttrykk og mislykkes.
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 eldre DBM rutiner det 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.6.0
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.6.0
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 lang tid 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
For å teste resultatene, kjør:
make check
Installer pakken:
make install
Perl pakken inneholder den praktiske utvinnings og rapporteringssprå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.38/core_perl \ -Darchlib=/usr/lib/perl5/5.38/core_perl \ -Dsitelib=/usr/lib/perl5/5.38/site_perl \ -Dsitearch=/usr/lib/perl5/5.38/site_perl \ -Dvendorlib=/usr/lib/perl5/5.38/vendor_perl \ -Dvendorarch=/usr/lib/perl5/5.38/vendor_perl \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib \ -Dusethreads
Betydningen av de nye konfigureringsalternativene:
-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å vil ikke Configure opprette mansider for Perl. Disse parameterene overstyrer denne oppførselen.
-Dusethreads
Bygg perl med støtte for tråder.
Kompiler pakken:
make
For å teste resultatene (ca. 11 SBU), utsted:
TEST_JOBS=$(nproc) make test_harness
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 en 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
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 fire parallelle jobber øker hastigheten på testene, selv på systemer med mindre logiske kjerner, på grunn av interne forsinkelser i individuelle tester. Å teste resultatene, utsted:
make -j$(($(nproc)>4?$(nproc):4))
check
Erstatt $((...))
med antall logiske kjerner du vil bruke, hvis du ikke vil
bruke alle.
Testen t/subobj.sh er kjent for å mislykkes.
Installer pakken:
make install
Genererer |
|
En hard lenke til aclocal |
|
Et verktly 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:
HARNESS_JOBS=$(nproc)
make test
En test, 30-test_afalg.t, er kjent for å mislykkes hvis
vertskjernen ikke har CONFIG_CRYPTO_USER_API_SKCIPHER
aktivert,
eller ikke har noen alternativer som gir en AES med CBC
implementering (for eksempel en kombinasjonen av CONFIG_CRYPTO_AES
og CONFIG_CRYPTO_CBC
, eller CONFIG_CRYPTO_AES_NI_INTEL
hvis CPU støtter
AES-NI) aktivert. Hvis den mislykkes, kan den trygt
ignoreres.
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.2.1
Hvis ønskelig, installer litt tilleggsdokumentasjon:
cp -vfr doc/* /usr/share/doc/openssl-3.2.1
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 sitt kryptobibliotek fra skallet. Den kan brukes til ulike funksjoner som er dokumentert i openssl(1) |
|
implementerer et bredt spekter av kryptografiske algoritmer som brukes i ulike Internettstandarder. 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, dokumentasjonen kan bli funnet i ssl(7) |
Kmod pakken inneholder biblioteker og verktøy for lasting av kjernemoduler
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å kjernedeklarasjoner (ikke de “sanitiserte” kjernedeklarasonene 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 modulene |
|
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.190 pakken. Bruk elfutils-0.190.tar.bz2 filen som kildetarball.
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 en portabel høynivå programmeringsgrensesnitt til ulike kallkonvensjoner. Dette lar en programmerer kalle enhver funksjon ved kjøretid, spesifisert av et kallgrensesnittbeskrivelse.
FFI står for Foreign Function Interface. En FFI tillater et program skrevet på ett språk å kalle et program skrevet på et annet språk. Nærmere bestemt, Libffi kan gi en bro mellom en tolk som Perl, eller Python, og delte biblioteksunderrutiner skrevet i C eller C++.
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
(Illegal Operation Errors).
Forbered libffi for kompilering:
./configure --prefix=/usr \ --disable-static \ --with-gcc-arch=native
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 er kanskje ikke riktig. Hvis den genererte koden vil bli kopiert fra det opprinnelige systemet til et mindre kapabelt system, bruk det mindre kapable systemet som parameter. For detaljer om alternative systemtyper, se x86 alternativene i GCC manualen.
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 av store programmer, eller utvikle hele applikasjoner. Python er et tolket dataspråk.
Forbered Python for kompilering:
./configure --prefix=/usr \ --enable-shared \ --with-system-expat \ --enable-optimizations
Betydningen av konfigureringsalternativene:
--with-system-expat
Denne bryteren muliggjør kobling mot systemversjonen av Expat.
--enable-optimizations
Denne bryteren muliggjør omfattende, men tidkrevende, optimaliseringstrinn Tolken bygges to ganger; tester utført på det første bygget brukes til å forbedre den optimaliserte endelige versjonen.
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
Vi bruker pip3
kommandoen til å installer Python 3 programmer og moduler for
alle brukere som root
flere
steder i denne boken. Dette er i konflikt med Python
utviklernes anbefaling: å installere pakker i et virtuelt
miljø eller inn i hjemmemappen til en vanlig bruker (ved å
kjøre pip3 som
denne brukeren). En advarsel med flere linjer utløses når
pip3 er utstedt
av root
brukeren.
Hovedgrunnen for anbefalingen er å unngå konflikter med systemets pakkeansvarlig (dpkg, for eksempel). LFS har ikke en systemomfattende pakkebehandling, så dette er ikke et problem. Også pip3 vil se etter en ny versjon av seg selv når den kjøres. Siden domenenavnoppløsning ikke er konfigurert ennå i LFS chroot miljøet, pip3 kan ikke sjekke for en ny versjon av seg selv, og vil produsere en advarsel.
Etter at vi har startet opp LFS systemet og satt opp en nettverkstilkobling, en annen advarsel vil bli gitt, og ber brukeren om å oppdatere pip3 fra et forhåndsbygd wheel på PyPI (når en ny versjon er tilgjengelig). Men LFS vurderer pip3 å være en del av Python 3, så det burde ikke oppdateres separat. Dessuten vil en oppdatering fra et forhåndsbygd wheel avvike fra vårt mål: å bygge et Linuxsystem fra kildekoden. Så advarsel om en ny versjon av pip3 bør ignoreres om vi vil. Hvis du ønsker det, kan du undertrykke alle disse advarslene ved å kjøre følgende kommando, som oppretter en konfigurasjonsfil:
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
Pythonmoduler med pip3 kommandoen.
Vennligst pass på at pip3
install kommandoer i begge bøkene 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. Når du bruker pip3
install kommandoen for å oppgradere en
modul (for eksempel fra meson-0.61.3 til meson-0.62.0),
sett inn alternativet --upgrade
inn i
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
inn i kommandolinjen.
Hvis ønskelig, installer den forhåndsformaterte dokumentasjonen:
install -v -dm755 /usr/share/doc/python-3.12.2/html tar --no-same-owner \ -xvf ../python-3.12.2-docs-html.tar.bz2 cp -R --no-preserve=mode python-3.12.2-docs-html/* \ /usr/share/doc/python-3.12.2/html
Betydningen av dokumentasjonsinstallasjons kommandoene:
--no-same-owner
(tar) og --no-preserve=mode
(cp)
Sørger for at de installerte filene har riktig eierskap og tillatelser. Uten disse alternativene, tar vil installere pakkefilene med oppstrømsskaperens verdier og filer vil ha restriktive tillatelser.
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 et Python bevisst GUI tekstprogram. For at dette skriptet skal kjøre, må du ha installert Tk før Python slik at Tkinter Pythonmodulen blir bygget. |
|
Pakkeinstallasjonsprogrammet for Python. Du kan bruke pip til å installere pakker fra Python Pakke Indeks og andre indekser |
|
er Python dokumentasjonsverktøy |
|
er tolken for Python, et tolket, interaktiv, objektorientert programmeringsspråk |
Flit-core er den distribusjonsbyggende delene av Flit (et pakkeverktøy for enkle Pythonmoduler).
Bygg pakken:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Installer pakken:
pip3 install --no-index --no-user --find-links dist flit_core
Betydningen av pip3 konfigurasjonsalternativene og kommandoene:
Denne kommandoen bygger wheelarkivet for denne pakken.
-w
dist
Instruerer pip å putte det opprettede wheelet i
dist
mappen.
--no-cache-dir
Hindrer pip fra å kopiere det opprettede wheel inn i
/root/.cache/pip
mappen.
Denne kommandoen installerer pakken.
--no-build-isolation
,
--no-deps
, and
--no-index
Disse alternativene forhindrer henting av filer fra nettets pakkerepository (PyPI). Hvis pakkene er installert i riktig rekkefølge, trenger ikke pip å hente noen filer i utgangspunktet; disse alternativer gir en viss sikkerhet i tilfelle brukerfeil.
--find-links dist
Instruerer pip til å søke etter wheelarkiver i
dist
mappen.
Wheel er et Python bibliotek som er referanseimplementeringen av Python wheel pakkestandarden.
Kompiler Wheel med følgende kommando:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Installer wheel med følgende kommando:
pip3 install --no-index --find-links=dist wheel
Setuptools er et verktøy som brukes til å laste ned, bygge, installere, oppgradere, og avinstaller Python pakker.
Bygg pakken:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Installer pakken:
pip3 install --no-index --find-links dist setuptools
Ninja er et lite byggesystem med fokus på hastighet.
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 bruke opp systemets minne. Når ninja påkalles fra kommandolinjen, å sende parameteren -jN vil begrense antall parallelle prosesser. Noen pakker legger inn utførelsen av ninja, og gir ikke parameteren -j videre til den.
Ved å bruke den valgfrie prosedyren nedenfor lar en bruker begrense antall parallelle prosesser via en miljøvariabel, NINJAJOBS. For eksempe, å sette:
export NINJAJOBS=4
vil begrense ninja til fire parallelle prosesser.
Om ønskelig, la ninja gjenkjenne miljøvariabelen NINJAJOBS ved å kjøre strømredigeringsprogrammet:
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.
Kompiler Meson med følgende kommando:
pip3 wheel -w dist --no-cache-dir --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 wheels inn i dist
mappen.
--find-links dist
Installerer wheels fra dist
mappen.
Coreutils pakken inneholder de grunnleggende hjelpeprogrammene som trengs av hvert operativsystem.
POSIX krever at programmer fra Coreutils gjenkjenner karaktergrenser riktig selv i multibyte lokaliteter. Følgende oppdateringer fikser dette misligholdet og andre internasjonaliseringsrelaterte feil.
patch -Np1 -i ../coreutils-9.4-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.
Rett opp en sikkerhetssårbarhet i split verktøyet:
sed -e '/n_out += n_hold/,+4 s|.*bufsize.*|//&|' \ -i src/split.c
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 programmer 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 en gruppe. Sånn at disse
testene ikke hoppes over, legg til en midlertidig gruppe og
gjør bruker tester
en del av
de:
groupadd -g 102 dummy -U tester
Fiks noen av tillatelsene slik at ikke-root
brukeren kan kompilere og kjøre
testene:
chown -R tester .
Kjør nå testene:
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
Fjern den midlertidige gruppen:
groupdel dummy
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 utgang |
|
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 dato og klokkeslett i det gitte formatet, eller stiller inn systemdato og klokkeslett |
|
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 mappe (det samme som ls kommandoen) |
|
Skriver ut kommandoer for å angi |
|
Trekker ut mappedelen(e) av gitte navn |
|
Rapporterer hvor mye diskplass som brukes av gjeldende mappe, av hver av de gitte mappene (inkludert alle undermapper) 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 de spesifiserte heltallene |
|
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 mappe |
|
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 mapper |
|
Kjører et program med endret planleggingsprioritet |
|
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 oktal 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 arbeidsmappe |
|
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 kontrollerer 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 endringstider 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 den delvise rekkefølgen 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 en fil er gitt |
|
Rapporterer hvem som er pålogget |
|
Rapporterer brukernavnet som er knyttet til gjeldende effektive bruker-ID |
|
Skriver ut |
|
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:
chown -R tester . su tester -c "PATH=$PATH make check"
Installer pakken:
rm -f /usr/bin/gawk-5.3.0 make install
Betydningen av parameter:
Byggesystemet vil ikke gjenskape den harde lenken
gawk-5.3.0
hvis den
allerede eksisterer. Fjern den for å sikre at den
forrige hardlinken installert i Section 6.9,
“Gawk-5.3.0” er oppdatert her.
Installasjonsprosessen har allerede opprettet awk som en symlenke til gawk, opprette mansiden til den som en symlenke også
ln -sv gawk.1 /usr/share/man/man1/awk.1
Hvis ønskelig, installer dokumentasjonen:
mkdir -pv /usr/share/doc/gawk-5.3.0 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.3.0
Findutils pakken inneholder programmer for å finne filer. Programmer er tilgjengelig for å søke gjennom alle filene i et katalogtre og til opprette, vedlikeholde og søke i en database (ofte raskere enn den rekursive find, men upålitelig med mindre databasen nylig har blitt oppdatert). Findutils leverer også xargs programmet, som kan brukes til å kjøre en spesifisert kommando på hver fil valgt av et søk.
Forbered Findutils for kompilering:
./configure --prefix=/usr --localstatedir=/var/lib/locate
Betydningen av konfigureringsalternativene:
--localstatedir
Dette alternativet flytter locate databasen til
/var/lib/locate
, som er
den FHS kompatible plasseringen.
Kompiler pakken:
make
For å teste resultatene, utsted:
chown -R tester . su tester -c "PATH=$PATH make check"
Installer pakken:
make install
Søker i gitte mappetræ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 at miljøvariabelen PAGE
inneholder 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
Bygg pakken:
make
For å teste resultatene, utsted:
make check
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 forbehandler for å lage kjemiske strukturdiagrammer |
|
Kompilerer beskrivelser av ligninger innebygd i troff inndatafiler 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 |
|
Forbehandler for groff, tillater tillegg av perl kode inn i groff filer |
|
Forbehandler for groff, tillater innsetting av Pinyin (Mandarin-kinesisk stavet med det romerske alfabetet) til groff filer. |
|
Konverterer et grapdiagram til et beskåret punktgrafikkbilde (grap er et gammelt Unix-programmeringsspråk for å lage diagrammer) |
|
En groff forbehandler for gremlin filer |
|
En driver for groff som produserer utdatafiler med TeX dvi formatet |
|
En grenseflate til groff dokumentformateringssystemet; normalt, kjøres troff programmet og en etterbehandler passende for den valgte enheten |
|
Viser groff filer og mansider på X og tty terminaler |
|
Leser filer og gjetter hvilket av groff
alternativene |
|
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 fra GNU troff til PDF |
|
Oversetter utdataene fra GNU troff til PostScript |
|
Oversetter utdataene fra 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 forbehandler for groff |
|
Formaterer ligninger for amerikansk standardkode for informasjon utveksling (ASCII) utdata |
|
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 fra GNU troff til HTML |
|
Konverterer koding av inndatafiler til noe GNU troff forstår |
|
Oversetter utdataene fra GNU troff til HTML |
|
Kopierer innholdet i en fil til standardutgang, unntatt linjene mellom .[ og .] som tolkes som referanser, og linjer mellom .R1 og .R2 som tolkes som kommandoer for hvordan referanser skal behandles |
|
Transformerer Roff filer til DVI format |
|
Transformerer Roff filer til HTML format |
|
Transformerer Roff filer til PDF filer |
|
Transformerer Roff filer til ps filer |
|
Transformerer Roff filer til tekst filer |
|
Transformerer Roff filer til andre formater |
|
Leser filer og erstatter linjer i formatet .so file av innholdet i nevnte file |
|
Kompilerer beskrivelser av tabeller innebygd i troff inndatafiler 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 forbehandler og etterbehandler 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) ved å følge instruksjonene på BLFS siden.
Fjern eventuelle miljøvariabler som kan påvirke bygget:
unset {C,CPP,CXX,LD}FLAGS
Ikke prøv å “optimalisere” denne pakken med tilpassete kompileringsflagg. Denne pakken er en oppstartslaster. Da kan lavnivå operasjonene i kildekoden bli brutt av aggressiv optimalisering.
Legg til en fil som mangler fra utgivelsens tarball:
echo depends bli part_gpt
> grub-core/extra_deps.lst
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 eliminere noen 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
Å gjøre LFS systemet oppstartbart med GRUB 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 den gitte filen er av den angitte typen |
|
Verktøy for å feilsøke filsystemdriveren |
|
Limer 32-biters og 64-biters binære filer til en enkelt fil (for Apple maskiner) |
|
Installer GRUB på harddisken din |
|
Skript som konverterer et xkb oppsett til et som gjenkjennes av GRUB |
|
Er Mac-style bless for HFS eller HFS+ filsystemer (bless er særegen for Apple-maskiner; det gjør en enhet oppstartbar) |
|
Konverterer en GRUB Legacy |
|
Generer en |
|
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, CDROM/DVD, eller en USB stasjon |
|
Genererer et frittstående bilde |
|
Er et hjelpeprogram som skriver ut banen til en GRUBenhet |
|
Undersøker enhetsinformasjon for en gitt bane eller enhet |
|
Angir standard oppstartsoppføring for GRUB bare for neste oppstart |
|
Gjengir Apple .disk_label for Apple Macer |
|
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 nettverksbygging.
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 og en manside for arpd vil fortsatt bli installert. Forhindre dette ved å kjøre kommandoene nedenfor.
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-6.7.0 cp -v COPYING README* /usr/share/doc/iproute2-6.7.0
Konfigurerer nettverksbroer |
|
Verktøy for tilkoblingsstatus |
|
Generisk verktøy for netlink grenseflate |
|
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å nabobindinger og deres egenskaper, legge til nye nabooppføringer og slette gamle ip rule lar brukerne se på rutingsreglene 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, for å liste rutetabellene |
|
Viser innholdet i |
|
Overvåkingsverktøy for Route |
|
Konverterer utdataene til ip -o til en lesbar form |
|
Statusverktøy for Route |
|
Ligner på netstat kommandoen; viser aktive forbindelser |
|
Trafikkkontroll for Quality Of Service (QOS) og Class Of Service (COS) implementeringer tc qdisc lar brukere sette opp kødisiplinen tc class lar brukere sette opp klasser basert på køen til kødisiplinplanleggingen tc filter lar brukere sette opp QOS/COS pakkefiltrering tc monitor kan brukes til å se endringer gjort til trafikkkontroll i kjernen. |
Kbd pakken inneholder tastaturfiler, konsollfonter og tastaturverktøy.
Oppførselen til tilbaketastene og slettetastene er ikke konsistent på tvers av tastaturoppsettene i Kbd pakken. Følgende oppdatering fikser dette problemet for i386 tastaturoppsett:
patch -Np1 -i ../kbd-2.6.4-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 tastaturoppsett hvor beholdningen “av” tastaturoppsettene antar en ISO-8859-5-koding og CP1251 tastaturet vanligvis brukes. Brukere av slike språk må laste ned et fungerende tastaturoppsett separat.
Hvis ønskelig, installer dokumentasjonen:
cp -R -v docs/doc -T /usr/share/doc/kbd-2.6.4
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 tastaturkode ( scancode-to-keycode) tilordningstabell |
|
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 (unicode-to-font) kartleggingstabell |
|
Et utdatert program som pleide å laste en brukerdefinert utdata 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 konsollfont |
|
Fjerner den innebygde Unicode tegntabellen fra en konsollfont |
|
Håndterer Unicode tegntabeller for konsollfonter |
|
Endrer fonter for forbedrede grafikkadapteren (EGA) og videografikk matrise (VGA) på konsollen |
|
Laster kjernens skanningskode til tastaturkode (scancode-to-keycode) kartleggingstabelloppføringer; dette er nyttig hvis det er uvanlige taster på tastaturet |
|
Stiller inn tastaturflagg og lysdioder (LED) |
|
Definerer tastaturets metatasthåndtering |
|
Stiller inn konsollfargekartet i alle virtuelle terminaler |
|
Viser gjeldende EGA/VGA konsollskjermfont |
|
Rapporterer skanningskodene, tastekodene 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:
chown -R tester . su tester -c "PATH=$PATH 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 og å 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 er 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 eller sikkerhetsetiketter på filsystemet som brukes til å bygge LFS.
Installer pakken:
make install make -C doc install-html docdir=/usr/share/doc/tar-1.35
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å mansider, 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/12.1/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 -R tester .
Kjør nå testene som bruker tester
:
su tester -c "TERM=xterm-256color 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 (spesielt mens vi overstyrer TERM
variabelen for å tilfredsstille noen
forutsetninger for testpakken). 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 skriver refleksivt vi i stedet for vim. For å tillate kjøringen av vim når brukere vanligvis skriver vi, opprett en symbolkobling for både binærsiden og mansiden 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.1.0041
, som gjør det i
samsvar med plasseringen av dokumentasjonen for andre pakker:
ln -sv ../vim/vim91/doc /usr/share/doc/vim-9.1.0041
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/12.1/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 vil 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 en vi kompatibel måte. Fjern
“no”
for å beholde det gamle vi oppførselen. set backspace=2
innstillingen
tillater tilbaketast over linjeskift, autoinnrykk og starten
på et innlegg. syntax
on
parameteren 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 sin gjetting om
bakgrunnsfargen til en eller annen terminalemulatorer. Dette
gir uthevingen et bedre fargevalg for bruk på svart bakgrunn
for disse programmene.
Dokumentasjon for andre tilgjengelige alternativer kan fås ved å kjøre 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, kopier .spl
og eventuelt .sug
filer for
ditt språk og tegnkoding fra runtime/spell
til mappen /usr/share/vim/vim91/spell/
.
For å bruke disse stavefilene, trengs noen konfigurasjoner
i /etc/vimrc
, f.eks.:
set spelllang=en,ru
set spell
For mer informasjon, se runtime/spell/README.txt
.
Starter vim i ex modus |
|
Er en begrenset versjon av view; ingen skallkommandoer kan startes og view kan ikke suspenderes |
|
Er en begrenset versjon av vim; ingen skallkommandoer 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ære endringer |
MarkupSafe er en Python modul som implementerer en XML/HTML/XHTML Markup sikker streng.
Kompiler MarkupSafe med følgende kommando:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Denne pakken kommer ikke med en testpakke.
Installer pakken:
pip3 install --no-index --no-user --find-links dist Markupsafe
Jinja2 er en Pythonmodul som implementerer et enkelt pytonisk malspråk.
Bygg pakken:
pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
Installer pakken:
pip3 install --no-index --no-user --find-links dist Jinja2
Udev pakken inneholder programmer for dynamisk oppretting av enhetsnoder.
Udev er en del av systemd-255 pakken. Bruk systemd-255.tar.xz file som tarballkilde.
Fjern to unødvendige grupper, render
og sgx
, fra standard udev regler:
sed -i -e 's/GROUP="render"/GROUP="video"/' \ -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in
Fjern en udevregel som krever en full Systemd installasjon:
sed '/systemd-sysctl/s/^/#/' -i rules.d/99-systemd.rules.in
Juster de hardkodede banene til nettverkskonfigurasjonsfiler for frittstående udev installasjon:
sed '/NETWORK_DIRS/s/systemd/udev/' -i src/basic/path-lookup.h
Forbered Udev for kompilering:
mkdir -p build cd build meson setup \ --prefix=/usr \ --buildtype=release \ -Dmode=release \ -Ddev-kvm-mode=0660 \ -Dlink-udev-shared=false \ -Dlogind=false \ -Dvconsole=false \ ..
Betydningen av mesonalternativene:
--buildtype=release
Denne bryteren overstyrer standard byggetype (“debug”), som produserer uoptimaliserte binære filer.
-Dmode=release
Deaktiver noen funksjoner som anses som eksperimentelle av oppstrøms.
-Ddev-kvm-mode=0660
Standard udev regelen vil tillate alle brukere tilgang
til /dev/kvm
. Utviklerne
anser det som farlig. Dette alternativet overstyrer
det.
-Dlink-udev-shared=false
Dette alternativet forhindrer udev fra å koble til det
interne systemd delte biblioteket, libsystemd-shared
. Dette
biblioteket er designet for å deles av mange Systemd
komponenter og det er overdrevent for kun en udev
installasjon.
-Dlogind=false
-Dvconsole=false
Disse alternativene forhindrer generering av flere udev regelfiler som tilhører de andre Systemd komponentene som vi ikke vil installere.
Få listen over de sendte Udev hjelperne og lagre den i en miljøvariabel (eksportere den er strengt tatt ikke nødvendig, men den gjør det enklere å bygge som en vanlig bruker eller bruke en pakkebehandling):
export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \ awk '{print $3}' | tr -d ",'" | grep -v 'udevadm')
Bygg bare komponentene som trengs for udev:
ninja udevadm systemd-hwdb \ $(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \ $(realpath libudev.so --relative-to .) \ $udev_helpers
Installer pakken:
install -vm755 -d {/usr/lib,/etc}/udev/{hwdb.d,rules.d,network} install -vm755 -d /usr/{lib,share}/pkgconfig install -vm755 udevadm /usr/bin/ install -vm755 systemd-hwdb /usr/bin/udev-hwdb ln -svfn ../bin/udevadm /usr/sbin/udevd cp -av libudev.so{,*[0-9]} /usr/lib/ install -vm644 ../src/libudev/libudev.h /usr/include/ install -vm644 src/libudev/*.pc /usr/lib/pkgconfig/ install -vm644 src/udev/*.pc /usr/share/pkgconfig/ install -vm644 ../src/udev/udev.conf /etc/udev/ install -vm644 rules.d/* ../rules.d/README /usr/lib/udev/rules.d/ install -vm644 $(find ../rules.d/*.rules \ -not -name '*power-switch*') /usr/lib/udev/rules.d/ install -vm644 hwdb.d/* ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/ install -vm755 $udev_helpers /usr/lib/udev install -vm644 ../network/99-default.link /usr/lib/udev/network
Installer noen tilpassede regler og støttefiler som er nyttige i et LFS miljøet:
tar -xvf ../../udev-lfs-20230818.tar.xz make -f udev-lfs-20230818/Makefile.lfs install
Installer manualsidene:
tar -xf ../../systemd-man-pages-255.tar.xz \ --no-same-owner --strip-components=1 -C /usr/share/man --wildcards '*/udev*' '*/libudev*' \ '*/systemd.link.5' \ '*/systemd-'{hwdb,udevd.service}.8 sed 's|systemd/network|udev/network|' \ /usr/share/man/man5/systemd.link.5 \ > /usr/share/man/man5/udev.link.5 sed 's/systemd\(\\\?-\)/udev\1/' /usr/share/man/man8/systemd-hwdb.8 \ > /usr/share/man/man8/udev-hwdb.8 sed 's|lib.*udevd|sbin/udevd|' \ /usr/share/man/man8/systemd-udevd.service.8 \ > /usr/share/man/man8/udevd.8 rm /usr/share/man/man*/systemd*
Til slutt, deaktiverudev_helpers
variabelen:
unset udev_helpers
Informasjon om maskinvareenheter opprettholdes i /etc/udev/hwdb.d
og /usr/lib/udev/hwdb.d
mappene. Udev trenger at informasjonen samles inn
i en binær database /etc/udev/hwdb.bin
. Opprett første
database:
udev-hwdb update
Denne kommandoen må kjøres hver gang maskinvareinformasjonen er oppdatert.
Generisk udev administrasjonsverktly: kontrollerer udevd nissen, gir informasjon fra Udevdatabasen, overvåker uevents, venter på uevents for å fullføre, tester Udevkonfigurasjonen og utløser uevents for en gitt enhet |
|
En nisse som lytter etter uevents på netlink socket, oppretter enheter og kjører de konfigurerte eksterne programmene i respons på disse hendelsene |
|
Oppdaterer eller spørrer maskinvaredatabasen. |
|
Et biblioteksgrensesnitt til udev enhetsinformasjon |
|
Inneholder Udev konfigurasjonsfiler, enhetstillatelser og regler for navngivning av enheter |
Man-DB pakken inneholder programmer for å finne og se på mansider.
Forbered Man-DB for kompilering:
./configure --prefix=/usr \ --docdir=/usr/share/doc/man-db-2.12.0 \ --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 endrer eierskapet til de systemomfattende
hurtigbufferfilene til 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 mansider. 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 |
---|---|---|---|
Dansk (da) | ISO-8859-1 | Kroatisk (hr) | ISO-8859-2 |
Tysk (de) | ISO-8859-1 | Ungarsk (hu) | ISO-8859-2 |
Engelsk (en) | ISO-8859-1 | Japansk (ja) | EUC-JP |
Spansk (es) | ISO-8859-1 | Koreansk (ko) | EUC-KR |
Estisk (et) | ISO-8859-1 | Litauisk (lt) | ISO-8859-13 |
Finsk (fi) | ISO-8859-1 | Latvisk (lv) | ISO-8859-13 |
Fransk (fr) | ISO-8859-1 | Makedonsk (mk) | ISO-8859-5 |
Irsk (ga) | ISO-8859-1 | Polsk (pl) | ISO-8859-2 |
Galisisk (gl) | ISO-8859-1 | Rumensk (ro) | ISO-8859-2 |
Indonesisk (id) | ISO-8859-1 | Gresk (el) | ISO-8859-7 |
Islandsk (is) | ISO-8859-1 | Slovakisk (sk) | ISO-8859-2 |
Italiensk (it) | ISO-8859-1 | Slovensk (sl) | ISO-8859-2 |
Norsk Bokmål (nb) | ISO-8859-1 | Serbisk Latin (sr@latin) | ISO-8859-2 |
Nederlandsk (nl) | ISO-8859-1 | Serbisk (sr) | ISO-8859-5 |
Norsk Nynorsk (nn) | ISO-8859-1 | Tyrkisk (tr) | ISO-8859-9 |
Norsk (no) | ISO-8859-1 | Ukrainsk (uk) | KOI8-U |
Portugisisk (pt) | ISO-8859-1 | Vietnamesisk (vi) | TCVN5712-1 |
Svensk (sv) | ISO-8859-1 | Forenklet Kinesisk (zh_CN) | GBK |
Hviterussisk (be) | CP1251 | Forenklet Kinesisk, Singapore (zh_SG) | GBK |
Bulgarsk (bg) | CP1251 | Tradisjonell Kinesisk, Hong Kong (zh_HK) | BIG5HKSCS |
tsjekkisk (cs) | ISO-8859-2 | Tradisjonell Kinesisk (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 databasen og viser de korte beskrivelsene av systemkommandoer som inneholder en gitt streng |
|
Oppretter eller oppdaterer de forhåndsformaterte manualsidene |
|
Viser en-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 separat 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.4 \ --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 -k check
En test navngitt ps with output flag
bsdtime,cputime,etime,etimes
er kjent for å mislykkes
hvis vertskjernen ikke er bygget med CONFIG_BSD_PROCESS_ACCT
aktivert. To tester
navngitt pmap X with unreachable
process
og pmap XX with
unreachable process
er kjent for mislykkes av og til.
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 |
|
Rapporterer gjeldende arbeidsmappe for en prosess |
|
Viser detaljert kjernens 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 som 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.
Først deaktiver en problematisk test:
sed -i '/test_mkfds/s/^/#/' tests/helpers/Makemodule.am
Forbered Util-linux for kompilering:
./configure --bindir=/usr/bin \ --libdir=/usr/lib \ --runstatedir=/run \ --sbindir=/usr/sbin \ --disable-chfn-chsh \ --disable-login \ --disable-nologin \ --disable-su \ --disable-setpriv \ --disable-runuser \ --disable-pylibmount \ --disable-static \ --without-python \ --without-systemd \ --without-systemdsystemunitdir \ ADJTIME_PATH=/var/lib/hwclock/adjtime \ --docdir=/usr/share/doc/util-linux-2.39.3
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øre 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 -R tester . su tester -c "make -k check"
hardlink testene vil
mislykkes hvis vertens kjerne ikke har alternativet
CONFIG_CRYPTO_USER_API_HASH
aktivert eller har ingen alternativer som gir en SHA256
implementering (for eksempel, CONFIG_CRYPTO_SHA256
, eller CONFIG_CRYPTO_SHA256_SSSE3
hvis CPU støtter
Supplemental SSE3) aktivert. I tillegg, to undertester fra
misc: mbsencode og en undertest fra script: replay er kjent
for å mislykkes.
Installer pakken:
make install
Informerer Linuxkjernen 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 blokkenhetsattributter |
|
Brukes til å administrere zone lagringsblokkenheter |
|
Lar brukere kalle blokkenhet ioctls fra kommandolinjen |
|
Viser en enkel kalender |
|
Manipulerer partisjonstabellen til den gitte enheten |
|
Endrer tilstanden til CPUer |
|
Konfigurerer minnet |
|
Viser og justerer OOM-killer poeng, brukes til å bestemme hvilken prosess som skal drepes først når Linux er tom for minne |
|
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 Linuxkjernen 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 |
|
Setter en fillås og utfprer 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 |
|
Konsoliderer dupliserte filer ved å lage harde lenker |
|
Dumper den gitte filen i hexadecimal, decimal, octal, eller ascii |
|
Leser eller stiller inn systemets maskinvareklokke, også kalt sanntidsklokken (RTC) eller grunnleggende inndata-utdata system (BIOS) klokken |
|
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 top(1) stilvisning |
|
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 |
|
Viser informasjon om åpne filer; erstatter lsof |
|
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 områder 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 harddiskpartisjon) |
|
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 stiene |
|
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 |
|
Henter og angir ressursgrenser til en prosess |
|
Leser informasjon om kjerneprofileringen |
|
Gir 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 frem til den spesifiserte vekkingstiden |
|
Lager et typeskript av en terminaløkt |
|
Kjører 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 endringer til vekselminneområ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 |
|
En nisse som brukes av UUID biblioteket for å generere tidsbasert UUID på en sikker og garantert unik måte |
|
Oppretter nye UUID. Hver ny UUID er et tilfeldig tall sannsynligvis unik blant alle UUID opprettet, på det lokale systemet og på andre systemer, i fortiden og i fremtiden, med ekstremt høy sannsynlighet (2128 UUIDs er mulig) |
|
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 mansiden 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
filsystemet. 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 bruker.
--disable-*
Dette hindrer E2fsprogs fra å bygge og installere
libuuid
og libblkid
bibliotekene, uuidd
nissen, og fsck innpakningen,
util-linux installerer nyere versjoner.
Kompiler pakken:
make
For å kjøre testene, utsted:
make check
En test navngitt m_assume_storage_prezeroed
er kjent for å
mislykkes.
Installer pakken:
make install
Fjern ubrukelige statiske biblioteker:
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
Denne pakken installerer en gzipped .info
filen, men oppdaterer ikke den
systemomfattende dir
filen.
Pakk ut denne filen og oppdater deretter systemets
dir
fil ved å bruke 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
/etc/mke2fs.conf
inneholder
standardverdien til ulike kommandolinjealternativer for
mke2fs. Du kan
rediger filen for å gjøre standardverdiene egnet for ditt
behov. For eksempel kan noen verktøy (ikke i LFS eller BLFS)
ikke gjenkjenne en ext4
filsystem med metadata_csum_seed
funksjonen aktivert. Hvis du trenger et slikt
verktøy, kan du fjerne funksjonen fra standard ext4
funksjonsliste med kommandoen:
sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf
Les mansiden mke2fs.conf(5) for detaljer.
Søker en enhet (vanligvis en diskpartisjon) etter dårlige blokker |
|
Endrer attributtene til filer på |
|
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 |
|
Skriver ut superblokken og gruppeinformasjon til blokker for filsystemet som finnes 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 (Multiple Mount Protection) status for
et |
|
Sjekker innholdet i et montert |
|
Sjekker alle monterte |
|
Gjentar angreloggen (undo_log) for et |
|
|
|
Online defragmentering for |
|
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 |
|
Oppretter 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 loggingnissen 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.08-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; den tar over oppstartsprosessen og starter alle prosesser spesifisert i konfigurasjonsfilen |
|
Sender et signal til alle prosesser, bortsett fra prosessene i sin egen økt; den vil ikke drepe 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 |
|
Bringer systemet ned på en sikker måte, og signaliserer alle prosesser og varsler alle påloggede brukere |
|
Forteller init hvilket kjørenivå den skal bytte til |
De fleste programmer og biblioteker er som standard kompilert
med feilsøkingssymboler inkludert (med gcc sitt -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 gjør imidlertid et program eller et bibliotek betydelig større. Følgende er et eksempel på hvor mye plass disse symbolene opptar:
bash binær med feilsøkingssymboler: 1200 KB
bash binær uten feilsøkingssymboler: 480 KB (60% mindre)
Glibc og GCC filer (/lib
og
/usr/lib
) med
feilsøkingssymboler: 87 MB
Glibc og GCC filer uten feilsøkingssymboler: 16 MB (82% mindre)
Størrelser vil variere avhengig av hvilken kompilator og C bibliotek som ble brukt, men et program som har blitt strippet for feilsøkingssymboler er vanligvis mellom 50 % til 80 % mindre enn dens ustrippede motpart. Fordi de fleste brukere aldri vil bruke en feilsøker på systemprogramvaren, kan mye diskplass 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 noen unødvendige symboltabelloppføringer fra binærfiler og biblioteker. Dette medfører ingen ulemper for en typisk Linuxbruker.
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 ide å 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 fra utvalgte biblioteker komprimeres med Zlib og lagres i separate filer. Denne feilsøkingsinformasjon er nødvendig for å kjøre regresjonstester med 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 til /tmp
, stripper dem der, og installer dem
tilbake med install kommandoen. (Den
relaterte oppføringen i Section 8.2.1,
“Oppgraderingsproblemer” gir 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ørt.
Hvis det er en en pakke som versjonen er forskjellig fra
versjonen spesifisert av boken (enten etter et sikkerhetsråd
eller som tilfredsstiller personlige preferanser), kan det
være nødvendig å oppdatere bibliotekets filnavn i
save_usrlib
eller online_usrlib
. Unnlatelse av å gjøre det kan gjøre systemet
helt ubrukelig.
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.32 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.42.so libsframe.so.1.0.0 libhistory.so.8.2 libncursesw.so.6.4-20230520 libm.so.6 libreadline.so.8.2 libz.so.1.3.1 libzstd.so.1.5.5 $(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, rydd 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". På et moderne Linuxsystem, er libtool .la-filene bare nyttig for libltdl. Ingen biblioteker i LFS forventes å bli lastet av libltdl, og det er kjent at noen .la-filer kan forårsake at BLFS pakker feiler under byggingen. Fjern disse filene nå:
find /usr/lib /usr/libexec -name \*.la -delete
For mer informasjon om libtool arkivfiler, se BLFS delen "Om Libtool arkiverfiler (.la)".
Kompilatoren bygd i Kapittel 6 og Kapittel 7 er fortsatt delvis installert og ikke nldvendig 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 og 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.
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 hastighetsbasert LFS system tar 8-12 sekunder der oppstartstiden måles fra første kjernemelding til login ledeteksten. Nettverkstilkobling 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 oppflrt 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 en etter en, 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 |
|
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 Kapittel 8, installerte vi udev nissen når udev 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
enhetsopprettingsmetode , 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. devfs
ble merket
som utdatert i lang tid, 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 det mulig å utvikle et
brukerområde erstatning for devfs
.
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 i devtmpfs
filsystemet. Enhver driver som
ønsker å registrere en enhetsnode vil bruke devtmpfs
(via driverkjernen) for å
gjøre det. Når en devtmpfs
forekomst er montert på /dev
,
vil enhetsnoden i utgangspunktet bli eksponert for
brukerrom med et fast navn, tillatelser og eieren.
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 mappene er nummererte og alle tre
mappene 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 gjøre at
udevd kaller
/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 nettverksprotokoller, 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-6.7.4, 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 enhetsmappen under
/sys/bus
og sjekk om det er
en modalias
fil 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
fil 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-6.7.4, dette er tilfellet
med ISA busser. Forvent at dette problemet blir løst i
senere kjerneversjoner.
Udev er ikke ment å laste “innpakkede (wrapper)” drivere som f.eks snd-pcm-oss og ikke-maskinvaredrivere som f.eks loop i det hele tatt.
Hvis den “innpakkede” modulen bare forbedrer
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 til
å laste inn innpakkningen etter at udev har lastet den
innpakkede 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 (Før) pre:
og (Etter) 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
ikke optimalt 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.
Først må du være sikker på at driveren er innebygd i kjernen eller allerede lastet inn som en modul, og at udev ikke oppretter en enhet med feil navn.
Hvis en kjernedriver ikke eksporterer dataene sine til
sysfs
, mangler udev
informasjon som trengs for å opprette en enhetsnode. Dette
vil mest sannsynlig skje med tredjepartsdrivere fra 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å at 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
https://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. I eldre versjoner av Linux—på en datamaskin med to nettverkskort laget av Intel og Realtek, for eksempel— nettverkskort produsert av Intel kan ha blitt eth0 mens Realtek-kortet ble eth1. Etter en omstart, er kortene noen ganger nummerert omvendt.
I det nye navneskjemaet vil typiske nettverksenhetsnavn 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 en 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, blir kanskje ikke nettverksregelfilen generert fordi adresser ikke er konsekvent tildelt. I disse tilfellene kan denne metoden ikke bli brukes.
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å
nettverksgrensesnittene).
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 NIC sin 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 før du fortsetter,
og sørg for å bruke NAME
verdien når du opprette konfigurasjonsfilene nedenfor.
Selv om den tilpassede UDEV regelfilen er opprettet, kan
UDEV fortsatt tilordne ett eller flere alternative navn for
en annen NIC basert på fysisk kjennetegn. Hvis en tilpasset
UDEV regel ville gi nytt navn til en annen NIC ved hjelp av
et navn som allerede er tildelt som et alternativt navn på
en annen NIC, denne UDEV regelen vil mislykkes. Hvis dette
problemet skjer, kan du opprette /etc/udev/network/99-default.link
konfigurasjonsfil med en tom alternativ tildelingspolitikk,
og overstyrer standard konfigurasjonsfil /usr/lib/udev/network/99-default.link
:
sed -e '/^AlternativeNamesPolicy/s/=.*$/=/' \ -i /usr/lib/udev/network/99-default.link \ > /etc/udev/network/99-default.link
Noe programvare som du kanskje vil installere senere (f.eks.
diverse mediespillere) forventer at /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 udev sitt 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 begge 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 mappen
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
som 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.75, “Udev fra Systemd-255”) 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 mansiden 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 en
oppføring (krever sekundære servere for reservefunksjon).
Hvis du bare trenger eller vil ha en 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 et fullt kvalifisert domenenavn (FQDN) og
mulige aliaser til bruk i /etc/hosts
filen. Hvis du bruker statiske
IP adresser, må du også bestemme deg for en IP adresse.
Syntaksen for en vertsfiloppføring 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.
Hvis datamaskinen skal være synlig for Internett, en gyldig FQDN kan være selve domenenavnet, eller en streng som er resultatet av å sette sammen et prefiks (ofte vertsnavnet) og domenenavnet med “.” karakter. Og du må kontakte domeneleverandøren for å knytte FQDN til din offentlige IP-adresse.
Selv om datamaskinen ikke er synlig for Internett, er en FQDN
fortsatt nødvendig for at visse programmer, for eksempel
MTA-er, skal fungere ordentlig. En spesiell FQDN,
localhost.localdomain
, kan bli
brukt til dette formålet.
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.
Denne versjonen av LFS bruker en spesiell oppstartsfunksjon kalt SysVinit, basert på en serie av 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.
Det er en alternativ oppstartsprosedyre kalt systemd. Vi vil ikke diskuter den oppstartsprosessen mer her. For en detaljert beskrivelse besøk https://www.linux.com/training-tutorials/understanding-and-using-systemd/.
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). 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 sin gdm eller LXDE sin 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 “reserved”.
Under kjerneinitialiseringen, det første programmet som
kjøres (hvis ikke overstyrt på kommandolinjen) er
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å mansiden
for inittab. I LFS,
nøkkelkommandoen er rc. Initialiseringsfilen
ovenfor instruerer 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 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 hvilken PID.
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 avhenge av filsystemer som ikke
er montert før mountfs skriptet kjøres
(spesielt, /usr
og /var
kan forårsake dette). Disse skriptene
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, “Modullasting”.
setclock
skriptet leser tiden fra maskinvareklokken , 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, kan mye av denne
delen hoppes over. Uten konfigurasjonsfilen, (eller
tilsvarende innstillinger i rc.site
), console vil ikke
oppstartsskriptet 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 https://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)
and 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 beskjeder) til 8
.
Standardnivået er 7
, som
er ganske detaljert.
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 spesifiseres
(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 tastaturkoder i
tastaturkartet.
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 tastaturkartet til UTF-8 umiddelbart hvis denne variabelen er satt til kodingen av det tilgjengelige tastaturet som ikke er UTF-8.
Noen eksempler:
Vi vil bruke C.UTF-8
som
lokalitet for interaktive økter i Linuxkonsollen i
Section 9.7,
“Konfigurere systemlokaliteten” så vi bør sette
UNICODE
til 1
. Konsollfontene levert av
Kbd pakken som
inneholder glyfer for alle tegnene fra
programmeldingene i C.UTF-8
lokalitet er LatArCyrHeb*.psfu.gz
, LatGrkCyr*.psfu.gz
, Lat2-Terminus16.psfu.gz
, og
pancyrillic.f16.psfu.gz
i
/usr/share/consolefonts
(de andre leverte konsollfonter mangler glyffer av noen
tegn som Unicode venstre/høyre anførselstegn og Unicode
engelsk bindestrek). Så sett en av dem, for eksempel
Lat2-Terminus16.psfu.gz
som standard konsollfont:
cat > /etc/sysconfig/console << "EOF"
# Begin /etc/sysconfig/console
UNICODE="1"
FONT="Lat2-Terminus16"
# End /etc/sysconfig/console
EOF
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 keymap sin 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 tastaturmapper 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-6.7.4 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 α. 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 set the right edge of message output (characters) # Useful when resetting console font during boot to override # automatic screen width detection #COLUMNS=120 # Interactive startup #IPROMPT="yes" # Whether to display the interactive boot prompt #itime="3" # The amount of time (in seconds) to display the prompt # The total length of the distro welcome string, without escape codes #wlen=$(echo "Welcome to ${DISTRO}" | wc -c ) #welcome_message="Welcome to ${INFO}${DISTRO}${NORMAL}" # The total length of the interactive string, without escape codes #ilen=$(echo "Press 'I' to enter interactive startup" | wc -c ) #i_message="Press '${FAILURE}I${NORMAL}' to enter interactive startup" # Set scripts to skip the file system check on reboot #FASTBOOT=yes # Skip reading from the console #HEADLESS=yes # Write out fsck progress if yes #VERBOSE_FSCK=no # Speed up boot without waiting for settle in udev #OMIT_UDEV_SETTLE=y # Speed up boot without waiting for settle in udev_retry #OMIT_UDEV_RETRY_SETTLE=yes # Skip cleaning /tmp if yes #SKIPTMPCLEAN=no # For setclock #UTC=1 #CLOCKPARAMS= # For consolelog (Note that the default, 7=debug, is noisy) #LOGLEVEL=7 # For network #HOSTNAME=mylfs # Delay between TERM and KILL signals at shutdown #KILLDELAY=3 # Optional sysklogd parameters #SYSKLOGD_PARMS="-m 0" # Console parameters #UNICODE=1 #KEYMAP="de-latin1" #KEYMAP_CORRECTIONS="euro2" #FONT="lat0-16 -m 8859-15" #LEGACY_CHARSET=
LFS oppstartsskriptene starter opp og slår av et system på
en rimelig effektiv måte, men det er noen få justeringer du
kan gjøre i rc.site filen for å forbedre hastigheten enda
mer og for å justere meldinger i henhold til til dine
preferanser. For å gjøre dette, juster innstillingene i
/etc/sysconfig/rc.site
filen
ovenfor.
Under oppstartsskriptet udev
, 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
eller kjøre
shutdown med
-F
parameter
i stedet for -f
.
Å sette variabelen FASTBOOT=y vil deaktivere fsck under oppstartsprosessen til den fjernes. Dette anbefales ikke på permanent basis.
Normalt slettes alle filene i /tmp
mappen ved oppstart. Avhengig
av antall filer eller mapper som er tilstede, kan
dette føre til en merkbar forsinkelse i
oppstartsprosessen. For å hoppe over å fjerne disse
filene, sett inn variabelen SKIPTMPCLEAN=y.
Under avstengning, init programmet sender et TERM signal til hvert program det har startet (f.eks. agetty), venter på en tid (standard 3 sekunder), og sender hver prosess et KILL signal og venter en gang til. Denne prosessen gjentas i sendsignals skript for alle prosesser som ikke stenges av deres egne skript. Forsinkelse for init kan stilles inn ved å sende en parameter. For eksempel for å fjerne forsinkelsen i init, 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.
Noen miljøvariabler er nødvendige for morsmål støtte. Å sette dem riktig resulterer i:
Utdataene fra programmer blir oversatt til ditt morsmål
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
Den riktige standard papirstørrelsen
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
Tegntabellene 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. krever at
UTF-8
er skrevet som UTF-8
, ikke utf8
), så det er det sikreste i de fleste
tilfeller å 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
lokalitet,
kommandoen over vil skrive ut:
ISO-8859-1
Dette resulterer i en endelig lokaleinnstilling for
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, tegnkodingen som brukes av lokaliteten, den lokale valutaen og prefikset for å ringe før telefonnummeret for å komme 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 ble installert i kapittel 8 eller at det 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 kommando, 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.
Skallprogrammet /bin/bash (her etter referert
som “skallet”) bruker en samling
oppstartsfiler for å hjelpe med å lage miljøet å kjøre i. Hver
fil har en bestemt bruk og kan påvirke pålogging og interaktive
miljøer ulikt. Filene i /etc
mappen gir globale innstillinger. Hvis tilsvarende filer finnes
i hjemmemappen, kan de 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 er startet på kommandolinjen (f.eks.
[prompt]$
/bin/bash). Et
ikke-interaktivt skall er vanligvis tilstede når et skallskript
kjører. Det er ikke-interaktivt fordi det behandler et skript
og ikke venter for brukerinndata mellom kommandoer.
Opprett /etc/profile
når de riktige lokale innstillingene har blitt bestemt
for å angi ønsket lokalitet, men still inn C.UTF-8
lokalitet i stedet hvis den kjøres i
en Linux konsoll (for å hindre programmer fra å skrive ut tegn
som Linux konsollen ikke kan gjengi):
cat > /etc/profile << "EOF"
# Begin /etc/profile
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
export LANG=<ll>_<CC>.<charmap><@modifiers>
fi
# End /etc/profile
EOF
C
(standard) og en_US
(den anbefalte for engelske brukere i
USA) er annerledes. 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 at
ikke-RFC-samsvarende meldinger sendes (tegnsettet i den
utgående posten er indikert som unknown 8-bit
). Det foreslås at du
bruker C
lokalitet kun hvis du er
sikker på at du aldri vil trenge 8-bits tegn.
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
tmpfs /dev/shm tmpfs nosuid,nodev 0 0
cgroup2 /sys/fs/cgroup cgroup2 nosuid,noexec,nodev 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 fstab(5).
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 File systems -> Native
Language Support 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 skiller 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 “Default NLS Option”
(CONFIG_NLS_DEFAULT)
, “Default Remote NLS
Option” (CONFIG_SMB_NLS_DEFAULT
), “Default codepage for
FAT” (CONFIG_FAT_DEFAULT_CODEPAGE
), and “Default 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å.
Å bygge Linuxkjernen for færste gang er en av de mest utfordrende oppgaver i LFS. Å få det riktig avhenger av den spesifikke maskinvaren for målsystemet og dine spesifikke behov. Det er nesten 12 000 konfigurasjonselementer som er tilgjengelige for kjernen, selv om bare en tredjedel av dem er nædvendig for de fleste datamaskiner. LFS redaktærene anbefaler at brukere som ikke er kjent med denne prosessen fælger prosedyrene nedenfor ganske næye. Målet er å få et innledende system til et punkt hvor du kan logge inn på kommandolinjen når du starter på nytt senere i Section 11.3, “Omstart av systemet”. På dette punktet er optimering og tilpasning ikke et mål.
For generell informasjon om kjernekonfigurasjon se https://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt. Ytterligere informasjon om konfigurering og bygging av kjernen finner du på https://anduin.linuxfromscratch.org/LFS/kernel-nutshell/. Disse referansene er litt utdatert, men gir likevel en rimelig oversikt over prosessen.
Hvis alt annet feiler, kan du be om hjelp på lfs-support mailingliste. Vær oppmerksom på at du må abonnere på listen for å unngå spam.
Forbered for kompilering ved å kjøre følgende kommando:
make mrproper
Dette sikrer at kjernetreet er helt rent. Kjerneteamet 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.
Et godt utgangspunkt for å sette opp kjernekonfigurasjonen er å kjøre make defconfig. Dette vil sette basekonfigurasjonen 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 [WERROR] CPU/Task time and stats accounting ---> [*] Pressure stall information tracking [PSI] [ ] Require boot parameter to enable pressure stall information tracking ... [PSI_DEFAULT_DISABLED] < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [IKHEADERS] [*] Control Group support ---> [CGROUPS] [*] Memory controller [MEMCG] [ ] Configure standard kernel features (expert users) ---> [EXPERT] Processor type and features ---> [*] Build a relocatable kernel [RELOCATABLE] [*] Randomize the address of the kernel image (KASLR) [RANDOMIZE_BASE] General architecture-dependent options ---> [*] Stack Protector buffer overflow detection [STACKPROTECTOR] [*] Strong Stack Protector [STACKPROTECTOR_STRONG] Device Drivers ---> Generic Driver Options ---> [ ] Support for uevent helper [UEVENT_HELPER] [*] Maintain a devtmpfs filesystem to mount at /dev [DEVTMPFS] [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs ... [DEVTMPFS_MOUNT] Graphics support ---> < /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> ... [DRM] # If [DRM] is selected as * or M, this must be selected: [ /*] Enable legacy fbdev support for your modesetting driver ... [DRM_FBDEV_EMULATION] Console display driver support ---> # If [DRM] is selected as * or M, this must be selected: [ /*] Framebuffer Console support [FRAMEBUFFER_CONSOLE]
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 et alternativ kun vises etter at avhengighetene er
valgt.
Processor type and features ---> [*] Support x2apic [X86_X2APIC] Device Drivers ---> [*] PCI support ---> [PCI] [*] Message Signaled Interrupts (MSI and MSI-X) [PCI_MSI] [*] IOMMU Hardware Support ---> [IOMMU_SUPPORT] [*] Support for Interrupt Remapping [IRQ_REMAP]
Hvis du bygger et 32-bits system som kjører på en maskinvare med mer enn 4 GB RAM, juster konfigurasjonen slik at kjernen vil kunne bruke opptil 64 GB fysisk RAM:
Processor type and features ---> High Memory Support ---> (X) 64GB [HIGHMEM64G]
Hvis partisjonen for LFS-systemet er i en NVME SSD (dvs
enhetsnoden for partisjonen er /dev/nvme*
i stedet for /dev/sd*
), aktivere NVME støtte ellers
vil ikke LFS systemet starte:
Device Drivers ---> NVME Support ---> <*> NVM Express block device [BLK_DEV_NVME]
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.
Hvis vertsmaskinvaren din bruker UEFI og du ønsker å starte opp LFS systemet med det, bør du justere noen kjernekonfigurasjon som på følgende BLFS side selv om du bruker UEFI oppstartslaster fra vertsdistroen.
Begrunnelsen for de ovennevnte konfigurasjonselementene:
Randomize
the address of the kernel image
(KASLR)
Aktiver ASLR for kjernebilde for å redusere noen angrep basert på faste adresser til sensitive data eller kode i kjernen.
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 er ikke installert av LFS.
Configure
standard kernel features (expert
users)
Dette vil gjøre at noen alternativer vises i konfigurasjonsgrensesnittet, men å endre disse alternativene kan være farlig. Ikke bruk dette med mindre du vet hva du gjør.
Strong
Stack Protector
Aktiver SSP for kjernen. Vi har aktivert det for hele
brukerplassen med --enable-default-ssp
konfigureringen for GCC, men kjernen bruker ikke GCC
standardinnstillingen for SSP. Vi aktiverer det
eksplisitt her.
Support
for uevent helper
Å ha dette alternativet satt kan forstyrre enhetens behandling ved bruk av Udev.
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.
Automount
devtmpfs at /dev
Dette vil montere kjernevisningen til enhetene på /dev ved bytte til rotfilsystem rett før start av init.
Aktiver
eldre fbdev støtte for
modusinnstillingsdriveren
og Framebuffer Console
support
Disse er nødvendige for å vise Linux konsollen på en
GPU drevet av en DRI driver (Direct Rendering
Infrastructure). Hvis CONFIG_DRM
(Direct Rendering Manager)
er aktivert, bør du aktivere disse to alternativene
også, ellers vil du se en tom skjerm når DRI driveren
er lastet inn.
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.
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-6.7.4
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-6.7.4/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 du har bestemt deg for å bruke et separat /boot
partisjon for LFS systemet (kanskje
dele en /boot
partisjon med
vertsdistroen ), filene som er kopiert nedenfor, skal gå
dit. Den enkleste måten å gjær det er å opprette
oppfæringen for /boot
i
/etc/fstab
færst (les forrige
seksjon for detaljer), utfær deretter fælgende kommando som
root
bruker i chroot environment:
mount /boot
Stien til enhetsnoden er utelatt i kommandoen fordi
mount kan
lese den fra /etc/fstab
.
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-6.7.4-lfs-12.1
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-6.7.4
Kjernens konfigurasjonsfil .config
produsert av make menuconfig steget
ovenfor inneholder alle konfigurasjonsvalgene for kjernen som
nettopp ble kompilert. Det er en god ide å beholde denne
filen for fremtidig referanse:
cp -iv .config /boot/config-6.7.4
Installer dokumentasjonen for Linux kjernen:
cp -r Documentation -T /usr/share/doc/linux-6.7.4
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-6.7.4
mappen å sikre 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-6.7.4 API Deklarasjoner”. 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 instruksjonene på denne siden,
men likevel lære deg syntaksen til grub.cfg
og metoden for å spesifisere en
partisjon i filen fra denne siden, og konfigurer GRUB med
UEFI støtte ved å bruke instruksjonene gitt 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 kan hvert bygg, enten LFS
eller en kommersiell distro, 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
.
Å la /boot
være på nåværende
LFS partisjon vil også virke, men konfigurasjonen for flere
systemer er mer vanskelig.
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 oppstartsbehandler 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
Kapittel 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 part_gpt
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 6.7.4-lfs-12.1" {
linux /boot/vmlinuz-6.7.4-lfs-12.1 root=/dev/sda2 ro
}
EOF
insmod
kommandoer laster inn GRUB
moduler navngitt part_gpt
og
ext2
. Til tross for
navngivningen, støtter ext2
faktisk ext2
, ext3
, og ext4
filsystemer. grub-install kommandoen har
bygd inn noen moduler inn i hoveddelen av GRUB bildet (installert i MBR- eller
GRUB BIOS-partisjonen) for å få tilgang til de andre modulene
(i /boot/grub/i386-pc
) uten et
kylling-eller-egg-problem, så med en typisk konfigurasjon er
disse to modulene allerede innebygd og de to insmod kommandoer vil ikke
gjøre noe. Men de gjør ingen skade uansett, og det kan være
nødvendig med noen sjeldne konfigurasjoner.
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 for filsystemet der
kjernen er installert>
root=/dev/sda2
med
root=PARTUUID=
.
<UUID for 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=
, i <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 å opprette 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 12.1 > /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 nye 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="12.1" 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="12.1" ID=lfs PRETTY_NAME="Linux From Scratch 12.1" VERSION_CODENAME="<your name here>" HOME_URL="https://www.linuxfromscratch.org/lfs/" EOF
Pass på å tilpasse feltene 'DISTRIB_CODENAME' og 'VERSION_CODENAME' for å gjøre systemet unikt ditt.
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. Det er imidlertid fortsatt et par ting å sjekke. Her er noen forslag:
Installer evt firmware som er nødvendig hvis kjernedriver for maskinvaren din krever noen fastvarefiler for å fungere skikkelig.
Sørg for at et passord er angitt for root
brukeren.
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ørst gå ut av chroot-miljøet:
logout
Deretter avmontere de virtuelle filsystemene:
umount -v $LFS/dev/pts mountpoint -q $LFS/dev/shm && umount -v $LFS/dev/shm 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/home umount -v $LFS
Avmonter selve LFS filsystemet:
umount -v $LFS
Nå start nå systemet på nytt.
Forutsatt at GRUB oppstartslasteren ble satt opp som skissert tidligere, er menyen satt til å starte opp LFS 12.1 automatisk.
Når omstarten er fullført, er LFS systemet klart til bruk. Hva du vil se er en enkel “login: ” ledetekst. På dette tidspunktet kan du fortsett til BLFS boken hvor du kan legge til mer programvare som passer dine behov.
Hvis omstarten ikke er vellykket, er det på tide å feilsøke. For tips om hvordan du løser innledende oppstartsproblemer, se https://www.linuxfromscratch.org/lfs/troubleshooting.html.
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:
Dette er en liste over sikkerhetssårbarheter oppdaget i LFS-bok etter at den er utgitt.
E-postliste for sikkerhet med åpen kildekode
Dette er en e-postliste for diskusjon av sikkerhetsfeil, konsepter og praksiser i åpen kildekodefellesskapet.
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 Kapittel 1 - E-postlister 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 mansider. Den ligger på https://tldp.org/.
Nå som LFS er fullført og du har et oppstartbart system, hva gjør du? Det neste trinnet er å bestemme hvordan den skal brukes. Generelt er det to brede kategorier å vurdere: arbeidsstasjon eller server. Faktisk disse kategoriene utelukker ikke hverandre. Applikasjonene som trengs for hver kategori kan kombineres til et enkelt system, men la oss se på dem separat for nå.
En server er den enklere kategorien. Vanligvis består dette av en nettserver som Apache HTTP Server og en databaseserver som f.eks MariaDB. Men andre tjenester er mulig. Operativsystemet innebygd i en engangsenhet faller inn i denne kategorien.
På den annen side er en arbeidsstasjon mye mer kompleks. Generelt krever den et grafisk brukermiljø som f.eks LXDE, XFCE, KDE, eller Gnome basert på et grunnleggende grafisk miljø og flere grafisk baserte applikasjoner som f.eks Firefox nettleser, Thunderbird e-postklient, eller LibreOffice kontorpakke. Disse applikasjonene krever mange (flere hundre avhengig av ønskede funksjoner) flere pakker med støtteapplikasjoner og biblioteker.
I tillegg til ovennevnte er det et sett med applikasjoner for systemstyring for alle typer systemer. Disse applikasjonene er alle i BLFS boken. Ikke alle pakker er nødvendige i alle miljøer. F.eks dhcpcd, er normalt ikke egnet for en server og trådløse verktøy, er normalt bare nyttige for et bærbart system.
Når du starter opp i LFS, har du alle interne verktøy for å bygge tilleggspakker. Dessverre er brukermiljøet ganske sparsomt. Det er et par måter å forbedre dette på:
Denne metoden gir et komplett grafisk miljø hvor fulle funksjoner for nettleser og kopier/lim inn er tilgjengelige. Denne metoden lar deg laste ned applikasjoner som vertens versjon av wget for å laste ned pakkekilder til et sted som er tilgjengelig når du arbeider i chroot miljøet.
For å kunne bygge pakker på riktig måte i chroot, må du også huske å montere de virtuelle filsystemene hvis de ikke allerede er montert. En måte å gjøre dette på er å lage et skript på VERTS systemet:
cat > ~/mount-virt.sh << "EOF"
#!/bin/bash
function mountbind
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount --bind /$1 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
function mounttype
{
if ! mountpoint $LFS/$1 >/dev/null; then
$SUDO mount -t $2 $3 $4 $5 $LFS/$1
echo $LFS/$1 mounted
else
echo $LFS/$1 already mounted
fi
}
if [ $EUID -ne 0 ]; then
SUDO=sudo
else
SUDO=""
fi
if [ x$LFS == x ]; then
echo "LFS not set"
exit 1
fi
mountbind dev
mounttype dev/pts devpts devpts -o gid=5,mode=620
mounttype proc proc proc
mounttype sys sysfs sysfs
mounttype run tmpfs run
if [ -h $LFS/dev/shm ]; then
install -v -d -m 1777 $LFS$(realpath /dev/shm)
else
mounttype dev/shm tmpfs tmpfs -o nosuid,nodev
fi
#mountbind usr/src
#mountbind boot
#mountbind home
EOF
Merk at de tre siste kommandoene i skriptet er kommentert ut. Disse er nyttige hvis disse mappene er montert som separate partisjoner på vertssystemet og vil bli montert ved oppstart av det fullførte LFS/BLFS-systemet.
Skriptet kan kjøres med bash
~/mount-virt.sh som enten en vanlig bruker
(anbefalt) eller som root
.
Hvis du kjører som vanlig bruker, er sudo nødvendig på
vertssystemet.
Et annet problem påpekt av skriptet er hvor du skal lagre nedlastede pakkefiler. Denne plasseringen er vilkårlig. Det kan være i en vanlig brukers hjemmekatalog som ~/sources eller på en global plassering som /usr/src. Vær anbefaling er å ikke blande BLFS kilder og LFS kilder i (fra chroot-miljøet) /sources. I alle fall, pakkene må være tilgjengelig inne i chroot-miljøet.
En siste bekvemmelighet som presenteres her er å strømlinjeforme prosessen for å gå inn i chroot-miljøet. Dette kan gjøres med et alias plassert i en brukers ~/.bashrc-fil på vertssystemet:
alias lfs='sudo /usr/sbin/chroot /mnt/lfs /usr/bin/env -i HOME=/root TERM="$TERM" PS1="\u:\w\\\\$ "
PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login'
Dette aliaset er litt vanskelig på grunn av sitering og nivåer av omvendt skråstrek. Det må være på en linje. Kommandoen ovenfor er delt i to for presentasjonsformål.
Denne metoden gir også et fullstendig grafisk miljø, men først kreves installasjon av sshd på LFS systemet, vanligvis i chroot. Det krever også en datamaskin nummer to. Denne metoden har fordelen av å være enkel ved å ikke kreve kompleksiteten til chroot-miljøet. Den bruker også din LFS bygde kjerne for alle tilleggspakker og gir fortsatt et komplett system for å installere pakker.
Du kan bruke scp kommando for å laste opp pakke kilder som skal bygges inn i LFS systemet. Hvis du vil laste ned kildene direkte på LFS systemet, installer libtasn1, p11-kit, make-ca, og wget i chroot (eller last opp kildene deres ved å bruke scp etter oppstart av LFS systemet).
Denne metoden krever installasjon av libtasn1, p11-kit, make-ca, wget, gpm, og links (eller lynx) i chroot og deretter omstart i det nye LFS systemet. På dette punktet har standardsystemet seks virtuelle konsoller. Veksling mellom konsoller er like enkelt som å bruke Alt+Fx tastekombinasjoner hvor Fx er mellom F1 og F6. Kombinasjonene Alt+← og Alt+→ vil også endre konsollen.
På dette tidspunktet kan du logge på to forskjellige virtuelle konsoller og kjøre links eller lynx nettleseren i den ene konsollen og bash i den andre. GPM tillater da å kopiere kommandoer fra nettleseren med venstre museknapp, bytte konsoller, og lime inn i den andre konsollen.
Som en sidenotat kan bytting av virtuelle konsoller også gjøres fra en X Window forekomst med Ctrl+Alt+Fx tastekombinasjon, men kopieringsoperasjonen med mus fungerer ikke mellom det grafiske grensesnittet og en virtuell konsoll. Du kan gå tilbake til X Window-skjermen med Ctrl+Alt+Fx kombinasjonen, hvor Fx vanligvis er F1 men kan være F7.
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 Identifier) |
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> – Spansk LFS oversettelsesprosjekt
Johan Lenglet <johan AT linuxfromscratch D0T org> – Fransk LFS oversettelsesprosjekt opp til 2008
Jean-Philippe Mengual <jmengual AT linuxfromscratch D0T org> – Fransk LFS oversettelsesprosjekt 2008-2016
Julien Lepiller <jlepiller AT linuxfromscratch D0T org> – Fransk LFS oversettelsesprosjekt 2017-nåtid
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Portugisisk LFS oversettelsesprosjekt
Jamenson Espindula <jafesp AT gmail D0T com> – Portugisisk LFS oversettelsesprosjekt 2022-nåværende
Thomas Reitelbach <tr AT erdfunkstelle D0T de> – Tysk LFS oversettelsesprosjekt
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
Jason Andrade <jason AT dstc D0T edu D0T au> – au.linuxfromscratch.org mirror
Christine Barczak <theladyskye AT linuxfromscratch D0T org> – LFS Bokredaktør
Archaic <archaic@linuxfromscratch.org> – LFS teknisk skribent/redaktør, HLFS-prosjektleder, BLFS-redaktør, Hints and Patches Project Maintainer
Matthew Burgess <matthew AT linuxfromscratch D0T org> – LFS prosjektleder, LFS teknisk skribent/redaktør
Nathan Coulson <nathan AT linuxfromscratch D0T org> – LFS-Bootscripts vedlikeholder
Timothy Bauscher
Robert Briggs
Ian Chilton
Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – Nettsteds utvikler, FAQ vedlikeholder
Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – LFS/BLFS/HLFS XML og XSL vedlikeholder
Alex Groenewoud – LFS teknisk skribent
Marc Heerdink
Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – LFS Teknisk skribent, LFS LiveCD vedlikeholder
Bryan Kadzban <bryan AT linuxfromscratch D0T org> – LFS Teknisk forfatter
Mark Hymers
Seth W. Klein – FAQ vedlikeholder
Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – Wiki vedlikeholder
Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – Nettsted Backend-skripts vedlikeholder
Randy McMurchy <randy AT linuxfromscratch D0T org> – BLFS Prosjektleder, LFS-redaktør
Dan Nicholson <dnicholson AT linuxfromscratch D0T org> – LFS og BLFS Redaktør
Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> – LFS Technical Writer, LFS Internationalization Editor, LFS Live CD vedlikeholder
Simon Perreault
Scot Mc Pherson <scot AT linuxfromscratch D0T org> – LFS NNTP Gateway vedlikeholder
Douglas R. Reno <renodr AT linuxfromscratch D0T org> – Systemd Redaktør
Ryan Oliver <ryan AT linuxfromscratch D0T org> – CLFS Prosjekt Medleder
Greg Schafer <gschafer AT zip D0T com D0T au> – LFS teknisk skribent og Arkitekt for neste generasjons 64-biters byggemetode
Jesse Tie-Ten-Quee – LFS Teknisk forfatter
James Robertson <jwrober AT linuxfromscratch D0T org> – Bugzilla vedlikeholder
Tushar Teredesai <tushar AT linuxfromscratch D0T org> – BLFS bok Redaktør, Hints and Patches Prosjekt Leder
Jeremy Utley <jeremy AT linuxfromscratch D0T org> – LFS teknisk Forfatter, Bugzilla vedlikeholder, LFS-Bootscripts vedlikeholder
Zack Winkles <zwinkles AT gmail D0T com> – LFS Teknisk forfatter
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, som 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.
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.
rc
er det 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 responsibility 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) responsibility # 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) responsibility # 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 # Xi Ruoyao - xry111@xry111.site # # Version : LFS 12.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 chmod 1777 /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 mkdir -p /dev/shm log_info_msg2 " ${INFO}/dev/shm" mount -o nosuid,nodev /dev/shm || failed=1 mkdir -p /sys/fs/cgroup log_info_msg2 " ${INFO}/sys/fs/cgroup" mount -o nosuid,noexec,nodev /sys/fs/cgroup || failed=1 (exit ${failed}) evaluate_retval if [ "${failed}" = 1 ]; then exit 1 fi log_info_msg "Create symlinks in /dev targeting /proc: ${INFO}/dev/stdin" ln -sf /proc/self/fd/0 /dev/stdin || failed=1 log_info_msg2 " ${INFO}/dev/stdout" ln -sf /proc/self/fd/1 /dev/stdout || failed=1 log_info_msg2 " ${INFO}/dev/stderr" ln -sf /proc/self/fd/2 /dev/stderr || failed=1 log_info_msg2 " ${INFO}/dev/fd" ln -sf /proc/self/fd /dev/fd || failed=1 if [ -e /proc/kcore ]; then log_info_msg2 " ${INFO}/dev/core" ln -sf /proc/kcore /dev/core || failed=1 fi (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 # Xi Ruoyao - xry111@xry111.site # # Version : LFS 12.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 start fi # Start the udev daemon to continually watch for, and act on, # uevents SYSTEMD_LOG_TARGET=kmsg /sbin/udevd --daemon # Now traverse /sys in order to "coldplug" devices that have # already been discovered /bin/udevadm trigger --action=add --type=subsystems /bin/udevadm trigger --action=add --type=devices /bin/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: Activates and deactivates swap partitions. # Description: Activates and deactivates 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 filesystems 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 start 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 " 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 start 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 devices 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..." 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 /bin/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 /bin/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 shouldn'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 device # 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.75, “Udev fra Systemd-255”.
# /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"
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-2024 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.