Configurazione dello storage

Fedora CoreOS viene fornito con un layout di archiviazione predefinito semplice: la partizione root è l’ultima e si espande per occupare l’intera dimensione del disco. A parte la partizione di avvio, tutti i dati sono memorizzati nella partizione root. Consulta la sezione [Layout del disco](xref:#_disk_layout) per maggiori dettagli.

Di seguito, forniamo esempi di vari modi in cui puoi personalizzare questo.

Fedora CoreOS richiede che il filesystem root sia di almeno 8 GiB. Per motivi pratici, le immagini disco per alcune piattaforme vengono fornite con un filesystem root più piccolo, che per impostazione predefinita si espande automaticamente per riempire tutto lo spazio disponibile. Se aggiungi partizioni aggiuntive dopo il filesystem root, devi assicurarti di ridimensionare esplicitamente la partizione root come mostrato di seguito, affinché sia di almeno 8 GiB.

Attualmente, se il filesystem root è più piccolo di 8 GiB, viene visualizzato un avviso al login. A partire da giugno 2021, se il filesystem root è più piccolo di 8 GiB e seguito da un’altra partizione, Fedora CoreOS si rifiuterà di avviarsi. Per maggiori dettagli, vedi [questo bug](https://github.com/coreos/fedora-coreos-tracker/issues/586).

Riferimento ai dispositivi di blocco da Ignition

Molti degli esempi seguenti faranno riferimento a un dispositivo a blocchi, come /dev/vda. Il nome dei dispositivi a blocchi disponibili dipende dall’infrastruttura sottostante (bare metal o cloud) e, spesso, dallo specifico tipo di istanza. Ad esempio in AWS, alcuni tipi di istanza dispongono di unità NVMe (/dev/nvme*), mentre altri utilizzano /dev/xvda*.

Se la configurazione del disco è semplice e utilizza lo stesso disco da cui è stato avviato il sistema operativo, è possibile utilizzare il link`/dev/disk/by-id/coreos-boot-disk`per fare comodamente riferimento a quel dispositivo. Questo link è disponibile solo durante la fase di provisioning, al fine di facilitare il riferimento allo stesso disco da cui è stato avviato il sistema operativo.

Se hai bisogno di accedere ad altri dischi, puoi avviare una singola macchina con una configurazione Ignition che includa solo l’accesso SSH, per poi ispezionare i dispositivi a blocchi, ad esempio tramite il comando lsblk.

Per l’hardware fisico, si raccomanda di fare riferimento ai dispositivi tramite i link in /dev/disk/by-id/ o /dev/disk/by-path.

Configurazione di punti di montaggio separati per /var

Ecco un esempio di configurazione Butane per impostare /var su una partizione separata dello stesso disco primario:

Aggiunta di una partizione /var al disco primario
variant: fcos
version: 1.7.0
storage:
  disks:
  - # The link to the block device the OS was booted from.
    device: /dev/disk/by-id/coreos-boot-disk
    # We do not want to wipe the partition table since this is the primary
    # device.
    wipe_table: false
    partitions:
    - number: 4
      label: root
      # Allocate at least 8 GiB to the rootfs. See NOTE above about this.
      size_mib: 8192
      resize: true
    - size_mib: 0
      # We assign a descriptive label to the partition. This is important
      # for referring to it in a device-agnostic way in other parts of the
      # configuration.
      label: var
  filesystems:
    - path: /var
      device: /dev/disk/by-partlabel/var
      # We can select the filesystem we'd like.
      format: ext4
      # Ask Butane to generate a mount unit for us so that this filesystem
      # gets mounted in the real root.
      with_mount_unit: true

È ovviamente possibile montare anche solo una parte di /var in una partizione separata. Ad esempio, per montare /var/lib/containers:

Aggiunta di una partizione /var/lib/containers al disco primario
variant: fcos
version: 1.7.0
storage:
  disks:
  - device: /dev/disk/by-id/coreos-boot-disk
    wipe_table: false
    partitions:
    - number: 4
      label: root
      # Allocate at least 8 GiB to the rootfs. See NOTE above about this.
      size_mib: 8192
      resize: true
    - size_mib: 0
      label: containers
  filesystems:
    - path: /var/lib/containers
      device: /dev/disk/by-partlabel/containers
      format: xfs
      with_mount_unit: true

In alternativa, è anche possibile montare dello spazio di archiviazione da un disco separato. Ad esempio, qui montiamo //var/log da una partizione su /dev/vdb:

Aggiunta di /var/log da un disco secondario
variant: fcos
version: 1.7.0
storage:
  disks:
  - device: /dev/vdb
    wipe_table: false
    partitions:
    - size_mib: 0
      start_mib: 0
      number: 1
      label: log
  filesystems:
    - path: /var/log
      device: /dev/disk/by-partlabel/log
      format: xfs
      with_mount_unit: true
Definizione di un disco con più partizioni

In questo esempio, cancelliamo il disco e creiamo due nuove partizioni.

variant: fcos
version: 1.7.0
storage:
  disks:
    -
      # Mandatory. We use the World-Wide Number ID of the drive to ensure
      # uniqueness.
      device: /dev/disk/by-id/wwn-0x50014e2eb507fcdf
      # This ensures that the partition table is re-created, along with all
      # the partitions.
      wipe_table: true
      partitions:
        # The first partition (slot number 1) is 32 GiB and starts at the
        # beginning of the device. Its type_guid identifies it as a Linux
        # swap partition.
        - label: part1
          number: 1
          size_mib: 32768
          start_mib: 0
          type_guid: 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f
        # The second partition (implicit slot number 2) will be placed after
        # partition 1 and will occupy the rest of the available space.
        # Since type_guid is not specified, it will be a Linux native
        # partition.
        - label: part2

Riconfigurazione del file system principale root

È possibile riconfigurare lo stesso file system principale (root). Si può utilizzare il percorso `/dev/disk/by-label/root`root per fare riferimento alla partizione `root`originale. È necessario assicurarsi che anche il nuovo file system abbia root come etichetta (label).

È necessario disporre di almeno 4 GiB di RAM affinché la riprovisione della root vada a buon fine.

Ecco un esempio di passaggio da xfs a ext4, riutilizzando però la stessa partizione sul disco primario:

Modifica del file system principale root in ext4
variant: fcos
version: 1.7.0
storage:
  filesystems:
    - device: /dev/disk/by-partlabel/root
      wipe_filesystem: true
      format: ext4
      label: root

Analogamente alla sezione precedente, è anche possibile spostare interamente il file system principale (root). In questo caso, stiamo spostando la root su un dispositivo RAID0:

Spostamento del file system principale (root) su RAID0
variant: fcos
version: 1.7.0
storage:
  raid:
    - name: myroot
      level: raid0
      devices:
        - /dev/disk/by-id/virtio-disk1
        - /dev/disk/by-id/virtio-disk2
  filesystems:
    - device: /dev/md/myroot
      format: xfs
      wipe_filesystem: true
      label: root
Non sono necessarie le chiavi path`o`with_mount_unit; FCOS sa che la partizione root è speciale e capirà da solo come trovarla e montarla.

Se desideri replicare il disco di avvio su più unità per garantire la resilienza in caso di guasto del disco, è necessario creare un mirror di tutte le partizioni predefinite (root, boot, EFI System Partition e il codice del bootloader). Per fare questo, Butane mette a disposizione una sintassi di configurazione speciale:

Mirroring del disco di avvio su due unità
variant: fcos
version: 1.7.0
boot_device:
  # Change to match target architecture (aarch64, ppc64le, etc.)
  layout: x86_64
  mirror:
    devices:
      - /dev/sda
      - /dev/sdb

Definizione di un file system

Questo esempio dimostra il processo di creazione del file system definendo ed etichettando le partizioni, unendole in un array RAID e formattando tale array in ext4.

Definizione di un file system su un dispositivo di archiviazione RAID
variant: fcos
version: 1.7.0
storage:
  disks:
  # This defines two partitions, each on its own disk. The disks are
  # identified by their WWN.
  - device: /dev/disk/by-id/wwn-0x50014ee261e524e4
    wipe_table: true
    partitions:
    -
      # Each partition gets a human-readable label.
      label: "raid.1.1"
      # Each partition is placed at the beginning of the disk and is 64 GiB
      # long.
      number: 1
      size_mib: 65536
      start_mib: 0
  - device: /dev/disk/by-id/wwn-0x50014ee0b8442cd3
    wipe_table: true
    partitions:
    - label: "raid.1.2"
      number: 1
      size_mib: 65536
      start_mib: 0
  # We use the previously defined partitions as devices in a RAID1 md array.
  raid:
    - name: publicdata
      level: raid1
      devices:
      - /dev/disk/by-partlabel/raid.1.1
      - /dev/disk/by-partlabel/raid.1.2
  # The resulting md array is used to create an EXT4 filesystem.
  filesystems:
    - path: /var/publicdata
      device: /dev/md/publicdata
      format: ext4
      label: PUB
      with_mount_unit: true

Archiviazione crittografata (LUKS)

Ecco un esempio per configurare un dispositivo LUKS su /var/lib/data.

variant: fcos
version: 1.7.0
storage:
  luks:
    - name: data
      device: /dev/vdb
  filesystems:
    - path: /var/lib/data
      device: /dev/mapper/data
      format: xfs
      label: DATA
      with_mount_unit: true

Anche il file system principale (root) può essere spostato su LUKS. In questo caso, il dispositivo LUKS deve essere vincolato tramite Clevis. I due tipi principali di vincolo (pin) disponibili sono: TPM2 e Tang (o una combinazione di questi ultimi utilizzando lo Shamir’s Secret Sharing).

Il vincolo (pinning) tramite TPM2 si limita a legare la crittografia alla macchina fisica in uso. Assicurati di comprendere il suo modello di minaccia (threat model) prima di scegliere tra il vincolo con TPM2 e quello con Tang. Per ulteriori informazioni, consulta questa sezione della documentazione del pin TPM2 di Clevis.
È necessario disporre di almeno 4 GiB di RAM affinché la riprovisione della root vada a buon fine.

Butane mette a disposizione una sintassi di configurazione semplificata per configurare la crittografia e il vincolo (pinning) del file system principale (root). Ecco un esempio di come utilizzarla per creare un file system root crittografato e vincolato tramite TPM2:

Crittografia del file system principale root con un vincolo pin TPM2 di Clevis
variant: fcos
version: 1.7.0
boot_device:
  luks:
    tpm2: true

Questo equivale alla seguente configurazione estesa:

Crittografia del file system principale (root) con un vincolo (pin) TPM2 di Clevis senza utilizzare boot_device
variant: fcos
version: 1.7.0
storage:
  luks:
    - name: root
      label: luks-root
      device: /dev/disk/by-partlabel/root
      clevis:
        tpm2: true
      wipe_volume: true
  filesystems:
    - device: /dev/mapper/root
      format: xfs
      wipe_filesystem: true
      label: root

La configurazione estesa non include le chiavi path o with_mount_unit; FCOS sa che la partizione root è speciale e capirà da solo come trovarla e montarla.

Questo prossimo esempio vincola la crittografia del file system principale (root) al PCR 7, che corrisponde all’UEFI Boot Component utilizzato per tracciare il certificato di Secure Boot dalla memoria. Di conseguenza, gli aggiornamenti del firmware UEFI o dei certificati non dovrebbero influire sul valore memorizzato nel PCR 7.

Il vincolo (binding) per il PCR 8 (l’UEFI Boot Component utilizzato per tracciare i comandi e la linea di comando del kernel) non è supportato, poiché la linea di comando del kernel cambia a ogni aggiornamento del sistema operativo.
Crittografia del file system principale (root) con un vincolo (pin) TPM2 di Clevis legato al PCR 7
variant: fcos
version: 1.7.0
storage:
  luks:
    - name: root
      label: luks-root
      device: /dev/disk/by-partlabel/root
      clevis:
        custom:
          needs_network: false
          pin: tpm2
          config: '{"pcr_bank":"sha1","pcr_ids":"7"}'
      wipe_volume: true
  filesystems:
    - device: /dev/mapper/root
      format: xfs
      wipe_filesystem: true
      label: root

Ulteriore documentazione per i campi di config`è disponibile nelle pagine man di `clevis:`man clevis-encrypt-tpm2`

Il seguente comando `clevis`può essere utilizzato per confermare che la crittografia del file system principale (root) è legata al PCR 7.

$ sudo clevis luks list -d /dev/disk/by-partlabel/root
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha1","pcr_ids":"7"}'

Ecco un esempio della sintassi di configurazione semplificata con Tang:

Crittografia del file system principale (root) con un vincolo (pin) Tang di Clevis
variant: fcos
version: 1.7.0
boot_device:
  luks:
    tang:
      - url: http://192.168.122.1:80
        thumbprint: bV8aajlyN6sYqQ41lGqD4zlhe0E

Il sistema contatterà il server Tang all’avvio.

Per ulteriori informazioni sulla configurazione di un server Tang, consulta la documentazione ufficiale.

È possibile configurare sia il vincolo (pinning) con Tang sia quello con TPM2 (inclusa la presenza di più server Tang per la ridondanza). Di default, per sbloccare il file system principale (root) è richiesto solo il dispositivo TPM2 o un singolo server Tang. Questo comportamento può essere modificato utilizzando la chiave threshold(soglia):

Crittografia del file system principale (root) con vincoli (pin) sia TPM2 sia Tang
variant: fcos
version: 1.5.0
boot_device:
  luks:
    clevis:
      tang:
        - url: http://192.168.122.1:80
          thumbprint: "bV8aajlyN6sYqQ41lGqD4zlhe0E"
      tpm2: true
      # Questo consentirà lo sblocco del rootfs solo se sia il pin TPM2
      # sia il server Tang sono accessibili e validi.
      threshold: 2

Quindi la partizione root:

Se si utilizza Ignition per riconfigurare o spostare la partizione principale (root), tale partizione non viene ingrandita automaticamente al primo avvio (si vedano le discussioni correlate in questo problema). Nel caso in cui si sposti la partizione root su un nuovo disco (o su più dischi), è necessario impostare la dimensione desiderata per la partizione utilizzando il campo size_mib. Se si riconfigura il file system root nella sua posizione attuale, come nell’esempio LUKS precedente, è possibile ridimensionare la partizione esistente utilizzando il campo resize:

Ridimensionamento della partizione principale (root) alla sua dimensione massima
variant: fcos
version: 1.7.0
storage:
  disks:
    - device: /dev/disk/by-id/coreos-boot-disk
      partitions:
        - label: root
          number: 4
          # 0 means to use all available space
          size_mib: 0
          resize: true
  luks:
    - name: root
      device: /dev/disk/by-partlabel/root
      clevis:
        tpm2: true
      wipe_volume: true
  filesystems:
    - device: /dev/mapper/root
      format: xfs
      wipe_filesystem: true
      label: root

Aggiunta dello spazio di swap

This example creates a swap partition spanning all of the sdb device, creates a swap area on it, and creates a systemd swap unit so the swap area is enabled on boot.

Configurazione di una partizione di swap su un secondo disco
variant: fcos
version: 1.1.0
storage:
  disks:
    - device: /dev/sda
      wipe_table: true
      partitions:
        - label: var
  filesystems:
    - device: /dev/disk/by-partlabel/var
      label: var
      format: xfs
      wipe_filesystem: false
      path: /var
      with_mount_unit: true

Aggiunta di uno spazio di archiviazione di rete

I sistemi Fedora CoreOS possono essere configurati per montare file system di rete come NFS e CIFS. Il modo migliore per farlo è utilizzare Ignition per creare delle unità systemd. I file system possono essere montati all’avvio creando un’unità di montaggio (mount) standard. In alternativa, è possibile montare un file system nel momento in cui gli utenti accedono al punto di montaggio creando un’unità di montaggio automatico (automount) aggiuntiva. Di seguito sono riportati gli esempi di ciascun metodo per un file system NFS.

Configurazione dei montaggi NFS

Creazione di un’unità systemd per montare un file system NFS all’avvio.
Il file ..mount`deve essere nominato in base al percorso di montaggio (ad esempio, `/var/mnt/data`diventa `var-mnt-data.mount)
variant: fcos
version: 1.3.0
systemd:
  units:
    - name: var-mnt-data.mount
      enabled: true
      contents: |
        [Unit]
        Description=Mount data directory

        [Mount]
        What=example.org:/data
        Where=/var/mnt/data
        Type=nfs4

        [Install]
        WantedBy=multi-user.target
Creazione di un’unità systemd per montare un file system NFS quando gli utenti accedono al punto di montaggio ( automatico/automount)
variant: fcos
version: 1.3.0
systemd:
  units:
    - name: var-mnt-data.mount
      contents: |
        [Unit]
        Description=Mount data directory

        [Mount]
        What=example.org:/data
        Where=/var/mnt/data
        Type=nfs4

        [Install]
        WantedBy=multi-user.target

    - name: var-mnt-data.automount
      enabled: true
      contents: |
        [Unit]
        Description=Automount data directory

        [Automount]
        TimeoutIdleSec=20min
        Where=/var/mnt/data

        [Install]
        WantedBy=multi-user.target

Advanced examples

Questo esempio configura un disco di avvio speculare (in RAID 1) con un file system principale (root) crittografato tramite TPM2, sovrascrive le dimensioni delle repliche della partizione root generate automaticamente e aggiunge una partizione `/var`speculare e crittografata che consuma lo spazio rimanente sui dischi.

Disco di avvio speculare crittografato con partizione /var separata
variant: fcos
version: 1.7.0
boot_device:
  # Change to match target architecture (aarch64, ppc64le, etc.)
  layout: x86_64
  luks:
    tpm2: true
  mirror:
    devices:
      - /dev/sda
      - /dev/sdb
storage:
  disks:
    - device: /dev/sda
      partitions:
        # Override size of root partition on first disk, via the label
        # generated for boot_device.mirror
        - label: root-1
          size_mib: 10240
        # Add a new partition filling the remainder of the disk
        - label: var-1
    - device: /dev/sdb
      partitions:
        # Similarly for second disk
        - label: root-2
          size_mib: 10240
        - label: var-2
  raid:
    - name: md-var
      level: raid1
      devices:
        - /dev/disk/by-partlabel/var-1
        - /dev/disk/by-partlabel/var-2
  luks:
    - name: var
      device: /dev/md/md-var
      # No key material is specified, so a random key will be generated
      # and stored in the root filesystem
  filesystems:
    - device: /dev/mapper/var
      path: /var
      label: var
      format: xfs
      wipe_filesystem: true
      with_mount_unit: true

Struttura del disco

Tutti i sistemi Fedora CoreOS si avviano con la stessa immagine disco, che varia leggermente a seconda dell’architettura in base a ciò che è necessario per l’avvio (bootloading). Al primo avvio, il file system principale (root) viene espanso per occupare il resto del disco. L’immagine disco può essere personalizzata utilizzando le configurazioni Butane per ripartizionare il disco e creare o formattare i file system. Le installazioni su bare metal non fanno eccezione; l’installer si limita a copiare l’immagine grezza (raw) sul disco di destinazione e a inserire la configurazione specificata in /boot affinché venga utilizzata al primo avvio.

Vedere Riconfigurazione del file system principale per esempi relativi alle modifiche supportate per la partizione root.

tabella delle partizioni

L’uso dei numeri di partizione per fare riferimento a partizioni specifiche è sconsigliato; si dovrebbero utilizzare invece le etichette (label) o gli UUID. Fedora CoreOS riserva le etichette boot, boot-<number>, root, root-<number>, BIOS-BOOT, bios-<number>, EFI-SYSTEM ed esp-<number>, nonché i nomi dei dispositivi RAID md-boot e md-root. La creazione di partizioni, file system o dispositivi RAID con queste etichette non è supportata.

Tabella delle partizioni x86_64

L’immagine disco x86_64 è formattata in GPT con un MBR protettivo. Supporta l’avvio sia tramite BIOS sia tramite UEFI (incluso Secure Boot).

Il layout della tabella delle partizioni è cambiato nel tempo. Il layout attuale è:

Table 1. Tabella delle partizioni per x86_64

Number

Label

Description

Partition Type

1

BIOS-BOOT

Contains BIOS GRUB image

raw data

2

EFI-SYSTEM

Contains EFI GRUB image and Secure Boot shim

FAT32

3

boot

Contains GRUB configuration, kernel/initramfs images

ext4

4

root

Contains the root filesystem

xfs

La partizione EFI-SYSTEM può essere eliminata o riformattata in caso di avvio tramite BIOS. Allo stesso modo, la partizione BIOS-BOOT può essere eliminata o riformattata in caso di avvio tramite EFI.

Monta Filesystem

Fedora CoreOS utilizza OSTree, un sistema per la gestione di molteplici alberi (tree) di sistemi operativi avviabili che condividono lo stesso spazio di archiviazione. Ogni versione del sistema operativo fa parte del file system /. Tutte le distribuzioni condividono la stessa directory /var, che può trovarsi sul medesimo file system o essere montata separatamente.

Questo mostra i punti di montaggio predefiniti per un sistema Fedora CoreOS installato su un disco /dev/vda:

Punti di montaggio predefiniti su x86_64
$ findmnt --real # Some details are elided
TARGET        SOURCE                                                   FSTYPE  OPTIONS
/             /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash]     xfs     rw
|-/sysroot    /dev/vda4                                                xfs     ro
|-/etc        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash/etc] xfs     rw
|-/usr        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/$hash/usr] xfs     ro
|-/var        /dev/vda4[/ostree/deploy/fedora-coreos/deploy/var]       xfs     rw
`-/boot       /dev/vda3                                                ext4    ro

In passato la partizione di sistema EFI I System Partition veniva montata in /boot/efi, ma non è più così. Sui sistemi configurati con il mirroring del dispositivo di avvio, sono presenti partizioni EFI indipendenti su ciascuno dei dischi costitutivi.

/ immutabile, /usr in sola lettura

Poiché OSTree viene utilizzato per gestire tutti i file appartenenti al sistema operativo, i punti di montaggio /`e `/usr`non sono scrivibili. Qualsiasi modifica al sistema operativo deve essere applicata tramite `rpm-ostree.

Allo stesso modo, il punto di montaggio`/boot`non è scrivibile e la partizione di sistema EFI non è montata per impostazione predefinita. Questi file system sono gestiti da rpm-ostree e bootupd, e non devono essere modificati direttamente da un amministratore.

L’aggiunta di directory di primo livello (ad esempio /foo) non è attualmente supportata ed è vietata dall’attributo di immutabilità.

Il vero / (ovvero la radice del file system nella partizione root) è montato in sola lettura in /sysroot e non deve essere modificato o consultato direttamente.

Configurazione in /etc e stato in /var

Le uniche posizioni scrivibili supportate sono /etc e /var. La directory /etc dovrebbe contenere solo file di configurazione e non è destinata alla memorizzazione di dati. Tutti i dati devono essere conservati in /var e non verranno toccati dagli aggiornamenti di sistema. I percorsi tradizionali che potrebbero contenere lo stato del sistema (ad esempio /home o /srv) sono collegamenti simbolici (symlink) a directory presenti in /var (come /var/home o /var/srv).

Selezione della versione e avvio

Viene creata una voce del menu di GRUB per ogni versione di Fedora CoreOS attualmente disponibile sul sistema. Questa voce di menu fa riferimento a una (distribuzione ostree`costituita da un kernel Linux, un initramfs e un hash che si collega a un commit `ostree(passato tramite l’argomento del kernel`ostree=`). Durante l’avvio, `ostree`leggerà questo argomento del kernel per determinare quale distribuzione utilizzare come file system radice. Ogni aggiornamento o modifica al sistema (installazione di pacchetti, aggiunta di argomenti del kernel) crea una nuova distribuzione. Ciò consente di ripristinare (eseguire il rollback a) una distribuzione precedente se l’aggiornamento dovesse causare problemi.