Compré una tarjeta SD de 64 GB en eBay. Funciona bien cuando grabo una imagen ARM de Arch Linux y la uso para iniciar mi Raspberry Pi.
Sin embargo, cuando intento crear una única partición ext4 en ella para usar toda la capacidad de la tarjeta, se producen errores. mkfs.ext4
siempre termina felizmente; sin embargo, la partición no se puede mount
editar, siempre arroja un error y dmesg
muestra los mensajes del núcleo incluidos Cannot find journal
. Este ha demostrado ser el caso en al menos dos plataformas: Arch Linux ARM y Ubuntu 13.04.
Por otro lado, puedo crear y montar una partición FAT32 sin error (no se ha realizado una verificación de capacidad total).
Escuché que algunos tipos malos pueden cambiar la interfaz de la tarjeta SD para informar una capacidad incorrecta al sistema operativo (es decir, la tarjeta en realidad solo tiene 2 GB pero se reporta como 64 GB) para vender la tarjeta a un mejor precio.
Sé que badblocks
existen herramientas como para que compruebe que la tarjeta SD no tenga bloques defectuosos. ¿Puede badblocks
detectar problemas como este? Si no, ¿qué otras soluciones existen para que yo pruebe la tarjeta?
Idealmente me gustaría saber si fui engañado o no; Si el resultado muestra que acabo de recibir un artículo defectuoso, puedo volver solo al vendedor, en lugar de informar a eBay que alguien trató de engañarme.
ACTUALIZAR
operaciones y mensajes:
~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, 16383996 blocks
819199 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
500 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
~$ dmesg | tail
...
[4199.749118]...
~$ sudo mount /dev/sde1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sde1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
~$ dmesg | tail
...
[ 4199.749118]...
[ 4460.857603] JBD2: no valid journal superblock found
[ 4460.857618] EXT4-fs (sde1): error loading journal
ACTUALIZAR
He corrido badblocks /dev/sde
pero no informa ningún error. Eso significa que las causas restantes son:
La SD del coche es bueno, pero por alguna razón
mke2fs
omount
o el núcleo tiene un error que causa el problema.Fui engañado de una manera que
badblocks
no puede detectar la derrota. Esto es plausible porque creo quebadblocks
solo estoy haciendo una prueba de lectura y escritura en el lugar. Sin embargo, el tramposo puede hacer que el acceso a las áreas salientes se vincule a algún bloque entrante. En este caso, una comprobación de lectura y escritura in situ no puede detectar el problema.
Si no hay una aplicación que pueda hacer la prueba adecuada, creo que puedo intentar escribir un programa C simple para probarlo.
fuente
dmesg
muestra los mensajes del kernel y estoy seguro de que aparece al mismo tiempo que los errores porque lo hice antes y después y los comparé. No lo he verificadosyslog
porque creodmesg
que mostrará los mensajes.Respuestas:
Si alguien ve esto más tarde: alguien escribió una herramienta de código abierto llamada "F3" para probar la capacidad de las tarjetas SD y otros medios similares. Se puede encontrar en la página principal del proyecto y en Github .
fuente
El engaño ahora ha sido confirmado por los siguientes pasos:
Generar un archivo de datos al azar. (4194304 = 4 × 1024 × 1024 = 4 MiB, tamaño total = 40 × 4 MiB = 160 MiB)
Mando:
Copie los datos a la tarjeta SD. (2038340 × 4096 = 8153600 KiB = 7962.5 MiB)
Mando:
Lea los datos de la tarjeta SD.
Mando:
Mostrar el resultado
Mando:
¿Que pasó? Observamos una brecha de ceros. Este es un indicador de que los datos aleatorios no se han escrito realmente en la tarjeta. Pero, ¿por qué vuelven los datos después
1a81000
? Obviamente la tarjeta tiene un caché interno.También podemos intentar investigar el comportamiento del caché.
no proporciona ningún resultado, lo que significa que la basura generada no tiene ese patrón. Sin embargo,
Tiene 4 partidos.
Entonces es por eso que pasa el
badblocks
cheque. Pruebas adicionales pueden mostrar que la capacidad real es 7962.5 MB, o un poco menos de 8 GB.Concluyo que es muy poco probable que esto sea solo una falla aleatoria del hardware, pero es más probable que sea una especie de trampa (es decir, fraude). Me gustaría saber qué medidas puedo tomar para ayudar a otras víctimas.
Actualización 05/11/2019
La gente me preguntaba cómo descubrí el
seek
parámetro correcto2038399
. Hice mucha más experiencia de la que he mostrado en lo anterior. Básicamente tienes que adivinar en primer lugar. Debe adivinar un tamaño de datos adecuado y adivinar dónde estaba la corrupción de datos. Pero siempre puedes usar el método de bisección para ayudar.En el comentario a continuación, pensé que se suponía que el segundo paso anterior (copiar los datos en la tarjeta SD) solo copia 1 sector. Pero no cometí este error en mi experiencia. En cambio,
seek
fue para mostrar que en el paso "mostrar resultado" el desplazamiento1000
simplemente ocurre en el segundo sector de los datos. Si losseek
sectores son 2038399, la corrupción está en el sector 2038400.fuente
bs=4194304 count=40
cuando lees desde,/dev/urandom
perobs=4096 count=40960
cuando escribes y lees desde la tarjeta SD? (Son matemáticamente equivalentes; 167772160 bytes cada uno.)seek
, así que solo escribí 1 sector en la tarjeta, lo que ahorra la cantidad de transferencia de datos. De hecho, al experimentar utilicé un bloque de datos más grande, por eso el archivo de datos generado es 160MiB.sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096
. Y obviamente tienes razón; que utilizaseek
. Y, sí, técnicamente, no sirvecount
. ... (Continúa)count
especificación,dd
transfiere toda la entrada (es decir, transfiere hasta EOF o un error). Entonces, ese comando transfiere todo el contenido detest.orig
, que es 40960 registros de 4096 bytes cada uno, para un total de 167772160 bytes (como dije).En primer lugar, lea la respuesta F3 de @Radtoo. Es el camino correcto.
De alguna manera lo extrañé e intenté a mi manera:
crear archivo de prueba de 1 gb:
dd if=/dev/urandom bs=1024k count=1024 of=testfile1gb
escriba copias de ese archivo en la tarjeta sd (64 es el tamaño de la tarjeta sd en gb):
for i in $(seq 1 64); do dd if=testfile1gb bs=1024k of=/media/sdb1/test.$i; done
compruebe md5 de archivos (todos menos el último, incompleto, deben coincidir):
md5sum testfile1gb /media/sdb1/test.*
fuente
La forma más sencilla de probar la capacidad total de una tarjeta SD es llenarla con archivos y luego verificar que los archivos sean correctos:
diff -qr /directory/on/computer /directory/on/SD
Alternativamente, puede utilizar programas para escribir patrones o cadenas de hashes en un archivo y luego verificar que sean correctos.
Como señaló @Earthy Engine , es importante llenar la tarjeta SD, luego leer los datos, ya que los enfoques tradicionales que simplemente escriben un pequeño bloque de datos y luego los leen, son engañados por tarjetas SSD falsas.
fuente
Escribí un pequeño script que hace lo siguiente.
-crea un directorio temporal a la tarjeta USB o SC de destino
-crea un archivo de referencia de 5 MB generado aleatoriamente con suma de comprobación md5sum -Copia el archivo de referencia al objetivo y genera una comprobación de md5sum desde el objetivo para confirmar el éxito de lectura / escritura -llena el objetivo hasta su capacidad (100%) o se detiene cuando se produce un error de suma de comprobación -una vez que el script se detiene de forma natural, muestra el tamaño objetivo indicado, las cantidades utilizadas y las cantidades gratuitas.Con este script, llegué a la conclusión de que un vendedor de eBay me estafó y me pasó una microSD de 8GB por una de 64GB.
fuente
Se puede escribir una secuencia de números (cada fila tiene 16 bytes) y luego verificar el contenido:
Luego verifique skip == output (usando una pequeña muestra de valores de skip que son un número menor de registros escritos) ej. Skip = 9876 :
O haga una muestra de 20 ubicaciones con un solo revestimiento:
of=tempFileOnSD
, si desea evitar destruir los datos almacenados en su tarjeta (relevante solo si no es falsa)fuente
seq -w 0 123456789012345 > /dev/yourSdHere
yseq -w 0 123456789012345 | cmp - /dev/yourSdHere
?