Masz do zainstalowania wiele maszyn z Ubuntu 24.04 i nie chcesz każdej instalować ręcznie? Chcesz zautomatyzować proces i stworzyć gotowe ISO, które samo się instaluje? Ten przewodnik pokaże Ci krok po kroku, jak to zrobić – od konfiguracji autoinstall.yaml po modyfikację obrazu ISO.

Poradnik jest przeznaczony dla Ubuntu 24.04 oraz nowszych. 
Starsze wersje Ubuntu (do 20.04) korzystają z mechanizmu preseed, 
który nadal działa poprawnie i nie jest omawiany w tym dokumencie.

Wyróżnię trzy najpopularniejsze metody wykorzystania pliku autoinstall jego pobrania i uruchomienia przez instalator.

Na początku omówmy, czym jest plik autoinstall.

Autoinstall to zestaw komend przekazywanych do instalatora, który pozwala na pełną lub częściową automatyzację instalacji. Odnosi się to do tworzenia użytkowników, sposobu partycjonowania dysku, instalacji pakietów czy szyfrowania instalacji. Jest połączony z mechanizmem cloud-init, który wykorzystywany jest w środowiskach serwerowych.

Pełny opis znajdziesz na oficjalnej stronie. Pamiętaj, że Canonical stale rozwija autoinstall.yaml, dlatego przed wdrożeniem sprawdź aktualną dokumentację:

https://canonical-subiquity.readthedocs-hosted.com/en/latest/reference/autoinstall-reference.html

Na potrzeby tego poradnika wykorzystamy następujący plik autoinstall.yaml:

#cloud-config
autoinstall:
  version: 1
  storage:
    layout:
      name: lvm
      sizing-policy: all
  keyboard:
    layout: pl
    toggle: null
    variant: ''
  locale: pl_PL
  identity:
    realname: 'John Doe'
    hostname: macpro
    username: john
    password: $y$j9T$SB516meRbmpCmIEK86UeC1$7bqarQ6Q1BQneUA/osert66GP8NqwN6BXaNEPKIss/4
  updates: all
  codecs:
    install: true
  drivers:
    install: true
  snaps:
    - name: code
      channel: stable
      classic: true
  packages:
    - vim
    - wget
    - preload
    - btop
    - gnome-sushi
  timezone: "Europe/Warsaw"
  shutdown: reboot
  late-commands:
    - curtin in-target -- sh -c "yes | apt install $(check-language-support -l pl)"
    - curtin in-target -- sh -c "update-locale LANG=pl_PL.UTF-8"
    - curtin in-target -- sh -c "sed -i 's/\(GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*\)/\1 pci=nomsi/' /etc/default/grub"
    - curtin in-target -- sh -c "update-grub"
    - curtin in-target -- sh -c "wget -qO /tmp/google-key.pub https://dl.google.com/linux/linux_signing_key.pub"
    - curtin in-target -- sh -c "cat /tmp/google-key.pub | gpg --dearmor > /usr/share/keyrings/google-chrome-keyring.gpg"
    - curtin in-target -- sh -c "echo 'deb [signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main' > /etc/apt/sources.list.d/google-chrome.list"
    - curtin in-target -- sh -c "apt update && apt install -y google-chrome-stable"
Hasło użytkownika to: pass
Wygenerowane poleceniem: mkpasswd z pakietu whois
sudo apt install whois

Ten przykładowy plik jest przygotowany do instalacji Ubuntu na komputerze MacBook Pro 2011, rozwiązując ewentualne problemy użytkownika takie jak:

  • instalacja sterowników karty wifi
  • pełna aktualizacja podczas instalacji
  • dodanie parametrów do kernela w celu usprawnienia obsługi karty sieciowej
  • instalacja dodatkowych pakietów
  • instalacja Google Chrome
  • instalacja języka Polskiego

Plik ten możemy podać do instalatora podczas instalacji, poprzez link do zewnętrznego serwera dla przykładu:

http://horoszkiewicz.eu/cdn/ubuntu/autoinstall.yaml

To rozwiązanie jest uniwersalne, jeśli nie mamy personalizowanego obrazu iso. Pobieramy go bezpośrednio ze strony www:

https://ubuntu.com/download/desktop

Metoda nie sprawdza się w przypadku instalacji nienadzorowanych, gdy musimy wdrożyć wiele komputerów. Może znacząco wydłużyć czas wdrażania i wymaga dodatkowej pracy zespołu IT.

W takim wypadku, lepszym rozwiązaniem będzie edycja pliku iso i przygotowanie obrazu personalizowanego w którym:

