Table of Contents

Byg din egen Linux-distribution – til din organisation

Byg et organisationsejet operativsystem med SUSE/openSUSE-værktøjer: Open Build Service, Keg, KIWI, PXE/netværksboot, iPXE, USB og U-Boot.

Dette dokument er opdelt i fire dele, så hver læser kan gå direkte til det relevante niveau:

Udgangspunktet er SUSE-økosystemet: SUSE Linux Enterprise Server/Desktop (SLES/SLED) 16 til maskiner, hvor der er behov for support og SLA, og openSUSE Leap/ALP, hvor en 100 % fri løsning er ønsket. De to er binærkompatible og bygget med de samme værktøjer, så man kan starte frit og købe support senere – uden vendor lock-in.

Den sikre fjernadgang, der refereres til gennem hele dokumentet, er beskrevet i den eksisterende referencearkitektur på wiki.smarken.dk.

Se også :


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” indeholder – programmer, sikkerhedsindstillinger, netværksopsætning, branding – og derefter bygges der færdige, identiske images af den. En ny medarbejder får tildelt en maskine, den tændes, og efter få minutter står der en færdigkonfigureret pc. Uanset om maskinen står på kontoret, i medarbejderens hjem eller på en kundevisit.

Kort sagt: I får jeres egen Linux-distribution – bygget på open source-værktøjer fra SUSE/openSUSE, som selv SUSE bruger til at bygge deres egne produkter.

Hvorfor er det en god forretning?

Hvad koster det?

Der er tre poster:

  1. Mennesker. Én til to medarbejdere, der lærer værktøjerne (der er rigelig, gratis dokumentation – se Del 4). Det er den vigtigste investering.
  2. Infrastruktur. Én byggeserver (kan være en virtuel maskine) og eventuelt en boot-server pr. lokation. Beskeden hardware.
  3. 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?

Hvad er de største risici – og hvad gør vi ved dem?

Anbefalet beslutning: Start med en pilot: én baseprofil + én afdelingsprofil + én hjemmearbejdsplads, 10–15 maskiner, 3 måneder. Evaluer, og skaler derefter.


Del 2 – Teknisk strategi (for it-chefer og teknisk funderede mellemledere)

Værktøjskæden i oversigt

Lag Værktøj Rolle
Kilde/beskrivelse Keg (image description generator) Modulære “opskrifter” (recipes) på YAML-basis, der genererer KIWI-beskrivelser. Skalering af mange profiler med stort overlap.
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, der genbygger images automatisk, når pakker opdateres; versionsstyring af artefakter; reproducible builds. Kan være self-hostet eller build.opensuse.org.
Udrulning/boot PXE/HTTP-boot, iPXE, GRUB2, U-Boot Netværksboot til masseudrulning; USB til standalone og feltenheder; U-Boot på ARM-hardware.
Drift/security Uyuni/Salt, NetBird/WireGuard, Keycloak/FreeIPA Registrering, patch-styring, zero trust-netværk og identitet – jf. wikien.

Pipeline, kort fortalt: Git-repo (Keg-recipes) → OBS-byg → KIWI-images → HTTP/TFTP-distribution → maskinen vælger profil i boot-menu (GRUB2) → første boot-opsætning (cloud-init/Combustion) → registrering i Uyuni + NetBird.

Hvorfor Keg + KIWI + OBS frem for håndbyggede images?

Boot- og distributionsstrategi

Der er fire boot-veje, som bør betragtes som én samlet løsning med fælles indhold:

  1. PXE/netværksboot (BIOS + UEFI). Standard på kontoret. GRUB2 (evt. shim til Secure Boot) serves via TFTP/HTTP; boot-menuen er den samme GRUB2-menu med profilvalg som USB-varianten. iPXE kan lægges ind som led (chainload) for at få HTTP(S), scripts og nem debug.
  2. UEFI HTTP Boot. Nyere firmware kan hente bootloader direkte over HTTP(S) – fjerner TFTP's hastigheds- og skaleringsproblemer.
  3. USB. Til standalone-pc'er, feltenheder og som fallback. USB-mediet booter GRUB2 med samme menu/profiler. Kan også bootstrappe via U-Boot på ARM.
  4. U-Boot (ARM/edge). Boards uden PC-firmware bruger U-Boot's “distro boot”-mekanisme: standard extlinux.conf/boot script på USB/SD, så samme image-beskrivelse kan ramme edge-hardware.

