Linux / GParted dapat melihat tabel partisi tetapi dd bs = 512 count = 1 tidak bisa


8

Saya memiliki kartu sd yang diformat MBR dan ketika terhubung ke mesin Linux (xubuntu 12.04) ia dapat me-mount sebuah partisi dan mem-parsing sistem file (seperti yang dapat GParted). Namun, ketika saya mencoba membaca MBR dari perangkat menggunakan dd itu memberi saya banyak data palsu.

Adakah yang bisa menjelaskan bagaimana Linux / GParted dapat membaca dan memahami MBR ketika dd tidak dapat membaca MBR. Apakah mereka menggunakan metode berbeda untuk mendapatkan data? Yaitu tidak terbuka (), baca ()

Perintah DD adalah:

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

Output DD adalah:

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

Tempat pembuangan mbr.bin hexdump -C mbr.binadalah:

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

Apa hasil yang dddiberikan?
qdii

apa maksudmu dengan dd tidak bisa membaca data ?
qdii

512 byte pertama adalah MBR yang berisi tabel partisi tetapi jelas bukan itu masalahnya
Tom Booth

hmm mungkin karena Anda tidak menggunakannya? Keajaiban dengan GPT adalah Tabel Partisi yang menggantikan MBR (tetapi MBR dapat dipertahankan agar boot loader yang mengharapkannya tetap berfungsi).
qdii

1
Apa hasil dari fdisk -lu /dev/sdb, gdisk -l /dev/sdbdan grep sdb /proc/partitions?
Stéphane Chazelas

Jawaban:


2

Kartu tidak memiliki Master Boot Record (MBR). Jika memiliki hexdump Anda akan memberi Anda setidaknya satu entri partisi di offset 0x1C0dan 55aadi akhir.

Tidak semua tabel partisi mengeluarkan data dalam 512 byte pertama. The Data palsu yang Anda lihat adalah SID dan CSD mendaftar dari (a / yang) kartu SD. Tapi dari kelihatannya, itu bukan data yang benar untuk kartu (kecuali itu model lama 1 MiB 2001).

16 byte pertama adalah:

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 byte berikutnya (setidaknya sebagian darinya):

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

Juga, pemeriksaan CRC7 untuk register CSD salah. Bisa jadi data lama yang tersisa dari hobi.

Register-register itu dan yang lainnya dapat ditanyakan dari kartu secara langsung dengan berbagai perintah. Ini dilakukan oleh driver modul, hub kartu, dll.


Akan menarik untuk melihat apa yang Anda temukan dengan perintah yang diberikan oleh Stephane Chazelas, slm dll.


1

Saya akan mencoba menggunakan sfdiskperintah sebagai lawan dd. Sebagai contoh:

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

Sekarang melihat mbr_using_sfdisk.binmengungkapkan apa yang Anda cari:

$ 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

Jadi mengapa saya tidak bisa melihat tabel partisi menggunakan dd?

Saya tidak sepenuhnya yakin mengapa tetapi saya menemukan trik ini yang menunjukkan kepada Anda bagaimana melihat tabel partisi di Anda mbr.binmenggunakan fileperintah.

Sebagai contoh:

$ 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

Referensi


Mengapa orang harus menggunakan hexdumpoutput (teks biasa) sfdisk -d /dev/sda?
Hauke ​​Laging

Itu poin yang bagus, saya tidak memperhatikan itu teks biasa. Saya akan memperbaikinya dalam jawaban 8-).
slm

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.