Wersja: 0.6.0
Narzędzie do budowania niemutowalnych obrazów systemowych Debiana (w stylu
bootc/rpm-ostree) ze struktury projektu identycznej jak live-build.
Jeśli masz już projekt live-build, możesz go wkleić do hackeros-builder
i dodać jeden plik — config/config.hk — żeby zbudować z niego obraz
niemutowalny zamiast klasycznego, instalowalnego ISO.
Migracja deb-ostree → hammer. hackeros-builder jest teraz
całkowicie niezależny od deb-ostree — jedynym narzędziem
zarządzania pakietami/atomowością wstrzykiwanym do budowanego obrazu jest
hammer, w trybie OCI (oci-mode.tar.gz). Zmiany:
internal/download/hammer.go(zastępujedebostree.go) — ściągaoci-mode.tar.gzzhttps://github.com/HackerOS-Linux-System/hammer/releases, rozpakowuje z niego pojedynczą binarkęhammer, weryfikuje SHA256 całego archiwum jeśli wydanie publikujechecksums.txt.internal/hkgen/hammer_config.go(zastępujedebostree_config.go) — generuje/etc/hammer/oci.hkzamiast/etc/deb-ostree/deb-ostree.hk.internal/rootfs/hammer_deps.go(zastępujedebostree_deps.go) — instaluje biblioteki dynamiczne realnie wymagane przezhammer(libostree-1-1,libglib2.0-0t64,liblzma5,libbz2-1.0,libgcc-s1), zweryfikowane bezpośrednio zreadelf -dna wydaniuhammerv0.6.0 — lista krótsza niż dladeb-ostree, bohammer(Rust) statycznie linkuje HTTP/TLS/GPG.apt/apt-getusuwane z finalnie zainstalowanego systemu. W krokubuild iso, po wstrzyknięciu instalatora Calamares a przed spakowaniemfilesystem.squashfs,hackeros-builderusuwaapt,apt-geti pomocnicze narzędzia (apt-cache,apt-config,apt-cdrom,apt-mark,apt-key,/usr/lib/apt). Bazadpkg(/var/lib/dpkg/*) i samdpkgzostają nietknięte —hammerczyta tę bazę bezpośrednio.
W tej rundzie rozbudowy hackeros-builder przeszedł z "działającego
szkieletu" do narzędzia z podstawowym hardeningiem produkcyjnym:
internal/preflight— sprawdzenie dostępnościdebootstrap,mksquashfs,grub-mkrescue,xorriso,mount/umount/chrootw$PATHna samym starcie, z jednym komunikatem listującym wszystko czego brakuje (plusapt installz konkretnymi pakietami). Bez tego błąd wypływał dopiero w połowie wieloetapowego builda.internal/buildlock— lockfile (flock(2)) naworkDir, chroniący przed dwoma równoległymi buildami nadpisującymi sobie te same pliki tymczasowe. Druga próbabuildna tym samymworkDirdostaje czytelny błąd natychmiast, zamiast cichej korupcji danych.internal/httpclient— wspólny klient HTTP z jawnymTimeout(30s dla krótkich zapytań, dłuższy budżet na bezczynność połączenia dla transferów registry) zamiasthttp.DefaultClient, który mógł zawiesić cały build w nieskończoność przy martwym połączeniu.- Weryfikacja SHA256 pobranego archiwum
oci-mode.tar.gz(hammer) —download.DownloadHammersprawdza sumę kontrolną zchecksums.txtopublikowanego przy wydaniu (jeśli wydanie go publikuje; w przeciwnym razie wypisuje wyraźne ostrzeżenie i kontynuuje, nie blokując starszych tagów). --insecure-registry— opcjonalne wyłączenie weryfikacji TLS dla self-signed/wewnętrznych registry testowych, podłączone przezremote.WithTransportwgo-containerregistry. Nigdy włączone domyślnie..github/workflows/ci.yml— pipelinego build/go vet/go test/gofmtna każdy push/PR.- Testy jednostkowe dla
internal/hk(parser .hk),internal/preflight,internal/buildlock,internal/download,internal/config.
live-build jest świetny do budowania klasycznych obrazów Debiana, ale nic
w tym łańcuchu nie tworzy obrazu OCI jako jednostki dystrybucji systemu —
a to jest fundament modelu immutable/bootc (Fedora/RHEL ma to rozwiązane,
Debian nie miał). hackeros-builder wypełnia tę dziurę: interpretuje
strukturę live-build samodzielnie (bez wywoływania lb build), buduje
rootfs, pakuje go jako obraz OCI, wypycha do registry, i z tego obrazu może
zbudować bootowalne ISO z hammer już wstrzykniętym do /usr/bin/ i
usuniętym apt/apt-get na finalnie zainstalowanym dysku (baza dpkg
pozostaje — czyta ją bezpośrednio hammer).
sudo hackeros-builder build cloud # buduje rootfs + wypycha obraz OCI do registry
sudo hackeros-builder build iso # sciaga obraz OCI z registry + buduje hybrydowe ISO
sudo hackeros-builder build all # build cloud, nastepnie build isoOpcje globalne (patrz --help dla pełnej listy):
| Flaga | Znaczenie |
|---|---|
-p, --project <dir> |
Katalog projektu (domyślnie .) |
-w, --workdir <dir> |
Katalog roboczy, chroniony lockiem — musi być różny dla równoległych buildów |
-o, --output <plik> |
Ścieżka wynikowego .iso |
--insecure-registry |
Wyłącza weryfikację TLS dla registry (tylko self-signed/testowe) |
--skip-preflight |
Pomija sprawdzenie dostępności narzędzi na starcie (przydatne w CI) |
-v, --verbose |
Logi DEBUG |
build cloud— preflight (debootstrap/chroot/mount) → lock naworkDir→ buduje rootfs (debootstrap + hooks + package-lists), wstrzykujehammer(z weryfikacją SHA256) i wygenerowany config/etc/hammer/oci.hk, pakuje całość jako jednowarstwowy obraz OCI i wypycha go do registry.apt/apt-getpozostają w tym obrazie na tym etapie — są jeszcze potrzebne w krokubuild isodo wstrzyknięcia instalatora Calamares.build iso— preflight (mksquashfs/grub-mkrescue/xorriso) → ściąga obraz OCI z registry (dokładnie ten, który istnieje tam teraz), aktualizuje w nim[origin]w/etc/hammer/oci.hk, wstrzykuje instalator Calamares (apt-get), usuwaapt/apt-get(bazadpkgzostaje — czyta jąhammer), i dopiero z tak przygotowanego rootfs buduje klasyczny hybrydowy ISO (BIOS+UEFI). Od tego momentu system, który użytkownik zainstaluje na dysku przez Calamares, nie ma jużapt/apt-get.build all— preflight dla obu etapów na starcie (zanim zacznie się kosztownydebootstrap) → jeden lock na cały przepływ →build cloud, a następniebuild isona obrazie który właśnie został wypchnięty.
Identyczna jak live-build, plus jeden dodatkowy plik:
moj-projekt/
├── config/
│ ├── config.hk ← WYMAGANE: jedyny plik specyficzny dla hackeros-builder
│ ├── package-lists/
│ │ └── moje-pakiety.list.chroot
│ ├── hooks/
│ │ └── normal/
│ │ └── 0100-cos.hook.chroot
│ ├── includes.chroot/
│ │ └── etc/moj-plik.conf
│ └── archives/
│ ├── moje-repo.list.chroot
│ └── moje-repo.key.chroot
Możesz wkleić istniejący katalog config/ z projektu live-build 1:1 —
hackeros-builder interpretuje te same podkatalogi (package-lists/,
hooks/normal/, includes.chroot/, archives/) tą samą logiką co
live-build (debootstrap + wykonanie hooków w chroot + kopiowanie plików),
tylko bez wywoływania lb build — cała interpretacja jest reimplementowana
natywnie w Go (internal/liveparse, internal/rootfs).
Jedyny plik, którego live-build nie ma. Format to .hk
(specyfikacja: hackeros-linux-system.github.io/HackerOS-Website/tools-docs/hk.html):
[account]
-> type => user ! "user" albo "organisation"
-> name => michal
[auth]
-> token => ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[release]
-> name => trixie ! bookworm / trixie / forky / sid / unstable
| Sekcja | Klucz | Znaczenie |
|---|---|---|
[account] |
type |
user → obraz trafia na konto użytkownika w registry; organisation → na konto organizacji |
[account] |
name |
nazwa użytkownika/organizacji w registry (np. GitHub) |
[auth] |
token |
token autoryzacyjny do push obrazu OCI (np. GitHub PAT z write:packages dla ghcr.io) |
[release] |
name |
wersja Debiana przekazywana do debootstrap jako SUITE |
- Wstrzykuje
hammer— podczas budowy rootfs ściąga najnowszą wersję zhttps://github.com/HackerOS-Linux-System/hammer/releases(archiwumoci-mode.tar.gz, lub wersję wskazaną w zmiennej środowiskowejHAMMER_VERSION), rozpakowuje z niego pojedynczą binarkęhammeri umieszcza wrootfs/usr/bin/hammerz uprawnieniamia+x. Instaluje też jego biblioteki dynamiczne (libostree-1-1,libglib2.0-0t64,liblzma5,libbz2-1.0,libgcc-s1). - Generuje
/etc/hammer/oci.hk— gotowy plik konfiguracyjny dlahammer, żeby system zbudowany przezhackeros-builderod razu po pierwszym boocie miał poprawny[origin] -> refspec(docker://...) wskazujący na obraz OCI, z którego powstał. - Usuwa
apt/apt-getz finalnie zainstalowanego systemu — w krokubuild iso, po wstrzyknięciu Calamares a przed spakowaniemfilesystem.squashfs(czyli dokładnie w treści, którą Calamares kopiuje 1:1 na dysk użytkownika),hackeros-builderusuwa binarkiapt,apt-get,apt-cache,apt-config,apt-cdrom,apt-mark,apt-keyoraz katalog/usr/lib/apt. Bazadpkg(/var/lib/dpkg/*) oraz samdpkgpozostają nietknięte —hammerczyta tę bazę bezpośrednio do odczytu listy zainstalowanych pakietów, więc jej usunięcie zepsułobyhammer. Obraz OCI wypychany przez samobuild cloud(bezbuild iso) nadal zawieraapt/apt-get— patrz punkt 3 w sekcji „Co trzeba dopracować”.
sudo apt install debootstrap squashfs-tools grub-pc-bin grub-efi-amd64-bin xorriso mtoolsGo 1.22+ do budowania samego hackeros-builder (binarka końcowa nie
wymaga Go w runtime).
Uwaga o
go.mod: przy okazji tej rundy zmian poprawiono literówkę w deklaracji modułu — byłomodule .../HackerOS-Builder(wielka litera), a WSZYSTKIE importy wewnętrzne w calym kodzie od poczatku uzywaly.../hackeros-builder(mala litera) -- przez cogo buildnie uruchamial sie w ogole (Go nie rozwiazywalby importow wzgledem zadeklarowanej sciezki modulu). Poprawiono nahackeros-builder(male litery), zgodnie z rzeczywistymi importami. Cały projekt, łącznie z tą zmianą i migracją deb-ostree → hammer, został faktycznie skompilowany (go build ./...), sprawdzony (go vet ./...) i przetestowany (go test ./...) lokalnie (z tymczasowymireplacenagolang.org/x/sys/golang.org/x/sync-> mirrory nagithub.com, bo środowisko w którym to pisano miało dostęp tylko dogithub.com, nie dogolang.org; w normalnym środowisku z pełnym dostępem do internetu tereplacenie są potrzebne i nie są częścią tego repo) — wszystko przechodzi bez błędów.
Uwaga o
go.sum: ten plik (lockfile z hashami zależności) nie jest commitowany w repozytorium — środowisko, w którym ten kod został napisany, nie miało dostępu do internetu, więc nie dało się obliczyć prawdziwych hashy modułów (a commitowanie fałszywych/pustych hashy psowałoby build identycznie jak ich brak). To nie są zewnętrzne ścieżki czy literówki w imporcie —internal/ociimagepoprawnie importuje pakiety zgo-containerregistry, którego wersja jest podana wgo.mod; brakuje tylko samego lockfile. Wygeneruj go jednym poleceniem przed pierwszym budowaniem:
go mod tidy
# lub: make setupTo ściągnie go-containerregistry i policzy jego hashe do go.sum.
Po tym go build ./... zadziała normalnie.
go build -o hackeros-builder .
sudo ./hackeros-builder build all -p ./moj-projekt -o ./moj-system.isoconfig/config.hk ──────┐
▼
internal/config (parsuje .hk)
│
config/{package-lists, ▼
hooks,includes.chroot} internal/liveparse (interpretuje strukture live-build)
│
▼
internal/rootfs.Builder
├─ debootstrap
├─ mount /proc,/sys,/dev
├─ apt-get install <package-lists>
├─ copy includes.chroot
├─ exec hooks/normal/*.hook.chroot (w chroot)
├─ download.DownloadHammer -> /usr/bin/hammer
└─ hkgen.WriteHammerConfig -> /etc/hammer/oci.hk
│
┌──────────────┴───────────────┐
▼ ▼
internal/ociimage.BuildAndPush (build cloud)
(tar.gz warstwa -> v1.Image ->
remote.Write do registry)
│
▼
Registry OCI (np. ghcr.io)
│
▼ (build iso sciaga TEN SAM obraz z powrotem)
internal/ociimage.PullAndUnpack
(remote.Image -> warstwy -> rootfs
z obsluga whiteoutow OCI)
│
▼
internal/isobuild.Build
├─ InjectInstaller: apt-get install calamares + xorg (w rootfs z registry)
├─ rootfs.RemoveAptTooling -> usuwa apt/apt-get (baza dpkg zostaje)
├─ mksquashfs rootfs -> filesystem.squashfs (JUZ bez apt/apt-get)
├─ copy vmlinuz + initrd.img
├─ generuj grub.cfg
└─ grub-mkrescue -> hybrydowe ISO (BIOS+UEFI)
Parser pełnej specyfikacji .hk (sekcje, zagnieżdżenie ->/-->/--->,
klucze kropkowe, interpolacja ${...} i ${env:...}, tablice, typy
string/number/bool) żyje w internal/hk. To jest implementacja referencyjna
dla całego ekosystemu HackerOS — hammer (Rust) ma swój podzbiór tego
parsera wystarczający dla jego własnego configu (/etc/hammer/oci.hk);
jeśli ten config w przyszłości potrzebuje interpolacji czy głębszego
zagnieżdżenia, logika z internal/hk (Go) jest wzorcem do portu na Rust.
Uwaga o strukturze
/etc/hammer/oci.hk: klucze pól (refspec,osname,repo_path,lists_paths,sources_list,sources_dir,keyring_dir,require_gpg) zostały zweryfikowane wprost z binarki wydaniahammerv0.6.0 (strings/readelf), ponieważhammernie publikuje osobnej dokumentacji schematu configu w chwili pisania tego kodu. Grupowanie tych kluczy w sekcje winternal/hkgen/hammer_config.gojest odwzorowaniem analogicznym do poprzedniegodeb-ostree.hk— jeśli faktyczny parserhammeroczekuje innego układu sekcji, dostosujhkgen.GenerateHammerConfig; same klucze są zweryfikowane.
internal/hkgen używa internal/hk do programowego wygenerowania
/etc/hammer/oci.hk (fluent Builder/SectionBuilder API) bez ręcznego
sklejania stringów.
Wersja 0.5.0 ma podstawowy hardening (preflight, lock, timeouty, checksuma,
insecure registry, CI, testy jednostkowe) ale wciąż nie jest przetestowana
end-to-end na realnej maszynie budującej. Pierwszy krok po pobraniu repo:
go mod tidy && go build ./... && go test ./....
-
Realna kompilacja i testy end-to-end na czystej maszynie Debian Kod przeszedł przegląd logiki i testy jednostkowe (
internal/hk,internal/preflight,internal/buildlock,internal/download,internal/config), ale nie był jeszcze uruchomiony jako pełnybuild cloud/build iso/build allna żywej maszynie zdebootstrap. Sprawdź szczególnieinternal/ociimage(zależność odgo-containerregistry— wersje API submodułów mogły się zmienić między wydaniami biblioteki od czasu napisania tego kodu). -
Autoryzacja registry inna niż Basic+token
ociimage.BuildAndPush/PullAndUnpackużywająauthn.Basicz dowolną nazwą użytkownika i tokenem jako hasłem — to działa dlaghcr.io, ale inne registry (Docker Hub, prywatne Harbor) mogą wymagać innego flow (np.authn.Bearer, OAuth2 token exchange). -
Brak walidacji rozmiaru/zawartości rootfs przed push Nie ma sprawdzenia czy rootfs nie jest pusty/uszkodzony przed zapakowaniem do warstwy OCI — błąd w
debootstrapmógłby skutkować pchnięciem zepsutego obrazu do registry. -
checksums.txtmusi zostać opublikowany przez wydaniahammerWeryfikacja SHA256 wdownload.DownloadHammerjest gotowa po stroniehackeros-builder, ale działa tylko jeśli wydaniahammerna GitHub Releases publikują plikchecksums.txtw formaciesha256sum(<hex> oci-mode.tar.gz). Bez tego pliku weryfikacja jest pomijana z ostrzeżeniem — to nie jest błądhackeros-builder, ale wymaga skoordynowanej zmiany w pipeline releasehammer. -
apt/apt-getnadal obecne w obrazie OCI wypychanym przez samobuild cloud(bezbuild iso) Usunięcieapt/apt-getnastępuje winternal/isobuild, PO wstrzyknięciu Calamares, PONIEWAŻ Calamares wciąż go potrzebuje żeby zainstalować siebie i swoje zależności (Xorg, openbox, itd.) w rootfs pociągniętym z registry — apt/apt-get NIE są usuwane już na etapiebuild cloud, bo to złamałoby ten krok. Jeśli obraz OCI ma być wdrażany bezpośrednio (hammer oci deploy ...) bez przechodzenia przez ISO/Calamares, apt/apt-get pozostaną obecne w takim wdrożeniu — docelowo powinno to być finalizowane po stronie samegohammer(analogicznie do tego, jak obrazybootc/rpm-ostreenigdy nie mają menedżera pakietów hosta wewnątrz zbudowanego drzewa).
-
Jedna warstwa OCI dla całego rootfs
createLayerTarballpakuje cały rootfs jako jedną warstwę — proste, ale nieefektywne dlaupgrade(cały obraz trzeba ściągnąć ponownie nawet przy drobnej zmianie). Warstwy przyrostowe (baza / package-lists / hooks) zmniejszyłyby transfer przy aktualizacjach przezhammer. -
Brak weryfikacji podpisów /
--policyprzy pull obrazu OCI Tak jak whammer,PullAndUnpacknie weryfikuje podpisów obrazu (cosign/sigstore). -
Konfigurowalny mirror Debiana
defaultMirrorjest zaszyty na sztywno (deb.debian.org) — warto dodać opcjonalny klucz wconfig.hk(np.[release] -> mirror). -
EFI boot image dla
grub-mkrescueObecna implementacja zakłada, żegrub-mkrescuema dostęp do/usr/lib/grub/x86_64-efi(pakietgrub-efi-amd64-bin) — sprawdzić na docelowym systemie budującym, czy obraz UEFI faktycznie się generuje. -
buildlockjest specyficzny dla Linuksa (syscall.Flock) Nie jest to problem dlahackeros-builder(który i tak wymagadebootstrap/chroot/mount, czyli działa tylko na Linuksie), ale warto to udokumentować jawnie — próbago buildna innym systemie operacyjnym (np. do samych testówinternal/hkna macOS) nie skompiluje całego modułu z powoduinternal/buildlock. -
Brak testów dla
internal/rootfs,internal/ociimage,internal/isobuildTe pakiety wymagają roota i rzeczywistych narzędzi systemowych (debootstrap,mksquashfs) lub żywego registry OCI do przetestowania — nie są łatwe do pokrycia testami jednostkowymi w CI bez kontenera privileged.internal/hk,internal/preflight,internal/buildlock,internal/download,internal/configmają testy; reszta wymaga środowiska integracyjnego (patrz pkt 1).
- Progress indicator dla
debootstrap/mksquashfs/push warstwy OCI — obecnie tylko statyczne logi[INFO]. → Roadmap v0.6.0.
Zrealizowane w v0.1.0 – v0.5.0 (ta runda rozbudowy):
- Sprawdzenie dostępności wymaganych narzędzi na starcie (
internal/preflight) - Timeouty na żądaniach HTTP (
internal/httpclient) - Weryfikacja checksumy SHA256 pobranego archiwum
hammer(oci-mode.tar.gz) - Wsparcie registry self-signed/insecure (
--insecure-registry) - Lockfile na
workDir(internal/buildlock) - Minimalny pipeline GitHub Actions (
go build/go vet/go test/gofmt) - Testy jednostkowe dla
internal/hk,internal/preflight,internal/buildlock,internal/download,internal/config -
main.goprzeniesiony do korzenia repo (obokgo.mod)
Pozostałe pozycje:
- v0.6.0 — Ładny progress indicator (spinner/progress bar) dla
debootstrap,mksquashfs, push/pull warstw OCI — ten sam motyw co whammerroadmap, najlepiej współdzielona biblioteka/styl między obydwoma narzędziami HackerOS. - v0.6.0 — Warstwy OCI przyrostowe (baza / package-lists / hooks) zamiast jednej warstwy na cały rootfs.
- v0.6.0 — Walidacja rozmiaru/zawartości rootfs przed push (ochrona przed wypchnięciem uszkodzonego obrazu do registry).
- v0.7.0 — Konfigurowalny mirror Debiana w
config.hk([release] -> mirror). - v0.7.0 — Weryfikacja podpisów obrazów OCI przy
build iso(cosign/sigstore). - v0.8.0 — Pełne wsparcie interpolacji
${...}wconfig.hkhackeros-buildera (np.${env:GITHUB_TOKEN}zamiast trzymania tokenu w pliku) —internal/hkjuż to wspiera, brakuje testów end-to-end z prawdziwymenv. - v0.9.0 — Wsparcie wielu architektur (
--arch=arm64w debootstrap), obecnie zaszyte naamd64. - v0.9.0 — Testy integracyjne dla
internal/rootfs/internal/ociimage/internal/isobuildw kontenerze privileged (GitHub Actions self-hosted runner lub VM z KVM). - v1.0.0 — Stabilne API CLI, dokumentacja man page, paczka
.debdla samegohackeros-builder.
MIT