Fælles menu-princip: Uanset boot-vej ender maskinen i en GRUB2-menu (eller extlinux/U-Boot-ækvivalent), hvor profilen vælges – evt. automatisk pr. DHCP/MAC for bulk-udrulning, manuelt for enkeltmaskiner.

Profilmodel

Profil Formål Kendetegn
standalone Fristående pc uden organisationsintegration (workshop, laboratorium, gæst) Ingen registrering, lokal admin, evt. offentligt netværk
firma-base Standard arbejdsstation på kontoret Registrering i Uyuni, SELinux enforcing, LUKS, organisationsapps
afdeling-* Firma-base + afdelingens værktøjer (fx afdeling-okonomi, afdeling-udvikling) Arver base, tilføjer pakker/politikker; hold antallet nede – se Appendix A/B
hjem/felt Bærbar til hjemmearbejde og “ude i felten” Alt i firma-base + NetBird/WireGuard-tunnel, MFA-onboarding, hårdere patch-frister

Sikkerheden for hjem/felt følger den eksisterende referencearkitektur for sikker fjernadgang: adgang afgøres af identitet (Keycloak + FreeIPA, MFA/FIDO2) og enheds-compliance (Uyuni/Salt), ikke af netværksplacering – hjemmenetværk og kontor-netværk behandles ens.

Installationstyperne bag det hele (manuel installation vs. præfabrikeret image vs. AutoYaST/Agama) er gennemgået i wikiens deploy-overblik; dette dokument uddyber image-sporet (KIWI), som er det hurtigste og mest reproducerbare.

Livscyklus og drift

Roller

Estimat og plan (tommelfingerregler)

  1. Uge 1–2: OBS + Git-repo op, base-image bygger.
  2. Uge 3–4: PXE/HTTP + USB-boot med profilmenu virker på pilot-hardware.
  3. Uge 5–8: Firma-profiler + Uyuni-registrering + NetBird-enrol til hjem/felt-profil.
  4. Uge 9–12: Pilot på 10–15 maskiner, justering af profiler, dokumentation.
  5. Derefter: bred udrulning afdeling for afdeling.

Del 3 – Detaljeret instruktion (for teknikere og brugere)

3.0 Forudsætninger

3.1 Værktøjerne på byggeværten

# KIWI (image builder) – fra OBS' builder-repo for nyeste version
sudo zypper addrepo \
  https://download.opensuse.org/repositories/Virtualization:/Appliances:/Builder/openSUSE_Leap_16.0 \
  kiwi-appliance-builder
sudo zypper refresh && sudo zypper install python3-kiwi kiwi-tools
 
# Keg (image description generator)
sudo zypper install python3-kiwi-keg   # eller: pip install kiwi-keg
 
# OBS-klienten
sudo zypper install osc

Bemærk: versionsnavne/<DIST>-mapper følger din distribution – se den aktuelle vejledning i KIWI-dokumentationen og Keg-dokumentationen.

3.2 Struktur: Keg-recipes

Organiser repo'et, så basen og profilerne er adskilt:

org-images/
├── base/                    # fælles grundlag for alle profiler
│   ├── images.yaml          # imagemetadata, repos, disklayout
│   ├── config.sh            # post-install tilretninger i chroot
│   └── root/                # filer, der kopieres 1:1 ind i image
├── profiles/
│   ├── standalone/
│   ├── firma-base/
│   ├── afdeling-okonomi/
│   └── hjem-felt/
└── .obs/                    # OBS-multibuild: ét subbuild pr. profil

