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
인용하다
- 표준 도구를 사용하여 전체 디스크의 파티션 레이아웃을 복사하는 방법
- MBR/EBR 파티션 테이블← MBR에 대한 훌륭한 튜토리얼!
- 마스터 부트 레코드 예시
답변3
이 데이터는 SD 카드 메모리가 아니라 SD 카드 컨트롤러(ASMI)에서 전송됩니다. 이 페이지에서는 나에게 발생한 문제를 설명합니다.
http://www.idioten-notschlachten.de/blog/2011/11/13/kennen-sie-asmi/