Linux Tutorial – Puntata 31

di jolek78

Care/i fruitrici e fruitori del blog, in questi post – ogni domenica mattina – si parlerà del sistema operativo GNU/Linux e degli strumenti per utilizzarlo al massimo delle potenzialità. Cercheremo di spiegare come funziona, cosa è il kernel, come costruirsi una vpn, come settare un firewall e giocare col terminale, usare adb e altro. Se il capitalismo della sorveglianza ci vuole passivi consumatori-consumatrici di servizi noi si risponde con un po’ di “cultura informatica” e un MARAMEO (quasi affettuoso). Buona lettura!

Quando la prima volta qualcuno mi disse “puoi installare una macchina virtuale linux sopra una macchina fisica windows” ricordo che storsi il naso. Poi provai a farlo e quell’esperienza corroboro’ la mia ipotesi: le macchine virtuali non erano assolutamente mature e non facevano per me. Per anni mi rifiutai categoricamente di considerare le macchine virtuali come delle alternative funzionanti. Se ci penso, davvero, mi vien da ridere. Quasi tutti i sistemi cloud di oggi si basano su macchine virtuali perfettamente funzionanti e i cosiddetti hypervisor – virtualbox è uno di questi – sono innumerevoli, altamente configurabili e veramente ben fatti fino al punto che, per esempio, per questo tutorial, stiamo proprio utilizzando una macchina virtuale linux installata su un hypervisor multipiattaforma. Tutto sembra dunque perfetto, se non fosse che nell’utilizzo giornaliero, nonostante una attenta e certosina configurazione, questo sistema non fa altro che appesantire la macchina fisica sul quale gira. Una macchina virtuale infatti lavora essenzialmente in memoria, e lavora sopra un hypervisor che è quindi un’altra applicazione che deve girare affinché la macchina virtuale possa funzionare. È una scatola pesante dentro una scatola pensante dentro un’altra scatola pesante. Che fanno tre scatole pesanti. A quei tempi però, quindi parlo di circa 20 anni fa, qualcuno parlava di questa bella cosa chiamata “Jails” su Freebsd, che funzionava facendo partire le macchine virtuali condividendo direttamente il kernel. Gran bella idea. Tanto bella che Linux decise d’implementare una idea simile introducendo KVM, un modulo del kernel attivabile a comando per far funzionare macchine virtuali sopra hypervisors opensource come Qemu.

Macchine virtuali o applicazioni?

Ricapitoliamo. Per far funzionare una macchina virtuale abbiamo bisogno di
– un computer
– un kernel
– un modulo del kernel
– un hypervisor

A questo punto, circa dieci anni fa, comincio’ lo sviluppo di una nuova idea: e se per far funzionare delle macchine virtuali, o qualcosa di simile, facessimo a meno del pesante hypervisor? E se per avere un nuovo sistema operativo funzionante sopra la macchina fisica potessimo avere una semplice applicazione, magari leggera, che occupa poco spazio e poche risorse? Questa idea si sviluppo’ velocemente tramite due attori principali: LXC e Docker, e quelle non-macchine-virtuali diventarono popolari e vennero chiamate “containers”. Un “container”, in parole povere, è un gruppo di applicazioni che replica l’esperienza di un intero sistema operativo all’interno di un blocco chiuso e isolato. Non male vero? Oggi, nel tutorial, proveremo a introdurre forse il più performante dei due, LXC, e proveremo a configurare alcuni containers che ci potranno essere utili nel prosieguo delle puntate. Buona lettura.

Snap Install

Ubuntu è una delle distribuzioni linux che, fin dal principio, ha deciso di supportare pienamente lxc Tanto pienamente che, purtroppo, Canonical ha deciso d’inserire il pacchetto d’installazione all’interno del suo store snapcraft. Turiamoci il naso e:

bottega@bottegadelbarbieri  ~  sudo snap install lxd
lxd 4.19 from Canonical✓ installed

