Vai al contenuto

6 Profili

In questo capitolo, i comandi devono essere eseguiti come utente non privilegiato (“incusadmin” se avete seguito questo libro dall'inizio).

Quando si installa Incus, si ottiene un profilo predefinito, che non può essere rimosso o modificato. È possibile utilizzare il profilo predefinito per creare nuovi profili per i propri container.

Se si esamina l'elenco dei container, si noterà che l'indirizzo IP in ogni caso proviene dall'interfaccia bridged. In un ambiente di produzione, si potrebbe voler usare qualcos'altro. Può trattarsi di un indirizzo assegnato tramite DHCP dall'interfaccia LAN o di un indirizzo assegnato staticamente dalla WAN.

Se si configura il server Incus con due interfacce e si assegna a ciascuna un IP sulla WAN e sulla LAN, è possibile assegnare gli indirizzi IP del container in base all'interfaccia verso cui il container si deve rivolgere.

A partire dalla versione 9.4 di Rocky Linux (e da qualsiasi copia di Red Hat Enterprise Linux con bug), il metodo per assegnare gli indirizzi IP staticamente o dinamicamente con i profili non funziona.

Ci sono modi per aggirare questo problema, ma è difficile. Questo sembra avere a che fare con le modifiche apportate a Network Manager che influenzano macvlan. macvlan consente di creare molte interfacce con indirizzi Layer 2 diversi.

Tenere presente che questo comporta degli svantaggi quando si scelgono immagini di container basate su RHEL.

Creare un profilo macvlan ed assegnarlo

Per creare il profilo macvlan, utilizzare questo comando:

incus profile create macvlan

Se ci si trova su una macchina multi-interfaccia e si vuole più di un modello macvlan in base alla rete che si vuole raggiungere, si potrebbe usare “lanmacvlan” o “wanmacvlan” o qualsiasi altro nome che si voglia usare per identificare il profilo. L'uso di “macvlan” nel comando di creazione del profilo dipende da voi.

Si vuole cambiare l'interfaccia macvlan, ma prima di farlo, è necessario sapere qual è l'interfaccia principale del server Incus. Questa interfaccia avrà un IP assegnato alla LAN (in questo caso). Per individuare l'interfaccia, utilizzare:

ip addr

Cercare l'interfaccia con l'assegnazione IP LAN nella rete 192.168.1.0/24:

2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 40:16:7e:a9:94:85 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
       valid_lft 4040sec preferred_lft 4040sec
    inet6 fe80::a308:acfb:fcb3:878f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

In questo caso, l'interfaccia è "enp3s0".

Successivamente, cambiare il profilo.

incus profile device add macvlan eth0 nic nictype=macvlan parent=enp3s0

Questo comando aggiunge tutti i parametri necessari al profilo macvlan per il suo utilizzo.

Esaminare ciò che questo comando ha creato utilizzando il comando:

incus profile show macvlan

Il risultato sarà simile a questo:

config: {}
description: ""
devices:
  eth0:
    nictype: macvlan
    parent: enp3s0 
    type: nic
name: macvlan
used_by: []

I profili possono essere usati per molte altre cose, ma l'assegnazione di un IP statico a un container o l'uso del proprio server DHCP sono esigenze comuni.

Per assegnare il profilo macvlan a rockylinux-test-8, occorre procedere come segue:

incus profile assign rockylinux-test-8 default,macvlan

Fare la stessa cosa per rockylinux-test-9:

incus profile assign rockylinux-test-9 default,macvlan

Questo comando specifica che si vuole il profilo predefinito e che si vuole applicare anche il profilo macvlan.

Rocky Linux macvlan

Il Network Manager è cambiato costantemente nelle distribuzioni e nei cloni di RHEL. Proprio per questo motivo, il modo in cui lavora il profilo macvlan non funziona (almeno rispetto ad altre distribuzioni) e richiede un lavoro aggiuntivo per assegnare gli indirizzi IP da DHCP o staticamente.

Bisogna ricordare che tutto questo non ha nulla a che fare con Rocky Linux, ma con l'implementazione dei pacchetti upstream.

Se si desidera eseguire i container Rocky Linux e utilizzare macvlan per assegnare un indirizzo IP dalle reti LAN o WAN, il processo è diverso a seconda della versione del container del sistema operativo (8.x o 9.x).

Rocky Linux 9.x macvlan - la soluzione DHCP

Innanzitutto, si illustra cosa succede quando si arrestano e si riavviano i due container dopo aver assegnato il profilo macvlan.

L'assegnazione del profilo, tuttavia, non modifica la configurazione predefinita, che è DHCP per impostazione predefinita.

Per verificarlo, procedere come segue:

incus restart rocky-test-8
incus restart rocky-test-9

Elencare nuovamente i container e notare che rockylinux-test-9 non ha più un indirizzo IP:

incus list
+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING |                      |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Come si può vedere, il container Rocky Linux 8.x ha ottenuto l'indirizzo IP dall'interfaccia LAN, mentre il container Rocky Linux 9.x no.

Per dimostrare ulteriormente il problema, si deve eseguire dhclient sul container Rocky Linux 9.0. Questo mostrerà che il profilo macvlan è impostato:

incus exec rockylinux-test-9 dhclient

Un altro elenco di container mostra ora quanto segue:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Ciò sarebbe dovuto accadere con l'arresto e l'avvio del contenitore, ma non è così. Supponendo di voler utilizzare sempre un indirizzo IP assegnato da DHCP, si può risolvere il problema semplicemente con una voce di crontab. Per fare ciò, è necessario ottenere l'accesso al container tramite shell, inserendo:

incus shell rockylinux-test-9

Quindi, determiniamo il percorso di dhclient. Per farlo, poiché questo contenitore proviene da un'immagine minimale, è necessario installare prima which:

dnf install which

Quindi eseguire:

which dhclient

Che restituirà questo:

/usr/sbin/dhclient

Successivamente, modificare il crontab di root:

crontab -e

Aggiungere questa riga:

@reboot    /usr/sbin/dhclient

Il comando crontab inserito utilizza vi. Utilizzare Shift+:+w+q per salvare le modifiche ed uscire.

Uscire dal container e riavviare rockylinux-test-9:

incus restart rockylinux-test-9

Un altro elenco rivelerà che al contenitore è stato assegnato un indirizzo DHCP:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Rocky Linux 9.x macvlan - Il fix al IP statico

Quando si assegna staticamente un indirizzo IP, le cose si complicano ulteriormente. Poiché network-scripts è ora deprecato in Rocky Linux 9.x, l'unico modo per farlo è attraverso l'assegnazione statica e, a causa del modo in cui i container utilizzano la rete, non è possibile impostare la route con una normale istruzione ip route. Il problema è che l'interfaccia assegnata quando si applica il profilo macvlan (eth0 in questo caso), non è gestibile con Network Manager. La soluzione consiste nel rinominare l'interfaccia di rete del contenitore dopo il riavvio e assegnare l'IP statico. È possibile farlo con uno script ed eseguirlo (di nuovo) nel crontab di root. Per farlo, utilizzare il comando ip.

Per farlo, è necessario ottenere nuovamente l'accesso al contenitore:

incus shell rockylinux-test-9

Successivamente, si creerà uno script bash in /usr/local/sbin chiamato “static”:

vi /usr/local/sbin/static

Il contenuto di questo script non è complicato:

#!/usr/bin/env bash

/usr/sbin/ip link set dev eth0 name net0
/usr/sbin/ip addr add 192.168.1.151/24 dev net0
/usr/sbin/ip link set dev net0 up
sleep 2
/usr/sbin/ip route add default via 192.168.1.1

Cosa si sta cercando di fare qui?

  • si rinomina eth0 con un nuovo nome che si può gestire (“net0”)
  • si assegna il nuovo IP statico che è stato assegnato al container (192.168.1.151)
  • si apre la nuova interfaccia "net0"
  • si attende 2 secondi affinché l'interfaccia sia attiva prima di aggiungere la route predefinita
  • è necessario aggiungere la route predefinita per la propria interfaccia

Rendete il vostro script eseguibile con quanto segue:

chmod +x /usr/local/sbin/static

Aggiungerlo al crontab di root per il container con l'ora di @reboot:

@reboot     /usr/local/sbin/static

Infine, uscire dal container e riavviarlo:

incus restart rockylinux-test-9

Aspettate qualche secondo e elencate di nuovo i contenitori:

incus list

Il successo dovrebbe essere visibile:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 10.146.84.181 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Ubuntu macvlan

Fortunatamente, l'implementazione di Ubuntu di Network Manager non interrompe lo stack macvlan, rendendo molto più semplice la distribuzione!

Proprio come nel caso del container rockylinux-test-9, è necessario assegnare il profilo al container:

incus profile assign ubuntu-test default,macvlan

Per sapere se il DHCP assegna un indirizzo al container, arrestarlo e riavviarlo:

incus restart ubuntu-test

Elencare nuovamente i contenitori:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.132 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Successo!

La configurazione dell'IP statico è un po' diversa, ma non difficile. È necessario modificare il file .yaml associato alla connessione del container (10-incus.yaml). Per questo IP statico si utilizzerà 192.168.1.201:

vi /etc/netplan/10-incus.yaml

Cambiare ciò che c'è con quanto segue:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: false
      addresses: [192.168.1.201/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]

Salvare le modifiche e uscire dal container.

Riavviare il container:

incus restart ubuntu-test

Quando si elencano nuovamente i containeri, si vedrà il proprio IP statico:

+-------------------+---------+----------------------+------+-----------+-----------+
|       NAME        |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test       | RUNNING | 192.168.1.201 (eth0) |      | CONTAINER | 0         |
+-------------------+---------+----------------------+------+-----------+-----------+

Successo!

Negli esempi qui utilizzati, è stato scelto intenzionalmente un container difficile da configurare e due meno difficili. Molte altre versioni di Linux sono presenti nell'elenco delle immagini. Se si ha una distro preferita, provare a installarla, assegnando il modello macvlan e impostare gli IP.

Author: Spencer Steven

Contributors: Ezequiel Bruni, Ganna Zhyrnova