Habilitando o autologin e configurando um hostname customizado

Certifique-se de ter concluído as etapas descritas em página de configuração inicial antes de iniciar este tutorial.

Provisionando o Fedora CoreOS

O Fedora CoreOS não possui um disco de instalação separado. Em vez disso, toda instância inicia a partir de uma imagem de disco genérica personalizada na primeira inicialização via Ignition.

Ignition config files are written in JSON but are typically not user-friendly. Configurations are thus written in a simpler format, the Butane config, that is then converted into an Ignition config. The tool responsible for converting Butane configs into Ignition configs is called Butane.

Primeira configuração do Ignition via Butane

Let’s create a small Butane config that will perform the following actions:

  • Adicionar algo ao systemd para sobrescrever o default serial-getty@ttyS0.service.

  • A substituição irá fazer o serviço logar automaticamente o usuário core para o console serial da máquina inicializada.

  • Configure o hostname do sistema colocando um arquivo em /etc/hostname,

  • Adicione um perfil do bash que diga ao systemd para não usar um paginador para output.

We can create a config file named autologin.bu now as:

variant: fcos
version: 1.5.0
systemd:
  units:
    - name: serial-getty@ttyS0.service
      dropins:
      - name: autologin-core.conf
        contents: |
          [Service]
          # Override Execstart in main unit
          ExecStart=
          # Add new Execstart with `-` prefix to ignore failure`
          ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM
storage:
  files:
    - path: /etc/hostname
      mode: 0644
      contents:
        inline: |
          tutorial
    - path: /etc/profile.d/systemd-pager.sh
      mode: 0644
      contents:
        inline: |
          # Tell systemd to not use a pager when printing information
          export SYSTEMD_PAGER=cat

This configuration can then be converted into an Ignition config with Butane:

butane --pretty --strict autologin.bu --output autologin.ign

The resulting Ignition configuration produced by Butane as autologin.ign has the following content:

{
  "ignition": {
    "version": "3.4.0"
  },
  "storage": {
    "files": [
      {
        "path": "/etc/hostname",
        "contents": {
          "compression": "",
          "source": "data:,tutorial%0A"
        },
        "mode": 420
      },
      {
        "path": "/etc/profile.d/systemd-pager.sh",
        "contents": {
          "compression": "",
          "source": "data:,%23%20Tell%20systemd%20to%20not%20use%20a%20pager%20when%20printing%20information%0Aexport%20SYSTEMD_PAGER%3Dcat%0A"
        },
        "mode": 420
      }
    ]
  },
  "systemd": {
    "units": [
      {
        "dropins": [
          {
            "contents": "[Service]\n# Override Execstart in main unit\nExecStart=\n# Add new Execstart with `-` prefix to ignore failure`\nExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM\n",
            "name": "autologin-core.conf"
          }
        ],
        "name": "serial-getty@ttyS0.service"
      }
    ]
  }
}

Butane outputs valid Ignition configs. However, if you are tweaking the config after Butane, or manually creating Ignition configs, you will have to verify that the config format is valid with ignition-validate:

ignition-validate autologin.ign && echo 'Success!'

Inicializando o Fedora CoreOS

Agora que nós temos uma configuração Ignition, nós podemos inicializar uma máquina virtual com ela. Esse tutorial usa a imagem QEMU com libvirt, mas você pode usar a mesma configuração Ignition em todas as plataformas suportadas pelo Fedora CoreOS.

Nós usamos virt-install para criar uma nova máquina virtual Fedora CoreOS com uma configuração específica:

# Configura o rótulo SELinux correto para permitir acesso à configuração
chcon --verbose --type svirt_home_t autologin.ign

# Inicia uma máquina virtual do Fedora CoreOS
virt-install --name=fcos --vcpus=2 --ram=2048 --os-variant=fedora-coreos-stable \
    --import --network=bridge=virbr0 --graphics=none \
    --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${PWD}/autologin.ign" \
    --disk=size=20,backing_store=${PWD}/fedora-coreos.qcow2

