Para referencia futura, así es como procedí finalmente, con algunos comentarios sobre los diversos problemas o dificultades encontradas:
1. Arranque la máquina con un sistema Linux en vivo
El primer paso fue arrancar la máquina que contenía el disco a la imagen, usando un sistema Linux en vivo.
NOTA:Mi primera idea fue utilizar un disco USB de Ubuntu Live, pero la máquina no admitía el arranque desde USB, por lo que me resultó más fácil utilizar un viejo Knoppix live CD. .
2. Imagen del disco usando dd
y canalice los datos a través de ssh
Luego, copié todo el contenido del disco a una imagen de archivo en mi servidor local usando dd
y canalizando los datos a través de ssh
:
$ dd if=/dev/hdX bs=4k conv=sin error, sincronizar | ssh -c ejemplo de pez [email protected] 'dd of=myfile.dd'
Algunos comentarios aquí:este método leerá todo el contenido del disco, por lo que puede llevar mucho tiempo (me tomó 5 horas para un disco de 80 Gb). El cuello de botella no es la red, sino la velocidad de lectura del disco. Antes de iniciar la copia, aconsejo verificar los parámetros del BIOS/disco/sistema para asegurarse de que el disco y la placa base funcionen a la velocidad más alta posible (esto se puede verificar usando el comando hdparm -i
y ejecutando una prueba con hdparm -Tt /dev/hdX
).
NOTA:dd
no muestra el progreso de la operación, pero podemos obligarlo a que lo haga enviando el USR1 señal al dd
procesar PID desde otro terminal:
$ matar -USR1 PIDofdd
Nota:Versiones más recientes de dd
apoya el status=LEVEL
opción (man dd
)
status=LEVEL
The LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer' suppresses
the final transfer statistics, 'progress' shows periodic transfer statistics
3. Recuperar el espacio no utilizado
En este punto, la máquina de origen ya no es necesaria y trabajaremos exclusivamente en el servidor de destino (también con Linux). VirtualBox se utilizará para convertir la imagen de disco sin procesar al formato VHD, pero antes de hacerlo, podemos poner a cero los bloques no utilizados, de modo que VirtualBox no les asigne espacio en el archivo final.
Para hacerlo, monté las imágenes como un dispositivo de bucle invertido:
$ mount -o loop,rw,offset=26608813056 -t ntfs-3g /mnt/mydisk/myfile.dd /mnt/tmp_mnt
$ cat /dev/zero > zero.file
$ rm zero.file
NOTA:El desplazamiento que indica el comienzo de la partición dentro de la imagen del disco se puede obtener usando parted
en el archivo de imagen:
$ parted /mnt/mydisk/myfile.dd
(parted) unit
Unit? [compact]? B
(parted) print
Model: (file)
Disk /mnt/mydisk/myfile.dd: 80026361856B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32256B 21936821759B 21936789504B primary ntfs boot
2 21936821760B 80023749119B 58086927360B extended lba
5 26608813056B 80023749119B 53414936064B logical ntfs
NOTA 2:El controlador NTFS predeterminado del kernel de Linux proporciona acceso de solo lectura, por lo que es necesario instalar y usar el espacio de usuario ntfs-3g
controlador o escribir en el disco generará un error!
4. Cree la imagen VHD usando VBoxManage
En este punto, podemos usar las utilidades de VirtualBox para convertir la imagen sin procesar en un archivo VHD:
VBoxManage convertfromraw myfile.dd myfile.vhd --format VHD
Estaba tratando de hacer exactamente lo mismo que el OP (mientras rescataba una instalación de Windows) y terminé creando una nueva herramienta para él, ntfsclone2vhd
.
Entonces simplemente haría algo como esto:
ntfsclone --save-image -o - /dev/sdXX | ntfsclone2vhd - /mnt/usb/output.vhd
Un enfoque es usar un par de tecnologías prácticas:VirtualBox y el ntfsprogs
paquete.
Las versiones recientes de VirtualBox le permiten crear archivos de disco duro VHD, mientras que ntfsprogs
proporciona el ntfsclone
utilidad. Como su nombre indica, ntfsclone
clona sistemas de archivos NTFS, y creo que lo hace a nivel del sistema de archivos, omitiendo bloques de disco no utilizados.
Entonces, para comenzar, cree una nueva VM en VirtualBox y aprovisione una nueva unidad de archivo VHD vacía para ella. La unidad VHD solo necesita ser tan grande como el tamaño de los datos en uso en la unidad física que desea clonar (bueno, en realidad, hágala un poco más grande, para permitir algo de margen de maniobra).
A continuación, busque un CD en vivo de Linux que contenga el ntfsprogs
paquete, así como openssh-server
. Me gusta System Rescue CD para esto, pero prácticamente cualquier Live CD basado en Debian o Ubuntu debería funcionar también.
Inicie la máquina virtual VirtualBox con el Live CD de Linux e inicie sshd
dentro de la VM para que pueda ejecutar comandos en ella de forma remota. Particione la unidad VHD vacía de manera adecuada, utilizando la herramienta de partición que prefiera (me gusta el viejo y sencillo fdisk
, pero soy algo de la vieja escuela).
Con otra copia del Live CD de Linux, inicie la máquina que contiene el disco físico que desea clonar. Supongo que la máquina virtual VirtualBox y esta máquina son accesibles entre sí a través de la red. En esta máquina, ejecute el siguiente comando (todo en una línea):
ntfsclone --save-image -o - /dev/sdXX |
ssh [email protected] 'ntfsclone --restore-image --overwrite /dev/sdYY -'
donde:
/dev/sdXX
es el nombre del dispositivo (en la máquina local) de la unidad física que desea clonar, y/dev/sdYY
es el nombre del dispositivo (en la máquina virtual) de la unidad de destino VHD.
Explicación:El primer ntfsclone
El comando en la canalización extrae una imagen del sistema de archivos NTFS de origen y la envía a través del túnel ssh, mientras que el segundo ntfsclone
recibe la imagen y la restaura en la unidad VHD.
Una vez que se complete la operación, el archivo VHD debe contener un clon exacto archivo por archivo del disco físico original (salvo que se produzcan errores de hardware, como sectores defectuosos, que podrían provocar la interrupción prematura del proceso).
Una última cosa que puede hacer es ejecutar Windows chkdsk
en la unidad VHD, solo para garantizar que la clonación no haya presentado ningún problema (no debería haberlo hecho, pero bueno, estoy un poco paranoico con estas cosas).