VirtualBox: come montare in automatico i dischi virtuali di VirtualBox

Usate questo forum per proporre nuovi articoli, creare gruppi di lavoro, segnalare problemi, collaborare in genere al progetto Wikislacky.

Moderatore: Staff

Regole del forum
1) Citare l'eventuale nome e link dell'articolo della wiki.
2) Specificare se discussione/suggerimento o richiesta d'aiuto.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
duturo1953
Linux 0.x
Linux 0.x
Messaggi: 13
Iscritto il: sab 8 mar 2014, 18:34
Nome Cognome: Ferrari Renato Maria
Slackware: 15.0 - 64 bit
Kernel: 5.15.19
Desktop: kde
Località: Milano

VirtualBox: come montare in automatico i dischi virtuali di VirtualBox

Messaggio da duturo1953 »

Ho sempre avuto difficoltà nel trovare informazioni in rete per montare, sotto linux, i dischi virtuali di VirtualBox.

Finalmente, nei giorni scorsi, sono riuscito ad assemblare un po' di informazioni dalla rete, molto sparpagliate, che permettono di semplificare molto l’operazione di cui stiamo parlando.
Alcune premesse:
  • 1) È indispensabile che si conosca VirtualBox e che si abbia un minimo di conoscenza degli script in bash; chi non ce l’ha può fare come ho fatto io:
    • a) leggersi la Advanced Bash Guide di cui esiste la traduzione italiana

      b) studiarsi gli script di Pat Volkerding (in /sbin: installpkg, upgradepkg, explodepkg, makepkg, removepkg , installpkg, pkgtool, upgradepkg), quelli di Eric Hameleer, quelli di swaret, quelli di Marco Stabellini, quelli di Massimo Cavalleri (progetto gnome_slacky 12.2), quelli di tanti altri che utilizzano gli script bash per gestire le proprie macchine o siti.
    2) negli esempi seguenti farò riferimento alla mia personale sistemazione di directories e nomi di file, ognuno, poi, dovrà adattare le informazioni alla propria architettura.

    3) farò riferimento al primo device di loop, cioè /dev/loop0 ma, chiaramente, nulla vieta di usare qualsiasi altro device di loop (se non ricordo male, al massimo sono 8, ma è ininfluente).

    4) io uso solo dischi virtuali a dimensione fissa, ma credo che quanto sto dicendo valga anche per quelli a dimensione dinamica o variabile che dir si voglia.

    5) tutti i miei dischi virtuali sono partizionati con MBR (anche quelli windows), non con EFI-UEFI ma, anche in questo caso, credo che il metodo funzioni

    6) si presume che, con sudo, l'utente attuale possa acquisire i privilegi di root
Il problema principale è trovare dove inizia veramente il file-system del disco virtuale: ci viene in aiuto il comando interno di VirtualBox:

Codice: Seleziona tutto

VBoxManage internalcommands dumphdinfo
(attenzione, come sempre, a maiuscole e minuscole),

ad esempio, con:

Codice: Seleziona tutto

VBoxManage internalcommands dumphdinfo /mnt/minihd2/sistemi/slacchia110.vdi
si ottiene questo risultato:

Codice: Seleziona tutto

Dumping VDI image "/mnt/minihd2/sistemi/slacchia110.vdi" mode=r/o fOpen=1 File=00000003
Header: Version=00010001 Type=2 Flags=0 Size=10737418240
Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=10240 cBlocksAllocated=10240
Header: offBlocks=512 offData=41472
Header: Geometry: C/H/S=1024/255/63 cbSector=512
Header: uuidCreation={695f35cd-f0d5-4d8d-bff8-5b4d674dfdbf}
Header: uuidModification={ea8c3637-3c18-4ee9-ab3e-92c64436b638}
Header: uuidParent={00000000-0000-0000-0000-000000000000}
Header: uuidParentModification={00000000-0000-0000-0000-000000000000}
Image:  fFlags=00000000 offStartBlocks=512 offStartData=41472
Image:  uBlockMask=000FFFFF uShiftIndex2Offset=20 uShiftOffset2Index=20 offStartBlockData=0
A noi interessano:

offData=41472 e
cbSector=512


Poiché il tipo di macchina virtuale è vecchio, usa l’MBR, quindi

