4 votos

¿Cómo puedo recrear una iso instaladora desde un usb (Mac/Windows) usando dd?

He leido muchas preguntas de "como escribo una iso a USB". Estoy buscando una manera de invertir el proceso. Mi pregunta es acerca de tomar una memoria USB que contiene un instalador de Windows o Mac instalador y el uso de dd para leer sólo las partes del USB necesarias para recrear la iso original.

Escenario:
Tengo un USB de Windows 10 edición octubre 2020 que grabé allá por noviembre. Quiero hacer una copia de seguridad en disco utilizando dd . Algo parecido a:

dd if=/dev/sda of=backup-windows.iso bs=4m

Me gustaría poder comparar esto con la iso original y obtener una coincidencia. En otras palabras, no quiero tener que hacer una imagen de 64 GB de una unidad USB cuando la ISO sólo tiene 7-8 GB.

3voto

Kamil Maciorowski Puntos 897

Nota preliminar

Esta respuesta presenta comandos válidos en sistemas operativos compatibles con POSIX o casi compatibles con POSIX, en particular en Linux o macOS. Los comandos no son para Windows puro (pero supongo que la respuesta se puede ajustar para trabajar en WSL o Cygwin).


Análisis

OK, has copiado alguna imagen a una unidad USB /dev/sdx . En general, no se puede invertir exactamente el proceso basándose únicamente en el contenido y las propiedades de la unidad porque no se sabe cuántos bytes hay que leer. El límite superior es el tamaño de la unidad (64 GB en su caso), todo lo demás es una suposición. La unidad contiene un flujo de bytes y no hay ninguna marca que diga "deja de leer aquí para obtener la imagen original".

Analizando la tabla de particiones (si existe) es posible hacer una conjetura educativa. Pero incluso entonces no se puede estar seguro de que la imagen original no era más grande (con basura o no basura al final).

Sin embargo, si quieres comparar el resultado con alguna otra imagen, llamémosla the_other_file . Supongo que espera que las dos imágenes sean idénticas. Para que sean idénticas deben tener el mismo tamaño. Esto significa que usted sabe cuántos bytes para leer de /dev/sdx el número exacto de bytes the_other_file tiene. Puede obtener este número invocando

wc -c /path/to/the_other_file

o

</path/to/the_other_file wc -c

Tenga en cuenta que el primero es un comando independiente, mientras que el segundo requiere un Shell (para manejar < ). A partir de ahora asumo que estás en un Shell.


Copia de

Si su objetivo final es comparar, entonces no necesitan para copiar a un archivo normal. Lee toda la respuesta antes de decidirte. Aún así la pregunta explícita es:

¿Cómo puedo recrear un instalador iso desde un usb [ ] usando dd ?

Parece que dd es la única forma POSIX de leer un número exacto de bytes de un fichero . El camino requiere ibs=1 puede ser lento. Para leer N bytes:

dd ibs=1 count=N if=/dev/sdx of=image_file

El archivo resultante es image_file .

La imagen original, como imagen diseñada para ser escrita en un dispositivo de bloque, muy probablemente era de un tamaño múltiplo de 512 bytes, posiblemente múltiplo de 4096 bytes. Es probable que pueda utilizar algún ibs entonces.

Si N es un exacto múltiplo de alguna mayor ibs que desea utilizar, entonces puede utilizar el mayor ibs con count ajustado. El número después de count= especifica cuántos bloques del tamaño ibs leer. Notas:

  • bs especifica tanto ibs y obs (véase man 1 dd ).
  • Ni bs=4m (de su ejemplo) ni bs=4M pertenecen al Especificación POSIX de dd . Los sufijos válidos son k y b . Puede que te sorprenda que la especificación también permita cadenas en forma de AxB . Para obtener 4 MiB utilice bs=4kx1k ; para obtener 4 MB utilizar bs=4000000 o bs=4000x1000 etc.
  • En general, tenga en cuenta dd es una herramienta irritable y difícil de utilizar correctamente. Tiene sus trampas. Véase este y este .

Si N no es un múltiplo exacto de algún ibs es posible leer la mayor parte de lo que se desea con la gran ibs y añadir la parte que falta durante la lectura con ibs=1 . Esto es engorroso, requiere algunos cálculos, aun así es técnicamente posible; aunque casi nunca es útil. Si no estás limitado a POSIX, hay mejores maneras.

GNU dd admite iflag=count_bytes que hace count contar bytes independientemente de ibs . Junto con iflag=fullblock hace dd una herramienta decente para leer un número exacto de bytes. En tu caso el comando podría ser:

dd bs=4M iflag=fullblock,count_bytes count=N if=/dev/sdx of=image_file

o (para evitar escribir N manualmente):

dd bs=4M iflag=fullblock,count_bytes count="$(</path/to/the_other_file wc -c)" if=/dev/sdx of=image_file

Yo en su lugar utilizaría head -c :

head -c "$(</path/to/the_other_file wc -c)" /dev/sdx >image_file

Nota wc -c es portable (especificado por POSIX) pero head -c no lo es (aunque creo que head en macOS admite -c ).


Comparación de

Puede comparar directamente, sin crear ningún image_file . El siguiente comando es portable:

cmp /dev/sdx /path/to/the_other_file

En su caso /dev/sdx es un dispositivo mayor que the_other_file . Obtendrá un mensaje (a stdout) los archivos difieren, o un mensaje (a stderr) EOF on the_other_file . En cualquier caso, el estado de salida será 1 . Este último mensaje significa el comienzo de /dev/sdx es idéntica a the_other_file . Esto es lo que se espera después de copiar the_other_file a /dev/sdx .

Si quieres juzgar por el estado de salida (útil en scripts) entonces necesitas asegurarte de que estás comparando archivos de igual tamaño. Esto todavía es posible sin crear ningún image_file :

head -c "$(</path/to/the_other_file wc -c)" /dev/sdx | cmp - /path/to/the_other_file

(El estado de salida de una tubería proviene del último comando; aquí: de cmp .) Nota head -c es (todavía :) ) no portátil. Puede sustituirlo por portable dd … si es necesario:

dd ibs=1 count="$(</path/to/the_other_file wc -c)" if=/dev/sdx | cmp - /path/to/the_other_file

Alternativamente después de crear image_file como se muestra arriba, se puede comparar directamente image_file a the_other_file :

cmp image_file the_other_file

Estado de salida 0 indica que los archivos son idénticos; estado de salida 1 indica que los archivos no son idénticos.

Mientras trabajas de forma interactiva puedes prestar atención a la salida (me refiero a stdout + stderr, es decir, todo lo que ves normalmente en un terminal). Salida vacía de cmp indica que los archivos son idénticos; la salida no vacía de cmp indica lo que dice. Nota dd (pero no head ) imprime en stderr incluso si no se ha producido ningún error. Escribí deliberadamente "salida vacía de cmp ", no sólo "salida vacía". En caso de duda, compruebe de todos modos el estado de salida: ejecute echo $? justo después de cmp (o después de una tubería que termine en cmp ).

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X