Initial commit: MAAS-deployable Proxmox VE images with cluster automation

Builds a Proxmox VE image that MAAS can deploy to bare metal, plus first-boot
automation that configures the node and joins it to a Proxmox cluster with no
manual steps.

The image starts from the official Debian cloud image and installs proxmox-ve
on top of it, rather than capturing a raw disk from the Proxmox ISO. That keeps
MAAS in control of partitioning, networking, SSH keys and cloud-init, and makes
moving between Proxmox releases a variable change instead of a rewrite.

Contents:

  * Makefile driving the whole flow: build, verify, preseed, upload
  * customize-proxmox.sh, run inside the Packer build VM, which layers Proxmox
    onto the Debian cloud image and resets the pmxcfs node identity so one image
    can produce many nodes
  * pve-maas-init, a first-boot state machine covering /etc/hosts, node-unique
    identifiers, the root password, vmbr0 conversion, cluster create/join and
    the local-lvm thin pool; each stage is resumable across reboots
  * curtin-hooks, which stops curtin installing a kernel over APT and pins
    interface names by MAC so they match what MAAS recorded at commissioning
  * a MAAS curtin preseed template and cloud-init examples
  * deploy-cluster.sh, which builds a whole cluster through the MAAS API
  * verify-image.sh, 22 static checks on the produced tarball

Cluster identity lives entirely in deploy-time cloud-init user-data, so a single
image and preseed can build any number of independent clusters.

Verified end to end against MAAS 3.7.2: proxmox-ve 9.2.0 / pve-manager 9.2.11 /
kernel 7.0.14-15-pve, deployed to two machines that formed a quorate cluster with
local-lvm on both, with no manual intervention.

The README documents four failure modes found along the way that all fail
silently: curtin rejecting "kernel: null", pvenetcommit overwriting the network
configuration at boot, interface renaming leaving the link down, and a systemd
ordering cycle that made systemd delete the service's start job.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-04 21:50:17 +02:00
commit 3d4841f31c
18 changed files with 3395 additions and 0 deletions

521
README.tr.md Normal file
View File