Codice: Seleziona tutto

offData=41472 indica l’inizio dell’MBR (forse anche della NVRAM sulla GPT + UEFI)
Ora, dopo essere certi che nulla sia montato in /dev/loop0 (classicamente, immagini iso, in genere), utilizziamo il comando losetup:

Codice: Seleziona tutto

losetup -o 41472 /dev/loop0 /mnt/minihd2/sistemi/slacchia110.vdi
e con
fdisk -l /dev/loop0 ottengo le partizioni dell’HD, così:

Codice: Seleziona tutto

bash-4.2$ fdisk -l /dev/loop0 
Disk /dev/loop0: 10 GiB, 10737418240 bytes, 20971520 sectors 
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disklabel type: dos 
Disk identifier: 0x064cd5db 

Dispositivo  Avvio   Start     Fine  Settori  Size Id Tipo 
/dev/loop0p1            63  1959929  1959867  957M 82 Linux swap 
/dev/loop0p2 *     1959930 20964824 19004895  9,1G 83 Linux 
e, a quel punto, ci si può lavorare come se fosse un hard disk fisico, con fdisk, cfdisk e similari.

Affinché il sistema riconosca questi nuovi device, altrimenti non riusciamo a montare un bel nulla, dobbamo ricorrere a partprobe:

Codice: Seleziona tutto

sudo partprobe /dev/loop0
e con:

Codice: Seleziona tutto

sudo mount -o, user,users,dev,exec,suid,rw /dev/loop0p2 /mnt/minihd2/sistemi/loop0p2
trovo montata la mia bella partizione contenente la slackware 11.0.

Ma, così facendo, non conviene rendere automatico il tutto? La risposta è sì: ecco, qui di seguito, lo script che ho realizzato alla bisogna:

Codice: Seleziona tutto

#! /bin/bash
# montare automaticamente un disco virtuale .vdi
# per i vari sistemi NTFS, FAT,VFAT,Linux
# creato il 7 marzo 2017

# Heavily based on the Slackware 14.1 SlackBuild (v1)
# Written by Ferrari Renato aka dutur (renatoferrari@tiscali.it)
# Last build from <your name> ( your [at] email.address )
 
# Questo programma viene fornito così com'è
# senza nessuna garanzia di nessun tipo per nessuno motivo
# a vostro rischio e pericolo
# Suggerimenti per migliorarlo sono sempre ben accolti
# La ridistribuzione è possibile a condizione che
# venga sempre citato l'autore originale
# e che ogni prodotto derivato sia distribuito 
# esclusivamente come codice sorgente 

cd /mnt/minihd2/sistemi
for ((CICCIO=1; CICCIO<9; CICCIO++)) ; do 
  if (mount | grep loop0p$CICCIO) &>/dev/null; then
    sudo umount /dev/loop0p"$CICCIO" &>/dev/null;
  fi;
done
rmdir /mnt/minihd2/sistemi/loop0p* &>/dev/null

losetup -D
if [ "$1" = "" ]; then exit; fi
export OFFDATA="$(VBoxManage internalcommands dumphdinfo $1|grep offData| rev|cut -f1 -d=|rev )"
losetup -o "$OFFDATA" /dev/loop0 $1 &>/dev/null
sudo partprobe /dev/loop0 &>/dev/null

export ESTESO="$(fdisk -l /dev/loop0| grep steso| cat | cut -f3 -d/| cut -f1 -d\ )"
export LOSWAP="$(fdisk -l /dev/loop0| grep swap| cat | cut -f3 -d/| cut -f1 -d\ )"
export MONTA="$(fdisk -l /dev/loop0 | grep /dev | grep loop0p |cat | cut -f3 -d/| cut -f1 -d\ |tac)"
export OPZ="user,users,exec,dev,suid,rw"

for MIADIR in `echo "$MONTA" | cat`; do
  if ! [ "$MIADIR" = "$ESTESO" ] & ! [ "$MIADIR" = "$LOSWAP" ]; then
    if (fdisk -l /dev/loop0| grep "$MIADIR" | grep NTFS) &>/dev/null ; then
      OPZ="$OPZ,uid=500,fmask=000,dmask=000"
    elif (fdisk -l /dev/loop0| grep "$MIADIR" | grep FAT) &>/dev/null; then
      OPZ="$OPZ,uid=500"
    fi
    mkdir -p /mnt/minihd2/sistemi/"$MIADIR" &>/dev/null;
    sudo mount -o,"$OPZ" /dev/"$MIADIR" /mnt/minihd2/sistemi/"$MIADIR" &>/dev/null;
  fi