-> Podamy plik lokalnie, modyfikując wpisy w programie uruchomieniowym grub

-> Podamy zdalny adres pod którym instalator będzie szukał plików konfiguracyjnych

W przypadku tej drugiej opcji struktura trochę się różni na zdalnym serwerze:

https://horoszkiewicz.eu/cdn/ubuntu/

Muszą znajdować się dwa pliki:

ubuntuauto
├── meta-data # Plik może być pusty, dla instalacji takiej jak w przykładzie.
└── user-data # powinien zawierać tylko `autoinstall.yaml`, jeśli celem jest automatyczna instalacja.

Ważne: W przypadku wykorzystania tych plików z mechanizmem cloud-init zawartość tych plików może być inna. Dlatego możesz znaleźć inne informacje na ich temat w sieci.

Przygotowanie ISO

Pobranie plików z ISO

W tym przykładzie zakładam, że znajdujemy się w katalogu:

/home/user/work/ubuntuiso

Tutaj pobieramy najnowsze dostępne ISO Ubuntu Desktop. Musimy jeszcze utworzyć katalog src, w którym zamieścimy pliki, które umieścimy w naszym iso.

mkdir src

Następnie instalujemy potrzebne oprogramowanie do edycji ISO:

sudo apt install xorriso genisoimage vim

edytor vim możesz zmienić na swój ulubiony :)

Teraz potrzebujemy pobrać z obecnego iso dwa pliki

/boot/grub/grub.cfg
md5sum.txt
isoinfo -i ubuntu-24.04.2-desktop-amd64.iso -x "/BOOT/GRUB/GRUB.CFG;1" > src\boot\grub\grub.cfg

isoinfo -i ubuntu-24.04.2-desktop-amd64.iso -x "/MD5SUM.TXT;1" > src\md5sum.txt

Listowanie zawartości ISO uzyskasz komendą:

isoinfo -i ubuntu-24.04.2-desktop-amd64.iso -l

Edycja grub.cfg

Do pliku grub.cfg dodajemy potrzebne dla nas konfiguracje:

Duplikujemy wpis (tyle razy ile potrzebujemy opcji wyboru instalacji):

menuentry "Try or Install Ubuntu" {
	set gfxpayload=keep
	linux	/casper/vmlinuz  --- quiet splash
	initrd	/casper/initrd
}

Nowy wpis edytujemy dla lokalnego pliku autoinstall.yaml:

menuentry "Install Ubuntu from autoinstall.yaml" {
	set gfxpayload=keep
	linux	/casper/vmlinuz autoinstall subiquity.autoinstallpath=/cdrom/autoinstall/autoinstall.yaml  --- quiet splash
	initrd	/casper/initrd
}

autoinstall subiquity.autoinstallpath=/cdrom/autoinstall/autoinstall.yaml oznacza, że Ubuntu pobierze plik z naszego ISO.

lub dla plików ze zdalnego serwera wwww:

menuentry "Install Ubuntu from remote" {
	set gfxpayload=keep
	linux	/casper/vmlinuz autoinstall ds=nocloud-net\;s=https://horoszkiewicz.eu/ubuntuauto/  --- quiet splash
	initrd	/casper/initrd
}

autoinstall ds=nocloud-net;s=URL – oznacza, że Ubuntu użyje cloud-init, aby pobrać pliki user-data i meta-data z podanego URL.

WAŻNE!!!

Zwróć uwagę na literówki, jeśli popełnisz błąd w składni instalator nie wykryje poprawnie Twoich plików.

Teraz musimy umieścić te pliki w naszym nowym ISO. Upewnij się, że w katalogu “src” znajdują się wymagane oraz odpowiednio przygotowane pliki:

src
├── autoinstall
│   └── autoinstall.yaml
├── grub
│   └── grub.cfg
└── md5sum.txt

Naprawa sum kontrolnych

ISO Ubuntu zawiera plik md5sum.txt, który przechowuje sumy kontrolne plików. Jeśli zmodyfikujesz grub.cfg lub dodasz plik autoinstall.yaml, musisz zaktualizować sumy kontrolne, aby instalator nie zgłaszał błędu.

Tutaj znajduje się przykładowy skrypt, który wykona to za Ciebie:

Zapisz go jako md5fix.sh wydaj polecenie:

chmod +x md5fix.sh
./md5fix.sh
#!/bin/bash

cd src || exit 1

# Sprawdzenie, czy istnieje md5sum.txt
if [[ ! -f md5sum.txt ]]; then
    echo "Brak pliku md5sum.txt. Utwórz go przed uruchomieniem skryptu."
    exit 1
