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å :
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.
Der er tre poster:
Anbefalet beslutning: Start med en pilot: én baseprofil + én afdelingsprofil + én hjemmearbejdsplads, 10–15 maskiner, 3 måneder. Evaluer, og skaler derefter.
| 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.
Der er fire boot-veje, som bør betragtes som én samlet løsning med fælles indhold:
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.
| 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.
org-images).# 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.
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:
base/. En profil må kun indeholde differenser.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):
_service-opsætning, der trækker Keg-recipes fra Git.base.image, firma-base.image, …). OBS bygger images med KIWI og genbygger automatisk ved pakkeopdateringer.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
Følg den officielle SLES 16 PXE-server-vejledning som ramme; opsummeret:
next-server + boot-filnavn pr. klientarkitektur (grubx64.efi/shim til UEFI, grub2-i386-pc til legacy BIOS). Kea eller dhcp-server-pakken./srv/tftpboot/.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.
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.
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):
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.
aarch64 (samme beskrivelse, anden arkitektur).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.
Image'et er “fabrikstilstand”; til det organisatoriske gøres ved første boot:
journalctl -u dhcpd/kea; tjek next-server/filename, og at klientens arkitektur (BIOS/EFI) matcher.grub.cfg-sti/namngivning i TFTP-roden; stole-pil i serielle logs (console=ttyS0)./var/log, NetBird/Uyuni-kontakt i journalctl.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.
| # | 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 |
build-tests/-mappen i OSInside/kiwi-repoet – den hurtigste start på en egen beskrivelse.Redaktionel note: Alle eksterne links er verificerede pr. oktober 2026. DokuWiki genererer automatisk indholdsfortegnelse ud fra overskrifterne ( ====== til === ) .