Probar actualizaciones de Fedora CoreOS

Asegúrese de que ha completado los pasos descritos en la página inicial de ajuste antes de empezar con este tutorial.

En este tutorial no nos centraremos en el aprovisionamiento, sino en lo que sucede durante las actualizaciones y las opciones que están disponibles en caso de fallas.

Descargar una versión anterior de Fedora CoreOS

Una de las características que definen a Fedora CoreOS son las actualizaciones automáticas. Para verlas en acción, debemos descargar una versión anterior de Fedora CoreOS. En este caso, iniciaremos la versión N-1 de Fedora CoreOS, que puede consultarse en página de versiones de Fedora CoreOS o mediante los metadatos de releases.json:

RELEASE=$(curl https://builds.coreos.fedoraproject.org/prod/streams/stable/releases.json | jq -r '.releases[-2].version')
curl -O https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/${RELEASE}/x86_64/fedora-coreos-${RELEASE}-qemu.x86_64.qcow2.xz
curl -O https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/${RELEASE}/x86_64/fedora-coreos-${RELEASE}-qemu.x86_64.qcow2.xz.sig

Una vez que el archivador ha sido descargado, asegúrese verificar su integridad:

curl https://fedoraproject.org/fedora.gpg | gpg --import
gpg --verify fedora-coreos-${RELEASE}-qemu.x86_64.qcow2.xz.sig
Busque "Buena firma de" en la salida.

Una vez que haya verificado el archivador, puede extraerlo con:

unxz fedora-coreos-${RELEASE}-qemu.x86_64.qcow2.xz

Para hacer el tutorial más simple, renombraría esta imagen a un nombre más breve:

mv fedora-coreos-${RELEASE}-qemu.x86_64.qcow2 fedora-coreos-older.qcow2

Escribir la configuración Butane y convertirla a Ignition

Crearemos una configuración de Butane:

  • Configura el acceso automático por consola.

  • Añadiremos una Clave SSH para el usuario core desde el archivo local ssh-key.pub.

Escribimos esta config de Butane a un archivo invocado en updates.bu:

variant: fcos
version: 1.7.0
passwd:
  users:
    - name: core
      ssh_authorized_keys_local:
        - ssh-key.pub
systemd:
  units:
    - name: serial-getty@ttyS0.service
      dropins:
      - name: autologin-core.conf
        contents: |
          [Service]
          # Anular Execstart en la unidad principal
          ExecStart=
         # Agregue nuevo Execstart con el prefijo `-` para ignorar el error
          ExecStart=-/usr/sbin/agetty --autologin core --noclear %I $TERM
          TTYVTDisallocate=no
storage:
  files:
    - path: /etc/profile.d/systemd-pager.sh
      mode: 0644
      contents:
        inline: |
          # Indica a systemd que no utilice un buscapersonas al imprimir información
          export SYSTEMD_PAGER=cat
Opcionalmente, puede reemplazar la clave pública SSH del archivo YAML con su propia clave pública para iniciar sesión en la instancia iniciada. Si no lo hace, se iniciará sesión automáticamente en la consola serie.

Ejecute Butane para convertir eso a una config Ignition:

butane --pretty --strict --files-dir=./ updates.bu --output updates.ign

Inicio y actualización inicial

Ahora vamos a proprorcionarlo. Asegúrate de empezar desde la imagen anterior de Fedora CoreOS en este paso:

# Configurar la etiqueta correcta de SELinux para conceder acceso para la config
chcon --verbose --type svirt_home_t updates.ign

# Inicia una máquina virtual de 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}/updates.ign" \
    --disk="size=20,backing_store=${PWD}/fedora-coreos-older.qcow2"

Desconéctese de la consola serie pulsando CTRL + ] y, a continuación, utilice la dirección IP indicada para la NIC desde la consola serie para iniciar sesión con el usuario core a través de SSH:

Como el sistema no está actualizado al día, Zincati notificará esto e iniciará la actualización del sistema. Vería el proceso de actualización sucediendo de esta manera:

Todos los servicios de red necesarios pueden no estar actualizados y ejecutándose durante la comprobación inicial. En tal caso, Zincati de nuevo comprobará si hay actualizaciones alrededor de 5 minutos.
[core@localhost ~]$ 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 19:52:41 UTC; 10s ago
       Docs: https://github.com/coreos/zincati
   Main PID: 1816 (zincati)
     Status: "found update on remote: 38.20230709.3.0"
      Tasks: 12 (limit: 2239)
     Memory: 6.8M
        CPU: 273ms
     CGroup: /system.slice/zincati.service
             ├─1816 /usr/libexec/zincati agent -v
             └─1873 rpm-ostree deploy --lock-finalization --skip-branch-check revision=552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9 --disallow-downgrade

Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::cli::agent] starting update agent (zincati 0.0.25)
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::cincinnati] Cincinnati service: https://updates.coreos.fedoraproject.org
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::cli::agent] agent running on node '87c9ec3e0a4045a19b74b54ae5ed986a', in update group 'default'
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] registering as the update driver for rpm-ostree
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] initialization complete, auto-updates logic enabled
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::strategy] update strategy: immediate
Aug 03 19:52:41 localhost.localdomain systemd[1]: Started zincati.service - Zincati Update Agent.
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] reached steady state, periodically polling for updates
Aug 03 19:52:42 localhost.localdomain zincati[1816]: [INFO  zincati::cincinnati] current release detected as not a dead-end
Aug 03 19:52:43 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] target release '38.20230709.3.0' selected, proceeding to stage it

