Tengo una imagen de una partición existente generada con dd if=/dev/sdXN of=image.bin
. Ahora quiero usar esta imagen como base para una máquina virtual. Sé cómo convertir la imagen a un formato que VirtualBox pueda usar.
El problema es que la imagen del "disco" es realmente solo la imagen de una partición y, por lo tanto, no contiene un MBR o una tabla de particiones. Esto hace que sea muy difícil arrancar la VM.
¿Existe una manera simple, dada una imagen de una partición, de crear una imagen de disco adecuada, incluida una tabla de partición?
fuente
Estoy seguro de que el problema original se resolvió hace mucho tiempo, pero para cualquiera con un problema similar:
Una forma de evitar copiar toda la imagen sería crear una imagen en formato .vmdk que haga referencia a archivos de extensión separados para la tabla de particiones y para el contenido de la partición.
Tengo este fragmento en un archivo .vmdk de una prueba que hice hace un tiempo:
Esto significa que los 63 sectores que comienzan desde el desplazamiento 0 se leen desde el archivo sin formato "parttable.bin", pero el sector 63 y hacia arriba provienen del volcado de partición sin formato "division-image.bin". (Por supuesto, reemplace 63 con el desplazamiento real de la primera partición, generalmente 2048 en estos días).
El resultado final es que, desde dentro de VBox, parece que ha colocado la tabla de particiones en el frente de la imagen de la partición, sin tener que hacer la operación de copia larga.
Particione la unidad desde dentro de la VM y, si obtiene sus correcciones correctas, debería ver el contenido de su imagen de partición dentro de la partición recién creada.
fuente
Interesante problema Esto es lo que haría:
Una vez hecho esto, deberá actualizar su gestor de arranque. Suponiendo que está utilizando GRUB, monte la partición recién escrita, luego haga un chroot en ella y ejecútela
update-grub
(tenga cuidado, sin embargo, es posible que deba ajustar sus archivos de configuración antes de que funcione correctamente).¡Buena suerte!
fuente
Puede cambiar el tamaño del sistema de archivos en su lugar, con GParted.
Crea la imagen de prueba:
No estoy usando resize2fs, porque cambia el tamaño del archivo, en lugar de dejar espacio libre.
1 MB gratis al inicio.
Finalmente, cree la tabla de particiones.
Establezca el primer sector en 2048 (2048 sectores * 512 B / sector = 1 MB), el último sector es el predeterminado (es decir, el final de la imagen).
fuente
Personalmente prefiero agregar usando
dd
.Estoy asumiendo sectores de 512 bytes aquí. Puede haber un caso para los sectores de 2048 bytes, así que simplemente intercambie los números y haga los cálculos.
En cada caso, estoy usando un archivo de prueba de 512 MB, por ejemplo:
dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img
MBR
Componiendo la imagen
Personalmente prefiero agregar el primer MB (2048 sectores) a su comienzo:
dd if=testfs.img skip=2048 bs=512 of=full.img
Finalmente ejecute fdisk para crear la tabla de particiones (o copie la suya propia), creé 1 partición usando los valores predeterminados.
Verificando
Para verificar, crear particiones de bucle y autodetectar:
sudo losetup -fP full.img
Y ejecutar
file
en el dispositivo de loopback particionado resultante:sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)
GPT
Componiendo la imagen
Personalmente, prefiero agregar los primeros MB (2048 sectores, ya que gdisk usará de forma predeterminada este número, ya que está alineado con 1 MB) al comienzo para el MBR inicial y 34 sectores hasta el final (o 2048 para un MB completo) para el final GPT (el sector final puede ser diferente). Omitir el GPT final puede perder sus datos:
dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34
Finalmente ejecute gdisk para crear la tabla de particiones (o copie la suya propia), creé 1 partición usando los valores predeterminados.
Verificando
Para verificar, crear particiones de bucle y autodetectar:
sudo losetup -fP full.img
Y ejecutar
file
en el dispositivo de loopback particionado resultante:sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)
Este método garantiza no adivinar, cambiar el tamaño o alinear manualmente.fuente
sudo file -s /dev/loop11p1
lo tengo/dev/loop11p1: data
. Que anteriormente era un sistema de archivos ext4. Y el full.img resultante es más pequeño. Creo que tienes la solución invertida.seek=2048
en este comando dd if = testfs.img skip = 2048 bs = 512 of = full.img