bottega@bottegadelbarbieri  ~  snap list
Name    Version           Rev    Tracking       Publisher   Notes
core20  20210928          1169   latest/stable  canonical✓  base
ipfs    0.10.0-64b532fbb  2525   latest/stable  elopio      -
lxd     4.19              21750  latest/stable  canonical✓  -      <<<<<<<<<<<<
snapd   2.52.1            13640  latest/stable  canonical✓  snapd
Id – Group
Verifichiamo che esista l’id, che esista il gruppo lxc, e che l’utente bottega sia membro del gruppo lxc:
bottega@bottegadelbarbieri  ~  id bottega
uid=1000(bottega) gid=1000(bottega) groups=1000(bottega),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),121(lpadmin),131(lxd),132(sambashare)

bottega@bottegadelbarbieri  ~  tail /etc/group
pulse:x:129:
pulse-access:x:130:
lxd:x:131:bottega       <<<<<<<<<
bottega:x:1000:
sambashare:x:132:bottega
systemd-coredump:x:999:
vboxsf:x:133:
debian-tor:x:134:
_flatpak:x:135:
Images

Una delle cose belle del progetto è che, all’interno dell’archivio pubblico, esistono immagini già configurate e aggiornate, manutenute dagli sviluppatori. Per cominciare quindi, invece che costruire una immagine da zero, basterà scaricarne una e configurarla. Listiamo quindi prima i repos:

bottega@bottegadelbarbieri  ~  lxc remote list
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    |  AUTH TYPE  | PUBLIC | STATIC | GLOBAL |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| images          | https://images.linuxcontainers.org       | simplestreams | none        | YES    | NO     | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| local (current) | unix://                                  | lxd           | file access | NO     | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams | none        | YES    | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams | none        | YES    | YES    | NO     |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
E poi, successivamente, le immagini. Ci baseremo sulla distro ubuntu, versione LTS 20.04, piattaforma amd64:
bottega@bottegadelbarbieri  ~  lxc image list images: ubuntu 20.04 amd64
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
|             ALIAS             | FINGERPRINT  | PUBLIC |             DESCRIPTION             | ARCHITECTURE |      TYPE       |   SIZE    |          UPLOAD DATE          |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
| ubuntu/focal (7 more)         | a33719937baa | yes    | Ubuntu focal amd64 (20211018_07:42) | x86_64       | CONTAINER       | 103.43MB  | Oct 18, 2021 at 12:00am (UTC) |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
| ubuntu/focal (7 more)         | d91bf665b110 | yes    | Ubuntu focal amd64 (20211018_07:42) | x86_64       | VIRTUAL-MACHINE | 241.38MB  | Oct 18, 2021 at 12:00am (UTC) |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
| ubuntu/focal/cloud (3 more)   | 9acc8d23b0a2 | yes    | Ubuntu focal amd64 (20211018_07:42) | x86_64       | VIRTUAL-MACHINE | 264.75MB  | Oct 18, 2021 at 12:00am (UTC) |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
| ubuntu/focal/cloud (3 more)   | 954282bad1a9 | yes    | Ubuntu focal amd64 (20211018_07:42) | x86_64       | CONTAINER       | 118.53MB  | Oct 18, 2021 at 12:00am (UTC) |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
| ubuntu/focal/desktop (3 more) | e8ab0ca7b864 | yes    | Ubuntu focal amd64 (20211018_07:42) | x86_64       | VIRTUAL-MACHINE | 1349.05MB | Oct 18, 2021 at 12:00am (UTC) |
+-------------------------------+--------------+--------+-------------------------------------+--------------+-----------------+-----------+-------------------------------+
Launch image
Ed ora il momento chiave: installiamo il primo container chiamato wireguard:
bottega@bottegadelbarbieri  ~  lxc launch ubuntu:20.04 wireguard
Creating wireguard
Starting wireguard
Voilà, semplice come bere un bicchier d’acqua. Poi lanciamo alcuni comandi dall’esterno, senza entrarci dentro. Chiediamo dapprima i dati:
bottega@bottegadelbarbieri  ~  lxc exec wireguard -- hostnamectl
   Static hostname: wireguard
         Icon name: computer-container
           Chassis: container
        Machine ID: 92e1c2e473ec4c228cd49b7dbe7467e8
           Boot ID: 0b4c762f9885499cb683fb72a47624b0
    Virtualization: lxc
  Operating System: Ubuntu 20.04.3 LTS
            Kernel: Linux 5.11.0-38-generic
      Architecture: x86-64
