Estructura interna de un archivo vdi
Los archivos con extensión vdi son utilizados por Oracle VM VirtualBox para almacenar el contenido que las máquinas virtuales percibirán como sus discos duros. Por lo tanto, lo que para una máquina virtual (sistema invitado) es manejado como un disco duro, para la máquina real (sistema anfitrión) es sencillamente un archivo de grandes proporciones.
La extensión vdi proviene de las siglas en inglés de la expresión Virtual Disk Image.
Como es lógico, será el software de virtualización (en este caso Oracle VM VirtualBox) quien se encargue de establecer la estructura interna del archivo y quien interprete las solicitudes de lectura y escritura del sistema invitado para redirigirlas al archivo vdi.
Como pasa con los discos físicos, los discos virtuales (archivos vdi para el sistema anfitrión) tendrán una capacidad en particular, que se indicará en el momento de crearlo. La diferencia con los discos físicos es que esta capacidad podrá modificarse en el futuro, incluso si el disco ya contiene datos.
Independientemente de la capacidad del disco, tendremos dos opciones en cuanto al momento en el que se reserva su espacio en el sistema anfitrión:
- Tamaño fijo: En este caso, en el momento de crear el disco duro virtual, se reservará todo el espacio necesario para albergarlo dentro del sistema de archivos real
- Tamaño dinámico: Si elegimos esta opción, sólo se reservará en el sistema anfitrión el espacio necesario para para los sectores que deban ser ocupados. Por lo tanto, el espacio que ocupe el disco duro virtual irá creciendo al ritmo de las necesidades de almacenamiento de la máquina virtual.
La primera opción empleará más tiempo durante la creación del archivo. Por su parte, la segunda podrán emplear un tiempo extra en cada operación de escritura cuando sea preciso obtener más espacio. No obstante, cuando las necesidades de almacenamiento se estabilicen, la sobrecarga será insignificante.
Aunque Oracle VM VirtualBox tiene su propio formado (el formato vdi), también es capaz de reconocer los formatos de discos virtuales de otras plataformas de virtualización:
- VMDK (Virtual Machine Disk): Un formato abierto que utilizan otros productos, como los desarrollados por la empresa VMware Inc.
- VHD (Virtual Hard Disk): El formato propio de Microsoft cuyas especificaciones fueron puestas a disposición del resto de desarrolladores en Junio de 2005.
- HDD: Es el formato propietario de la empresa Parallels Inc. En este caso, no están soportadas las versiones 3 y 4 por falta de documentación.
Como cabe esperar, Oracle VM VirtualBox dispone de un comando que nos ofrece información sobre la estructura interna de un disco virtual. Para comprobarlo, sólo tenemos que abrir una ventana de terminal y escribir la siguiente orden:
VBoxManage showhdinfo Mint13.vdi
Sin embargo, el resultado es un poco decepcionante porque, como puede verse en la siguiente imagen, la información obtenida es bastante escasa:
No obstante, con la información adecuada y un poco de habilidad, podremos obtener mucha más información del contenido de un disco vdi. Para comenzar, debemos saber cómo se estructura la información guardada en su interior. Algo que aprenderemos con bastante detalle en el siguiente apartado.
Formato interno de un archivo vdi
En el modo más sencillo, es decir, cuando nos referimos a un disco duro virtual de tamaño fijo, podríamos pensar en él como en una copia byte a byte de un disco duro real, pero precedido de una cabecera informativa donde Oracle VM VirtualBox guardará información relativa al propio archivo.
En definitiva, algo parecido a esto:
En la imagen anterior, observamos cómo sería la estructura de un disco duro virtual en el que disponemos de dos particiones.
Cabecera y Pre-cabecera
Puedes encontrar la estructura completa de la Cabecera y la Pre-cabecera de un archivo vdi, representada en un archivo de cabecera para lenguaje C, accediendo a la siguiente dirección: http://www.virtualbox.org/svn/vbox/trunk/src/VBox/Storage/VDICore.h
La parte realmente interesante del archivo está formada por la Cabecera (VDIHEADER) y la Pre-cabecera (VDIPREHEADER). Ambas en color verde en la imagen anterior.
La Pre-cabecera tiene una configuración muy sencilla, formada únicamente por tres datos:
- Un texto informativo sobre el tipo de imagen de hasta 64 caracteres
- La firma del archivo de imagen, que es un identificador único formado por un entero sin signo de 32 bits (4 bytes).
- La versión del archivo de imagen, representada también por un entero sin signo de 32 bits (4 bytes). Este valor informa sobre el tipo de cabecera que nos vamos a encontrar a continuación
La Cabecera es algo más compleja, y podemos encontrarnos tres formatos diferentes según el valor del último campo de la Pre-cabecera. Veamos a continuación cada uno de ellos, con una pequeña tabla de representa su estructura:
- VDIHEADER0
- VDIHEADER1
- VDIHEADER1PLUS
El primer byte de un archivo ocupa la posición cero, no la uno
La información de las tablas anteriores se refiere a discos de tamaño fijo, ya que cuando se trata de discos de tamaño dinámico, habrá que guardar también información relativa a los bloques que ya se encuentran reservados. Si el Tipo de imagen (desplazamiento 76) contiene el valor 1, se tratará de un disco de tamaño dinámico, si es de tipo 2, estaremos tratando con un disco de tamaño fijo y si es de tipo 4, nos enfrentamos a un disco diferencial.
Para evitar complicaciones, antes de comenzar a trabajar con un archivo vdi, es conveniente convertirlo en una imagen de tamaño fijo, algo que conseguimos fácilmente con la siguiente orden:
VBoxManage clonehd Mint13.vdi Mint13_copia.vdi --variant Fixed
Observa que no hemos cambiado el disco original, sino que lo hemos copiado (clonado) a un disco nuevo. Para diferenciarlos, al segundo le hemos añadido el texto ‘_copia’
El MBR y el resto del disco
Después de de la cabecera, nos encontraremos la información que se corresponde con el MBR (Master Boot Record). Éste tiene la misma estructura que si se encontrase en un disco duro real. Es decir, ocupa 512 bytes (un sector estándar), que se distribuye de la siguiente forma:
En cuanto a los 16 bytes que representan cada partición, se estructuran de la siguiente forma:
Por último, estarán las particiones, que contienen la información propiamente dicha.
Cómo acceder a la información del archivo vdi
Vale, ya sabemos cómo se organiza la información en el interior de un archivo vdi, pero, ¿eso para qué nos vale?. Afortunadamente, la respuesta es que, la mayor parte del tiempo, para nada. Sin embargo, en alguna ocasión, el archivo puede haberse corrompido, o dañado de algún modo, y puede ser imposible acceder a sus datos por vías normales. De hecho, hay técnicas de informática forense que se basan en esta información.
Pues bien, la forma más sencilla de acceder a la información que hay en un disco duro virtual es mediante un Editor hexadecimal. Este tipo de programas permiten acceder a los archivos byte a byte, independientemente de la información que contengan.
Para que se entienda, vamos a instalar uno de estos programas y comprobar cómo funcionaría…
Instalar el editor hexadecimal Bless
Bless es un completo editor hexadecimal escrito en mono/Gtk# para sistemas GNU/Linux.
Entre sus mayores ventajas se encuentran:
- Soporta archivos de gran tamaño e incluso dispositivos de bloque completos
- Permite deshacer y rehacer múltiples niveles
- Admite vistas de datos personalizables
- Dispone de representación rápida de datos en pantalla
- Ofrece múltiples pestañas
- Posibilita la búsqueda y sustitución rápida de contenido
- Proporciona una tabla de conversión de datos
- Facilita las operaciones bit a bit sobre los datos
- etc.
Además, tiene la gran ventana de que se encuentra en el repositorio de Ubuntu, con lo que su instalación es tremendamente sencilla:
Cuando se abra el programa comenzamos a escribir parte del nombre del programa en el cuadro de búsqueda
Como es lógico, deberemos escribir la contraseña de administración para completar la instalación.
Poco después, tendremos el editor hexadecimal Bless listo para usarlo.
Cómo usar Bless
Cuando instalamos Bless, se crea un nuevo icono en el Launcher de Unity (si no fuese así, siempre podemos recurrir al Dash y comenzar a escribir su nombre).
Poco después, tendremos delante la ventana principal del programa con el área de trabajo vacía. Ahora tendremos que abrir el archivo vdi.
Al hacerlo, obtendremos una ventana típica del sistema operativo para abrir archivos. Nos desplazamos hasta el lugar donde tenemos almacenado el archivo vdi y lo seleccionamos.
Observa que he elegido el archivo Mint13_copia.vdi, que es el que obtuve más arriba con el fin de que tuviese un tamaño fijo.
Aquí vemos, a modo de ejemplo, que en la posición 76 se encuentra almacenado el valor 2. Recuerda que ahí es donde debe estar almacenado el Tipo de imagen y que el valor 2 identifica los discos de tamaño fijo.
Lógicamente, esto es sólo un ejemplo. Sin embargo, utilizando la información que tenemos más arriba (y un poco de paciencia), podríamos acceder a cualquier parte del disco virtual y obtener los datos almacenados en él.
En realidad, la única diferencia entre un disco virtual y un disco real es la información contenida en la Cabecera y en la Pre-cabecera. En un disco duro real, esta información no existiría y el MBR (Master Boot Record) se encontraría en el sector cero (el primer sector) del disco.
Esto quiere decir que lo aprendido en este artículo puedes aplicarlo, directamente, a un disco duro real, aunque te recomiendo que nunca hagas experimentos con dispositivos en los que existan datos importantes. Luego no digas que no te avisé.
One more thing…
Si en realidad lo que necesitas es poder acceder a los datos contenidos en un archivo vdi sin necesidad de crear una máquina virtual que lo utilice, puede que sólo necesites echarle un vistazo al artículo Montar un disco vdi en un ordenador anfitrión con Ubuntu 14.04.