Linux / GParted puede ver la tabla de particiones pero dd bs = 512 count = 1 no puede

8

Tengo una tarjeta sd con formato MBR y cuando me conecto a una máquina Linux (xubuntu 12.04) puede montar una partición y analizar el sistema de archivos (como GParted). Sin embargo, cuando trato de leer el MBR desde el dispositivo usando dd, me da un montón de datos espurios.

¿Podría alguien arrojar alguna luz sobre cómo Linux / GParted puede leer y entender el MBR cuando dd no puede leer el MBR? ¿Utilizan diferentes métodos para obtener los datos? IE no abierto (), read ()

El comando DD es:

dd if=/dev/sdb of=mbr.bin bs=512 count=1

La salida DD es:

1+0 records in
1+0 records out
512 bytes transferred in 0.000786 secs (651345 bytes/sec)

mbr.bin dump con hexdump -C mbr.bines:

00000000  04 16 41 53 4d 49 2d 53  44 03 00 00 00 00 16 f1  |..ASMI-SD.......|
00000010  00 7f 00 32 1f 5b 80 00  36 db bf bf 96 c0 00 01  |...2.[..6.......|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  6f 00 00 10 00 00 02 2e  00 00 00 00 00 00 00 00  |o...............|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200
Tom Booth
fuente
¿Qué salida ddda?
qdii
¿Qué quieres decir con que dd no puede leer los datos ?
qdii
los primeros 512 bytes deben ser un MBR que contenga una tabla de particiones, pero claramente ese no es el caso
Tom Booth
hmm tal vez porque no usas uno? La magia con GPT es la tabla de particiones que reemplaza el MBR (pero el MBR se puede preservar para que los cargadores de arranque que esperan que uno siga funcionando).
qdii
1
¿Cuál es la salida fdisk -lu /dev/sdb, gdisk -l /dev/sdby grep sdb /proc/partitions?
Stéphane Chazelas

Respuestas:

2

La tarjeta no tiene un Master Boot Record (MBR). Si tuviera su hexdump le habría dado al menos una entrada de partición en el desplazamiento 0x1C0y 55aaal final.

No todas las tablas de partición presentan datos en los primeros 512 bytes. Los datos espurios que ve son el registro SID y CSD de (a / the) tarjeta SD. Pero por lo que parece, no son los datos correctos para la tarjeta (a menos que sea un viejo modelo 1 MiB 2001).

Los primeros 16 bytes son:

CID Register:
----------------------------------------------------------------------------
Manufacturer ID       (MID): 04               => (Transcend)
OEM/Application ID    (OID): 16 41            =  ?A
Product name          (PNM): 53 4d 49 2d 53   =  SMI-S
Product revision      (PRV): 44               =  0100 0100 => 4.4
Product serial number (PSN): 03 00 00 00
reserved               (-) : 00 >> 4          = 0000b
Manufacturing date    (MDT): (00 & 0x0f)|0x16 = 0001b,0110b => 2000+1,6=> Jun 2001
CRC7 checksum         (CRC): 1f >> 1          = 120
always 1               (1) : 1f & 1           = 1

Siguientes 16 bytes (al menos parte de él):

CSD Register:
----------------------------------------------------------------------------
CSD Structure        (CSD_STRUCTURE): 00 >> 6  = 00b => CSD Version 1.0
reserved                         (-): 00 & 3f  = 00 0000b
Data read access time 1       (TAAC): 7f = 1111b => time val 8.0, 111b => 7=10ms
Data read access time 2       (NSAC): 00
Max. data transfer rate (TRAN_SPEED): 32 = 0110,010 time val 2.5, 2=10Mbit/s 25MHz
Card command classes           (CCC): 1f << 4 | 5b >> 4 = 0x1f5

...
Device size (C_SIZE) : (0x80 & 0x03) << 0xa | 00h | 36 >> 6 : 0

Max. read  current @VDD min (VDD_R_CURR_MIN) : 110 => 60mA
Max. read  current @VDD max (VDD_R_CURR_MAX) : 110 => 80mA
Max. write current @VDD min (VDD_W_CURR_MIN) : 110 => 60mA
Max. write current @VDD max (VDD_W_CURR_MAX) : 110 => 80mA
Device size multiplier         (C_SIZE_MULT) : 111 => 2^(7 + 2) = 512
Erase single block enable     (ERASE_BLK_EN) : 0
Erase sector size              (SECTOR_SIZE) : 1111111 => 127 + 1 = 128
Write protect group size       (WP_GRP_SIZE) : 0111111 =>  63 + 1 = 64

MULT      = 2^(C_SIZE_MULT + 2)  = 2^(7 + 2) = 512
BLOCKNR   = (C_SIZE + 1) * MULT  = 1 * 512   = 512
BLOCK_LEN = 2^READ_BL_LEN        = 2^11      = 2048

memory capacity = 
BLOCKNR * BLOCK_LEN = 512 * 2048 = 1048576 bytes = 1024 KiB = 1 MiB

Además, la verificación CRC7 para el registro CSD es incorrecta. Podrían ser datos antiguos de un pasatiempo.

Esos registros y más pueden consultarse directamente desde la tarjeta mediante varios comandos. Esto se realiza mediante controladores de módulos, concentradores de tarjetas, etc.


Sería interesante ver lo que encuentra por los comandos dados por Stephane Chazelas, slm, etc.

Runium
fuente
1

Intentaría usar el sfdiskcomando en lugar de dd. Por ejemplo:

$ sudo sfdisk -d /dev/sda > /tmp/mbr_using_sfdisk.bin
Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.

Ahora mirar mbr_using_sfdisk.binrevela lo que estás buscando:

$ more /tmp/mbr_using_sfdisk.bin
# partition table of /dev/sda
unit: sectors

/dev/sda1 : start=     2048, size=  2457600, Id= 7, bootable
/dev/sda2 : start=  2459648, size=314765312, Id= 7
/dev/sda3 : start=956291072, size= 20480000, Id= 7
/dev/sda4 : start=317224960, size=639066112, Id= 5
/dev/sda5 : start=317227008, size=  1024000, Id=83
/dev/sda6 : start=318253056, size=638038016, Id=8e

Entonces, ¿por qué no puedo ver la tabla de particiones usando dd?

No estoy completamente seguro de por qué, pero encontré este truco que le muestra cómo ver las tablas de partición en el mbr.binuso del filecomando.

Por ejemplo:

$ sudo dd if=/dev/sda bs=512 count=1 of=mbr.bin
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000184924 s, 2.8 MB/s

$ file mbr.bin 
mbr.bin: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, boot drive 0x80, 1st sector stage2 0x12f0c26a, GRUB version 0.94; 
partition 1: ID=0x7, active, starthead 32, startsector 2048, 2457600 sectors; 
partition 2: ID=0x7, starthead 162, startsector 2459648, 314765312 sectors;
partition 3: ID=0x7, starthead 239, startsector 956291072, 20480000 sectors;
partition 4: ID=0x5, starthead 239, startsector 317224960, 639066112 sectors, code offset 0x48

Referencias

slm
fuente
¿Por qué debería alguien usar hexdumppara la salida (texto plano) de sfdisk -d /dev/sda?
Hauke ​​Laging
Ese es un gran punto, no me había dado cuenta de que era texto sin formato. Lo arreglaré en la respuesta 8-).
slm