Esta receta explica cómo montar cualquier partición que esté contenida dentro de un fichero .vdi (disco virtual de VirtualBox)
Lo primero es tener claro la estructura de un fichero VDI. En realidad, no es más que un fichero de imagen de disco (iso) con una cabecera especial:
Cabecera VDI MBR Partición 1 Partición 2

Averiguar la longitud de la cabecera

Para conseguir esto, hace falta tener el ejecutable vditool que viene con la distribución de VirtualBox. Es necesario tener la versión 1.6.6 o anterior, ya que desde la versión 2 en adelante, esta herramienta (o mejor dicho, la funcionalidad que vamos a utilizar) desapareció. Con dicha herramienta, realizamos lo siguiente:
<b>$ vditool DUMP test.vdi </b>
vditool    Copyright (c) 2008 Sun Microsystems, Inc.
Dumping VDI image file="autotest.vdi" into the log file...
Log created: 2009-12-30T19:18:30.651261000Z
Dumping VDI image "autotest.vdi" mode=r/o fOpen=1 File=00000003
Header: Version=00010001 Type=2 Flags=0 Size=67108864
Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=64 cBlocksAllocated=64
Header: offBlocks=512 <b>offData=1024</b>
Header: Geometry: C/H/S=130/16/63 cbSector=512
Header: uuidCreation={7826ef35-6189-42cf-bbad-4f39501c47ca}
Header: uuidModification={477d2b77-860f-41d2-bcf4-0597f26db977}
Header: uuidParent={00000000-0000-0000-0000-000000000000}
Header: uuidParentModification={00000000-0000-0000-0000-000000000000}
Image:  fFlags=00000000 offStartBlocks=512 offStartData=1024
Image:  uBlockMask=000FFFFF uShiftIndex2Offset=20 uShiftOffset2Index=20 offStartBlockData=0
The operation completed successfully!
El valor de offData que he señalado en negrita, es la longitud en bytes de la cabecera VDI.

Crear un dispositivo de bloques

Un disco, sea virtual o no, es un dispositivo de bloques, así que tenemos que asociar uno de los ficheros especiales de dispositivos de bloques con nuestro fichero VDI. Para ello, utilizaremos el comando losetup. Primero necesitamos saber el nombre de un dispositivo que no se esté usando y esté disponible:
# losetup -f
/dev/loop0
Ahora, lo que vamos a hacer es vincular el dispositivo con el fichero VDI, pero saltándonos la cabecera. De esta forma, será como si fuera un disco real:
# losetup --offset 1024 --sizelimit 67108864 /dev/loop0 test.vdi
Si os habéis fijado, en offset he colocado la longitud de la cabecera VDI. El valor que le he puesto a sizelimit es el resultado de restarle la longitud de la cabecera al tamaño del fichero VDI (todo en bytes). De esta forma, nos aseguramos que el dispositivo "no se sale" del fichero (la podríamos liar parda). Si el disco vdi fuera o fuese un disco recién creado y estuviera vacío, es en este momento cuando tenéis que particionarlo. Primero hay que crear una tabla de particiones, y luego las particiones. Podéis hacer todo con el comando parted.

Montar la partición

Ya casi estamos. Ahora, necesitamos saber dónde empieza la partición que queremos montar. Como tenemos nuestro disco en /dev/loop0, podemos averiguar esto con el comando fdisk:
# fdisk -lu /dev/loop0

Disco /dev/loop0: 67 MB, 67076608 bytes
255 heads, 63 sectors/track, 2481 cylinders, 39860255 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Disk identifier: 0xa453a453

Disposit.     Inicio   Comienzo      Fin       Bloques   Id  Sistema
/dev/loop0p1                63    38106179    19053058+  83  Linux
/dev/loop0p2          38106180    39857264      875511   82  Linux swap / Solaris
Es importante usar la opción -u con fdisk para que nos dé la información en sectores (por defecto utiliza cilindros como unidad). Sabiendo que cada sector son 512 bytes (según fdisk), podemos montar nuestra partición con el comando mount. Por ejemplo, si queremos montar la primera partición, haremos lo siguiente:
# mount /dev/loop0 /mnt -t ext3 -o loop,offset=$((63*512))
Como la partición comienza en el sector 63 y cada sector son 512 bytes, hay que saltarse 63*512 bytes hasta encontrar el principio de la partición.

Desmontar

Una vez que acabéis de usar la partición, desmontadla normalmente. Acordaros después de desvincular el fichero de dispositivo del disco vdi. Esto se hace con:
# losetup -d /dev/loop0

Referencias



blog comments powered by Disqus