I libguestfs è una libreria C e una raccolta di strumenti su questa libreria per creare, visualizzare, accedere e modificare le immagini del disco della macchina virtuale in Linux. Puoi guardare all'interno delle immagini del disco, modificare i file che contengono, crearli da zero, ridimensionarli e molto altro. Non richiede libvirt o KVM e non richiede nemmeno i privilegi di root. Red Hat sponsorizza lo sviluppo di libguestfs. Supporta molte distribuzioni Linux e varianti Unix come Mac OS.
Libguestfs funziona con quasi tutti i file system Linux (ext2/3/4, XFS, btrfs, ecc.), i file system Windows (vfat e ntfs), i file system Mac OS e BSD, i volumi LVM2, le partizioni del disco MBR e GPT, i dischi RAW , QCOW2, VirtualBox VDI, VMWare VMDK e Hyper-V VHD/VHDX. Può persino accedere a file locali e dispositivi locali come CD e DVD ISO, schede SD o in remoto tramite FTP, HTTP, SSH, iSCSI, NBD, GlusterFS, Ceph, Sheepdog e molto altro.
Caratteristiche di Libguestfs
Usando gli strumenti libguest, possiamo svolgere molte attività come elencate di seguito:
- Crea macchine virtuali guest,
- Clone macchine virtuali,
- Crea macchine virtuali,
- Personalizza le macchine virtuali,
- Scripting delle modifiche alle macchine virtuali,
- Ispeziona le immagini della macchina virtuale,
- Visualizza e modifica i file all'interno dei computer guest,
- Copia file e directory da e verso macchine virtuali,
- Visualizza informazioni su filesystem, dispositivi, LVM,
- Archivia, carica e scarica file
- Monitoraggio del disco utilizzato/statistiche libere,
- Formatta dischi virtuali,
- Ridimensiona i dischi virtuali,
- Esecuzione di backup
- Monta e smonta il filesystem guest nel sistema host,
- P2V (conversione di una macchina fisica per l'esecuzione virtualizzata su KVM, OpenStack, oVirt, Red Hat Virtualization),
- V2V (conversione di una macchina guest da un hypervisor esterno per l'esecuzione su KVM),
- Visualizza i file di registro,
- Unisci le modifiche nel registro di Windows nei guest di Windows,
- e molto altro.
Puoi eseguire tutte queste attività tramite una shell con script chiamata guestfish o una shell di salvataggio interattiva virt-rescue .
Installa libguestfs su Linux
Esegui il seguente comando per installare libguestfs su Debian, Ubuntu:
$ sudo apt install libguestfs-tools
Su CentOS, RHEL:
$ sudo dnf install libguestfs-tools
Una volta installato, controlla la versione di guestfish usando il comando:
$ guestfish --version guestfish 1.40.2
Accedi e modifica le immagini del disco della macchina virtuale con Libguestfs
Assicurati che le macchine guest siano spente. Non devi modificare le immagini live per nessun motivo. Potrebbe causare la corruzione permanente del disco e la perdita di dati. Eseguire sempre il backup delle immagini del disco prima di apportare modifiche.
1. Guscio di pesce ospite
Guestfish, abbreviazione di guest filesystem shell, è una shell interattiva per la modifica di filesystem di macchine virtuali e immagini disco.
1.1. Accedi alle immagini disco esistenti e monta manualmente i filesystem guest
Innanzitutto, carichiamo un'immagine disco esistente da ispezionare.
Esegui il seguente comando da per entrare nella shell interattiva di guestfish:
$ guestfish
Risultato di esempio:
Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell ><fs>
Qui, >
..e poi aggiungi le immagini del disco usando il comando:
><fs> add ~/CentOS_8_Server.img
Quindi, esegui il comando seguente per avviare la libreria e allegare (avviare) l'immagine del disco:
><fs> run
Ci vorranno alcuni secondi la prima volta. Gli avvii successivi finiranno molto più velocemente.
Ora devi elencare e montare manualmente i filesystem guest.
Per visualizzare l'elenco dei filesystem nel disco, eseguire questo comando dal prompt di guestfish:
><fs> list-filesystems
Risultato di esempio:
/dev/sda1: ext4 /dev/cl/root: xfs /dev/cl/swap: swap
Monta un filesystem:
><fs> mount /dev/cl/root /
Visualizza punti di montaggio:
><fs> mountpoints /dev/cl/root: /
Allo stesso modo, monta gli altri filesystem.
1.2. Accedi alle immagini disco esistenti e monta automaticamente i filesystem guest
Invece di elencare e montare manualmente i filesystem guest, puoi lasciare che guestfish ispezioni automaticamente le immagini e monti i filesystem usando -i segnala come sotto.
$ guestfish -a CentOS_8_Server.img -i
Ecco,
- -a (--add) il parametro rileverà automaticamente il formato dell'immagine del disco. Per ignorare questo e specificare un formato particolare, usa il --formato opzione.
- -i (--inspector) - Ispeziona i dischi e monta i filesystem.
- CentOS_8_Server.img - nome dell'immagine del disco. Ho questa immagine nella mia directory attuale.
Questo comando caricherà l'immagine data, monterà i file system guest e ti atterrerà all'interno della shell guestfish.
Welcome to guestfish, the guest filesystem shell for editing virtual machine filesystems and disk images. Type: ‘help’ for help on commands ‘man’ to read the manual ‘quit’ to quit the shell Operating system: CentOS Linux release 8.2.2004 (Core) /dev/cl/root mounted on / /dev/sda1 mounted on /boot ><fs>
Se hai utilizzato "-i" parametro, non è necessario elencare e montare manualmente i filesystem guest. I filesystem verranno montati automaticamente. Inoltre, non è necessario avviare la libreria e allegare l'immagine del disco da soli. Se ne occuperà Guestfish stesso.
1.3. Accedi alle macchine virtuali invece delle sole immagini disco
Guestfish ha un'opzione per accedere alle macchine virtuali (domini) invece delle immagini del disco.
Innanzitutto, ottieni il nome delle macchine virtuali usando il comando:
$ virsh list --all Id Name State -------------------------------- - centos8-uefi shut off - nginx_centos8 shut off
Per accedere alla VM denominata "centos8-uefi", usa l'opzione -d o --domain come di seguito.
$ guestfish -d centos8-uefi -i
1.4. Visualizzazione e modifica del contenuto delle immagini disco
Guestfish supporta centinaia di comandi per visualizzare e modificare le immagini del disco a tuo piacimento. Sarai sopraffatto se guardi nell'intera pagina man. Quindi è meglio sapere prima come ottenere aiuto.
Elenca tutti i comandi
Se non sai da dove iniziare, apri semplicemente la sezione della guida usando il comando:
><fs> help
Per elencare tutti i comandi disponibili insieme a una breve descrizione, esegui:
><fs> help -l
Richiedi aiuto per un comando specifico
Per ottenere aiuto su qualsiasi comando, ad esempio mkdir, esegui:
<fs> help mkdir
Vediamo ora alcuni esempi.
Elenca i dispositivi a blocchi
Per elencare tutti i dispositivi a blocchi nell'immagine, esegui:
><fs> list-devices /dev/sda
Elenca le partizioni
Per elencare tutte le partizioni rilevate su tutti i dispositivi a blocchi, eseguire:
><fs> list-partitions /dev/sda1 /dev/sda2
Elenca i contenuti della directory
Per elencare i file in una determinata directory, esegui:
><fs> ls /root .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
Visualizza il contenuto del file
Per visualizzare il contenuto di un file, eseguire:
><fs> cat /etc/fstab # # /etc/fstab # Created by anaconda on Thu Feb 6 06:43:28 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=5e675dd6-7f64-46cd-8535-3617f3cf870b /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0
Crea directory
Il comando seguente creerà una directory denominata "otechnix" nella directory /root nel sistema guest.
><fs> mkdir /root/ostechnix
Crea file vuoti
Per creare un file vuoto all'interno della macchina guest, fai:
><fs> touch /root/ostechnix/file.txt
Verifica se il file è stato creato:
><fs> ls /root/ostechnix/ file.txt
Crea file con contenuti
Per creare un file con alcuni contenuti, usa scrivi comando:
><fs> write /root/ostechnix/file2.txt https://ostechnix.com
Il comando precedente creerà file2.txt nella directory /root/otechnix/ e scriverà "https://otechnix.com".
Puoi verificarlo usando il comando "cat":
><fs> cat /root/ostechnix/file2.txt https://ostechnix.com
Aggiungi contenuti a file esistenti
Per aggiungere nuovo contenuto alla fine di un file già creato, usa il comando "write-append":
<fs> write-append /root/ostechnix/file2.txt /about
Il comando precedente aggiungerà la parola "/about" alla fine del contenuto del file1.txt.
Verifica se la riga è stata aggiunta, usa il comando cat:
><fs> cat /root/ostechnix/file2.txt https:/ostechnix.com/about
Modifica file
Per modificare un file sulla macchina ospite, usa il comando "modifica":
><fs> edit /root/ostechnix/file.txt
Il file specificato si aprirà nell'editor predefinito.
Rimuovi file e directory
Per rimuovere un file dal computer guest:
><fs> rm /root/ostechnix/file2.txt ><fs> rm /root/ostechnix/file.txt
Per rimuovere una directory, usa il comando "rmdir":
><fs> rmdir /root/ostechnix/
Copia file o directory locali nell'immagine disco
Il comando "copy-in" copia i file o le directory locali in modo ricorsivo nell'immagine del disco.
Il comando seguente copierà il file otechnix.txt dal sistema locale a /root/otechnix/ nell'immagine del disco.
<fs> copy-in ostechnix.txt /root/ostechnix/
Verificalo utilizzando ls comando:
<fs> ls /root/ostechnix/ file.txt ostechnix.txt
Copia file o directory dall'immagine disco al sistema host
Allo stesso modo, possiamo copiare i file o le directory da un'immagine disco al sistema host locale usando il comando "copy-out" come di seguito.
<fs> copy-out /root/ostechnix/ /home/sk/Downloads/
Nell'esempio sopra, sto copiando la directory /root/otechnix/ nella directory Download nel sistema host.
Scarica file sul sistema host
È lo stesso del comando di copia.
Guestfish ti consente di scaricare e caricare contenuti dalla macchina ospite alla macchina host e viceversa.
La sintassi generale per scaricare i file:
download <guest_file_location> <host_file_location>
Il comando seguente scaricherà il file "/etc/fstab" dalla macchina guest nella directory /home/sk/Downloads/ nel sistema host KVM.
<fs> download /etc/fstab /home/sk/Downloads/fstab
Carica file dal sistema host al sistema guest
Questo è lo stesso del comando di copia-in.
Per caricare un file dal tuo sistema host al computer guest, esegui:
><fs> upload /home/sk/Downloads/fstab /etc/fstab
Qui sto caricando /home/sk/Downloads/fstab file dal mio sistema locale a /etc/fstab nella macchina ospite.
Visualizza la pagina del manuale di guestfish
Per visualizzare le pagine man di guestfish:
><fs> man
Esci da guestfish
Per uscire dal guscio di guestfish, esegui:
><fs> exit
Quello che abbiamo visto finora è che abbiamo avuto accesso, montato, ispezionato e modificato le immagini del disco esistenti. Guestfish può anche aiutarti a creare nuove immagini disco all'istante.
1.5. Creazione di nuove immagini disco
I seguenti comandi devono essere eseguiti al di fuori della shell guestfish. In altre parole, dovrebbero essere eseguiti nel tuo terminale host.
Ricordi che abbiamo aggiunto le immagini esistenti usando -a parametro? Sì. Per creare una nuova immagine del disco, andiamo su -N (--nuovo) parametro.
Per creare una nuova immagine disco e avviarla automaticamente, esegui il seguente comando dal prompt del terminale host (non nel guestfish):
$ guestfish -N fs
Questo comando creerà un nuovo disco denominato "test1.img" nella directory corrente e ti atterra all'interno del prompt di guestfish. Questo disco conterrà una singola partizione, con un filesystem vuoto. Per impostazione predefinita, la dimensione del disco sarà 1 GB . Se esegui lo stesso comando la prossima volta, creerà un nuovo disco chiamato "test2.img" con dimensione 1G e così via.
Invece di creare un disco da 1G di dimensioni fisse, è possibile creare anche un'immagine disco di dimensioni personalizzate.
Per creare un disco vuoto da 500 MB , esegui:
$ guestfish -N disk:500M
Puoi anche creare un'immagine disco formattata con un file system specifico. Ad esempio, il comando seguente creerà un disco 1G con un ext4 -partizione formattata, chiamata test1.img nella directory corrente:
$ guestfish -N fs:ext4
Crea un disco da 500 MB con un VFAT -partizione formattata e montarla:
$ guestfish -N fs:vfat:500M -m /dev/sda1
Crea un disco vuoto da 500 MB chiamato blankdisk.img (invece del nome predefinito test1.img):
$ guestfish -N blankdisk.img=disk:500M
1.6. Aggiunta di immagini del disco remoto
Non solo immagini disco locali, possiamo anche aggiungere dischi che si trovano su un server SSH, FTP, HTTP o TFTP remoto.
Aggiungi un disco che si trova su un server SSH remoto:
$ guestfish -a ssh://[email protected]/disk.img
Sostituisci il nome utente e l'indirizzo IP nel comando precedente con il tuo.
Aggiungi un disco che si trova su un server FTP remoto:
$ guestfish -a ftp://[email protected]:port/disk.img
$ guestfish -a ftps://[email protected]:port/disk.img
Aggiungi un disco che si trova su un server HTTP remoto:
$ guestfish -a http://[email protected]:port/disk.img
$ guestfish -a https://[email protected]:port/disk.img
Aggiungi un disco che si trova su un server TFTP remoto:
$ guestfish -a tftp://[email protected]:port/disk.img
2. Accedi, visualizza e modifica le immagini del disco senza entrare nella shell di guestfish
Libguestfs fornisce molti altri comandi equivalenti per accedere, visualizzare e modificare le immagini del disco, senza entrare effettivamente nella shell di guestfish.
2.1. guestmount
Il comando Guestmount viene utilizzato per montare un filesystem guest sull'host utilizzando FUSE e libguestfs.
Il comando seguente monterà centos8-uefi fulesystem della macchina guest in ~/guestvm/ nel sistema host.
$ mkdir ~/guestvm/
$ sudo guestmount -d centos8-uefi -i ~/guestvm/
Verifica il contenuto della directory di montaggio:
$ sudo ls -l ~/guestvm
Risultato di esempio:
total 16 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin dr-xr-xr-x. 6 root root 4096 Jul 18 15:46 boot drwxr-xr-x. 2 root root 6 Jul 18 15:23 dev drwxr-xr-x. 78 root root 8192 Jul 25 17:54 etc drwxr-xr-x. 2 root root 6 May 11 2019 home lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 May 11 2019 media drwxr-xr-x. 2 root root 6 May 11 2019 mnt drwxr-xr-x. 2 root root 6 May 11 2019 opt drwxr-xr-x. 2 root root 6 Jul 18 15:23 proc dr-xr-x---. 2 root root 135 Jul 18 15:46 root drwxr-xr-x. 2 root root 6 Jul 18 15:23 run lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin drwxr-xr-x. 2 root root 6 May 11 2019 srv drwxr-xr-x. 2 root root 6 Jul 18 15:23 sys drwxrwxrwt. 7 root root 119 Jul 25 18:44 tmp drwxr-xr-x. 12 root root 144 Jul 18 15:24 usr drwxr-xr-x. 20 root root 278 Jul 18 15:45 var
Per smontarlo, esegui:
$ sudo umount ~/guestvm
Per maggiori dettagli, fare riferimento alle pagine man.
$ man guestmount
2.2. virt-cat
Comando Virt-cat eseguito per visualizzare il contenuto di un file archiviato in un'immagine disco o in una macchina virtuale.
$ sudo virt-cat -a CentOS_8_Server.img /etc/fstab
Oppure,
$ sudo virt-cat -d centos8-uefi /etc/fstab
Risultato di esempio:
# # /etc/fstab # Created by anaconda on Sat Jul 18 05:53:25 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=6a7f6481-5eb3-4589-ad19-b2291ddfcda1 /boot ext4 defaults 1 2 UUID=6906-5D0A /boot/efi vfat umask=0077,shortname=winnt 0 2 /dev/mapper/cl-swap swap swap defaults 0 0
2.3. copia-virtuale
Il comando Virt-copy-in viene utilizzato per copiare file e directory dall'host a un'immagine disco o a una macchina virtuale.
$ sudo virt-copy-in -a CentOS_8_Server.img ostechnix.txt /root/
Oppure,
$ sudo virt-copy-in -d centos8-uefi ostechnix.txt /root/
2.4. copia virtuale
Il comando Virt-copy-out viene utilizzato per copiare file e directory da un'immagine disco o da una macchina virtuale.
$ sudo virt-copy-out -a CentOS_8_Server.img /root/ostechnix.txt ~/Downloads
Oppure,
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
I comandi precedenti copieranno il file /root/otechnix.txt dal disco della macchina virtuale nella directory ~/Downloads nel sistema host locale.
2.4. virt-df
Il comando Virt-df mostra lo spazio libero su un filesystem della macchina guest.
Visualizza lo spazio libero su un'immagine disco:
$ sudo virt-df -a CentOS_8_Server.img
Risultato di esempio:
Filesystem Size Used Available Use% CentOS_8_Server.img:/dev/sda1 976M 260M 649M 27% CentOS_8_Server.img:/dev/cl/root 17G 1.4G 16G 9%
Visualizza lo spazio su disco su una macchina virtuale:
$ sudo virt-copy-in -d centos8-uefi /root/ostechnix.txt ~/Downloads
Risultato di esempio:
Filesystem Size Used Available Use% centos8-uefi:/dev/sda1 599M 6.6M 592M 2% centos8-uefi:/dev/sda2 976M 121M 788M 13% centos8-uefi:/dev/cl/root 16G 1.2G 15G 8%
2.5. modifica virtuale
Modifica un file in un'immagine disco o in una macchina virtuale.
$ sudo virt-edit -a CentOS_8_Server.img /root/ostechnix.txt
Oppure,
$ sudo virt-edit -d centos8-uefi /root/ostechnix.txt
Questo comando aprirà il file remoto nell'editor predefinito. Basta apportare le modifiche e salvare e chiudere il file.
2.6. virt-filesystem
Elenca filesystem, partizioni, dispositivi a blocchi, LVM in una macchina virtuale o immagine disco.
$ sudo virt-filesystems -a CentOS_8_Server.img -l
Oppure,
$ sudo virt-filesystems -d centos8-uefi -l
Risultato di esempio:
Name Type VFS Label Size Parent /dev/sda1 filesystem vfat - 629145600 - /dev/sda2 filesystem ext4 - 1073741824 - /dev/cl/root filesystem xfs - 17620271104 -
Per visualizzare i dettagli della partizione, aggiungi --partitions nel comando precedente:
$ sudo virt-filesystems -d centos8-uefi --partitions /dev/sda1 /dev/sda2 /dev/sda3
Allo stesso modo, puoi utilizzare --logical-volumi , --gruppi-di-volume , --volumi-fisici , --block-devices per elencare quegli elementi.
2.7. virt-ispettore
Virt-inspector viene utilizzato per visualizzare la versione del sistema operativo e altre informazioni su un'immagine disco o una macchina virtuale.
$ sudo virt-inspector -a CentOS_8_Server.img
Oppure,
$ sudo virt-inspector -d centos8-uefi
2.8. virt-ls
Virt-ls viene utilizzato per visualizzare i file e le directory e le loro dimensioni, attributi, checksum in un'immagine disco o in una macchina virtuale.
$ sudo virt-ls -R -a CentOS_8_Server.img / | less
Oppure,
$ sudo virt-ls -R -d centos8-uefi /root
Puoi usare la maggior parte delle normali opzioni/flag del comando "ls" con il comando virt-ls.
2.9. registro virtuale
Virt-log viene utilizzato per visualizzare i file di registro da un'immagine disco o da una macchina virtuale.
$ sudo virt-log -a CentOS_8_Server.img
Oppure,
$ sudo virt-log -d centos8-uefi
2.10. coda virtuale
Il comando Virt-tail viene utilizzato per seguire i file di registro in un'immagine disco o in una macchina virtuale.
$ sudo virt-tail -a CentOS_8_Server.img /var/log/messages
Oppure,
$ sudo virt-tail -d centos8-uefi /var/log/messages
Ci sono molti altri comandi disponibili. Ti suggerisco di fare riferimento al sito libguestfs collegato alla fine di questa guida.
Leggi successivo:
- Crea rapidamente immagini di macchine virtuali con Virt-builder
- Visualizza le statistiche dei sistemi di virtualizzazione con Virt-top in Linux
- Come salvare macchine virtuali con Virt-rescue
Risoluzione dei problemi
Ecco le soluzioni per alcuni problemi comuni.
1. libguestfs non funziona senza i permessi di root su Ubuntu
Potresti riscontrare questo errore quando provi ad accedere alle immagini del disco su Ubuntu:
libguestfs: error: /usr/bin/supermin exited with error status 1. To see full error messages you may need to enable debugging. Do: export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1 and run the command again. For further information, read: http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
Per risolvere questo problema, esegui:
$ sudo chmod 0644 /boot/vmlinuz*
Potrebbe essere necessario aggiungersi a kvm gruppo:
$ sudo usermod -a -G kvm sk
Sostituisci "sk" nel comando precedente con il tuo nome utente.
- Se hai già installato libvirt o KVM sul tuo sistema e provi a usare gli strumenti libguesfs come utente root, dovresti vedere questo errore di autorizzazione:
libguestfs: error: could not create appliance through libvirt. Try running qemu directly without libvirt using this environment variable: export LIBGUESTFS_BACKEND=direct Original error from libvirt: Cannot access backing file '/root/CentOS_8_Server.qcow2' of storage file '/tmp/libguestfsiPjmga/overlay1.qcow2' (as uid:107, gid:107): Permission denied [code=38 int1=13]
Questo è causato da libvirt, e così accade solo quando si usa il backend libvirt. Per risolvere questo problema, passa al backend diretto impostando questa variabile di ambiente:
export LIBGUESTFS_BACKEND=direct
Per renderlo permanente, aggiungi questa riga al tuo ~/.bashrc file.