sexta-feira, 27 de junho de 2025

Fedora CoreOS

Para usar o Fedora Core é necessário criar um arquivo de inicialização semelhante à ideia do Cloud-init.

Mas o arquivo de configuração YAML (YAML Ain't Markup Language) é conhecido como Butane.

Esse arquivo precisa ser convertido para JSON, conhecido como Ignition.

Para definir a senha no arquivo, é preciso criar o hash usado no Linux. Uma forma de fazer isso é usando Podman:

podman run -ti --rm quay.io/coreos/mkpasswd --method=yescrypt

Exemplo do arquivo Butane que eu usei:

variant: fcos
version: 1.6.0
passwd:
  users:
    - name: core
      ssh_authorized_keys:
        - ssh-ed25519 AAAAC3NzaXXXXXXXXXXXXXXXII/RsHt5CL/v5juZaj+qmQfw9G+n6J24PzTLu+hIuMOd
      password_hash: $y$j9T$GNBLbCycFxXXXXni1hs.$GHx/wq5SwJpqyXXXXXXXXXXtfDY9nSYqLx7jqpt2w99
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: fcos01
    - path: /etc/vconsole.conf
      mode: 0644
      contents:
        inline: |
          KEYMAP=br-abnt2
systemd:
  units:
    - name: "install-qemu-guest-agent.service"
      enabled: true
      contents: |
        [Unit]
        Description=Ensure qemu-guest-agent is installed
        Wants=network-online.target
        After=network-online.target
        Before=zincati.service
        ConditionPathExists=!/var/lib/%N.stamp

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=rpm-ostree install --allow-inactive --assumeyes --reboot qemu-guest-agent
        ExecStart=/bin/touch /var/lib/%N.stamp

        [Install]
        WantedBy=multi-user.target

Para converter o Butane em Ignition:

No Linux:

podman run -i --rm quay.io/coreos/butane --pretty --strict < fcos.bn | tee fcos.ign

No PowerShell:

Get-Content fcos.bn | 
    podman run -i --rm quay.io/coreos/butane --pretty --strict | 
    ConvertFrom-Json | 
    ConvertTo-Json -Depth 100 -Compress | 
    Set-Content fcos.minimized.ign -Encoding utf8

Ou:

Get-Content fcos.bn | 
    podman run -i --rm quay.io/coreos/butane --pretty --strict | 
    Tee-Object -FilePath fcos2.ign -Encoding utf8

Se for usar VirtualBox:

Depois de importar o arquivo OVA, crie o guestproperty:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" guestproperty set 'FCOS' /Ignition/Config "$(cat .\fcos.minimized.ign)"

No meu caso, a máquina chamava FCOS e o arquivo Ignition fcos.minimized.ign.

Se for usar Proxmox, uma opção é iniciar com ISO e depois baixar o ign previamente hospedado por HTTP:

curl -o coreos.ign http://<ip-address>:8080/coreos/coreos.ign
coreos-installer install /dev/sda -i coreos.ign

Outra opção é editar o arquivo:

/etc/pve/qemu-server/<vmid>.conf
args: -fw_cfg name=opt/com.coreos/config,file=path/to/example.ign

Adicione na máquina uma interface serial porque foi configurada como terminal.

quinta-feira, 26 de junho de 2025

PROXMOX - CLOUD-INIT

Como falei antes usar cloud-init e libguestfs é muito útil aqui vou escrever como eu usei.


Primeiro precisa instalar a ferramenta:

apt install libguestfs-tools -y


Eu guardo minhas ISOs em um NFS que não fica no servidor mas está montado nele, então vou trabalhar dele assim posso usar o resultado em todos os servidores da rede, use a pasta onde você guarda suas ISOs e templates.

cd /mnt/pve/nfs-remoto/

Baixe o arquivo da sua distribuição, observe que eu usei genericcloud e extensão raw.

wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.raw


Para facilitar minha vida criei um script pra deixar a imagem com os ajustes que eu uso. Mas você pode fazer linha por linha.

Eu criei o arquivo cloud-prep.sh:

#!/bin/bash
IMAGEM="debian-12-genericcloud-amd64.raw"
SERIAL_DEVICE="ttyS0"
BAUD_RATE="115200"

# Instala QEMU Guest Agent
virt-customize -a "$IMAGEM" \
  --install qemu-guest-agent

# Criar diretório de override para serial-getty
virt-customize -a "$IMAGEM" \
  --mkdir /etc/systemd/system/serial-getty@${SERIAL_DEVICE}.service.d

# Criar arquivo de override com autologin root
virt-customize -a "$IMAGEM" \
  --write "/etc/systemd/system/serial-getty@${SERIAL_DEVICE}.service.d/override.conf:[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin root --keep-baud ${BAUD_RATE},38400,9600 %I \$TERM
TTYVTDisallocate=no"

# Habilitar o serviço serial-getty
virt-customize -a "$IMAGEM" \
  --run-command "systemctl enable serial-getty@${SERIAL_DEVICE}.service"

# Configurar GRUB_CMDLINE_LINUX
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^GRUB_CMDLINE_LINUX=.*/GRUB_CMDLINE_LINUX="console=tty0 console='${SERIAL_DEVICE}','${BAUD_RATE}'"/'

# Configurar GRUB_TERMINAL
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^#?GRUB_TERMINAL=.*/GRUB_TERMINAL="console serial"/'

# Configurar GRUB_SERIAL_COMMAND
virt-customize -a "$IMAGEM" \
  --edit '/etc/default/grub:s/^#?GRUB_SERIAL_COMMAND=.*/GRUB_SERIAL_COMMAND="serial --speed='${BAUD_RATE}' --unit=0 --parity=no --stop=1"/'

# Atualizar configuração do GRUB
virt-customize -a "$IMAGEM" \
  --run-command "update-grub"

echo "Configurado qemu-guest-agent"
echo "Configuração do console serial"

O arquivo deve ser executável:

chmod +x ~/cloud-prep.sh

Execute:

~/cloud-prep.sh

Então use o novo arquivo em suas VMs importando o disco, no exemplo o ID da VM é 101 altere para o de sua VM:

qm importdisk 101 debian-12-genericcloud-amd64.raw local-lvm

Por ultimo adicione ao Hardware da VM o CloudInit Drive para poder fazer as configurações. Eu usei EFI Disk também.