Poi verifichiamo l’ip:
bottega@bottegadelbarbieri  ~  lxc exec wireguard -- ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:36:ea:b6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.235.10.140/24 brd 10.235.10.255 scope global dynamic eth0
       valid_lft 3477sec preferred_lft 3477sec
    inet6 fe80::216:3eff:fe36:eab6/64 scope link
       valid_lft forever preferred_lft forever
E poi aggiorniamo il sistema:
bottega@bottegadelbarbieri  ~  lxc exec wireguard -- apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

bottega@bottegadelbarbieri  ~  lxc exec wireguard -- apt dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Login
Ovviamente, un metodo per entrare esiste. E allora facendo il login:
bottega@bottegadelbarbieri  ~  lxc exec wireguard -- su --login ubuntu

ubuntu@wireguard:~$ lsb_release -ra
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
Image – Container
Chiariamo una cosa: c’e’ una differenza fondamentale fra immagini e container. Le immagini sono letteralmente “immagini”, cioè sono l’analogo delle iso che normalmente si scaricano per poi essere installate all’interno degli hypervisor. Blocchi completi, magari strutturati per far lavorare soltanto alcuni servizi, e uguali per tutti. Noi, nell’installazione del container wireguard, ne abbiamo scaricata una in particolare. Andiamo a vedere le sue caratteristiche:
bottega@bottegadelbarbieri  ~  lxc image info ubuntu:20.04
Fingerprint: 5fc94479f588171282beb094da96bb83eb51420d6cf13b223c737d1fda9169cd
Size: 370.44MB
Architecture: x86_64
Type: container
Public: yes
Timestamps:
    Created: 2021/10/21 00:00 UTC
    Uploaded: 2021/10/21 00:00 UTC
    Expires: 2025/04/23 00:00 UTC
    Last used: never
Properties:
    serial: 20211021
    description: ubuntu 20.04 LTS amd64 (release) (20211021)
    type: squashfs
    os: ubuntu
    release: focal
    version: 20.04
    architecture: amd64
    label: release
Aliases:
    - 20.04
    - 20.04/amd64
    - default
    - default/amd64
    - f
    - f/amd64
    - focal
    - focal/amd64
    - lts
    - lts/amd64
    - ubuntu
    - amd64
Cached: no
Auto update: disabled
Profiles: []
Ls
E poi listiamo entrambe, prima l’immagine e poi il container:
bottega@bottegadelbarbieri  ~  lxc image ls
+-------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 | ARCHITECTURE |   TYPE    |   SIZE   |         UPLOAD DATE          |
+-------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+
|       | 5fc94479f588 | no     | ubuntu 20.04 LTS amd64 (release) (20211021) | x86_64       | CONTAINER | 370.44MB | Oct 23, 2021 at 5:38pm (UTC) |
+-------+--------------+--------+---------------------------------------------+--------------+-----------+----------+------------------------------+

