Virtualizando sólo una partición de una máquina física

Hace poquito un amigo me contó que estuvo leyendo el post anterior de Consolidación y «Shrinking» de discos físicos para pasarlos a una máquina virtual, pero tenía un pequeño obstáculo relacionado con el espacio en disco necesario, que más o menos era así:

Quería consolidar un disco real de 80 GB que tiene XP instalado en su C:, pero en total el disco tiene 4 particiones (primarias). Sólo me interesaba el disco C:, con lo que ahorraba espacio en el proceso ya que la partición del C: sólo ocupa 25 GB.

Entonces hice la copia con «dd if=/dev/sdb1 of=imagen.raw». Como uso VirtualBox, con un comando lo convertí de .raw a .vdi. Pero no logré bootear.

Hice varias pruebas, siempre con VirtualBox y no lo logré. Supongo que es porque no se copió el MBR. En cambio, cuando copié el disco completo, booteó sin problemas.

La pregunta es: ¿Cómo debería haber hecho para trabajar solo con esa partición y de esa forma evitar trabajar con los 80GB?

Bueno, el problema era que, efectivamente, al hacer el dd sobre /dev/sdb1 sólo se copian los bytes dentro de la partición y no el MBR+Bootloader (la vieja «pista 0» del disco). Para resolver el problema habría que copiar los bytes de la pista 0 más los bytes de la partición en cuestión, siguiendo estos pasos:

Ejecutar el comando parted sobre /dev/sdb (en mi caso, voy a usar /dev/sda como ejemplo):

marcelo@jupiter:~$ sudo parted /dev/sda u s print
Modelo: ATA WDC WD3200BEVT-0 (scsi)
Disco /dev/sda: 625142448s
Tamaño de sector (lógico/físico): 512B/512B
Tabla de particiones. msdos

Numero  Inicio     Fin         Tamaño      Tipo      Sistema de ficheros  Banderas
 1      63s        32001479s   32001417s   primary   ext4                 arranque
 2      32001541s  94494329s   62492789s   extended
 5      32001543s  94494329s   62492787s   logical   ext4
 3      94494330s  98494514s   4000185s    primary   linux-swap(v1)
 4      98494515s  625137344s  526642830s  primary   ext4

El parámetro «print» le dice a parted que me imprima la tabla de particiones, y «u s» que imprima los tamaños en sectores (que en los discos <=1.0TB son siempre de 512 bytes, sino mismo parted lo dice en la salida, ver este post para más detalles).

De esta manera se tienen todos los sectores a copiar de /dev/sda directamente; en mi caso, 63 sectores de la pista 0, que contiene al MBR, más los de la primera partición, 32001417, total: 32001480 sectores.

Luego el dd que sólo copia los bytes que nos interesan (Pista 0 + Partición «C:») es fácil:

sudo dd if=/dev/sda of=imagen.raw bs=512 count=32001480

Y listo. Eso sí, luego hay que particionar la imagen con Parted, Fdisk, GParted o el software que se quiera utilizar a tal efecto. Es necesario hacerlo porque el MBR copiado va a reportar las 4 particiones que se tenían previamente en el disco y ahora sólo se va a disponer de una sola.

Asumo que este procedimiento también se puede aplicar para copiar una partición que no sea la primera, usando las opciones «skip» y «append» del comando dd; por ejemplo, si quisiera hacer un disco de sólo mi partición 5, tendría que:

  1. Copiar la pista 0 en un archivo con algo así como «dd if=/dev/sda of=imagen.raw bs=512 count=63».
  2. Ejecutar otro dd con la partición a copiar, salteando («skipeando») N sectores con la opción «skip» y especificando la opción «append» para agregar al archivo anterior de salida: «dd if=/dev/sda of=imagen.raw bs=512 count=62492787 skip=32001543 append».

Lógicamente esto último no lo probé, acepto comentarios de si funcionó o no 😉

Espero que a alguien le sirva…

¡Saludos!


Comentarios