@@ -0,0 +1,521 @@
> **Not:** Kanonik dokumantasyon [README.md](README.md) (Ingilizce). Bu Turkce
> surum geride kalmis olabilir.
# maas-proxmox
MAAS ile bare-metal sunuculara deploy edilebilen **Proxmox VE** imajlari uretir.
Deploy edilen dugum ilk acilista kendini yapilandirir: `vmbr0` koprusunu kurar,
`local-lvm` thin havuzunu olusturur ve istenirse bir Proxmox kumesine otomatik katilir.
Varsayilan hedef: **Proxmox VE 9.x** (Debian 13 "trixie" tabanli).
---
## Nasil calisiyor?
```
Debian 13 cloud image (qcow2)
├─ packer-maas / debian sablonu (QEMU + KVM)
│ ├─ cloud-init, netplan, curtin uyumlulugu [upstream]
│ ├─ disk/cpu/ram yamasi (4G -> 16G) [bu proje]
│ └─ customize-proxmox.sh [bu proje]
│ ├─ Proxmox APT deposu + anahtarlik
│ ├─ proxmox-default-kernel + proxmox-ve
│ ├─ Debian cekirdegi / os-prober kaldirilir
│ ├─ pmxcfs dugum kimligi sifirlanir
│ └─ overlay: pve-maas-init + systemd unit + curtin-hooks
└─ proxmox-ve-9.tar.gz ──► maas boot-resources create
MAAS deploy (curtin)
pve-maas-init.service (ilk acilis)
hosts → identity → rootpw →
network → cluster → storage
```
Neden Proxmox ISO'su degil de Debian uzerine kurulum? MAAS imaji disk bolumlemesini,
ag yapilandirmasini, kullanici/SSH anahtarlarini ve cloud-init'i **curtin** ile kendisi
yonetir. Debian tabanli imaj bu akisa dogal olarak uyar; ISO'dan yakalanan ham disk
imaji (`dd.gz`) ise MAAS'in disk duzenini tamamen devre disi birakir.
---
## Dogrulanmis durum
Bu depo canli bir ortamda ucdan uca test edildi:
| | |
|---|---|
| Imaj | proxmox-ve 9.2.0 / pve-manager 9.2.11 / kernel 7.0.14-15-pve |
| MAAS | 3.7.2 (snap), Ubuntu 24.04 region+rack |
| Deploy | `custom/proxmox-ve-9`, amd64/generic, LVM duzeni (kok 12GiB) |
| Sonuc | 2 dugumlu kume, `Quorate: Yes`, her iki dugumde `local-lvm` thin havuzu |
| Otomasyon | vmbr0 donusumu, root parolasi, dugum adi, kume olusturma + katilma - hepsi elle mudahalesiz |
## Gereksinimler
**Build host** (imajin derlendigi makine):
* Ubuntu 22.04+ (24.04 LTS onerilir), x86_64
* **Nested virtualization / KVM erisimi** — VM ise CPU tipi `host` olmali
* 4+ vCPU, 8+ GB RAM, 25+ GB bos disk
* `sudo` yetkisi
**Deploy tarafi:**
* MAAS 3.2+ (custom image destegi)
* Curtin 21.0+
* Region controller uzerinde bu depodaki curtin preseed dosyasi (asagida)
---
## Hizli baslangic
```bash
# 1) Build host bagimliliklari (packer, qemu, nbdkit, ovmf, ...)
sudo ./scripts/install-deps.sh
# 2) Imaji derle (~20-40 dk, ag hizina bagli)
sudo make image
# -> build/proxmox-ve-9.tar.gz
# 3) MAAS curtin preseed dosyasini uret
make preseed
# -> build/curtin_userdata_custom_amd64_generic_proxmox-ve-9
# 4) Preseed'i MAAS region controller'a kopyala
sudo make install-preseed
# (varsayilan: /var/snap/maas/current/preseeds/ ; deb kurulumunda
# MAAS_PRESEED_DIR=/etc/maas/preseeds kullanin)
# 5) Imaji MAAS'a yukle
make upload MAAS_PROFILE=admin
```
Ardindan MAAS arayuzunde makineyi deploy ederken OS olarak
**Custom → Proxmox VE 9** secin, ya da CLI ile:
```bash
maas $PROFILE machine deploy $SYSTEM_ID \
osystem=custom distro_series=proxmox-ve-9 \
user_data="$(base64 -w0 maas/examples/01-first-node.yaml)"
```
---
## Makefile degiskenleri
| Degisken | Varsayilan | Aciklama |
|---|---|---|
| `PVE_VERSION` | `9` | Proxmox VE ana surumu (imaj adinda kullanilir) |
| `DEBIAN_SERIES` | `trixie` | PVE'nin dayandigi Debian kod adi |
| `DEBIAN_VERSION` | `13` | Debian ana surum numarasi |
| `PVE_REPO` | `pve-no-subscription` | `pve-no-subscription` / `pve-enterprise` / `pve-test` |
| `PVE_EXTRA_PACKAGES` | `ifupdown2 open-iscsi chrony ...` | Imaja eklenecek ek paketler |
| `IMAGE_NAME` | `proxmox-ve-9` | MAAS'taki `custom/<ad>` ve preseed dosya adi |
| `ARCH` / `BOOT` | `amd64` / `uefi` | Mimari ve onyukleme modu |
| `DISK_SIZE` | `16G` | Build VM disk boyutu (upstream sablondaki 4G yetersiz) |
| `BUILD_CPUS` / `BUILD_MEM` | `4` / `4096` | Build VM kaynaklari |
| `DEBIAN_IMAGE_CHANNEL` | `stable` | `stable` sabit URL kullanir (packer onbellegi isabet eder); `daily` upstream varsayilani |
| `GZIP_LEVEL` | `6` | Tarball sikistirma seviyesi (upstream 9; 6 belirgin hizli, imaj ~%2-3 buyuk) |
| `APT_PROXY` | *(bos)* | Yerel APT onbellegi, or. `http://10.0.2.2:3142` - bkz. `make deps-cache` |
| `PM_REF` | `main` | Kullanilacak `canonical/packer-maas` surumu (dal, etiket ya da commit SHA) |
| `MAAS_PROFILE` | `admin` | `maas` CLI profil adi |
| `MAAS_PRESEED_DIR` | `/var/snap/maas/current/preseeds` | Preseed dizini |
| `TIMEOUT` | `3h` | Packer build zaman asimi |
### Derlemeyi hizlandirma
Sure agirlikli olarak VM icindeki paket kurulumunda geciyor. Uygulanan
optimizasyonlar (varsayilan olarak acik):
* **eatmydata** - dpkg'nin her paket icin yaptigi `fsync` cagrilari devre disi.
Imaj derlemede guvenli, cunku build VM'inin diski zaten atilabilir.
* **initramfs erteleme** - `update-initramfs` kurulum boyunca diverte edilir ve
en sonda yalnizca bir kez calistirilir (cekirdek + firmware + dkms
tetikleyicileri normalde defalarca calistiriyor).
* **Kararli cloud image** - sabit URL sayesinde packer'in onbellegi isabet eder;
`daily` her gun degistigi icin her derlemede ~350MB yeniden inerdi.
* **`GZIP_LEVEL=6`** - upstream `--best` (9) kullaniyor; 6 ile `pigz` cok
cekirdekli calisip belirgin hizlaniyor.
Tekrarlanan derlemeler icin en buyuk ek kazanc yerel APT onbellegi:
```bash
sudo make deps-cache # apt-cacher-ng kurar
sudo make image APT_PROXY=http://10.0.2.2:3142 # ~700MB indirme onbellekten
```
`10.0.2.2`, packer'in user-mode aginda build host'un adresidir. Proxy verildiginde
Debian depolari `https` yerine `http` kullanacak sekilde yeniden yazilir (onbellek
CONNECT tunelini saklayamaz); paket imzalari yine dogrulandigi icin guvenlik
kaybi yoktur.
### Yeni bir Proxmox surumune gecmek
Once ne oldugunu gorun - derleme yapmadan, saniyeler icinde:
```bash
make check-upstream
```
Depodaki guncel `proxmox-ve` / `pve-manager` surumlerini, elinizdeki imajin
kunyesiyle (`/etc/pve-maas/image-info`) yan yana gosterir.
**Durum 1 - ayni Debian tabani icinde surum yukseltmesi (9.2 -> 9.3 -> ...)**
Hicbir sey degistirmeniz gerekmez. Imajda surum sabitlemesi yok; her derleme
depodaki en guncel `proxmox-ve` paketini alir:
```bash
sudo make image && make verify && make upload
```
Imaj adi (`proxmox-ve-9`) ve preseed dosyasi ayni kaldigi icin MAAS'taki kayit
yerinde guncellenir, preseed'e dokunmaniza gerek kalmaz.
**Durum 2 - Debian tabanini degistiren ana surum (or. PVE 10 / Debian 14)**
Bu **otomatik degildir**; bu depodaki degiskenleri degistirmek tek basina yetmez.
Sebep: temel aldigimiz `canonical/packer-maas` sablonunun icinde Debian surumune
ozel sabit kosullar var -
```
debian/scripts/networking.sh: if [ ${DEBIAN_VERSION} == '12' ] || [ ${DEBIAN_VERSION} == '13' ]
debian/scripts/setup-boot.sh: if [ ${DEBIAN_VERSION} == '13' ]
```
Bilinmeyen bir surumde bu kosullar `else` dalina duser ve 2020 tarihli bir
cloud-init paketi kurulur; imaj sessizce bozulur. Bu yuzden ana surum gecisi
**upstream'in yeni Debian'i desteklemesini bekler**. Sirasi:
1. `canonical/packer-maas` yeni Debian'i destekliyor mu?
(`debian/scripts/` icindeki `DEBIAN_VERSION` kosullarina bakin)
2. Proxmox anahtarligi yayinlanmis mi?
`https://enterprise.proxmox.com/debian/proxmox-archive-keyring-<suite>.gpg`
3. Depoda paketler var mi?
`curl -s http://download.proxmox.com/debian/pve/dists/<suite>/Release | grep Components`
4. Sonra:
```bash
sudo make image PVE_VERSION=10 DEBIAN_SERIES=forky DEBIAN_VERSION=14 PM_REF=main
make preseed PVE_VERSION=10
```
Yeni preseed dosyasinin adi da degisir (`..._proxmox-ve-10`) - MAAS'a kurmayi
unutmayin.
### Upstream surum sabitlemesi
`PM_REF`, test edilmis bir `canonical/packer-maas` commit'ine sabitlenmistir.
`main` birakmak, upstream'de yapilan bir degisikligin derlemenizi haber vermeden
bozmasi anlamina gelir. Ileri tasirken `PM_REF=main` ile derleyip **deploy ederek**
test edin, sonra yeni SHA'yi Makefile'a yazin.
---
## Dugumun ilk acilis davranisi
Imajda `pve-maas-init.service` etkin gelir. Servis su asamalari sirayla, her birini
yalnizca bir kez calistirir (`/var/lib/pve-maas/<asama>.done`):
| Asama | Ne yapar |
|---|---|
| `hosts` | `/etc/hosts` icinde `<yonetim-ip> <fqdn> <hostname>` satirini kurar (pvecm bunu sart kosar), postfix `myhostname` degerini duzeltir |
| `identity` | Dugume ozel kimlikleri yeniden uretir (iSCSI IQN) |
| `rootpw` | `root@pam` parolasini ayarlar |
| `network` | MAAS'in yapilandirdigi arayuzu `vmbr0` koprusune donusturur, cloud-init/netplan ag yapilandirmasini devre disi birakir |
| `cluster` | Kume olusturur (`create`) veya mevcut kumeye katilir (`join`) |
| `storage` | VG'deki bos alanda LVM-thin havuzu acar ve `local-lvm` olarak tanimlar |
Bir asama basarisiz olursa servis hata verir ve **sonraki acilista kaldigi yerden
devam eder**. Durum:
```bash
systemctl status pve-maas-init
journalctl -u pve-maas-init -b
ls -l /var/lib/pve-maas/
```
Yapilandirma `/etc/pve-maas/pve-maas.conf` (varsayilanlar) ve
`/etc/pve-maas/conf.d/*.conf` (cloud-init ile yazilan, ezici degerler) dosyalarindan
okunur. Tum secenekler icin [`overlay/etc/pve-maas/pve-maas.conf`](overlay/etc/pve-maas/pve-maas.conf).
### Proxmox + MAAS birlesiminin tuzaklari
Bu imaj asagidaki uc sorunu bilerek cozer. Kendi turevinizi yazacaksaniz
bunlari bozmayin:
**1. systemd siralama dongusu.** `pve-maas-init.service` icin
`After=cloud-final.service` + `WantedBy=multi-user.target` yazmak bu imajda
donguye yol aciyor ve systemd dongoyu kirmak icin *bizim* servisimizi siliyor:
```
multi-user.target: Found ordering cycle on pve-maas-init.service/start
Job pve-maas-init.service/start deleted to break ordering cycle
```
Servis sessizce hic calismaz. Cozum: unit'te cloud-init siralamasi yok;
script kendi icinde `cloud-init status --wait` ile bekliyor.
**2. `pvenetcommit.service`.** Proxmox ag degisikliklerini once
`/etc/network/interfaces.new` dosyasina yazar; `pvenetcommit` her acilista bu
dosyayi `interfaces` uzerine **tasir**. Build sirasinda olusan bir `.new`
dosyasi imajda kalirsa dugumun ilk acilisinda yapilandirmayi ezer. Hem imajda
hem de ag donusumunden sonra siliniyor.
**3. Arayuz adi uyusmazligi.** MAAS commissioning'i Ubuntu ephemeral ortaminda
yapar ve karti orada gordugu adla kaydeder (or. `enp6s18`). Deploy edilen
Debian 13 / Proxmox ise udev'in farkli isimlendirme semasi yuzunden ayni karta
`ens18` diyebilir. Bu durumda cloud-init acilista yeniden adlandirmayi dener,
`[busy]` hatasi alir ve **arayuzu kapali birakir** - dugum agini tamamen
kaybeder:
```
Failed to rename devices: [busy] Error renaming mac=... from ens18 to enp6s18
```
`curtin-hooks`, MAAS'in ag yapilandirmasindaki MAC -> ad eslemesini
`/etc/systemd/network/10-maas-<ad>.link` olarak yazar; udev karti en bastan
dogru adla olusturur ve yeniden adlandirma gerekmez.
### Ilk acilista ag sahipligi
Imaj `networking.service`'i (ifupdown2) **devre disi** ve `/etc/network/interfaces`
dosyasini yalnizca `lo` icerecek sekilde gonderir. Ilk acilista agi tamamen MAAS
yonetir (curtin'in yazdigi netplan + systemd-networkd). `pve-maas-init` ag asamasi
`vmbr0` yapilandirmasini yazdiktan sonra netplan/networkd'yi devre disi birakip
`networking.service`'i kendisi etkinlestirir.
Bu sirala onemli: ifupdown2 etkin gelirse, imajdan gelen eski arayuz tanimiyla
acilista gercek arayuzu kapatir ve dugum daha otomasyon calismadan agini kaybeder.
### Ag donusumu
`PVE_NET_APPLY=reboot` (varsayilan) ile dugum, cloud-init MAAS'a "deploy tamamlandi"
sinyalini gonderdikten **sonra** bir kez yeniden baslar ve `vmbr0` ile acilir.
Yeniden baslatma istemiyorsaniz `PVE_NET_APPLY=reload` ifupdown2'nin `ifreload -a`
komutunu kullanir.
Bond/VLAN gibi karmasik topolojilerde `PVE_NET_MANAGE=false` yapip
`/etc/network/interfaces` dosyasini cloud-init ile kendiniz yazin —
bkz. [`maas/examples/04-advanced-network.yaml`](maas/examples/04-advanced-network.yaml).
### Depolama
MAAS'in disk duzeni bir LVM VG birakiyorsa (MAAS'ta **LVM storage layout** secip
kok LV'yi kucultun), artan alanda `data` adinda bir thin havuz acilir ve `local-lvm`
olarak tanimlanir. Ayri bir disk kullanmak icin:
```
PVE_THINPOOL_DISK=/dev/sdb
PVE_THINPOOL_VG=pve
```
Bos alan `PVE_THINPOOL_MIN_GB` (varsayilan 16 GiB) altindaysa asama sessizce atlanir;
dugum yalnizca dizin tabanli `local` deposuyla calisir.
---
## Kume otomasyonu
`pvecm add` parolayi etkilesimli sorar, bu yuzden ayni isi yapan API ucu kullanilir:
```
pvesh create /cluster/config/join --hostname <peer> --password <pw> --fingerprint <fp>
```
**Ilk dugum** ([`01-first-node.yaml`](maas/examples/01-first-node.yaml)):
```yaml
PVE_CLUSTER_MODE=create
PVE_CLUSTER_NAME=pve-cluster-01
```
**Katilan dugumler** ([`02-join-node.yaml`](maas/examples/02-join-node.yaml)):
```yaml
PVE_CLUSTER_MODE=join
PVE_CLUSTER_PEER=192.0.2.11
PVE_CLUSTER_PEER_PASSWORD='...'
PVE_CLUSTER_FINGERPRINT='AA:BB:...' # onerilir
```
Katilan dugum, hedef dugumun 8006 portu acilana kadar bekler
(`PVE_CLUSTER_WAIT`, varsayilan 900 s) ve basarisiz denemeleri tekrarlar
(`PVE_CLUSTER_RETRIES`). Katilim bittikten sonra `conf.d` icindeki parolalar
temizlenir (`PVE_CLUSTER_WIPE_SECRETS=true`).
### Birden fazla bagimsiz kume
Imaj tamamen jeneriktir - kume kimligi **yalnizca** deploy anindaki cloud-init
user-data'sindan gelir. Ayni imaj ve ayni preseed ile istediginiz kadar ayri
kume kurabilirsiniz; **yeniden derleme gerekmez**.
Elle yapmak zahmetli oldugu icin ([`scripts/deploy-cluster.sh`](scripts/deploy-cluster.sh))
tum akisi otomatiklestirir: ilk dugumu `create` ile deploy eder, ayaga kalkmasini
bekler, sertifika parmak izini okur ve kalan dugumleri o parmak iziyle `join`
modunda deploy eder.
**MAAS region controller uzerinde** calistirin (`maas` CLI profili ve dugumlerin
8006 portuna erisim gerekir):
```bash
# Once ne uretecegini gorun - hicbir sey deploy etmez
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3 --dry-run
# Gercek kurulum
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3
# Ikinci, tamamen bagimsiz kume - ayni imaj, ayni preseed
./deploy-cluster.sh --name pve-dr --nodes dr1,dr2,dr3
```
Listedeki **ilk dugum kumeyi olusturur**, digerleri ona katilir. Her kume kendi
root parolasini alir (vermezseniz uretilir ve ekrana yazilir).
Ayri bir corosync agi kullaniyorsaniz:
```bash
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3 --link0-prefix 10.10.20.
```
Her dugumun o onekle baslayan adresi MAAS'tan bulunup `PVE_CLUSTER_LINK0` olarak
yazilir. (Bu yol henuz canli test edilmedi.)
Cok dugumlu kumelerde `--serial` ile katilanlar teker teker deploy edilir.
Varsayilan paralel moddur; es zamanli katilim denemeleri olursa `pve-maas-init`
zaten 5 kez, 30 saniye arayla tekrar dener.
**Kumeleri MAAS'ta ayirmak icin** etiket kullanmak ise yarar:
```bash
maas $PROFILE tag create name=pve-prod
maas $PROFILE tag update-nodes pve-prod add=$SYSTEM_ID
maas $PROFILE machines read tags=pve-prod | jq -r '.[].hostname'
```
### Guvenlik notlari
* Hedef dugumun **root@pam parolasi duz metin olmak zorundadir** — API dogrulamasi
hash kabul etmez. Bu deger cloud-init user-data icinde MAAS'ta saklanir; MAAS
user-data'ya erisimi olan herkes gorebilir. Kisa omurlu bir parola kullanip
kurulumdan sonra degistirmeyi dusunun.
* `PVE_CLUSTER_FINGERPRINT` vermezseniz parmak izi hedef dugumden okunur (TOFU) —
ilk baglantida MITM'e aciktir. Uretimde parmak izini onceden verin.
* Dugumun kendi `root` parolasi icin `PVE_ROOT_PASSWORD_HASH` kullanin
(`openssl passwd -6`), duz metin `PVE_ROOT_PASSWORD` yerine.
* `PVE_ROOT_PASSWORD*` hic verilmezse root parolasi kilitli kalir: web arayuzune
`root@pam` ile girilemez ve bu dugum baska bir dugumun katilim hedefi olamaz.
---
## Dizin yapisi
```
Makefile derleme / preseed / yukleme hedefleri
scripts/install-deps.sh build host bagimliliklari
scripts/customize-proxmox.sh.in build VM icinde calisan Proxmox kurulum sablonu
scripts/deploy-cluster.sh MAAS uzerinden komple bir kume kurar (cok kumeli senaryolar)
scripts/verify-image.sh uretilen imajin icerik dogrulamasi
overlay/ imaja kopyalanan dosyalar
usr/local/sbin/pve-maas-init ilk acilis durum makinesi
etc/pve-maas/pve-maas.conf varsayilan yapilandirma (tum secenekler)
etc/systemd/system/... pve-maas-init.service
curtin/curtin-hooks curtin'in apt ile cekirdek kurmasini engeller
maas/curtin_userdata_custom.in MAAS curtin preseed sablonu
maas/examples/*.yaml cloud-init user-data ornekleri
build/ uretilen dosyalar (git'e girmez)
```
---
### packer-maas uzerindeki degisiklikler
`make image`, `build/packer-maas` altina klonlanan upstream sablonda tek bir yama
yapar: `debian-cloudimg.pkr.hcl` icindeki `disk_size` (4G -> `DISK_SIZE`), `cpus` ve
`memory` degerleri. Upstream 4G ile gelir; Debian cloud image (~3G) uzerine Proxmox VE
kurulumu bu alana sigmaz. Uretilen `.tar.gz` yalnizca kullanilan dosyalari icerdigi
icin buyuk sanal disk son imaji buyutmez.
Yama her `make image` calistiginda `git checkout -f` sonrasi yeniden uygulanir;
upstream'i `PM_REF` ile bir commit SHA'ya sabitleyerek surprizleri onleyebilirsiniz.
---
## Sorun giderme
**Deploy "Failed deployment" ile bitiyor**
Preseed dosyasi dogru adla region controller'da mi? Ad, yuklenen imajin adiyla
birebir eslesmelidir: `curtin_userdata_custom_<arch>_<subarch>_<image-name>`.
`make preseed` ciktisindaki dosya adini kullanin.
**Deploy tamam ama web arayuzune girilemiyor**
`root@pam` parolasi ayarlandi mi? `journalctl -u pve-maas-init -b | grep rootpw`.
Ayrica `vmbr0` ayaga kalkmis mi: `ip -br addr`.
**Dugum kumeye katilmadi**
`journalctl -u pve-maas-init -b` ciktisina bakin. Sik nedenler: hedef dugum 8006'da
erisilemiyor, root parolasi yanlis, parmak izi eslesmiyor, ya da hedef dugumun
`/etc/hosts` kaydi eksik oldugu icin `pvecm` orada hata veriyor.
Servisi elle tekrar calistirmak icin:
```bash
rm -f /var/lib/pve-maas/cluster.done /var/lib/pve-maas/complete
systemctl start pve-maas-init
```
**Deploy "Deployed" diyor ama dugume hic erisilemiyor**
Dugumun konsoluna bakin (Proxmox'ta `qm terminal <vmid>`). Login istemi geliyorsa
sistem acilmis, sorun agda demektir. Kurtarma modunda diski inceleyin:
```bash
maas $PROFILE machine rescue-mode $SYSTEM_ID
# ephemeral ortama SSH ile baglanip:
mount /dev/vgroot/lvroot /mnt/t
cat /mnt/t/etc/network/interfaces # vmbr0 yazilmis mi?
ls -l /mnt/t/var/lib/pve-maas/ # hangi asamalar tamamlandi?
cat /mnt/t/var/log/cloud-init-output.log # cloud-init user-data'yi aldi mi?
journalctl -D /mnt/t/var/log/journal -u pve-maas-init
```
`/var/lib/pve-maas/` bosken ag da kapaliysa, `networking.service` ile MAAS'in
netplan yapilandirmasi cakisiyor demektir; imajda bu servis devre disi olmali.
**Dugum adi imajdaki hostname olarak gorunuyor**
Olmamasi gerekir — pmxcfs veritabani imajdan silinir ve ilk acilista guncel
hostname ile yeniden uretilir. Boyle bir durumda `/var/lib/pve-cluster/config.db`
imajda kalmis demektir; `make image` ciktisinda "Proxmox dugum kimligi sifirlaniyor"
adimini kontrol edin.
**Deploy "Installing OS" sonrasi "Configuring OS" asamasinda patliyor**
Kurulum kaydina bakin:
```bash
maas $PROFILE node-script-result download $SYSTEM_ID current-installation \
filetype=txt filters=/tmp/install.log output=all | tail -60
```
`install_kernel -> AttributeError: 'NoneType' object has no attribute 'get'`
goruyorsaniz preseed'de `kernel: null` kullanilmis demektir. MAAS ile gelen
curtin surumlerinin bir kismi bunu desteklemez. Bu depodaki preseed bunu
kullanmaz; cekirdek kurulumu imajdaki `/curtin/curtin-hooks` ile devre disi
birakilir. Preseed'i elle duzenlediyseniz geri alin.
**Build "proxmox-ve paketi bulunamadi" diyor**
`PVE_SUITE`/`DEBIAN_SERIES` ile `PVE_REPO` uyumsuz. Depoyu dogrulayin:
`curl -s http://download.proxmox.com/debian/pve/dists/<suite>/Release | grep Components`
---
## Kaynaklar
* [canonical/packer-maas](https://github.com/canonical/packer-maas) — temel Packer sablonlari (AGPL-3.0)
* [MAAS: Build custom images](https://canonical.com/maas/docs/how-to-build-custom-images)
* [Proxmox VE: Install on Debian](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie)
* [Proxmox VE: Cluster Manager](https://pve.proxmox.com/wiki/Cluster_Manager)
* [pvecm(1)](https://pve.proxmox.com/pve-docs/pvecm.1.html)