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
).