done
# fine programma
Se lo script viene eseguito senza parametri, smonta tutti i device eventualmente montati come /dev/loop0p[1-8], e rimuove le rispettive directory generate per il montaggio.


Metodo alternativo

Sempre sfruttando l’esempio citato, dove inizia la seconda partizione di /mnt/minihd2/sistemi/slacchia110.vdi?

Bisogna fare un po’ di conti.
L’offblock l’abbiamo visto.
Dalla macchina virtuale in esecuzione o con l’esempio citato abbiamo visto, con fdisk -l, che la seconda partizione inizia al blocco 1959930 e che il blocco è formato da 512 settori, quindi l’offset sarà, considerato che (cbSector=512),

Codice: Seleziona tutto

1959930 x 512 =
1003484160 +
41472 =
1003525632
e, se vogliamo montarla in automatico come user, possiamo scrivere in /etc/fstab:

Codice: Seleziona tutto

/mnt/minihd2/sistemi/slacchia110.vdi	/mnt/slacchia110virt	auto loop,offset=1003525632,noauto,users,exec,dev,suid,rw  0 0
tutto su una riga sola, logicamente
Ferrari Renato
email: renatoferrari@tiscali.it
--
Linux Registered User #219791
Linux Registered Machine #104061
renatoferrari@tiscali.it

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: VirtualBox: come montare in automatico i dischi virtuali di VirtualBox

Messaggio da targzeta »

Che dire, grazie mille!!!

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
duturo1953
Linux 0.x
Linux 0.x
Messaggi: 13
Iscritto il: sab 8 mar 2014, 18:34
Nome Cognome: Ferrari Renato Maria
Slackware: 15.0 - 64 bit
Kernel: 5.15.19
Desktop: kde
Località: Milano

Re: VirtualBox: come montare in automatico i dischi virtuali di VirtualBox

Messaggio da duturo1953 »

ah, piccolo errore:
ho dimenticato un "&" nel codice, qui:

Codice: Seleziona tutto

if ! [ "$MIADIR" = "$ESTESO" ] & ! [ "$MIADIR" = "$LOSWAP" ]; then
ce ne vogliono due, così:

Codice: Seleziona tutto

if ! [ "$MIADIR" = "$ESTESO" ] && ! [ "$MIADIR" = "$LOSWAP" ]; then
Ferrari Renato
email: renatoferrari@tiscali.it
--
Linux Registered User #219791
Linux Registered Machine #104061
renatoferrari@tiscali.it

Avatar utente
duturo1953
Linux 0.x
Linux 0.x
Messaggi: 13
Iscritto il: sab 8 mar 2014, 18:34
Nome Cognome: Ferrari Renato Maria
Slackware: 15.0 - 64 bit
Kernel: 5.15.19
Desktop: kde
Località: Milano

Re: VirtualBox: come montare in automatico i dischi virtuali di VirtualBox

Messaggio da duturo1953 »

Ho perfezionato lo script.
In effetti, mi bastava leggere prima il man losetup! :)

Codice: Seleziona tutto

#! /bin/bash
# montare automaticamente un disco virtuale .vdi
# per i vari sistemi NTFS, FAT,VFAT,Linux
# creato il 7 marzo 2017

# Heavily based on the Slackware 14.1 SlackBuild (v1)
# Written by Ferrari Renato aka dutur (renatoferrari@tiscali.it)
# Last build from <your name> ( your [at] email.address )
 
# Questo programma viene fornito così com'è
# senza nessuna garanzia di nessun tipo per nessuno motivo
# a vostro rischio e pericolo
# Suggerimenti per migliorarlo sono sempre ben accolti
# La ridistribuzione è possibile a condizione che
# venga sempre citato l'autore originale
# e che ogni prodotto derivato sia distribuito 
# esclusivamente come codice sorgente 