Keg genererer en samlet KIWI-beskrivelse (config.xml/*.kiwi) pr. profil:

# Generér KIWI-beskrivelse for firma-base
keg --recipes-dir org-images --image firma-base --out-dir out/firma-base
 
# Kontrollér resultatet
kiwi-ng --help   # validerings- og build-kommandoer se KIWI-manualen

Regler for repo'et:

3.3 Byg image med KIWI

Lokalt build (til test og USB):

# Eksempel: build af et OEM-diskimage fra en beskrivelse
sudo kiwi-ng --type oem system build \
  --description out/firma-base \
  --set-repo https://download.opensuse.org/distribution/leap/16.0/repo/oss \
  --target-dir /var/tmp/build-firma-base

Byg i OBS (anbefalet for produktion):

  1. Opret projekt (evt. internt OBS) og pakke pr. profil med _service-opsætning, der trækker Keg-recipes fra Git.
  2. Aktivér multibuild med ét subpackage pr. profil (base.image, firma-base.image, …). OBS bygger images med KIWI og genbygger automatisk ved pakkeopdateringer.
  3. Publicér resultaterne via OBS' download-repo eller spejl til boot-serveren med rsync/osc getbinaries.

Bemærk: OBS udelukker som standard byg uden profil – brug osc build -M <profil> til lokale testbyg. Mere om OBS+KIWI i KIWI-manualens OBS-kapitel.

Test før alt andet: boot det færdige image i QEMU, før det nogensinde rører fysisk hardware:

sudo qemu-system-x86_64 -boot c \
  -drive file=firma-base.x86_64-*.raw,format=raw,if=virtio \
  -m 4096 -serial stdio

3.4 PXE/netværksboot-server

Følg den officielle SLES 16 PXE-server-vejledning som ramme; opsummeret:

  1. DHCP (eller proxy-DHCP, så eksisterende DHCP-bevares): next-server + boot-filnavn pr. klientarkitektur (grubx64.efi/shim til UEFI, grub2-i386-pc til legacy BIOS). Kea eller dhcp-server-pakken.
  2. TFTP (tftp-pakken eller dnsmasq indbygget) med GRUB2-filer under /srv/tftpboot/.
  3. HTTP (nginx) til det tunge indhold: kernel, initrd, squashfs/agama-image og selve disk-imagene. TFTP er kun til bootloaderen.
  4. GRUB2-menu med profilvalg – se eksempel nedenfor.
  5. Tilføj shim i TFTP-roden for UEFI Secure Boot-maskiner.

Eksempel på GRUB2-menu med profilvalg:

set default=0
set timeout=10

menuentry "Firma-PC (standard)" {
    linuxefi /images/firma-base/linux root=live:http://pxe.example.com/images/firma-base/rootfs.img
    initrdefi /images/firma-base/initrd
}
menuentry "Økonomi-afdelingen" {
    linuxefi /images/afdeling-okonomi/linux root=live:http://pxe.example.com/images/afdeling-okonomi/rootfs.img
    initrdefi /images/afdeling-okonomi/initrd
}
menuentry "Hjemmearbejdsplads" {
    ...
}
menuentry "Lokal disk (ingen udrulning)" {
    exit 1   # GRUB2 falder tilbage til næste boot-prioritet
}

Klientproceduren (hvad teknikeren gør på maskinen) følger SLES 16 PXE-klient-vejledningen: vælg netværksboot i firmware → vælg profil i menuen → resten kører selv.

openSUSE-ækvivalenter: SDB: PXE boot installation og UEFI HTTP Boot-server-setup.

3.5 iPXE (kædeled og debugging)

iPXE kan chainloades fra standard PXE og giver HTTP(S)-overførsel, scripting og bedre fejlmeddelelser. openSUSE-wikien har en dedikeret iPXE-side; generelt: ipxe.org-dokumentation.

# 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://pxe.example.com/images/firma-base/linux root=live:http://pxe.example.com/images/firma-base/rootfs.img
initrd http://pxe.example.com/images/firma-base/initrd
boot

Brug iPXE i overgangsperioder (ældre BIOS-maskiner, WAN-link over TFTP-grænser) og til hurtig omskiftning af boot-menu uden TFTP-rod.

3.6 USB-boot med GRUB2-profilmenu

Til standalone-pc'er, feltenheder og som fallback:

# 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 “boot-vælger”-image (KIWI type=“iso” med GRUB2-menu, hvis menuentries peger på kernel/initrd/diskimages liggende som filer på samme nøgle) – eller brug ISO-varianten pr. profil. GRUB2-menuen er identisk med PXE-menuen, så brugeroplevelsen er ens på tværs af boot-veje.

Brugervejledning (kort, til slutbruger):

  1. Sæt USB-nøglen i og tænd maskinen (evt. vælg boot-menu med F12/F11/Esc).
  2. Vælg din profil i menuen og tryk Enter.
  3. Første boot tager 5–15 min (diskimage skrives, maskinen genstarter).
  4. Log ind med din organisationsbruger. Ved hjemmearbejdspladsen: sæt din FIDO2-nøgle i ved login. Færdig.

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 (“distro boot”), der læser standardkonfiguration fra USB/SD – samme mekanismer som GRUB2.

  1. Keg/KIWI bygger image til aarch64 (samme beskrivelse, anden arkitektur).
  2. På boot-mediet lægges en extlinux.conf (eller boot.scr) – se eksempel nedenfor.
# /boot/extlinux/extlinux.conf på USB-partitionen (ext4)
label firma-base
    kernel /boot/Image
    initrd /boot/initrd
    append root=UUID=<uuid> rw console=ttyAMA0

U-Boot's boot_targets-rækkefølge sørger for usb0 → mmc0 → dhcp osv.; på boards med leverandør-U-Boot genoprettes default-miljøet (env default -a; saveenv), hvis boot skal “distro-styres”. Netværksboot findes også her: bootcmd_pxe/bootcmd_dhcp gør det samme som PC-PXE.

Overordnet dokumentation: docs.u-boot.org.

3.8 Første boot: registrering og sikker opsætning

Image'et er “fabrikstilstand”; til det organisatoriske gøres ved første boot:

3.9 Fejlfinding – de første steder man kigger


Del 4 – Appendikser

Appendix A: Behovsanalyse-processen

Den generelle proces (alle scenarier)

  1. Indsaml: hvem skal bruge maskinen, hvor, med hvilke data? (Interview 30 min pr. målgruppe.)
  2. Klassificér: hvilken profiltype? (Se tabellen i Del 2.) Findes profilen allerede – kan en eksisterende udvides i stedet?
  3. Afgræns: hvad skal ind i basen, hvad skal være profil-specifikt? Tommelfingerregel: ind i basen hvis >70 % af alle maskiner har brug for det.
  4. Sikkerhedskrav: kategori af data (offentligt/internt/følsomt), lokation (kontor/hjem/felt), → krav til kryptering, MFA, patch-frist.
  5. Test-plan: hvilke hardwaretyper skal profilens image bootes på, før den må udrulles? Minimum én af hver.
  6. Frigivelse: image-ejer godkender; ændringslog i Git; OBS-byg; pilot før bred udrulning.
  7. Evaluering: efter 1 måned – brugertilfredshed, supportsager; justér profilen eller basen.

Scenarier

A.1 Standalone-pc (kontaktworkshop, lab, demonstrationsmaskine) Behov: ingen organisationsintegration, lokal administration, kan fungere offline. Analysefokus: hvem vedligeholder den, hvis der ingen it-tilknytning er? → profil med begrænset levetid eller tvungen auto-opdatering. Faldgrube: standalone-maskiner bliver “forældreløse” med aldrig-opdateret software; overvej rollefordeling eller fælles auto-opdaterings-politik.

A.2 Standard firma-pc (kontor) Behov: fuld integration, ensartethed, hurtig udskiftning. Analysefokus: hvilke apps indgår i “standardskrivebordet”? Find de 2–3 afdelinger med størst overlap og byg basen efter dem – ikke efter flertallet af ønsker (undgå “køkkenvask”-basen). Fokus på onboarding-tid: fra kasse til arbejdsdygtig maskine < 30 min.

A.3 Afdelings-/rolleprofil (fx økonomi, udvikling, design) Behov: firma-base + specialiserede værktøjer/politikker. Analysefokus: er forskellen reelt pakker (så profil i Keg) eller bare indstillinger (så hellere Salt-tilstand i Uyuni – ingen ny image-profil!)? Faldgrube: profil-eksplosion; hver ny profil koster vedligehold, test og byg-tid. Regel: maks. én ny profil pr. kvartal, og kun efter begrundet afvisning af Salt-alternativet.

A.4 Hjemmearbejdsplads Behov: sikkerhed som kontor-PC trods utroværdigt netværk. Analysefokus: hvilke data må arbejdes med hjemmefra? Krav: LUKS fuld diskkryptering, NetBird/WireGuard-tunnel med MFA-enrol, patch-frist (fx 7 dage) håndhævet af Uyuni/NetBird-tilbagekald. Overvej: skal tunge opgaver i stedet køres som fjernskrivebord via Guacamole/Harvester (jf. wikien), så data aldrig forlader datacenteret?

A.5 “Ude i felten” (bærbar, kundebesøg, offshore/dårligt net) Som A.4, plus offline-periode: hvilke funktioner skal kunne afvikles uden forbindelse, og hvor længe? → lokal cache/fil-synkronisering, offline-MFA-fallback (TOTP) jf. referencearkitekturen. Faldgrube: enrolment kræver netværk – onboard maskinen før den forlader huset.

A.6 Kiosk/terminal (fælles maskine, produktionsskærm) Behov: ét formål, ingen personlige data, selvhelbredende. Analysefokus: overvej immutable/transaktionelt OS (openSUSE MicroOS / SLE Micro) – read-only rod, atomiske opdateringer, automatisk rollback. Genstart = altid velkendt tilstand. Her kan profildefinitionen være ekstremt lille.

A.7 ARM/edge og devices med U-Boot Behov: hardware uden PC-firmware. Analysefokus: hvilket board (per U-Boot-version), boot-medie (USB/SD/eMMC), og skal det kunne netværksbootes? Keg-beskrivelsen genbruges til aarch64; test-matrix skal indeholde netop boardet, da U-Boot-varianter afviger. Faldgrube: leverandør-U-Boot med holdt boot-forsinkelse eller skjulte kommandoer – dokumentér nøjagtige tastetryk pr. board.

Appendix B: Faldgruber i processen

# Faldgrube Symptom Forebyggelse
1 Image-drift – images genbygges aldrig, maskiner “patcher sig selv væk” fra image-tilstand Nye udrulninger får gammel kernel; svært at bevise systemtilstand i audit Fast build-cyklus i OBS; “image-alderspolitik”: boot-server nægter at serve images ældre end N dage
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/repo – enrol-nøgler, kodeord bagt ind Nøgle kompromitteret for alle maskiner Engangs-tokens pr. maskine (event/batch), hemmeligheder via første-boot-transport, secret-scanning i repo
4 DHCP-kollision i produktion – en boot-server overtager fx “next-server” på klient-netværket Pludselig booter alle maskiner på netværket mod boot-serveren proxy-DHCP/option 43-afgrænsning; adskilt VLAN til udrulning; scope-regler godkendt af netværksafdelingen
5 TFTP som flaskehals – store images over TFTP Minutlange hængninger, timeouts ved parallel udrulning Kun bootloader via TFTP; alt andet via HTTP/HTTP-boot/iPXE
6 UEFI Secure Boot – shim/GRUB2 signaturkæde ikke på plads “Security Violation”/refuse at boote Medtag shim i TFTP/USB; test på Secure Boot-aktiveret hardware fra dag ét
7 Firmware/hardware-udfordringer – image virker på gammel test-maskine, ikke nyere Kernel mangler driver (NVMe/Wi-Fi), initrd for lille Test-matrix med repræsentativ ny hardware; opdater build-cyklus ved nyere kerne
8 SLES-registrering ved rå image-kopi – raw-disk kopieret licensmæssigt ureflekteret Support/abonnement-tælling utilfreds Registrer systemer via Uyuni/SUSEConnect ved første boot, ikke i image
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 “Certificate expired”/TLS-fejl i boot NTP (chrony) på boot-server; i hårde tilfælde kilde-tidsafstemning
11 Keg/KIWI-versionskilt – lokal build virker, OBS (eller omvendt) fejler Beskrivelse validerer ikke; schemas afviger Fastgør kiwi/keg-version i OBS-projektets config; CI-test af beskrivelse ved hver ændring
12 Bootloader-arkitekturblanding – EFI-fil serves til BIOS-maskine eller omvendt “No bootable device” GRUB2-pakker til alle målarkitekturer i boot-roden; DHCP-vendor-class-styring
13 Første boot uden netværkskontakt – maskinen kan ikke enrolle Lamineret “halvfærdig” maskine Onboard pipeline-ansvar: maskinen forlader it med succesfuld enrol-test dokumenteret
14 Uoprettelig build-infrastruktur – OBS-instans/Git-repo uden backup Genbyg umulig i nedbrudssituation Backup af Git (mirrors) + OBS-konfiguration; øvelse i genbyg fra backup hvert halve år
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)

C.2 SUSE-dokumentation side om side med openSUSE-dokumentation

C.3 Øvrige referencer


Redaktionel note: Alle eksterne links er verificerede pr. oktober 2026. DokuWiki genererer automatisk indholdsfortegnelse ud fra overskrifterne ( ====== til === ) .