VirtualBox: come montare in automatico i dischi virtuali di VirtualBox
Inviato: mer 8 mar 2017, 21:23
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:
(attenzione, come sempre, a maiuscole e minuscole),
ad esempio, con:
si ottiene questo risultato:
A noi interessano:
offData=41472 e
cbSector=512
Poiché il tipo di macchina virtuale è vecchio, usa l’MBR, quindi
Ora, dopo essere certi che nulla sia montato in /dev/loop0 (classicamente, immagini iso, in genere), utilizziamo il comando losetup:
e con
fdisk -l /dev/loop0 ottengo le partizioni dell’HD, così:
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:
e con:
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:
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),
e, se vogliamo montarla in automatico come user, possiamo scrivere in /etc/fstab:
tutto su una riga sola, logicamente
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.
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 - a) leggersi la Advanced Bash Guide di cui esiste la traduzione italiana
Codice: Seleziona tutto
VBoxManage internalcommands dumphdinfoad esempio, con:
Codice: Seleziona tutto
VBoxManage internalcommands dumphdinfo /mnt/minihd2/sistemi/slacchia110.vdiCodice: 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=0offData=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)Codice: Seleziona tutto
losetup -o 41472 /dev/loop0 /mnt/minihd2/sistemi/slacchia110.vdifdisk -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 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/loop0Codice: Seleziona tutto
sudo mount -o, user,users,dev,exec,suid,rw /dev/loop0p2 /mnt/minihd2/sistemi/loop0p2Ma, 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 programmaMetodo 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 =
1003525632Codice: Seleziona tutto
/mnt/minihd2/sistemi/slacchia110.vdi /mnt/slacchia110virt auto loop,offset=1003525632,noauto,users,exec,dev,suid,rw 0 0