Linux/GParted는 파티션 테이블을 볼 수 있지만 dd bs=512 count=1은 볼 수 없습니다.

Linux/GParted는 파티션 테이블을 볼 수 있지만 dd bs=512 count=1은 볼 수 없습니다.

MBR 형식의 SD 카드가 있고 Linux 시스템(xubuntu 12.04)에 연결하면 파티션을 마운트하고 파일 시스템을 구문 분석할 수 있습니다(GParted도 가능). 그러나 dd를 사용하여 장치에서 MBR을 읽으려고 하면 가짜 데이터가 많이 제공됩니다.

dd가 MBR을 읽을 수 없을 때 Linux/GParted가 MBR을 읽고 이해하는 방법에 대해 누구든지 밝힐 수 있습니까?그들은 데이터를 얻기 위해 다른 방법을 사용합니까?IE는 open(), read()를 할 수 없습니다.

DD 명령은 다음과 같습니다.

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

DD 출력은 다음과 같습니다.

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

mbr.bin 덤프는 hexdump -C mbr.bin다음과 같습니다.

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

답변1

카드에 MBR(마스터 부트 레코드)이 없습니다. 16진수 덤프가 있는 경우 오프셋 0x1C0과 끝에 55aa최소한 하나의 파티션 항목이 제공 됩니다.

모든 분할된 테이블이 처음 512바이트에 데이터를 배치하는 것은 아닙니다. 이것거짓 데이터당신이 보는 것은 (1/1) SD 카드의 SID 및 CSD 레지스터입니다. 하지만 표면적으로 이것은 카드에 대한 올바른 데이터가 아닙니다.(이전 1MiB 2001 모델이 아닌 경우)

처음 16바이트는 다음과 같습니다.

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

다음 16바이트(적어도 그 중 일부):

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

또한 CSD 레지스터의 CRC7 검사가 잘못되었습니다. 오락에서 남겨진 오래된 데이터일 수도 있습니다.

이러한 레지스터 등은 다양한 명령을 통해 카드에서 직접 쿼리할 수 있습니다. 이는 모듈 드라이버, 카드 허브 등에 의해 수행됩니다.


Stephane Chazelas, slm 등이 제공한 명령으로 무엇을 발견하는지 보는 것은 흥미로울 것입니다.

답변2

sfdisk대신 이 명령을 사용해 보겠습니다 dd. 예를 들면 다음과 같습니다.

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

이제 이를 보면 mbr_using_sfdisk.bin당신이 찾고 있는 것이 무엇인지 알 수 있습니다:

$ 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

그렇다면 왜 파티션 테이블을 볼 수 없습니까 dd?

mbr.bin이유를 완전히 확신할 수는 없지만 명령을 사용하여 파티션 테이블을 보는 방법을 보여주는 이 팁을 발견했습니다 file.

예를 들어:

$ 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

인용하다

답변3

이 데이터는 SD 카드 메모리가 아니라 SD 카드 컨트롤러(ASMI)에서 전송됩니다. 이 페이지에서는 나에게 발생한 문제를 설명합니다.

http://www.idioten-notschlachten.de/blog/2011/11/13/kennen-sie-asmi/

관련 정보