[core@localhost ~]$ rpm-ostree status
State: idle
AutomaticUpdatesDriver: Zincati
  DriverState: active; update staged: 38.20230709.3.0; reboot delayed due to active user sessions
Deployments:
  fedora:fedora/x86_64/coreos/stable
                  Version: 38.20230709.3.0 (2023-07-24T12:25:01Z)
                   Commit: 552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9
             GPGSignature: Valid signature by 6A51BBABBA3D5467B6171221809A8D7CEB10B464
                     Diff: 61 upgraded

● fedora:fedora/x86_64/coreos/stable
                  Versión: 38.20230625.3.0 (2023-07-11T11:57:53Z)
                   Commit: e841d77aadb875bb801ac845a0d9b8a70b4224bdeb15e7d6c5bff1da932c0301
             GPGSignature: Firma válida de 6A51BBABBA3D5467B6171221809A8D7CEB10B464

[core@localhost ~]$ 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 19:52:41 UTC; 1min 21s ago
       Docs: https://github.com/coreos/zincati
   Main PID: 1816 (zincati)
     Status: "update staged: 38.20230709.3.0; reboot delayed due to active user sessions"
      Tasks: 6 (limit: 2239)
     Memory: 3.2M
        CPU: 362ms
     CGroup: /system.slice/zincati.service
             └─1816 /usr/libexec/zincati agent -v

Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::cli::agent] agent running on node '87c9ec3e0a4045a19b74b54ae5ed986a', in update group 'default'
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] registering as the update driver for rpm-ostree
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] initialization complete, auto-updates logic enabled
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::strategy] update strategy: immediate
Aug 03 19:52:41 localhost.localdomain systemd[1]: Started zincati.service - Zincati Update Agent.
Aug 03 19:52:41 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] reached steady state, periodically polling for updates
Aug 03 19:52:42 localhost.localdomain zincati[1816]: [INFO  zincati::cincinnati] current release detected as not a dead-end
Aug 03 19:52:43 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] target release '38.20230709.3.0' selected, proceeding to stage it
Aug 03 19:52:55 localhost.localdomain zincati[1816]: [INFO  zincati::update_agent::actor] update staged: 38.20230709.3.0
Aug 03 19:52:55 localhost.localdomain zincati[1816]: [WARN  zincati::update_agent] interactive sessions detected, entering grace period (maximum 10 minutes)

Poco después de la actualización, el sistema se reiniciará de forma predeterminada. Sin embargo, si detecta sesiones de usuario activas, esperará y mostrará un mensaje al usuario:

Mensaje difundido por Zincati el jue 3/8/2023 a las 19:52:55 UTC:
Está disponible la actualización nueva 38.20230709.3.0 y se ha implementado.
Si la estrategia de actualización lo permite, Zincati se reiniciará con esta
actualización cuando todos los usuarios interactivos hayan cerrado sesión, o en
10 minutos, lo que ocurra primero. Cierre sesión en todas las sesiones activas
para que el proceso de actualización automática pueda continuar.

Una vez que hayan finalizado las sesiones de usuario el reinicio continuará. En este caso, debemos detener el inicio de sesión automático en el servicio ttyS0 y también cerrar la sesión de SSH:

[core@localhost ~]$ sudo systemctl stop serial-getty@ttyS0.service
[core@localhost ~]$ exit
logout
Conexión a 192.168.124.222 cerrada.
Puede supervisar la consola serie para ver cuando la máquina ha realizado el reinicio mediante virsh console fcos.

Al volver a iniciar sesión, podemos ver que la versión actual de Fedora CoreOS es la más reciente. El resultado de rpm-ostree status también mostrará la versión anterior, que aún existe en caso de que necesitemos revertirla:

[core@localhost ~]$ rpm-ostree status
State: idle
AutomaticUpdatesDriver: Zincati
  DriverState: activo; sondeando periódicamente en busca de actualizaciones (última comprobación Jue 03/08/2023 19:59:16 UTC)
