Manu

Jak używać Packera do utworzenia "Golden Image" na przykładzie CentOS9 (przykład z VirtualBoxem)? - Plik CFG🛠️

Rozszyfrujemy ks.cfg: Przepis na idealną maszynę! 🧑‍🍳

Rozszyfrujemy plik `ks.cfg`: Przepis na idealną maszynę! 🧑‍🍳

Wyobraź sobie, że chcesz zainstalować system operacyjny (jak Windows, czy Linux) na komputerze. Normalnie klikasz "Dalej", wybierasz język, hasło itp. Plik `ks.cfg` to taki "przepis" 📜, który mówi komputerowi, co ma zrobić automatycznie, bez Twojego klikania! Dzięki niemu, cała instalacja może przebiec sama. To jest super przydatne, gdy chcesz stworzyć wiele identycznych maszyn!

Zacznijmy od góry: Co tam jest napisane? 🤔

Ustawienia podstawowe: Hasła i język 🔐🗣️

  • 🔐 `rootpw --plaintext YOURPASSWORD`: To jak ustawienie głównego hasła dla "administratora" (użytkownika `root`) Twojej nowej maszyny. Pamiętaj, aby zmienić `YOURPASSWORD` na swoje prawdziwe hasło!
  • 🔐 `user --name=vagrant --password=YOURPASSWORD --plaintext`: Tworzy nowego użytkownika o nazwie `vagrant` i od razu nadaje mu hasło (też `YOURPASSWORD`). To jest standardowy użytkownik, którego często używa się w maszynach tworzonych dla deweloperów.
  • 🔐 `keyboard --vckeymap=pl --xlayouts='pl'`: Mówi maszynie, że chcesz używać polskiego układu klawiatury.
  • 🔐 **`lang en_US.UTF-8`**: Ustawia **język systemu na angielski** (amerykański, z odpowiednim kodowaniem znaków). Nawet jeśli masz polską klawiaturę, komunikaty systemowe będą po angielsku.

Sieć i strefa czasowa 🌐⏰

  • 🌐 `firewall --disabled`: Wyłącza zaporę sieciową (firewall). To oznacza, że Twoja maszyna nie będzie blokować połączeń przychodzących i wychodzących. W prawdziwym świecie i dla bezpieczeństwa, zazwyczaj włączamy firewall i konfigurujemy go odpowiednio. Tutaj jest wyłączony dla prostoty.
  • 🌐 `network --bootproto=dhcp --activate --hostname=centos9-stream`: Konfiguruje sieć. `--bootproto=dhcp` oznacza, że maszyna automatycznie dostanie adres IP (tak jak większość urządzeń w Twojej domowej sieci). `--activate` włącza tę konfigurację. `--hostname=centos9-stream` nadaje Twojej maszynie nazwę "centos9-stream".
  • 🌐 `timezone Europe/Warsaw --isUtc`: Ustawia strefę czasową na "Europa/Warszawa" i mówi systemowi, że czas systemowy jest przechowywany w uniwersalnym czasie koordynowanym (UTC).
  • 🌐 `services --enabled="sshd" --disabled="cloud-init,cloud-init-local,cloud-config,cloud-final"`: Określa, które programy (usługi) mają być automatycznie uruchamiane po starcie systemu. Tutaj włączamy `sshd` (czyli serwer SSH, który pozwala łączyć się zdalnie z maszyną) i wyłączamy usługi związane z `cloud-init` (narzędzia do konfiguracji maszyn w chmurze, które często nie są potrzebne w lokalnych VirtualBoxach).

Dyski twarde i instalacja 💾💿

  • 💾 `clearpart --all --initlabel`: Mówi instalatorowi, aby wyczyścił cały dysk i przygotował go do nowej instalacji. Usuwa wszystko, co było wcześniej na dysku!
  • 💾 `autopart --type=plain --nohome`: Nakazuje systemowi, aby automatycznie podzielił dysk na potrzebne fragmenty (partycje). `--nohome` oznacza, że nie zostanie utworzona osobna partycja dla katalogu użytkowników (np. `/home`).
  • 💾 booting `bootloader --location=mbr --boot-drive=sda`: Konfiguruje program rozruchowy (bootloader), który jest odpowiedzialny za uruchamianie systemu operacyjnego. `--location=mbr` oznacza, że bootloader zostanie zainstalowany w głównym rekordzie rozruchowym dysku (MBR), a `--boot-drive=sda` określa, że będzie to pierwszy dysk (`sda`).

Skąd pobierać programy?📦

Tutaj mówimy instalatorowi, gdzie ma szukać programów do zainstalowania.

  • 📦 `repo --name="BaseOS" --baseurl="http://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/"`: Wskazuje, że podstawowe komponenty systemu (BaseOS) znajdują się pod tym adresem internetowym.
  • 📦 `repo --name="AppStream" --baseurl="http://mirror.stream.centos.org/9-stream/AppStream/x86_64/os/"`: Podobnie, informuje o drugim zbiorze programów (AppStream).