bottega@bottegadelbarbieri  ~  lxc ls
+-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
|   NAME    |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| wireguard | RUNNING | 0.235.10.140  (eth0) | fd42:7a29:e472:f97a:216:3eff:fec7:3dfc (eth0) | CONTAINER | 0         |
+-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
Semplice no?
Network
Ora facciamo qualcosa di interessante. Creiamo, cosi’ per prova, altri due nuovi container basati sulla stessa immagine, cosi’ da non appesantire il sistema. Uno lo chiameremo nginix, il nome di un server web, e l’altro mariadb, il nome di un database:
bottega@bottegadelbarbieri  ~  lxc launch ubuntu:20.04 nginx
Creating nginx
Starting nginx
bottega@bottegadelbarbieri  ~  lxc launch ubuntu:20.04 mariadb
Creating mariadb
Starting mariadb

bottega@bottegadelbarbieri  ~  lxc exec nginx -- apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
bottega@bottegadelbarbieri  ~  lxc exec mariadb -- apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

E poi listiamo tutti i container che abbiamo creato:
bottega@bottegadelbarbieri  ~  lxc ls
+-----------+---------+----------------------+------+-----------+-----------+
|   NAME    |  STATE  |         IPV4         | IPV6 |   TYPE    | SNAPSHOTS |
+-----------+---------+----------------------+------+-----------+-----------+
| mariadb   | RUNNING | 10.235.10.93 (eth0)  |      | CONTAINER | 0         |
+-----------+---------+----------------------+------+-----------+-----------+
| nginx     | RUNNING | 10.235.10.31 (eth0)  |      | CONTAINER | 0         |
+-----------+---------+----------------------+------+-----------+-----------+
| wireguard | RUNNING | 10.235.10.140 (eth0) |      | CONTAINER | 0         |
+-----------+---------+----------------------+------+-----------+-----------+

Curioso vero? Sembrano tutti far parte della stessa subnet. Se controlliamo infatti sulla macchina virtuale della bottega, l’attivazione di lxc ha creato una nuova interfaccia di rete lxdbr0,  che domina l’intero gruppo:
bottega@bottegadelbarbieri  ~  ip a s lxdbr0
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:be:62:f7 brd ff:ff:ff:ff:ff:ff
inet 10.235.10.1/24 scope global lxdbr0
valid_lft forever preferred_lft forever
inet6 fd42:1bad:a58:d93a::1/64 scope global 
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:febe:62f7/64 scope link 
valid_lft forever preferred_lft forever
Resource 

Di default, lxc gestisce automaticamente tutte le risorse disponibili. Ecco, forse questo non è una buona idea. Configuriamo quindi memoria e cpu utilizzate da ciascuno di loro:

bottega@bottegadelbarbieri  ~  lxc config set wireguard limits.memory 512MB
bottega@bottegadelbarbieri  ~  lxc config set nginx limits.memory 512MB
bottega@bottegadelbarbieri  ~  lxc config set mariadb limits.memory 512MB

bottega@bottegadelbarbieri  ~  lxc config set wireguard limits.cpu 1
bottega@bottegadelbarbieri  ~  lxc config set nginx limits.cpu 1
bottega@bottegadelbarbieri  ~  lxc config set mariadb limits.cpu 1

Anche qui, davvero semplice.

Snapshot

Ora salviamo degli snapshot per ogni container :

bottega@bottegadelbarbieri  directory  ~  lxc snapshot wireguard 20211024
bottega@bottegadelbarbieri  directory  ~  lxc snapshot nginx 20211024
bottega@bottegadelbarbieri  directory  ~  lxc snapshot mariadb 20211024

bottega@bottegadelbarbieri  directory  ~  lxc ls
+-----------+---------+----------------------+------+-----------+-----------+
| NAME      | STATE   | IPV4                 | IPV6 | TYPE      | SNAPSHOTS |
+-----------+---------+----------------------+------+-----------+-----------+
| mariadb   | RUNNING | 10.235.10.93 (eth0)  |      | CONTAINER | 1         |
+-----------+---------+----------------------+------+-----------+-----------+
| nginx     | RUNNING | 10.235.10.31 (eth0)  |      | CONTAINER | 1         |
+-----------+---------+----------------------+------+-----------+-----------+
| wireguard | RUNNING | 10.235.10.140 (eth0) |      | CONTAINER | 1         |
+-----------+---------+----------------------+------+-----------+-----------+
lxdui 

