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 dumphdinfo
ad esempio, con:
Codice: Seleziona tutto
VBoxManage internalcommands dumphdinfo /mnt/minihd2/sistemi/slacchia110.vdi
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
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)
Codice: Seleziona tutto
losetup -o 41472 /dev/loop0 /mnt/minihd2/sistemi/slacchia110.vdi
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
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
Codice: Seleziona tutto
sudo mount -o, user,users,dev,exec,suid,rw /dev/loop0p2 /mnt/minihd2/sistemi/loop0p2
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
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
Codice: Seleziona tutto
/mnt/minihd2/sistemi/slacchia110.vdi /mnt/slacchia110virt auto loop,offset=1003525632,noauto,users,exec,dev,suid,rw 0 0