Deployments:
● fedora:fedora/x86_64/coreos/stable
                  Versión: 38.20230709.3.0 (2023-07-24T12:25:01Z)
                   Hecho: 552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9
             GPGSignature: Firma válida por 6A51BBABBA3D5467B6171221809A8D7CEB10B464

  fedora:fedora/x86_64/coreos/stable
                  Versión: 38.20230625.3.0 (11/07/2023T11:57:53Z)
                   Hecho: e841d77aadb875bb801ac845a0d9b8a70b4224bdeb15e7d6c5bff1da932c0301
             Firma GPG: Firma válida por 6A51BBABBA3D5467B6171221809A8D7CEB10B464
La implementación actualmente iniciada se indica con el carácter .

Puede ver las diferencias entre las dos versiones ejecutando el comando rpm-ostree db diff:

[core@localhost ~]$ rpm-ostree db diff
ostree diff commit from: rollback deployment (e841d77aadb875bb801ac845a0d9b8a70b4224bdeb15e7d6c5bff1da932c0301)
ostree diff commit to:   booted deployment (552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9)
Upgraded:
  NetworkManager 1:1.42.6-1.fc38 -> 1:1.42.8-1.fc38
  NetworkManager-cloud-setup 1:1.42.6-1.fc38 -> 1:1.42.8-1.fc38
  NetworkManager-libnm 1:1.42.6-1.fc38 -> 1:1.42.8-1.fc38
  NetworkManager-team 1:1.42.6-1.fc38 -> 1:1.42.8-1.fc38
  NetworkManager-tui 1:1.42.6-1.fc38 -> 1:1.42.8-1.fc38
  aardvark-dns 1.6.0-1.fc38 -> 1.7.0-1.fc38
  ...

Revertir a la versión anterior

Si por cualquier motivo el sistema no funciona completamente podemos volver a la versión anterior:

sudo rpm-ostree rollback --reboot

Después de volver a iniciar sesión tras el reinicio, podemos ver que ahora hemos vuelto a arrancar en la antigua implementación anterior a la modernización:

[core@localhost ~]$ rpm-ostree status
State: idle
AutomaticUpdatesDriver: Zincati
  DriverState: active; periodically polling for updates (last checked Thu 2023-08-03 20:05:05 UTC)
Deployments:
● fedora:fedora/x86_64/coreos/stable
                  Version: 38.20230625.3.0 (2023-07-11T11:57:53Z)
                   Commit: e841d77aadb875bb801ac845a0d9b8a70b4224bdeb15e7d6c5bff1da932c0301
             GPGSignature: Valid signature by 6A51BBABBA3D5467B6171221809A8D7CEB10B464

  fedora:fedora/x86_64/coreos/stable
                  Version: 38.20230709.3.0 (2023-07-24T12:25:01Z)
                   Commit: 552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9
             GPGSignature: Valid signature by 6A51BBABBA3D5467B6171221809A8D7CEB10B464

Y también puedes verificar que Zincati no intentará actualizarse a la versión nueva de la que acabamos de revertir:

[core@localhost ~]$ 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 20:05:05 UTC; 45s ago
       Docs: https://github.com/coreos/zincati
   Main PID: 813 (zincati)
     Status: "periodically polling for updates (last checked Thu 2023-08-03 20:05:05 UTC)"
      Tasks: 6 (limit: 2239)
     Memory: 22.0M
        CPU: 238ms
     CGroup: /system.slice/zincati.service
             └─813 /usr/libexec/zincati agent -v

Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::cincinnati] Cincinnati service: https://updates.coreos.fedoraproject.org
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::cli::agent] agent running on node '87c9ec3e0a4045a19b74b54ae5ed986a', in update group 'default'
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::update_agent::actor] registering as the update driver for rpm-ostree
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::update_agent::actor] found 1 other finalized deployment
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::update_agent::actor] deployment 38.20230709.3.0 (552de26fe0fe6a5e491f7a4163db125e3d44b144ae53a8f5f488e3f8481c46f9) will be excluded from being a future update target
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::update_agent::actor] initialization complete, auto-updates logic enabled
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::strategy] update strategy: immediate
Aug 03 20:05:05 localhost.localdomain systemd[1]: Started zincati.service - Zincati Update Agent.
Aug 03 20:05:05 localhost.localdomain zincati[813]: [INFO  zincati::update_agent::actor] reached steady state, periodically polling for updates
Aug 03 20:05:06 localhost.localdomain zincati[813]: [INFO  zincati::cincinnati] current release detected as not a dead-end

Purga

Ahora purgamos la instancia. Desconecta desde la máquina y después destrúyelo:

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

Conclusión

En estos tutoriales, hemos aprendido un poco sobre Fedora CoreOS. Hemos aprendido cómo se entrega como una imagen de disco predefinida, cómo se aprovisiona de forma automática mediante Ignition y cómo se configuran y se implementan las actualizaciones automáticas mediante Zincati y rpm-ostree. El siguiente paso es probar Fedora CoreOS en tus propios casos de uso y únete a la comunidad.