O comando virt-install começará uma instância nomeada fcos da imagem fedora-coreos.qcow2 usando a configuração Ignition autologin.ign. Isso irá conectar automaticamente o console serial da máquina para que então você possa ver as mensagens de inicialização.

Nós usamos a opção backing_store para virt install --disk para rapidamente criar uma nova imagem de disco e evitar escrever sobre a imagem original que baixamos. Essa nova imagem de disco pode ser facilmente jogada fora.

Dependendo da sua versão de virt-install, você talvez não será capaz de usar --os-variant=fedora-coreos-stable e irá obter um erro. Nesse caso, você deve pegar uma variante mais antiga do Fedora (--os-variant=31, por exemplo). Você pode encontrar as variantes que são suportadas pela sua versão corrente de virt-install com osinfo-query os | grep '^\s*fedora'.

Uma vez que a máquina fora inicializada vocẽ então deve ver alguns prompts e então vocẽ será automaticamente logged e apresentado com uma shell bash:

Fedora CoreOS 38.20230709.3.0
Kernel 6.3.11-200.fc38.x86_64 on an x86_64 (ttyS0)

SSH host key: SHA256:Eq0GiuflXh/3E+9h689DV4K2C0VQZ5UsXXfbJ7nB4rw (ECDSA)
SSH host key: SHA256:53uunBzHa2kfCO20q8h4cFeM19QRSscwUWUPoL4BP+4 (ED25519)
SSH host key: SHA256:HXrypq4OjKQ267RPhpptulMMYwsnrVWW3PYuvkIyt3k (RSA)
Ignition: ran on 2023/08/03 15:59:14 UTC (this boot)
Ignition: user-provided config was applied
No SSH authorized keys provided by Ignition or Afterburn
tutorial login: core (automatic login)

Fedora CoreOS 38.20230709.3.0
[core@tutorial ~]$

Vamos verificar que nossa configuração foi corretamente aplicada. Agora que estamos automaticamente logados no terminal, nós podemos assumir seguramente que o dropin do systemD foi criado:

[core@tutorial ~]$ systemctl cat serial-getty@ttyS0.service
# /usr/lib/systemd/system/serial-getty@.service
...

# /etc/systemd/system/serial-getty@ttyS0.service.d/autologin-core.conf
[Service]
# Sobrescreve ExecStart na unidade principal
ExecStart=
# Adiciona novo ExecStart com o prefixo `-` para ignorar falhas `
ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM

Nós também podemos checar que o hostname foi corretamente configurado:

[core@tutorial ~]$ cat /etc/hostname
tutorial
[core@tutorial ~]$ hostnamectl
     Static hostname: tutorial
           Icon name: computer-vm
             Chassis: vm 🖴
          Machine ID: fc4c5d5a14a741babe20559a25dcb846
             Boot ID: 22ed3b3c049d42968fb6ca9e35c8055d
      Virtualization: kvm
    Operating System: Fedora CoreOS 38.20230709.3.0
         CPE OS Name: cpe:/o:fedoraproject:fedora:38
      OS Support End: Tue 2024-05-14
OS Support Remaining: 9month 1w 3d
              Kernel: Linux 6.3.11-200.fc38.x86_64
        Architecture: x86-64
     Hardware Vendor: QEMU
      Hardware Model: Standard PC _Q35 + ICH9, 2009_
    Firmware Version: 1.16.2-1.fc38
       Firmware Date: Tue 2014-04-01

Explorando o interno do Fedora CoreOS

Uma vez que tenhamos acesso ao console da máquina nós podemos navegar um pouco ao redor para ver algumas das diferentes peças do Sistema Operacional. Por exemplo, mesmo que seja um sistema baseado em OSTree, ele ainda foi composto por RPMs e nós podemos inspecionar o sistema para ver do quê ele foi composto:

