teknik:operativsystemer:deploy:bygditegetos
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| teknik:operativsystemer:deploy:bygditegetos [2026/10/18 22:49] – created smarken | teknik:operativsystemer:deploy:bygditegetos [2026/10/19 05:10] (current) – [Byg din egen Linux-distribution – til din organisation] smarken | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | Lav din egen Linux-distribution – til din organisation | + | ====== Byg din egen Linux-distribution – til din organisation |
| + | **Byg et organisationsejet operativsystem med SUSE/ | ||
| + | Dette dokument er opdelt i fire dele, så hver læser kan gå direkte til det relevante niveau: | ||
| + | |||
| + | * **Del 1** – Den korte, ikke-tekniske version: til ledelse og beslutningstagere. | ||
| + | * **Del 2** – Den tekniske strategi: til it-chefer og teknisk funderede mellemledere. | ||
| + | * **Del 3** – Den detaljerede instruktion: | ||
| + | * **Del 4** – Appendikser: | ||
| + | |||
| + | Udgangspunktet er SUSE-økosystemet: | ||
| + | |||
| + | //Den sikre fjernadgang, | ||
| + | |||
| + | **Se også :** | ||
| + | * [[start|Forside/ | ||
| + | * [[teknik: | ||
| + | * [[teknik: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Del 1 – Den korte version (for ledelse og beslutningstagere) ====== | ||
| + | |||
| + | ===== Hvad handler det om? ===== | ||
| + | |||
| + | I dag installerer de fleste organisationer deres computere én ad gangen: en medarbejder (eller en it-afdeling) sætter en USB-nøgle i maskinen, klikker igennem en installationsguide og håber på, at resultatet ligner maskinen ved siden af. Det er langsomt, fejlbehæftet og umuligt at dokumentere. | ||
| + | |||
| + | Alternativet er at behandle operativsystemet som et **produkt, organisationen selv ejer og bygger**: én gang definerer man, hvad "vores firmapc" | ||
| + | |||
| + | Kort sagt: **I får jeres egen Linux-distribution** – bygget på open source-værktøjer fra SUSE/ | ||
| + | |||
| + | ===== Hvorfor er det en god forretning? ===== | ||
| + | |||
| + | * **Ensartethed og kvalitet.** Alle maskiner er bitidentiske. Det, der er testet én gang, er testet overalt. Supportsager falder, fordi " | ||
| + | * **Hastighed.** En ny maskine er produktiv på minutter i stedet for timer. Udrulning til en hel afdeling sker i én proces. | ||
| + | * **Sikkerhed og compliance.** Sikkerhedspolitikker (diskkryptering, | ||
| + | * **Digital suverænitet.** Alt er open source og kan bygges, auditeres og driftes på egen infrastruktur. Ingen afhængighed af en bestemt cloud eller udenlandsk leverandør. | ||
| + | * **Fleksibilitet.** Samme fundament kan levere flere " | ||
| + | * **Omkostningskontrol.** openSUSE er gratis; SLES-abonnement er valgfrit og køber support og SLA, ikke adgang til kode. Man kan altså starte gratis og først betale, når forretningen kræver garantier. | ||
| + | |||
| + | ===== Hvad koster det? ===== | ||
| + | |||
| + | Der er tre poster: | ||
| + | |||
| + | - **Mennesker.** Én til to medarbejdere, | ||
| + | - **Infrastruktur.** Én byggeserver (kan være en virtuel maskine) og eventuelt en boot-server pr. lokation. Beskeden hardware. | ||
| + | - **Vedligehold.** Images genbygges løbende med sikkerhedsopdateringer – men det er automatiseret. Man bør regne med en fast fraktion af en fuldtidsstilling afhængigt af antal profiler. | ||
| + | |||
| + | ===== Hvad skal ledelsen beslutte? ===== | ||
| + | |||
| + | * **Hvilke maskintyper/ | ||
| + | * **Supportniveau: | ||
| + | * **Hvem ejer profilerne? | ||
| + | * **Hvornår er en maskine " | ||
| + | |||
| + | ===== Hvad er de største risici – og hvad gør vi ved dem? ===== | ||
| + | |||
| + | * **"Vi glemmer at opdatere images." | ||
| + | * **"Én person byggede det, og han er opsagt." | ||
| + | * **"Det virker ikke på den nye hardware." | ||
| + | |||
| + | **Anbefalet beslutning: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Del 2 – Teknisk strategi (for it-chefer og teknisk funderede mellemledere) ====== | ||
| + | |||
| + | ===== Værktøjskæden i oversigt ===== | ||
| + | |||
| + | ^ Lag ^ Værktøj ^ Rolle ^ | ||
| + | | Kilde/ | ||
| + | | Byggeværktøj | **KIWI (KIWI NG)** | Bygger det færdige image (raw-disk, ISO, cloud-image osv.) ud fra beskrivelsen. SUSE's eget appliance-værktøj. | | ||
| + | | Byggeinfrastruktur | **Open Build Service (OBS)** | Central build-server, | ||
| + | | Udrulning/ | ||
| + | | Drift/ | ||
| + | |||
| + | Pipeline, kort fortalt: **Git-repo (Keg-recipes) → OBS-byg → KIWI-images → HTTP/ | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | |||
| + | ===== Hvorfor Keg + KIWI + OBS frem for håndbyggede images? ===== | ||
| + | |||
| + | * **Beskrivelser frem for snapshots.** Image-indholdet er deklareret i tekstfiler (versionsstyret, | ||
| + | * **Skalering af profiler.** Keg er lavet præcis til situationen, | ||
| + | * **Kontinuerlig genbygning.** OBS genbygger automatisk, når en pakke eller dependency opdateres – sikkerhedsopdateringer flyder ind i nye images uden manuelt arbejde. | ||
| + | * **Reproducerbarhed.** Samme input → samme output. Krav i enhver audit-sammenhæng. | ||
| + | |||
| + | ===== Boot- og distributionsstrategi ===== | ||
| + | |||
| + | Der er fire boot-veje, som bør betragtes som én samlet løsning med fælles indhold: | ||
| + | |||
| + | - **PXE/ | ||
| + | - **UEFI HTTP Boot.** Nyere firmware kan hente bootloader direkte over HTTP(S) – fjerner TFTP's hastigheds- og skaleringsproblemer. | ||
| + | - **USB.** Til standalone-pc' | ||
| + | - **U-Boot (ARM/ | ||
| + | |||
| + | **Fælles menu-princip: | ||
| + | |||
| + | ===== Profilmodel ===== | ||
| + | |||
| + | ^ Profil ^ Formål ^ Kendetegn ^ | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | Sikkerheden for '' | ||
| + | |||
| + | Installationstyperne bag det hele (manuel installation vs. præfabrikeret image vs. AutoYaST/ | ||
| + | |||
| + | ===== Livscyklus og drift ===== | ||
| + | |||
| + | * **Build-cyklus: | ||
| + | * **Patch-cyklus: | ||
| + | * **Versionscyklus: | ||
| + | * **Dokumentation: | ||
| + | |||
| + | ===== Roller ===== | ||
| + | |||
| + | * **Image-ejer (product owner):** godkender profilændringer (én pr. profil, samlet forum for basen). | ||
| + | * **Build-ingeniør: | ||
| + | * **Drift (Uyuni):** registrering, | ||
| + | * **Security: | ||
| + | |||
| + | ===== Estimat og plan (tommelfingerregler) ===== | ||
| + | |||
| + | - **Uge 1–2:** OBS + Git-repo op, base-image bygger. | ||
| + | - **Uge 3–4:** PXE/HTTP + USB-boot med profilmenu virker på pilot-hardware. | ||
| + | - **Uge 5–8:** Firma-profiler + Uyuni-registrering + NetBird-enrol til hjem/ | ||
| + | - **Uge 9–12:** Pilot på 10–15 maskiner, justering af profiler, dokumentation. | ||
| + | - **Derefter: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Del 3 – Detaljeret instruktion (for teknikere og brugere) ====== | ||
| + | |||
| + | ===== 3.0 Forudsætninger ===== | ||
| + | |||
| + | * Én build-vært: | ||
| + | * Git-repo til image-beskrivelser (fx '' | ||
| + | * Netværkssegment til boot-tests, hvor man råder over DHCP (brug **proxy-DHCP** i produktion – se Appendix B). | ||
| + | * For ARM/ | ||
| + | * OBS: enten konto på build.opensuse.org eller self-hostet OBS-instans. | ||
| + | |||
| + | ===== 3.1 Værktøjerne på byggeværten ===== | ||
| + | |||
| + | <code bash> | ||
| + | # KIWI (image builder) – fra OBS' builder-repo for nyeste version | ||
| + | sudo zypper addrepo \ | ||
| + | https:// | ||
| + | kiwi-appliance-builder | ||
| + | sudo zypper refresh && sudo zypper install python3-kiwi kiwi-tools | ||
| + | |||
| + | # Keg (image description generator) | ||
| + | sudo zypper install python3-kiwi-keg | ||
| + | |||
| + | # OBS-klienten | ||
| + | sudo zypper install osc | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | ===== 3.2 Struktur: Keg-recipes ===== | ||
| + | |||
| + | Organiser repo' | ||
| + | |||
| + | < | ||
| + | org-images/ | ||
| + | ├── base/ # fælles grundlag for alle profiler | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | ├── profiles/ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | │ | ||
| + | └── .obs/ # OBS-multibuild: | ||
| + | </ | ||
| + | |||
| + | Keg genererer en samlet KIWI-beskrivelse ('' | ||
| + | |||
| + | <code bash> | ||
| + | # Generér KIWI-beskrivelse for firma-base | ||
| + | keg --recipes-dir org-images --image firma-base --out-dir out/ | ||
| + | |||
| + | # Kontrollér resultatet | ||
| + | kiwi-ng --help | ||
| + | </ | ||
| + | |||
| + | **Regler for repo' | ||
| + | |||
| + | * Alt, der er sandt for alle maskiner, ligger i '' | ||
| + | * Ingen hemmeligheder i repo' | ||
| + | * Én merge = én rebuild; commit-besked følger profil og formål. | ||
| + | |||
| + | ===== 3.3 Byg image med KIWI ===== | ||
| + | |||
| + | Lokalt build (til test og USB): | ||
| + | |||
| + | <code bash> | ||
| + | # Eksempel: build af et OEM-diskimage fra en beskrivelse | ||
| + | sudo kiwi-ng --type oem system build \ | ||
| + | --description out/ | ||
| + | --set-repo https:// | ||
| + | --target-dir / | ||
| + | </ | ||
| + | |||
| + | Byg i OBS (anbefalet for produktion): | ||
| + | |||
| + | - Opret projekt (evt. internt OBS) og pakke pr. profil med '' | ||
| + | - Aktivér **multibuild** med ét subpackage pr. profil ('' | ||
| + | - Publicér resultaterne via OBS' download-repo eller spejl til boot-serveren med '' | ||
| + | |||
| + | // | ||
| + | |||
| + | **Test før alt andet:** boot det færdige image i QEMU, før det nogensinde rører fysisk hardware: | ||
| + | |||
| + | <code bash> | ||
| + | sudo qemu-system-x86_64 -boot c \ | ||
| + | -drive file=firma-base.x86_64-*.raw, | ||
| + | -m 4096 -serial stdio | ||
| + | </ | ||
| + | |||
| + | ===== 3.4 PXE/ | ||
| + | |||
| + | Følg den officielle [[https:// | ||
| + | |||
| + | - **DHCP** (eller proxy-DHCP, så eksisterende DHCP-bevares): | ||
| + | - **TFTP** (tftp-pakken eller dnsmasq indbygget) med GRUB2-filer under ''/ | ||
| + | - **HTTP (nginx)** til det tunge indhold: kernel, initrd, squashfs/ | ||
| + | - **GRUB2-menu** med profilvalg – se eksempel nedenfor. | ||
| + | - Tilføj **shim** i TFTP-roden for UEFI Secure Boot-maskiner. | ||
| + | |||
| + | Eksempel på GRUB2-menu med profilvalg: | ||
| + | |||
| + | < | ||
| + | set default=0 | ||
| + | set timeout=10 | ||
| + | |||
| + | menuentry " | ||
| + | linuxefi / | ||
| + | initrdefi / | ||
| + | } | ||
| + | menuentry " | ||
| + | linuxefi / | ||
| + | initrdefi / | ||
| + | } | ||
| + | menuentry " | ||
| + | ... | ||
| + | } | ||
| + | menuentry "Lokal disk (ingen udrulning)" | ||
| + | exit 1 # GRUB2 falder tilbage til næste boot-prioritet | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | openSUSE-ækvivalenter: | ||
| + | |||
| + | ===== 3.5 iPXE (kædeled og debugging) ===== | ||
| + | |||
| + | iPXE kan chainloades fra standard PXE og giver HTTP(S)-overførsel, | ||
| + | |||
| + | < | ||
| + | # iPXE-script (serveres via HTTP) | ||
| + | #!ipxe | ||
| + | menu Vælg profil | ||
| + | item firma Firma-PC (standard) | ||
| + | item okonomi Økonomi-afdelingen | ||
| + | choose target && goto ${target} | ||
| + | |||
| + | :firma | ||
| + | kernel http:// | ||
| + | initrd http:// | ||
| + | boot | ||
| + | </ | ||
| + | |||
| + | Brug iPXE i overgangsperioder (ældre BIOS-maskiner, | ||
| + | |||
| + | ===== 3.6 USB-boot med GRUB2-profilmenu ===== | ||
| + | |||
| + | Til standalone-pc' | ||
| + | |||
| + | <code bash> | ||
| + | # 1) Skriv det færdige image direkte (ren kopi, hurtigst) | ||
| + | sudo dd if=firma-base.x86_64-1.16.0.raw of=/dev/sdX bs=4M status=progress conv=fsync | ||
| + | |||
| + | # Alternativ: ISO-varianten (live) til maskiner, der skal rulle disk-image ud | ||
| + | sudo dd if=firma-base-live.iso of=/dev/sdX bs=4M status=progress conv=fsync | ||
| + | </ | ||
| + | |||
| + | For en **USB-nøgle med flere profiler** (uden at skrive hele diske): byg et lille " | ||
| + | |||
| + | **Brugervejledning (kort, til slutbruger): | ||
| + | |||
| + | - Sæt USB-nøglen i og tænd maskinen (evt. vælg boot-menu med F12/ | ||
| + | - Vælg din profil i menuen og tryk Enter. | ||
| + | - Første boot tager 5–15 min (diskimage skrives, maskinen genstarter). | ||
| + | - Log ind med din organisationsbruger. Ved hjemmearbejdspladsen: | ||
| + | |||
| + | ===== 3.7 U-Boot fra USB-enhed (ARM/edge) ===== | ||
| + | |||
| + | På ARM-boards erstatter U-Boot PC'ens firmware. Den gode nyhed: U-Boot har en distro-agnostisk boot-mekanisme (" | ||
| + | |||
| + | - Keg/KIWI bygger image til '' | ||
| + | - På boot-mediet lægges en **extlinux.conf** (eller '' | ||
| + | |||
| + | < | ||
| + | # / | ||
| + | label firma-base | ||
| + | kernel /boot/Image | ||
| + | initrd / | ||
| + | append root=UUID=< | ||
| + | </ | ||
| + | |||
| + | U-Boot' | ||
| + | |||
| + | Overordnet dokumentation: | ||
| + | |||
| + | ===== 3.8 Første boot: registrering og sikker opsætning ===== | ||
| + | |||
| + | Image' | ||
| + | |||
| + | * **cloud-init/ | ||
| + | * **Uyuni**: Salt aktiveres og maskinen kontakter Uyuni-serveren → patch-status og compliance synligt fra dag ét; efterfølgende policy: maskine uden opdateringer inden for fristen mister NetBird-peering (jf. [[teknik: | ||
| + | * **Identitet**: | ||
| + | |||
| + | ===== 3.9 Fejlfinding – de første steder man kigger ===== | ||
| + | |||
| + | * **Maskinen får ikke boot-fil:** '' | ||
| + | * **GRUB2-menu kommer ikke:** '' | ||
| + | * **Download går langsomt:** skift kernel/ | ||
| + | * **Image booter i QEMU men ikke på hardware:** firmware-version/ | ||
| + | * **Første boot fejler:** første-boot-loggene fra cloud-init/ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ====== Del 4 – Appendikser ====== | ||
| + | |||
| + | ===== Appendix A: Behovsanalyse-processen ===== | ||
| + | |||
| + | ==== Den generelle proces (alle scenarier) ==== | ||
| + | |||
| + | - **Indsaml: | ||
| + | - **Klassificér: | ||
| + | - **Afgræns: | ||
| + | - **Sikkerhedskrav: | ||
| + | - **Test-plan: | ||
| + | - **Frigivelse: | ||
| + | - **Evaluering: | ||
| + | |||
| + | ==== Scenarier ==== | ||
| + | |||
| + | **A.1 Standalone-pc (kontaktworkshop, | ||
| + | Behov: ingen organisationsintegration, | ||
| + | |||
| + | **A.2 Standard firma-pc (kontor)** | ||
| + | Behov: fuld integration, | ||
| + | |||
| + | **A.3 Afdelings-/ | ||
| + | Behov: firma-base + specialiserede værktøjer/ | ||
| + | |||
| + | **A.4 Hjemmearbejdsplads** | ||
| + | Behov: sikkerhed som kontor-PC trods utroværdigt netværk. Analysefokus: | ||
| + | |||
| + | **A.5 "Ude i felten" | ||
| + | Som A.4, plus offline-periode: | ||
| + | |||
| + | **A.6 Kiosk/ | ||
| + | Behov: ét formål, ingen personlige data, selvhelbredende. Analysefokus: | ||
| + | |||
| + | **A.7 ARM/edge og devices med U-Boot** | ||
| + | Behov: hardware uden PC-firmware. Analysefokus: | ||
| + | |||
| + | ===== Appendix B: Faldgruber i processen ===== | ||
| + | |||
| + | ^ # ^ Faldgrube ^ Symptom ^ Forebyggelse ^ | ||
| + | | 1 | **Image-drift** – images genbygges aldrig, maskiner " | ||
| + | | 2 | **Snapshot-tilstand i stedet for beskrivelse** – nogen retter manuelt i et image efter bygget | Kunne ikke gendannes; differencer uden for Git | Aldrig manuelle ændringer efter byg; alt gennem Keg-repo | | ||
| + | | 3 | **Hemmeligheder i image/ | ||
| + | | 4 | **DHCP-kollision i produktion** – en boot-server overtager fx " | ||
| + | | 5 | **TFTP som flaskehals** – store images over TFTP | Minutlange hængninger, | ||
| + | | 6 | **UEFI Secure Boot** – shim/GRUB2 signaturkæde ikke på plads | " | ||
| + | | 7 | **Firmware/ | ||
| + | | 8 | **SLES-registrering ved rå image-kopi** – raw-disk kopieret licensmæssigt ureflekteret | Support/ | ||
| + | | 9 | **Profil-eksplosion** – hver lille forskel bliver en ny image-profil | Byg-kø, test-matrix og vedligehold vokser ukontrolleret | Indstillingsforskelle via Salt/Uyuni; kun pakkeforskelle bliver Keg-profiler (se A.3) | | ||
| + | | 10 | **Manglende før-boot-idé om tid/ur** – HTTPS og cert-godkendelse fejler ved netværksboot | " | ||
| + | | 11 | **Keg/ | ||
| + | | 12 | **Bootloader-arkitekturblanding** – EFI-fil serves til BIOS-maskine eller omvendt | "No bootable device" | ||
| + | | 13 | **Første boot uden netværkskontakt** – maskinen kan ikke enrolle | Lamineret " | ||
| + | | 14 | **Uoprettelig build-infrastruktur** – OBS-instans/ | ||
| + | | 15 | **For lidt pilot** – direkte fuld udrulning på baggrund af tests på 2 maskiner | Organisationsstandsning ved fejl | Minimum 10–15 pilotbrugere pr. profil i ≥2 uger, med definerede exitskriterier | | ||
| + | |||
| + | ===== Appendix C: Linkbibliotek ===== | ||
| + | |||
| + | ==== C.1 Interne wikisider (wiki.smarken.dk) ==== | ||
| + | |||
| + | |||
| + | * [[start|Forside/ | ||
| + | * [[teknik: | ||
| + | * [[teknik: | ||
| + | |||
| + | ==== C.2 SUSE-dokumentation side om side med openSUSE-dokumentation ==== | ||
| + | |||
| + | ^ Emne ^ SUSE (enterprise-dokumentation) ^ openSUSE (fællesskab/ | ||
| + | | KIWI – image-bygning | [[https:// | ||
| + | | KIWI + OBS-integration | [[https:// | ||
| + | | Keg – image-beskrivelser | [[https:// | ||
| + | | Open Build Service | [[https:// | ||
| + | | PXE-server-setup | [[https:// | ||
| + | | PXE-klient/ | ||
| + | | UEFI HTTP Boot | [[https:// | ||
| + | | Klassisk deploy-/ | ||
| + | | iPXE | — (SUSE henviser til PXE-standarden; | ||
| + | | U-Boot (ARM/ | ||
| + | | Operativsystemet | [[https:// | ||
| + | |||
| + | ==== C.3 Øvrige referencer ==== | ||
| + | |||
| + | * KIWI-eksempler/ | ||
| + | * Sikkerhedsstacken (NetBird, Keycloak, FreeIPA, Uyuni, Guacamole, Wazuh m.m.): [[teknik: | ||
| + | |||
| + | ---- | ||
| + | |||
| + | // | ||
teknik/operativsystemer/deploy/bygditegetos.1792363759.txt.gz · Last modified: by smarken
