LegendaryOS Builder to narzędzie wiersza poleceń napisane w Go, które pozwala zbudować własną dystrybucję Linuksa opartą na Fedorze z jednego pliku konfiguracyjnego config.toml.
Pipeline budowania składa się z dwóch etapów:
config.toml
│
├─► build cloud ──► Containerfile ──► podman build ──► obraz OCI (ghcr.io)
│ (immutable: fedora-bootc + ostree commit)
│ (classic: plain fedora, bez ostree)
│
└─► build iso ───► bootc-image-builder ──► .isoObraz OCI w trybie domyślnym jest tworzony za pomocą bootc, co oznacza, że system operacyjny może być aktualizowany atomowo przez bootc upgrade.
W trybie classic budowany jest standardowy obraz kontenera Fedory bez ostree.
| Narzędzie | Uwagi |
|---|---|
Fedora 44+ (host) |
Wymagane dla |
|
Wymagane. |
|
Wymagane dla |
Go 1.22+ |
Tylko do kompilacji buildera |
Ruby |
Wymagane do uruchomienia |
|
Do podpisywania obrazów: |
|
Note
|
|
git clone https://github.com/LegendaryOS-Linux-System/legendaryos-builder
cd legendaryos-builder
# Buduj i instaluj (Ruby)
ruby build.rb install
# lub przez go bezpośrednio
go build -o legendaryos-builder .
sudo install -m 0755 legendaryos-builder /usr/local/bin/legendaryos-buildercurl -fsSL \
https://github.com/LegendaryOS-Linux-System/legendaryos-builder/releases/latest/download/legendaryos-builder-linux-amd64.tar.gz \
-o /tmp/legendaryos-builder.tar.gz
tar -xzf /tmp/legendaryos-builder.tar.gz -C /tmp
sudo install -m 0755 /tmp/legendaryos-builder /usr/local/bin/legendaryos-builder
legendaryos-builder version# 1. Utwórz katalog projektu
mkdir my-os && cd my-os
# 2. Inicjalizacja projektu (interaktywny wizard)
legendaryos-builder init --fast
# 3. Edytuj konfigurację
$EDITOR config.toml
# 4. Zbuduj obraz OCI
legendaryos-builder build cloud
# 5. Zbuduj ISO (wymaga sudo)
sudo legendaryos-builder build isoPo legendaryos-builder init katalog projektu wygląda następująco:
my-os/
├── config.toml ← główna konfiguracja
├── user.toml ← dane osobiste (gitignored)
├── build.rb ← opcjonalny własny skrypt budowania
├── packages/
│ ├── install.packages ← pakiety DNF do instalacji
│ ├── remove.packages ← pakiety DNF do usunięcia
│ ├── flatpak.packages ← aplikacje Flatpak (stosowane przy instalacji OS)
│ ├── flatpak.remove.packages ← aplikacje Flatpak do usunięcia (przy instalacji OS)
│ └── *.rpm ← lokalne pliki .rpm (opcjonalnie)
├── files/
│ ├── before/ ← overlay przed instalacją pakietów
│ └── after/ ← overlay po instalacji pakietów
├── scripts/
│ ├── pre/ ← skrypty na HOŚCIE przed buildem
│ ├── before/ ← skrypty w kontenerze PRZED dnf install
│ └── after/ ← skrypty w kontenerze PO dnf install
├── repos/ ← niestandardowe pliki .repo
├── .github/workflows/
│ └── build-cloud.yml ← GitHub Actions CI
└── build/
├── cache/
└── output/ ← końcowe .isoPlik config.toml jest jedynym miejscem, gdzie konfigurujesz swój system operacyjny.
Pola version, tag i product_version przyjmują:
-
Numery semver:
0.1.0,1.2.3,44 -
Symboliczne etykiety kanałów:
stable,beta,alpha,nightly,latest,edge,dev
[project]
version = "stable" # etykieta kanału → tag OCI: ghcr.io/org/myos:stable
# lub
version = "0.1.0" # semver → tag OCI: ghcr.io/org/myos:0.1.0[project]
name = "LegendaryOS"
version = "stable" # semver lub: stable | beta | alpha | nightly | latest | edge | dev
description = "Fedora-based OS"
author = "LegendaryOS-Linux-System"
license = "GPL-3.0"
base_distro = "fedora"
base_version = 44 # minimalna wersja: 44
arch = "x86_64"
# special_type — tryb budowania:
# "default" (lub brak) → Fedora immutable (bootc/ostree) — zachowanie jak dotychczas
# "classic" → zwykła, mutowalna Fedora (tradycyjny system RPM, bez bootc)
special_type = "default"| Wartość | Opis |
|---|---|
|
Fedora immutable — obraz bazuje na |
|
Zwykła mutowalna Fedora — obraz bazuje na |
[system]
hostname = "legendaryos"
locale = "pl_PL.UTF-8"
language = "pl_PL:pl:en_US:en"
timezone = "Europe/Warsaw"
keyboard = "pl"
selinux = "enforcing" # enforcing | permissive | disabled
firewall = true
services_enable = ["sshd", "NetworkManager", "bluetooth"]
services_disable = ["ModemManager"][desktop]
environment = "kde" # gnome | kde | xfce | cinnamon | mate | lxqt | cosmic | none
display_server = "wayland" # wayland | x11 | both
auto_login = false
auto_login_user = ""Sekcja [boot] działa jak dotychczas gdy [bootloader] jest wyłączony lub nieobecny.
[boot]
bootloader = "grub2"
kernel_args = "quiet splash mitigations=off"
splash = true
timeout = 5Nowa, opcjonalna sekcja pozwalająca wybrać alternatywny bootloader.
Gdy enabled = false (lub sekcja jest nieobecna) zachowanie jest identyczne jak dotychczas — rządzi boot.bootloader.
[bootloader]
enabled = true
# type: grub2 | refind | limine | systemd-boot | syslinux
type = "systemd-boot"
# Dodatkowe argumenty kernela dołączane gdy ten bootloader jest aktywny
extra_args = ""
# Dodatkowe pakiety DNF instalowane dla tego bootloadera
install_packages = []
# Katalog partycji EFI (domyślnie /boot/efi)
efi_dir = "/boot/efi"| Wartość | Opis |
|---|---|
|
GRUB 2 — takie samo zachowanie jak |
|
rEFInd — menedżer rozruchu EFI |
|
Limine — nowoczesny bootloader |
|
systemd-boot (sd-boot) |
|
SYSLINUX / ISOLINUX |
[anaconda]
enabled = true
product_name = "LegendaryOS"
product_version = "stable" # mirrors project.version
webui = true
default_lang = "pl_PL.UTF-8"
default_keyboard = "pl"
default_timezone = "Europe/Warsaw"
root_password_lock = true
default_user = "user"
default_user_groups = ["wheel", "audio", "video", "gamemode", "input", "render"][build]
output_dir = "build/output"
cache_dir = "build/cache"
compression = "zstd" # zstd | xz | gzip
iso_label = "LEGENDARYOS"
iso_filename = "" # puste = auto-generowane
jobs = 4
filesystem = "ext4" # ext4 | xfs | btrfs[nvidia]
enabled = true
open_driver = false
blacklist_nouveau = true
enable_kms = true
install_nvidia_settings = true
install_vaapi = true
install_vulkan = true
install_cuda = false[container]
enabled = true
registry = "repo"
repo = "LegendaryOS-Linux-System/legendaryos"
image = "legendaryos"
tag = "stable"
push = false
sign_image = false
bootc_mode = true[[branch]]
name = "gnome"
display_name = "LegendaryOS GNOME Edition"
desktop = "gnome"
tag = "stable-gnome"
enabled = true
extra_packages = ["@gnome-desktop-environment"]
remove_packages = ["@kde-desktop-environment"]legendaryos-builder <polecenie> [flagi]| Polecenie | Opis |
|---|---|
|
Buduje obraz bootc/classic OCI za pomocą podman |
|
Buduje i wysyła do ghcr.io |
|
Buduje, wysyła i podpisuje przez cosign |
|
Buduje bez cache’u warstw |
|
Tryb release: squash warstw, usunięcie symboli debugowania |
|
Buduje bootowalne ISO z obrazu OCI |
|
ISO z konkretnego obrazu OCI |
|
Zapis ISO pod wskazaną ścieżkę |
|
Pełny pipeline: cloud --push + iso |
|
Uruchamia |
|
Wyświetla wszystkie dostępne zadania zdefiniowane w |
|
Wyświetla dostępne subkomendy |
|
Uruchamia wskazany plik zamiast |
|
Interaktywny edytor TUI konfiguracji |
|
Inicjalizuje scaffold projektu |
|
Interaktywny wizard (zadaje pytania) |
|
Sprawdza konfigurację bez budowania |
|
Wyświetla informacje o projekcie i listę pakietów |
|
Usuwa |
|
Usuwa cały katalog |
|
Instaluje zależności na hoście (Fedora) |
|
Instaluje również cosign |
|
Wyświetla wersję buildera |
Flaga |
Opis |
|
Pełne wyjście poleceń |
|
Tryb release |
|
Wyłącza cache warstw podman |
Jeden pakiet DNF na linię. Komentarze zaczynają się od #. Grupy pakietów mają prefiks @.
bash-completion
curl
git
@kde-desktop-environment
# to jest komentarz|
Note
|
Pliki |
# packages/flatpak.packages
com.visualstudio.code
com.spotify.Client
com.discordapp.DiscordDrzewa plików nakładane na obraz kontenera — before/ przed instalacją pakietów, after/ po instalacji.
| Katalog | Kiedy uruchamiany |
|---|---|
|
Na HOŚCIE przed jakimkolwiek krokiem budowania |
|
W kontenerze PRZED |
|
W kontenerze PO |
Obsługiwane rozszerzenia: .sh, .py, .pl, .rb. Skrypty są sortowane i wykonywane alfabetycznie.
Opcjonalny plik build.rb umieszczony obok config.toml jest uruchamiany przez polecenie legendaryos-builder build (bez żadnych argumentów).
# Uruchom build.rb
legendaryos-builder build
# Wyświetl wszystkie zadania zdefiniowane w build.rb
legendaryos-builder build ;;
# Wyświetl subkomendy build.rb (--help)
legendaryos-builder build ''
# Uruchom własny plik zamiast build.rb
legendaryos-builder build -_ myscript.rb
legendaryos-builder build -_ scripts/custom-build.rbDomyślny tryb. Obraz bazuje na quay.io/fedora/fedora-bootc:<wersja>.
Containerfile kończy się RUN ostree container commit.
System może być aktualizowany atomowo przez bootc upgrade.
Tryb klasyczny. Obraz bazuje na registry.fedoraproject.org/fedora:<wersja>.
Brak ostree — standardowy, mutowalny system RPM identyczny z tradycyjną instalacją Fedory.
Containerfile nie zawiera ostree container commit.
[project]
special_type = "classic" # zwykła Fedora
# lub
special_type = "default" # immutable bootc (domyślnie)Sekcja [bootloader] jest opcjonalna. Gdy nieobecna lub enabled = false, builder zachowuje się identycznie jak przed jej dodaniem — rządzi boot.bootloader.
[bootloader]
enabled = true
type = "systemd-boot"
extra_args = "mitigations=off"
install_packages = ["efi-filesystem"]
efi_dir = "/boot/efi"[bootloader]
enabled = true
type = "refind"
efi_dir = "/boot/efi"[bootloader]
enabled = true
type = "limine"legendaryos-builder init generuje .github/workflows/build-cloud.yml. Workflow:
-
Pobiera binarkę
legendaryos-builder -
Instaluje podman
-
Loguje się do
ghcr.io -
Oblicza tag obrazu (tag git lub
latest) -
Uruchamia
legendaryos-builder validate -
Uruchamia
legendaryos-builder build cloud --push -
Podpisuje obraz przez cosign (Sigstore)
Plik user.toml przechowuje dane osobiste i jest automatycznie pomijany przez .gitignore.
[github]
type = "org"
name = "moja-organizacja"
token = "" # zostaw puste — builder zapyta interaktywnie
# lub użyj zmiennej środowiskowej GITHUB_TOKENToken można podać przez zmienną środowiskową:
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
legendaryos-builder build cloud --push# Dev build
ruby build.rb
# Release binary + tarball + checksum
ruby build.rb release
# Instalacja do /usr/local/bin
ruby build.rb install
# Wszystkie testy
ruby build.rb test
# Formatowanie kodu
ruby build.rb fmt
# Sprawdzanie kodu
ruby build.rb vetlegendaryos-builder/
├── main.go
├── go.mod
├── build.rb ← skrypt budowania (zastępuje Makefile)
├── config.toml ← przykładowa konfiguracja projektu
├── src/
│ ├── builder/
│ │ ├── cloud.go ← CloudBuilder (podman build/push/sign)
│ │ │ obsługuje tryb immutable i classic
│ │ ├── iso.go ← ISOBuilder (bootc-image-builder)
│ │ └── kickstart.go ← generator kickstarta Anaconda
│ │ (Flatpak stosowany w %post)
│ ├── cli/
│ │ ├── cli.go ← dispatcher poleceń + obsługa build.rb
│ │ ├── init.go ← scaffold projektu + szablony
│ │ ├── settings.go ← interaktywny edytor konfiguracji TUI
│ │ └── secret.go ← czytanie hasła bez echa (POSIX termios)
│ ├── config/
│ │ ├── config.go ← parser TOML + struktury + BootloaderConfig
│ │ │ + SpecialType + VersionTag
│ │ └── user.go ← parser user.toml
│ └── ui/
│ ├── ui.go ← TUI: kolory, paski postępu, podsumowanie buildu
│ └── usage.go ← pomoc / instrukcja użycia