Utilizzo del software di virtualizzazione VirtualBox.
Le macchine virtuali sono software che permettono di emulare un intero computer.
VirtualBox è un software di virtualizzazione, ovvero un programma che permette di creare e gestire macchine virtuali.
I sistemi operativi vengono spesso distribuito in formato iso, ovvero un file immagine che contiene i file necessari per la sua istallazione.
Alternativamente, dopo aver creato una prima VM, questa può essere clonata per creare altre VM identiche con lo stesso stato.
Vediamo i passi necessari per creare una macchina virtuale.
Scarichiamo l'immagine del sistema operativo che vogliamo installare.
In questo caso, utilizzeremo debian.
La guida riguardo la configurazione di VirtualBox può essere consultata sul sito.
Nel momento in cui viene avviata, selezionando l'installazione grafica sarà sufficiente seguire le istruzioni a schermo.
Per utilizzare più agevolmente la VM, può essere comodo connettersi ad essa tramite ssh.
Questo può essere fatto dopo aver attivato il server ssh sul guest OS.
Se l'installazione è stata quella guidata, dovrebbe essere già attivo.
Altrimenti è necessario seguire questi passi.
Di default, VirtualBox crea una connessione di tipo NAT.
Per poterci connettere alla VM, dobbiamo effettuare un port forwarding.
Dall'host OS, possiamo connetterci alla VM tramite ssh.
ssh -p 2222 debian@localhost
VirtualBox supporta diversi tipi di rete.
La scelta influenza la raggiungibilità delle VM e la loro connessione ad altre reti.
Mode | VM → Host | VM ← Host | VM1 ↔ VM2 | VM → LAN | VM ← LAN |
---|---|---|---|---|---|
Bridged | ✓ | ✓ | ✓ | ✓ | ✓ |
NAT network | ✓ | Forwarding | ✓ | ✓ | Forwarding |
NAT | ✓ | Forwarding | ✓ | Forwarding | |
Host-only | ✓ | ✓ | ✓ | ||
Internal | ✓ | ||||
Detached |
Di seguito ci sarà una serie di passaggi o di controlli da fare per verificare la correttezza della configurazione di VirtualBox.
Assicuratevi che il passaggio sia fatto sulla macchina corretta guardando il prompt della shell: host (il vostro computer) o vm (la macchina virtuale).
Alcune operazioni richiedono privilegi di amministratore.
Se è questo il caso, il prompt della shell mostrerà l'utente root
Per eseguire tali operazioni, potete aggiungere sudo
prima del comando o cambiare utente con su
, diventando root.
Dopo aver effettuato tutti gli eventuali aggiornamenti ed installazioni che necessitano internet, generalmente si userà la rete host-only.
Bisogna assicurarsi che Virtualbox abbia creato tale rete.
A quel punto si deve impostare l'interfaccia di rete che userà la VM.
Se clonate una macchina, assicuratevi di cambiare il MAC address.
Per poter connettere la VM, è necessario conoscere il suo indirizzo ip.
Questo può essere fatto con il comando ip a
.
user@vm:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...
...
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.24/24 brd 192.168.56.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::800:27ff:fe00:3754/64 scope link
valid_lft forever preferred_lft forever
L'interfaccia è la enp0s3
, e gli indirizzi sono 192.168.56.24
per IpV4 e fe80::800:27ff:fe00:2754
per IpV6.
A questo punto la VM dovrebbe essere raggiungibile dall'host.
La connessione può essere verificata con il comando ping
.
# ping <ip VM>
user@host:~$ ping 192.168.56.24
SSH è un tool, nonché un protocollo, per poter accedere alla VM da remoto. La VM deve fornire un server SSH a cui l'host si connetterà.
Per verificare che il server SSH sia attivo, si può usare il comando systemctl
.
Potrebbe essere necessario essere root.
root@vm:~$ systemctl status ssh
ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Fri 2021-09-24 15:27:55 CEST; 1h 26min ago
...
Se il server SSH non è installato, può essere fatto con il comando apt
.
Bisogna assicurarsi di avere i privilegi di root.
Inoltre sarà necessario accedere ad internet per effettuare il download.
Quindi la VM dovrà essere connessa utilizzando la rete NAT.
root@vm:~$ apt update # Aggiornamento dei pacchetti, se non ancora fatto
root@vm:~$ apt install openssh-server
A questo punto la VM dovrebbe essere raggiungibile dall'host tramite ssh.
La connessione può essere verificata con il comando ssh
.
# ssh <user>@<ip VM>
user@host:~$ ssh user@192.168.56.24
La prima volta che effettuate la connessione vi verrà chiesto di accettare la chiave pubblica (fingerprint) del server ssh.
Per proseguire basta digitare yes
.
VsCode offre l'estensione Remote - SSH che fornisce una connessione ssh agevolata.
Nel connettervi alla VM, non utilizzate l'account di root, ma quello utente, con la sua password.
Al primo avvio sarà necessario attendere per l'installazione del server VsCode sulla VM.
Serie di consigli e trucchi per utilizzare al meglio le macchine virtuali e VsCode.
Quando si effettua il login tramite ssh, si dovrebbe utilizzare sempre un utente non privilegiato. Se vi dovesse servire agire con i permessi di amministratore, potete:
sudo
(es. sudo apt update
). Verrà chiesta la password dell'utente.su
. Verrà chiesta la password di root.# Da user a root
user@vm:~$ su
Password:
# Da root a user
root@vm:/home/user$ su user
user@vm:~$
Invece di inserire ogni volta la stringa user@ip
per connettersi alla VM, è possibile aggiungere un host alla configurazione di ssh.
Questa operazione può essere fatta sia dal menù di connessione di VsCode, selezionando
+ Add New SSH Host...
sia manualmente, editando il file ~/.ssh/config
.
# ~/.ssh/config
Host vm # Nome mostrato nella lista di VsCode
HostName 192.168.56.24 # Ip della VM
User user # Utente con cui connettersi
Se avete bisogno di creare più VM identiche, potete effettuare delle clonazioni, così da evitare di ripetere il setup più volte.
In questo caso, connettendosi con VsCode alla VM originale, effettuerete il setup del server VsCode e potreste anche installare eventuali estensioni, in particolare quella di C/C++. Tutte le macchine clone si ritroveranno tutto il necessario già pronto.
Ricordatevi di cambiare il MAC address delle VM clonate.
Quando si lancia un comando da terminale, il terminale rimane occupato fino a che il comando non termina.
Questo può essere scomodo se si vuole eseguire più comandi che rimangono in esecuzione contemporaneamente, come ad esempio un server e un client.
Il modo più semplice per eseguire più comandi contemporaneamente è quello di aprire più terminali:
Terminal
-> New Terminal
(o Split terminal
)Un comando può essere eseguito in background aggiungendo &
alla fine del comando.
I programmi in background non ricevono input da tastiera e non mostrano output sul terminale.
user@vm:~$ ./server 2000 & ./client 127.0.0.1 2000
Per vedere i comandi in background, si può usare il comando jobs
.
user@vm:~$ jobs
[1]+ Running ./server &
Per riportare un comando in background in foreground, si può usare il comando fg
, potendolo poi interrompere con Ctrl+C
.
user@vm:~$ fg %1
Un terminal multiplexer è un software che permette di dividere una finestra di terminale in più parti, o pannelli indipendenti.
Alcuni esempi sono:
Byobu è un frontend per tmux o screen, che permette di avere una serie di comandi predefiniti per la gestione delle sessioni.
Per installarlo, basta usare il comando apt
.
root@vm:~$ apt install byobu
Per avviarlo, basta digitare byobu
da terminale.
Byobu offre una serie di keybindings per la gestione delle sessioni. Ecco i più comuni:
F2
: crea una nuova finestraF3
e F4
: naviga tra le finestreshift + F2
: divide la finestra orizzontalmenteshift + F3 / F4
: naviga tra i pannelli orizzontaliexit
: chiude la finestra correnteLista di comandi utili da terminale suddivisi per macro categorie.
ip a
: mostra le interfacce di rete e i relativi indirizzi ipip r
: mostra la tabella di routingping <ip>
: invia un pacchetto icmp echo request all'ip specificatossh <user>@<ip>
: connessione ssh all'ip specificatoscp <file locale> <user>@<ip>:<dest remota>
: copia il file locale in remotoscp <user>@<ip>:<file remoto> <dest locale>
: copia il file remoto in localels
: mostra i file e le cartelle presenti nella cartella correntels -la
: lista estesamkdir <cartella>
: crea una nuova cartellacd <cartella>
: entra nella cartellarm <file>
: rimuove il filerm -r <cartella>
: rimuove la cartella e tutto il suo contenutomv <file> <destinazione>
: rinomina il file o lo spostacp <file> <destinazione>
: copia il filecat <file>
: mostra il contenuto del filenano <file>
: apre il file con l'editor nanosystemctl status <nome servizio>
: mostra lo stato del serviziosystemctl start <nome servizio>
: avvia il serviziosystemctl stop <nome servizio>
: ferma il serviziosystemctl restart <nome servizio>
: riavvia il serviziosystemctl enable <nome servizio>
: avvia il servizio all'avvio della macchinaCapire meglio come funziona la rete e tutti i protocolli che vengono utilizzati diventa più facile quando si ha modo di osservare il traffico di rete.
Vi sono vari tool in grado di ottenere questo risultato. Noi vedremo una combinazione fra le funzionalità di VirtualBox e Wireshark per visualizzare i file .pcap.
VirtualBox prevede l'opzione di catturare tutto il traffico che coinvolge una macchina virtuale, salvandolo in un file .pcap.
Il comando deve essere fatto quando la macchina è spenta, e si applicherà al prossimo avvio.
La sintassi è la seguente:
VBoxManage modifyvm <nome vm> --nictrace<numero scheda di rete> on --nictracefile<numero scheda di rete> /path/file.pcap
Ad esempio
user@host:~$ VBoxManage modifyvm "MyVM" --nictrace1 on --nictracefile1 file.pcap
Ricordate di disattivare la cattura quando avete finito
user@vm:~$ VBoxManage modifyvm "MyVM" --nictrace1 off --nictracefile1 file.pcap
Una volta ottenuto il file .pcap, è possibile aprirlo con Wireshark o con qualsiasi altro tool in grado di leggere questo formato, come tcpdump.
Le guest additions sono un software opzionale che aggiunge diverse funzionalità alle VM create con VirtualBox.
Vedremo nello specifico come installarle su un guest debian. È sempre consigliabile fare queste operazioni sulla macchina virtuale originale, prima di effettuare cloni.
Il primo passo consiste nell'assicurarsi che la VM abbia accesso ad internet. La scheda di rete deve essere di tipo NAT, bridged o simili.
Successivamente si possono installare i pacchetti necessari.
root@vm:~$ apt update
root@vm:~$ apt install build-essential dkms linux-headers-$(uname -r)
Se si lavora con una macchina virtuale senza interfaccia grafica, quindi solo con il terminale, la funzione di copia-incolla non sarà abilitata di default dopo aver installato le guest additions. Sarà invece necessario installare alcuni pacchetti aggiuntivi.
root@vm:~$ apt x-window-system-core xclip
La nuova shell potrebbe utilizzare il layout della tastiera americano.
Per cambiarlo, si può usare il comando setxkbmap
.
user@vm:~$ setxkbmap it
Per poter verificare che tutto sia andato a buon fine, è necessario completare gli step successivi relativi all'installazione delle guest additions.
Abilitando la nuova shell con startx
, sarà possibile copiare i testi dall'host ed incollarli nella VM con il tasto centrale del mouse (o premendo entrambi i tasti contemporaneamente).
user@vm:~$ startx
La .iso delle guest addition può essere scaricata dal sito ufficiale.
La versione da scaricare è quella che appare nella sezione Help > About VirtualBox
.
Una volta scaricata, la .iso può essere inserta nella VM.
A questo punto è possibile montare il disco e installare le guest additions.
root@vm:~$ mkdir -p /mnt/cdrom
root@vm:~$ mount /dev/cdrom /mnt/cdrom
L'ultimo passaggio sarà quello di eseguire lo script di installazione
root@vm:~$ sh /mnt/cdrom/VBoxLinuxAdditions.run --nox11
Al prossimo riavvio, le guest additions saranno attive.
Per verificare che siano installate, si può usare il comando lsmod
.
root@vm:~$ lsmod | grep vbox
vboxsf 81920 0
vboxguest 40960 1 vboxsf
Una funzionalità molto comoda messa a disposizione da VirtualBox è la possibilità di condividere una cartella tra host e guest.
In questa modalità, una cartella presente sull'host sarà visibile anche sulla VM. In base alle impostazioni, sarà possibile leggere, scrivere o eseguire i file presenti, in modo che i cambiamenti siano visibili a tutte le macchine con accesso alla cartella.
Per assicurarsi di avere i permessi per la gestione della cartella condivisa, sarà sufficiente aggiungere l'utente corrente alla lista degli utenti del gruppo vboxsf
.
root@vm:~$ usermod -aG vboxsf user
La cartella condivisa temporanea è una cartella che viene creata e distrutta ad ogni avvio della VM.
Per creare una cartella condivisa temporanea, bisogna andare nelle impostazioni della VM, nella sezione Shared Folders
, e aggiungere una nuova cartella condivisa.
Le opzioni disponibili sono:
/media/sf_<folder name>
Se la cartella condivisa non viene montata automaticamente, è possibile farlo manualmente.
# Ci si assicura che il mount point sia un percorso valido
root@vm:~$ mkdir -p <mount point>
# Si monta la cartella condivisa
root@vm:~$ mount -t vboxsf -o uid=$UID <folder name> <mount point>
Questi passaggi dovranno essere ripetuti ad ogni avvio della VM.
Fare in modo che la cartella venga montata all'avvio della VM richiede qualche passaggio in più:
# Ottenere il proprio UID
user@vm:~$ echo $UID
# Editare il file /etc/fstab
root@vm:~$ nano /etc/fstab
# /etc/fstab
# Aggiungere la seguente riga, con le informazioni separate da un tab
<folder name> <mount point> vboxsf uid=<$UID ottenuto prima> 0 0