Una Gui? E perché no? Se si potessero visualizzare tutti i container da una pagina web, sarebbe comodo no? E allora…

bottega@bottegadelbarbieri  ~  sudo apt install python3.8-venv
[sudo] password for bottega: 
Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
python-pip-whl
[...]
Preparing to unpack .../python3.8-venv_3.8.10-0ubuntu1~20.04.1_amd64.deb ...
Unpacking python3.8-venv (3.8.10-0ubuntu1~20.04.1) ...
Setting up python-pip-whl (20.0.2-5ubuntu1.6) ...
Setting up python3.8-venv (3.8.10-0ubuntu1~20.04.1) ...


bottega@bottegadelbarbieri  directory  ~  git clone https://github.com/AdaptiveScale/lxdui.git
Cloning into 'lxdui'...
remote: Enumerating objects: 5190, done.
remote: Counting objects: 100% (61/61), done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 5190 (delta 20), reused 13 (delta 3), pack-reused 5129
Receiving objects: 100% (5190/5190), 5.04 MiB | 10.73 MiB/s, done.
Resolving deltas: 100% (3595/3595), done.

bottega@bottegadelbarbieri  directory  ~  cd lxdui
/home/bottega/lxdui
bottega@bottegadelbarbieri  python3 setup.py install
[....]
Using /usr/lib/python3/dist-packages
Searching for cryptography==2.8
Best match: cryptography 2.8
Adding cryptography 2.8 to easy-install.pth file
Using /usr/lib/python3/dist-packages
Searching for requests-unixsocket==0.2.0
Best match: requests-unixsocket 0.2.0
Adding requests-unixsocket 0.2.0 to easy-install.pth file
Using /usr/lib/python3/dist-packages
Searching for python-dateutil==2.7.3
Best match: python-dateutil 2.7.3
Adding python-dateutil 2.7.3 to easy-install.pth file

Using /usr/lib/python3/dist-packages
Finished processing dependencies for LXDUI==2.2\

Settiamo utente e password:

bottega@bottegadelbarbieri  directory  ~/lxdui   develop  python3 run.py user add -u bottega 
Password:

Modifichiamo le regole del firewall sulla porta 15151:

bottega@bottegadelbarbieri   directory  ~/lxdui   develop ●  sudo ufw allow 15151
Rule added
bottega@bottegadelbarbieri   directory  ~/lxdui   develop ●  sudo ufw reload
Firewall reloaded

bottega@bottegadelbarbieri   directory  ~/lxdui   develop ●  sudo ufw status verbose 
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
2121/tcp                   ALLOW IN    Anywhere                  
10000                      ALLOW IN    Anywhere                  
Anywhere                   ALLOW IN    192.168.0.0/24            
15151                      ALLOW IN    Anywhere

Facciamo partire il programma:

bottega@bottegadelbarbieri  directory  ~/lxdui   develop ●  python3 run.py start &
[1] 74483
⚙ bottega@bottegadelbarbieri  directory  ~/lxdui   develop ●  LXDUI ver. 2.2 -- (c)AdaptiveScale, Inc.
http://www.adaptivescale.com
LXDUI started. Running on http://0.0.0.0:15151
PID=74483, Press CTRL+C to quit

e poi puntando il browser all’indirizzo: http://10.235.10.1:15151

Bello vero? Divertitevi ora…

Alla prossima settimana!
jolek78

>> Indice <<
Puntata 30 < > Puntata 32

Il logo “Tux Linux” e’ stato realizzato e distribuito dall’artista deiby-ybied su Deviantart in licenza Creative Commons BY-NC-SA 3.0

jolek78
Un tizio che pensava di essere uno scienziato. Si ritrovò divulgatore scientifico. Poi si addormentò e si svegliò informatico. Ma era sempre lui.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.