⚠️ Ważne: Te adresy internetowe muszą być dostępne podczas instalacji! Jeśli zmienisz wersję CentOSa, adresy mogą się zmienić.

Co zainstalować? 📋

To jest lista wszystkich pakietów (programów i narzędzi), które system ma zainstalować automatycznie.

%packages --ignoremissing
@^minimal-environment # Minimalne środowisko systemu
@core                 # Podstawowe składniki systemu
chrony                # Program do synchronizacji czasu
cloud-init            # Narzędzia do konfiguracji maszyn w chmurze (nawet jeśli wyłączamy ich usługi, pakiety mogą być potrzebne)
openssh-server        # Serwer SSH (do zdalnego łączenia)
openssh-clients       # Klient SSH (do łączenia się z innymi maszynami)
sudo                  # Pozwala użytkownikom uruchamiać polecenia jako administrator
wget                  # Narzędzie do pobierania plików z internetu
curl                  # Narzędzie do komunikacji z serwerami internetowymi
net-tools             # Podstawowe narzędzia sieciowe
rsync                 # Narzędzie do synchronizacji plików i folderów
kernel-headers        # Pliki nagłówkowe jądra (potrzebne do kompilacji niektórych programów)
kernel-devel          # Pliki deweloperskie jądra (podobne do headers)
gcc                   # Kompilator języka C
make                  # Narzędzie do automatyzacji budowania programów
perl                  # Język skryptowy
dmidecode             # Narzędzie do wyświetlania informacji o sprzęcie
-iwl*firmware         # WYKLUCZA pakiety firmware dla kart WiFi (minus oznacza wykluczenie), często niepotrzebne w maszynach wirtualnych
%end
  • 📦 `%packages --ignoremissing`: Rozpoczyna sekcję z listą pakietów. `--ignoremissing` oznacza, że jeśli jakiegoś pakietu nie znajdzie, po prostu go pominie i nie przerwie instalacji.
  • 📦 Nazwy zaczynające się od `@` to grupy pakietów, np. `@^minimal-environment` to minimalny zestaw potrzebny do działania systemu.
  • 📦 Pozostałe to pojedyncze programy, które są instalowane.
  • 📦 `-iwl*firmware`: To ciekawy wyjątek! Znak minusa oznacza, że ten pakiet ma być wykluczony z instalacji. `iwl*firmware` to zazwyczaj oprogramowanie dla kart Wi-Fi Intela. W maszynie wirtualnej rzadko potrzebujemy sterowników do fizycznych kart Wi-Fi, więc ich wykluczenie pomaga zmniejszyć rozmiar maszyny.
  • 📦 `%end`: Kończy sekcję pakietów.

Co zrobić przed instalacją? (Sekcja `%pre`) ⏱️

Ta sekcja jest uruchamiana jeszcze **przed rozpoczęciem właściwej instalacji systemu**. Można tu umieścić różne skrypty, które sprawdzą, czy wszystko jest gotowe do instalacji (np. czy dysk ma odpowiedni rozmiar).

%pre
# Sekcja %pre jest wykonywana przed rozpoczęciem instalacji
# Możesz tu umieścić skrypty sprawdzające środowisko itp.
%end
  • ➡️ W tym konkretnym pliku **`%pre`** jest pusta, ale pokazuje, że taka możliwość istnieje.

Co zrobić po instalacji? (Sekcja `%post`) 🚀🧹

To jest najważniejsza sekcja! Uruchamia się **po zainstalowaniu wszystkich programów**, ale **zanim system zostanie uruchomiony po raz pierwszy**. Tutaj dokonujemy ostatnich szlifów, aby nasza maszyna była idealna.

%post --log=/var/log/anaconda/post-install.log
# Sekcja %post jest wykonywana po zainstalowaniu pakietów, ale przed pierwszym uruchomieniem systemu
# Configure sudo for vagrant user
echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
chmod 0440 /etc/sudoers.d/vagrant

# Install Vagrant public key (for SSH access during provisioning)
mkdir -pm 700 /home/vagrant/.ssh
wget --no-check-certificate \
    https://raw.githubusercontent.com/hashicorp/vagrant/master/keys/vagrant.pub \
    -O /home/vagrant/.ssh/authorized_keys
chmod 0600 /home/vagrant/.ssh/authorized_keys
chown -R vagrant: /home/vagrant/.ssh

# Remove unused services for a cleaner box
systemctl disable firewalld
systemctl stop firewalld

# Clean up dnf cache
dnf clean all

# Zero out the free space to reduce the size of the output VM
# This helps make the .box file smaller and more efficient
dd if=/dev/zero of=/EMPTY bs=1M || true
rm -f /EMPTY