function lodialogo(){
echo '--title "Ferrari Renato Software - Programma VirtualBox"   --no-cancel --menu "\nBenvenuti nel programma per montare\n \
\ni dischi virtuali di VirtualBox\
\nChe cosa scegli?\n" 27 80 15 \' > VBvirt.txt
echo \"Uscita\" \"Esce dal programma\" \\ >> VBvirt.txt
for CICCIO in *.vdi; do echo \"$CICCIO\" \"$CICCIO\" \ \\ >> VBvirt.txt ; done
dialog --file VBvirt.txt 2>POPA

export DISCO=`cat POPA`
rm -f POPA
if [ "$DISCO" = "Uscita" ]; then rm VBvirt.txt &>/dev/null; exit; fi
}

cd /mnt/minihd2/sistemi
for CICCIO in /mnt/minihd2/sistemi/loop*; do 
  sudo umount $CICCIO &>/dev/null; 
done
rmdir /mnt/minihd2/sistemi/loop*""$1""  &>/dev/null

losetup -D

if [ "$1" = "dialogo" ]; then
  lodialogo;
elif [ "$1" = "" ] || ! [ -e "$1" ] ; then
  if [ "$1" = "" ]; then
    export POPA="Esco dal programma"
  else
    export POPA="il file che hai chiesto \"$1\" non esiste"
  fi
  dialog --title "Nessun parametro" --msgbox "\nNon hai passato nessun parametro \
  \n\nDevi scrivere \"dialogo\" se vuoi una finestra di dialogo, \
  \n\nUn nome di file virtuale .vdi esistente se vuoi montarlo, \
  \n\n$POPA" 20 50
  exit
else export DISCO="$1";
fi

export OFFDATA="$(VBoxManage internalcommands dumphdinfo "$DISCO"|grep offData| rev|cut -f1 -d=|rev )"
export LOLOOP="$(losetup -f)"
losetup -o "$OFFDATA" "$LOLOOP" "$DISCO" &>/dev/null
sudo partprobe "$LOLOOP" &>/dev/null

export ESTESO="$(fdisk -l "$LOLOOP"| grep steso| cat | cut -f3 -d/| cut -f1 -d\ )"
export LOSWAP="$(fdisk -l "$LOLOOP"| grep swap| cat | cut -f3 -d/| cut -f1 -d\ )"
export MONTA="$(fdisk -l "$LOLOOP" | grep "$LOLOOP"p |cat | cut -f3 -d/| cut -f1 -d\ |tac)"
export OPZ="user,users,exec,dev,suid,rw"

for MIADIR in `echo "$MONTA" | cat`; do
  if ! [ "$MIADIR" = "$ESTESO" ] && ! [ "$MIADIR" = "$LOSWAP" ]; then
    if (fdisk -l "$LOLOOP"| grep "$MIADIR" | grep NTFS) &>/dev/null ; then
      OPZ="$OPZ,uid=500,fmask=000,dmask=000"
    elif (fdisk -l "$LOLOOP"| grep "$MIADIR" | grep FAT) &>/dev/null; then
      OPZ="$OPZ,uid=500"
    fi
    mkdir -p /mnt/minihd2/sistemi/"$MIADIR" &>/dev/null;
    sudo mount -v -o,"$OPZ" /dev/"$MIADIR" /mnt/minihd2/sistemi/"$MIADIR" &>/dev/null;
  fi
done
kfmclient openProfile filemanagement /mnt/minihd2/sistemi


# fine programma



Istruzioni:
cerca il primo loop libero e lo utilizza per montare al volo le partizioni del disco virtuale scelto
a) senza parametri, smonta i device montati e romuove le directories create
b) con un nome di disco virtuale valido, esegue le operazioni su detto disco
c) col parametro dialogo, crea una finestra di dialogo da cui scegliere il disco virtuale di cui montare le partizioni

infine, lancia il file manager (nel mio caso, konqueror.

sempre da personalizzare per la propria architettura.

Sul sito di virtualbox c'e' un altro script che esegue il montaggio dei dischi virtuali, ma non funziona, almeno dalle prove che ho fatto, con dischi virtuali a 16 bit; il DOS tanto per intenderci o le vecchie distribuzioni linux
Ferrari Renato
email: renatoferrari@tiscali.it
--
Linux Registered User #219791
Linux Registered Machine #104061
renatoferrari@tiscali.it

Rispondi