fi

# Tymczasowy plik do przechowywania nowych sum kontrolnych
tmpfile=$(mktemp)

# Oblicz MD5 dla wszystkich plików poza md5sum.txt i zapisz do tymczasowego pliku
find . -type f ! -name 'md5sum.txt' -exec md5sum {} \; > "$tmpfile"

# Aktualizacja istniejących wpisów w md5sum.txt
cat md5sum.txt "$tmpfile" | awk '
{
    sum[$2] = $1  # Przechowujemy sumy kontrolne dla każdej ścieżki pliku
}
END {
    for (file in sum)
        print sum[file], file
}' > md5sum.txt.tmp

mv md5sum.txt.tmp md5sum.txt

rm -f "$tmpfile"

Przygotowanie finalnego ISO

Komenda generowania nowego ISO:

xorriso \
  -indev "ubuntu-24.04.2-desktop-amd64.iso" \
  -outdev "ubuntu2404_autoinstall.iso" \
  -volid "ubuntu_autoinstall" \
  -map "src/autoinstall/autoinstall.yaml" "/autoinstall/autoinstall.yaml" \
  -map "src/boot/grub/grub.cfg" "/boot/grub/grub.cfg" \
  -map "src/md5sum.txt" "/md5sum.txt" \
  -boot_image any replay

Weryfikacja poprawności ISO

To polecenie wygeneruje nowe ISO, musimy jeszcze sprawić by nie miało błędów z GPT.

fdisk -l ubuntu2404_autoinstall.iso
sgdisk --move-second-header ubuntu2404_autoinstall.iso
fdisk -l ubuntu2404_autoinstall.iso

Powinno końcowo zwrócić:

Dysk ubuntu2404_autoinstall.iso: 5,91 GiB, bajtów: 6342377472, sektorów: 12387456
Jednostki: sektorów, czyli 1 * 512 = 512 bajtów
Rozmiar sektora (logiczny/fizyczny) w bajtach: 512 / 512
Rozmiar we/wy (minimalny/optymalny) w bajtach: 512 / 512
Typ etykiety dysku: gpt
Identyfikator dysku: 6E354C03-737C-42ED-AFBF-6D3A77445469

Urządzenie                         Początek   Koniec  Sektory Rozmiar Typ
mavops_ubuntu2404_autoinstall.iso1       64 12376631 12376568    5,9G Microsoft - dane podstawowe
mavops_ubuntu2404_autoinstall.iso2 12376632 12386775    10144      5M System EFI

Teraz wszystko jest gotowe. Wypal iso na dysk USB przy użyciu swojej ulubionej metody, np. balena etcher i sprawdź jak działa automatyzacja.

Ewentualne problemy:

Nazwy plików

Nazwa pliku autoinstall.yaml może być dowolna, we wskazanym przez Ciebie katalogu możesz mieć różne pliki np:

macbookpro.yaml
szyfrowanainstalacja.yaml

Ważne, aby wpisy w w grub.cfg poprawnie wskazywały te pliki. Jeśli instalator z jakiegoś powodu nie działa automatycznie to właśnie przez błąd w ich wskazaniu.

Weryfikacja składni

Pamiętaj, że plik autoinstall.yaml to plik YAML, jego składnia ma ogromne znaczenie. Błąd w formatowaniu sprawi, że automatyzacja nie będzie działać.

Możesz użyć narzędzi takich jak yamllint lub cloud-init schema w celu sprawdzenia czy składnia jest prawidłowa.

Możesz też zrobić to tak:

python3 -c "import yaml, sys; yaml.safe_load(open('autoinstall.yaml'))"

Jeśli nie zwróci błędu formatowanie powinno być dobre. Wcześniej wspomniane narzędzia są bardziej dokładne, ale ich rady nie są zawsze trafne w przypadku tego pliku konfiguracyjnego.

W sieci znajdziesz narzędzie online takie jak:

https://www.yamllint.com/

XORRISO

xorriso musi być w możliwie najnowszej wersji dostępnej z repozytorium.

Wspierane wersje

Oraz ostatnia ważna kwestia, przygotowanie automatyzacji z mojego doświadczenia najlepiej robić na tej samej wersji systemu, którą będziemy automatyzować. To znacznie zmniejszy nam ewentualne problemy z debugowaniem komend i zależności pakietów. Dlatego jak szykujesz Ubuntu 24.04 zrób to na Ubuntu 24.04 a nie na 18.10. Nie twierdzę, że nie będzie to działać, ale może sprawić problemy. Poradnik jest dla Ubuntu 24.04 i nowszych.