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!
Pliki zarówno hcl jak i cfg można znaleźć w moim repo: GitHub Repo 🔗
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