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
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 | +-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
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
bottega@bottegadelbarbieri ~ lxc launch ubuntu:20.04 wireguard Creating wireguard Starting wireguard
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
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
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
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
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
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 | +-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
Network
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.
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 | +-----------+---------+----------------------+------+-----------+-----------+
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