Adicionando extensões de sistema operacional ao sistema hospedeiro

O Fedora CoreOS mantém a imagem base tão simples e pequena quanto possível por razões de segurança e manutenção. É por isso que você deve, em geral, preferir o uso de contêineres podman em vez de software de camadas.

No entanto, em alguns casos, é necessário adicionar software ao próprio sistema operacional de base. Por exemplo, drivers ou software VPN são candidatos potenciais porque são mais difíceis de colocar em contêineres.

Para fazer isso, você pode usar rpm-ostree install. Considere esses pacotes como "extensões": eles estendem a funcionalidade do sistema operacional básico em vez de, por exemplo, fornecendo tempos de execução para aplicativos de usuário. Dito isso, não há restrições sobre quais pacotes alguém pode realmente instalar. Por padrão, os pacotes são baixados de repositórios do Fedora.

To start the layering of a package, you need to write a systemd unit that executes the rpm-ostree command to install the wanted package(s). By default with rpm-ostree install, changes are queued for the next boot. The -A/--apply-live option can be used to apply changes live and have them persist.

Exemplo: Colocando nano em camada e definindo-o como o editor padrão

Este exemplo mostra como instalar o editor de texto nano e adicionar um script a /etc/profile.d para que seja definido como o editor padrão para todos os usuários. O parâmetro --allow-inactive é útil se o pacote for adicionado à imagem raiz em uma versão futura do Fedora CoreOS. Nesse caso, o parâmetro evita que o serviço falhe.

No futuro, teremos um método de Ignition mais amigável para fazer isso com garantias mais fortes. Veja os problemas do upstream butane#81 e fedora-coreos-tracker#681 para obter mais informações.
variant: fcos
version: 1.4.0
systemd:
  units:
    # installing nano as a layered package with rpm-ostree
    - name: rpm-ostree-install-nano.service
      enabled: true
      contents: |
        [Unit]
        Description=Layer nano with rpm-ostree
        Wants=network-online.target
        After=network-online.target
        # We run before `zincati.service` to avoid conflicting rpm-ostree
        # transactions.
        Before=zincati.service
        ConditionPathExists=!/var/lib/%N.stamp

        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/rpm-ostree install --apply-live --allow-inactive nano
        ExecStart=/bin/touch /var/lib/%N.stamp

        [Install]
        WantedBy=multi-user.target
storage:
  files:
    # usa nano como editor padrão
    - path: /etc/profile.d/nano.sh
      overwrite: true
      contents:
        inline: |
          #/bin/sh
          export EDITOR=nano