[core@tutorial ~]$ rpm -q ignition kernel moby-engine podman systemd rpm-ostree zincati
ignition-2.15.0-3.fc38.x86_64
kernel-6.3.11-200.fc38.x86_64
moby-engine-20.10.23-1.fc38.x86_64
podman-4.5.1-1.fc38.x86_64
systemd-253.4-1.fc38.x86_64
rpm-ostree-2023.5-1.fc38.x86_64
zincati-0.0.25-4.fc38.x86_64

Nós também podemos inspecionar a atual revisão do Fedora CoreOS:

[core@tutorial ~]$ rpm-ostree status
State: idle
AutomaticUpdatesDriver: Zincati
  DriverState: active; periodically polling for updates (last checked Thu 2023-08-03 15:59:23 UTC)
Deployments:
● fedora:fedora/x86_64/coreos/stable
                  Version: 38.20230709.3.0 (2023-07-24T12:25:01Z)
                   Commit: 552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9
             GPGSignature: Valid signature by 6A51BBABBA3D5467B6171221809A8D7CEB10B464

Nós podemos checar zincati.service, que se comunica com nosso server de atualizações e diz ao rpm-ostree quando realizar uma atualização e para qual versão atualizar:

[core@tutorial ~]$ systemctl status --full zincati.service
● zincati.service - Zincati Update Agent
     Loaded: loaded (/usr/lib/systemd/system/zincati.service; enabled; preset: enabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Thu 2023-08-03 16:06:39 UTC; 18s ago
       Docs: https://github.com/coreos/zincati
   Main PID: 1843 (zincati)
     Status: "periodically polling for updates (last checked Thu 2023-08-03 16:06:39 UTC)"
      Tasks: 6 (limit: 2238)
     Memory: 2.8M
        CPU: 257ms
     CGroup: /system.slice/zincati.service
             └─1843 /usr/libexec/zincati agent -v

Aug 03 16:06:39 tutorial systemd[1]: Starting zincati.service - Zincati Update Agent...
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::cli::agent] starting update agent (zincati 0.0.25)
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::cincinnati] Cincinnati service: https://updates.coreos.fedoraproject.org
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::cli::agent] agent running on node '8fb5386cba574235a21ad3b2d59885d9', in update group 'default'
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::update_agent::actor] registering as the update driver for rpm-ostree
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::update_agent::actor] initialization complete, auto-updates logic enabled
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::strategy] update strategy: immediate
Aug 03 16:06:39 tutorial systemd[1]: Started zincati.service - Zincati Update Agent.
Aug 03 16:06:39 tutorial zincati[1843]: [INFO  zincati::update_agent::actor] reached steady state, periodically polling for updates
Aug 03 16:06:41 tutorial zincati[1843]: [INFO  zincati::cincinnati] current release detected as not a dead-end

Outra coisa interessante para fazer é ver os logs do Ignition no caso de haver algo interessante para investigarmos:

journalctl -t ignition

E finalmente, é claro, nós podemos usar o comando podman (ou docker) para inspecionar o atual estado dos contêineres do sistema:

podman version
podman info
Comandos podman podem ser rodados como usuário root ou não-root. Comandos docker precisam ser rodados como root via sudo a não ser que o usuário tenha sido adicionado ao grupo docker.
Rodar contêineres via docker ou podman simultaneamente pode ocasionar problemas e resultar em um comportamento inesperado. veja o FAQ para mais detalhes.
A daemon do docker não é iniciada por default mas rodar qualquer comando docker vai iniciá-la como ela é ativada por socket via systemd.

Derrubando a máquina virtual

Vamos agora nos livrar dessa máquina virtual para que possamos começar novamente do 0. Primeiro saia do console serial pressionando CTRL + ] e então digite:

virsh destroy fcos
virsh undefine --remove-all-storage fcos

Você agora pode proceder para segundo tutorial.