# Remove cloud-init files if not using cloud-init (or reconfigure if needed)
# This prevents issues with subsequent VM clones
rm -rf /var/lib/cloud/instances/*
rm -rf /var/lib/cloud/data/*
rm -rf /var/lib/cloud/sem/*

# Remove SSH host keys - they will be regenerated on first boot for new VMs
rm -f /etc/ssh/ssh_host_*

# Clear log files
for f in $(find /var/log -type f -name '*.log'); do cat /dev/null > "$f"; done
history -c

%end
  • 📝 `%post --log=/var/log/anaconda/post-install.log`: Rozpoczyna sekcję post-instalacyjną, a wszystko, co tu się dzieje, jest zapisywane do pliku logu.
  • 📝 `echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant`: To magiczna linijka! Mówi systemowi, że użytkownik `vagrant` może uruchamiać polecenia jako administrator (`sudo`) BEZ PODAWANIA HASŁA. To jest bardzo wygodne dla deweloperów, ale niebezpieczne w środowiskach produkcyjnych!

    Nigdy nie używaj tego na serwerach produkcyjnych!

  • 📝 `chmod 0440 /etc/sudoers.d/vagrant`: Ustawia odpowiednie, bezpieczne uprawnienia dla tego pliku, aby nikt niepowołany nie mógł go zmieniać.
  • 📝 Instalacja klucza publicznego Vagranta (dla dostępu SSH):
    • `mkdir -pm 700 /home/vagrant/.ssh`: Tworzy ukryty folder `.ssh` w katalogu użytkownika `vagrant` z odpowiednimi uprawnieniami.
    • `wget ... -O /home/vagrant/.ssh/authorized_keys`: Pobiera specjalny klucz publiczny Vagranta z internetu i zapisuje go w pliku `authorized_keys`. Dzięki temu, Vagrant (narzędzie do zarządzania maszynami wirtualnymi) może automatycznie łączyć się z tą maszyną bez pytania o hasło.
    • `chmod 0600 /home/vagrant/.ssh/authorized_keys`: Ustawia bardzo restrykcyjne uprawnienia dla tego klucza, aby tylko użytkownik `vagrant` mógł go odczytać i zapisać.
    • `chown -R vagrant: /home/vagrant/.ssh`: Ustawia właściciela folderu `.ssh` i jego zawartości na użytkownika `vagrant`.
  • 🧹 Porządki w systemie:
    • 🧹`systemctl disable firewalld` i `systemctl stop firewalld`: Wyłącza i zatrzymuje usługę firewalla (zapory sieciowej). Robimy to ponownie, aby upewnić się, że firewall nie będzie działał.
    • 🧹`dnf clean all`: Czyści pamięć podręczną menedżera pakietów `dnf`. Dzięki temu finalny obraz jest mniejszy.
    • 🧹`dd if=/dev/zero of=/EMPTY bs=1M || true` i `rm -f /EMPTY`: To sprytny trik! Te polecenia wypełniają wolne miejsce na dysku zerami, a następnie usuwają ten duży plik. Dzięki temu, gdy Packer "skompresuje" obraz dysku, zajmie on mniej miejsca, ponieważ "puste" obszary wypełnione zerami są łatwiejsze do skompresowania.
    • 🧹`rm -rf /var/lib/cloud/instances/*`, `rm -rf /var/lib/cloud/data/*`, `rm -rf /var/lib/cloud/sem/*`: Usuwa pliki związane z `cloud-init`. Robimy to, aby upewnić się, że maszyna będzie się zachowywać "czysto" przy kolejnych uruchomieniach i klonowaniu.
    • 🧹`rm -f /etc/ssh/ssh_host_*`: Usuwa tzw. klucze hosta SSH. Te klucze są unikalne dla każdej maszyny. Usuwamy je, aby przy pierwszym uruchomieniu nowej maszyny (sklonowanej z tego obrazu) wygenerowały się nowe, unikalne klucze. To ważne dla bezpieczeństwa.
    • 🧹`for f in $(find /var/log -type f -name '*.log'); do cat /dev/null > "$f"; done`: Czyści wszystkie pliki logów w systemie, aby nasz "złoty obraz" był jak najbardziej "świeży" i nie zawierał zbędnych informacji z procesu instalacji.
    • 🧹`history -c`: Czyści historię wpisywanych poleceń z konsoli.
  • 🔚 `%end`: Kończy sekcję post-instalacyjną.

Zakończenie instalacji 🔄

  • 🔄 `reboot`: Na samym końcu, po wykonaniu wszystkich poleceń, maszyna zostanie zrestartowana. Po restarcie będzie już gotowa do użycia!

I to wszystko! Ten plik `ks.cfg` to kompletny przepis na automatyczną instalację i wstępną konfigurację maszyny wirtualnej, dzięki czemu możesz szybko i łatwo tworzyć swoje "złote obrazy" systemów operacyjnych. ✨

Brak komentarzy:

Prześlij komentarz