10 respuestas a «Virtualizando sólo una partición de una máquina física»

  1. Aunque hayan pasado más de 8 meses desde que escribiste esto, quería agradecerte por haberlo hecho. Me resultó muy útil!.

    Te cuento que probé de virtualizar un Windows 7 Starter Edition de una netbook nueva [si, ya sé…horrible elección la mía pero era lo que tenía a mano 😛 ], y luego de pelearla un poquito, funcionó bárbaro. Puedo confirmar que el método que describís para clonar una partición NO contigua al MBR (en mi caso, fue la número 3), funciona joya!. Me permito agregar que a la línea con «dd» que publicaste para concatenar el sector de arranque con la partición del SO, le faltó el «oflag=append», y yo, por las dudas, le agregué un «conv=notrunc».

    Luego de hacer la imágen .raw, la convertí al formato nativo de VirtualBox (.vdi). Recurrí a «testdisk» para recuperar sólo la partición del SO. También tuve que corregir el MBR con esta misma herramienta. Aún así, el boot manager de Windows me recibió con una leyenda de error que decía, entre otras cosas, “Error al seleccionar el arranque; no se puede tener acceso a un dispositivo requerido”. Esto último, lo solucioné iniciando un «Hiren’s Boot «; Cargué el mini-Windows XP que trae incorporado y corregí un par de parámetros del boot manager de Windows 7 con «bcdedit». Y así fue como, finalmente, arrancó sin problemas! 🙂 .

    Me falta probar lo de achicar la imágen, pues tengo a la imágen del Windows ocupando 20GB en un disco USB portable 😛 .

    Muchas gracias!.

    Saludos.

  2. Buenísimo, aunque no fue tan fácil como suponía me alegro que haya funcionado.

    Saludos!

  3. Excelente manual de procedimiento, se agradece…

  4. y con los dispositivos del XP por ejemplo los detecta todos bien o habra que borrar la seccion de hardware del registro antes de generar la imagen? claro que la emulacion virtualizada generalmente es Intel y es muy probable que al bootear no arranque y ponga el CPU al 100% hasta que el equipo haga el shutdown termico correspondiente
    ademas tengo entendido que si booteas una imagen previamente en AMD en un virtualizado intel es probable que se congele generalmente hablando y si booteas una imagen intel en un AMD probablemente planches todo. estan al tanto?

  5. Para el XP los dispositivos son todos nuevos pero conocidos (ya que el hypervisor emula hardware que XP soporta bien), con lo cual deberías ver que se están instalando, pero todo funcionando y mientras arranca. Sobre «La emulación virtualizada» (?), en realidad el hypervisor no «disfraza» a la CPU que tenés en el host, para nada, sino que le muestra la gran mayoría de las características del CPU del host al guest (incluso hay posibilidades de hacer virtualización anidada desde no hace mucho).

    Lo que decis de cambiar AMD por Intel era cierto (siempre hablando de XP) hace mucho, quizás previo al SP2, no sé si sigue siendo cierto ahora o incluso con Vista o 7. Habría que probar.

    Saludos

  6. Tengo un problemilla, a ver si podemos hacer algo.

    Tengo una partición hecha con raw de una unidad c de un Windows XP, pero no tengo el mbr de ese disco.
    ¿ Como podría hace que ese windows reviviera virtualizado en virtualbox ?

    Gracias
    PD: muy bueno este post y el blog en general

  7. Lo que preguntás es justamente lo que explico en el post 🙂

    Sin embargo, como alternativa, creo que podrías bootear con un CD de instalación de Windows XP, entrar en la «Consola de Recuperación» (opción R) y ejecutar el comando «fixmbr» y «fixboot».

    http://www.hispazone.com/Guia/94/Consola-de-Recuperacion-de-Windows.html

    Saludos

  8. Gracias por contestar, Marcelo.

    Creo que mi problema es diferente al que expones en el post ya que yo no tengo ni puedo optener el mbr del disco origen.
    He creado un mbr a partir de la utilidad mbr de ubuntu, y he añadido la partición después, pero tampoco funciona. El fixmbr se ejecuta, pero el fixboot no reconoce la partición.

    Estoy en un punto muerto sin mbr

  9. Al final lo conseguí, pero no manipulando el mbr.
    El bolcado de la partición debía tener algo raro, porque cuando lo recuperé con dd y reconstruí el mbr, me decía que era una partición lógica en vez de una primaria.
    Pero una vez que parecía que los datos estaban bien, sólo tuve que copiar la partición a una primaria y poco mas.

    Me queda pendiente probar otro día tu método.

    Un saludo

  10. Buenísimo, me alegro.

    Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *