Ref
扩展分区和逻辑分区的概念: https://en.wikipedia.org/wiki/Extended_boot_record
Overview
- MBR中有4个partition record entry,为了支持多于4个分区,就需要用到扩展分区的概念。此时,
- MBR中的一个partition record entry定义extended partition。(最多只能有一个这种entry)
- primary partition和extended partition的区分,是用partition record entry中的一个字段(分区类型)。
- extended partition又会划分成多个logical partition,由一个或多个EBR来描述。
- 所有的EBR都位于extended partition中
Structure
EBR
- 第一个EBR总是位于整个extended partition的第一个扇区
- 所有的EBR是以链表的形式组织起来
- 每个EBR (EBR_A)位于其对应的logical partition (LP_A)之前;如果其后还有一个logical partition (LP_B),那么在这个EBR (EBR_A)中将包括一个entry,该entry指向下一个EBR (EBR_B)。——显然,这个ERB_B也是位于其对应的LP_B之前。
- 通过这种方式,多个EBR形成一个linked list;因此,EBR可以有任意个,其数量仅受实际的磁盘大小所限。
- EBR和MBR(几乎)有相同的结构,差异:EBR仅用了分区表的前两个entry;EBR扇区最后的2个字节是signature,和MBR一样,都是0xAA55。
Entry of the EBR Partition Table
- 第一个entry指向属于该EBR的logical partition
– Start Sector: 该logica partition的第一个扇区相对于该EBR的偏移扇区数。通常对于所有的EBR,这个值都一样。
– Number of Sectors: 该logical partition的扇区数。(EBR和logical partition之间可能有一些没有用到的扇区,这些都不属于该logical partition) - 第二个entry: 如果当前的EBR是extended partition的最后一个(最后一个logical partition),那么该entry就全0;否则,指向EBR Chain的下一个EBR。
– Starting Sector: Extended Partition中下一个EBR的相对地址(=下一个EBR的LBA地址 - extended partition的第一个EBR的LBA地址)
– Number of sectors: 下一个logical partition的扇区总数,但是是从下一个EBR扇区开始计数,因此会包括可能的实际未用到的、介于EBR和logical partition之间的扇区
实例分析
fdisk/分区列表
flying-bird@flyingbird:/$ sudo fdisk -l
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00089375
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 293177343 293175296 139.8G 83 Linux
/dev/sda2 293177344 301176831 7999488 3.8G 82 Linux swap / Solaris
/dev/sda3 301178878 976771071 675592194 322.2G 5 Extended
/dev/sda5 301178880 605679615 304500736 145.2G 83 Linux
/dev/sda6 605681664 786997428 181315765 86.5G 83 Linux
/dev/sda7 786999296 976771071 189771776 90.5G 83 Linux
Partition 3 does not start on physical sector boundary.
flying-bird@flyingbird:/$
两个主分区: sda1, sda2
一个扩展分区: sda3, 包括3个逻辑分区(sda5, sda6, sda7)。——逻辑分区从5开始计数。
MBR
flying-bird@flyingbird:~$ sudo dd if=/dev/sda of=mbr.dat bs=512 count=1
[sudo] password for flying-bird:
1+0 records in
1+0 records out
512 bytes copied, 0.0210277 s, 24.3 kB/s
flying-bird@flyingbird:~$ ls -l mbr.dat
-rw-r--r-- 1 root root 512 8月 6 00:25 mbr.dat
flying-bird@flyingbird:~$ sudo chown flying-bird mbr.dat
flying-bird@flyingbird:~$ sudo chgrp flying-bird mbr.dat
flying-bird@flyingbird:~$ hexdump -C mbr.dat
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |................|
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 bb 17 04 |. ..d|<.t...R...|
00000090 f6 07 03 74 06 be 88 7d e8 17 01 be 05 7c b4 41 |...t...}.....|.A|
000000a0 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 37 83 |..U..ZRr=..U.u7.|
000000b0 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 44 02 |..t21..D.@.D..D.|
000000c0 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 8b 1e |....f..|f.\.f..|
000000d0 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd 13 72 |`|f.\..D..p.B..r|
000000e0 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 d2 0f |...p.v....s.Z...|
000000f0 83 d0 00 be 93 7d e9 82 00 66 0f b6 c6 88 64 ff |.....}...f....d.|
00000100 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 f4 40 |@f.D...........@|
00000110 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 60 7c |.D.......f..f.`||
00000120 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 34 88 |f..uNf.|f1.f.4.|
00000130 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 88 c5 |.1.f.t.;D.}7....|
00000140 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 70 8e |0........Z....p.|
00000150 c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e b9 00 |.1......r...`...|
00000160 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f 61 ff |...1..........a.|
00000170 26 5a 7c be 8e 7d eb 03 be 9d 7d e8 34 00 be a2 |&Z|..}....}.4...|
00000180 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 47 65 |}.......GRUB .Ge|
00000190 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 61 |om.Hard Disk.Rea|
000001a0 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 b4 0e |d. Error........|
000001b0 cd 10 ac 3c 00 75 f4 c3 75 93 08 00 00 00 80 20 |...<.u..u...... |
000001c0 21 00 83 fe ff ff 00 08 00 00 00 80 79 11 00 fe |!...........y...|
000001d0 ff ff 82 fe ff ff 00 88 79 11 00 10 7a 00 00 fe |........y...z...|
000001e0 ff ff 05 fe ff ff fe 9f f3 11 02 b8 44 28 00 00 |............D(..|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
flying-bird@flyingbird:~$
Partition Entries in MBR
第一个主分区(/dev/sda1)
000001b0 80 20 |...<.u..u...... |
80: 启动分区
000001c0 21 00 83 fe ff ff 00 08 00 00 00 80 79 11
(20,21,00): 该分区第一个扇区的CHS(Linux仅使用sector数据)
83: 分区类型,GNU/Linux
(fe,ff,ff): 最后一个扇区的CHS
0x0800=2048: 第一个扇区的LBA,
0x11798000=293175296: 该分区的扇区数
第二个主分区(/dev/sda2)
00 fe |!...........y...|
00: 非启动分区
000001d0 ff ff 82 fe ff ff 00 88 79 11 00 10 7a 00
(fe,ff,ff): start CHS
82: Linux交换分区
(fe,ff,ff): 最后一个扇区的CHS
0x11798800=293177344: 该分区的第一个扇区
0x007a1000=7999488(=3.8G) 该分区的扇区数(分区大小)
扩展分区(/dev/sda3)
00 fe |........y...z...|
00: 非启动分区
000001e0 ff ff 05 fe ff ff fe 9f f3 11 02 b8 44 28
(fe,ff,ff): start CHS
05: 扩展分区
(fe,ff,ff): 最后一个扇区的CHS
0x11f39ffe=301178878: 该分区(/dev/sda3)的第一个扇区
0x11f39ffe*512=0x23e73ffc00
0x2844b802=675592194(=322.2G) 该分区的扇区数(分区大小)
第四个分区/dev/sda4未用
00 00 |............D(..|
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
boot signature
00000200
第一个EBR/第一个逻辑分区sda5
查看该EBR的命令(这里用了4096,多显示了EBR后面的几个扇区):
sudo hexdump -C -s 0x23e73ffc00 -n 4096 /dev/sda
EBR
第一个扇区是EBR:
446字节未用,全0
23e73ffc00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
23e73ffdb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第一个partition entry:
00 fe |................|
00: 非启动分区
23e73ffdc0 ff ff 83 fe ff ff 02 00 00 00 00 50 26 12
83: 分区类型,GNU/Linux 0x12265000=304500736(=145.2G) 逻辑分区/dev/sda5的扇区数(分区大小)
0x00000002=第一个逻辑分区(/dev/sda5)的相对LBA=0x11f39ffe+2=0x11f3a000=301178880
0x11f3a000*512=0x23e7400000=154203586560
第二个partition entry:
00 fe |...........P&...|
23e73ffdd0 ff ff 05 fe ff ff 02 50 26 12 b5 b0 ce 0a 00 00 |.......P&.......|
05: 扩展分区 0x0aceb0b5=181317813(86.459G)
0x12265002=第二个逻辑分区的相对LBA(相对于整个扩展分区的起始地址)
0x11f39ffe + 0x12265002 = 0x2419f000 = 605679616
0x2419f000 * 512 = 0x4833e00000
23e73ffde0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
23e73ffdf0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
23e73ffe00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
逻辑分区/dev/sda5的起始位置
23e7400000 00...
*
23e7400400 00 40 91 00 00 ca 44 02 19 0a 1d 00 3c 0b e1 00 |.@....D.....<...|
23e7400410 4e 98 7e 00 00 00 00 00 02 00 00 00 02 00 00 00 |N.~.............|
23e7400420 00 80 00 00 00 80 00 00 00 20 00 00 2c e5 85 59 |......... ..,..Y|
23e7400430 2c e5 85 59 6a 01 ff ff 53 ef 01 00 01 00 00 00 |,..Yj...S.......|
23e7400440 da 31 2c 53 00 00 00 00 00 00 00 00 01 00 00 00 |.1,S............|
23e7400450 00 00 00 00 0b 00 00 00 00 01 00 00 3c 00 00 00 |............<...|
23e7400460 46 02 00 00 7b 00 00 00 82 cb 7e cd 1e 15 42 78 |F...{.....~...Bx|
23e7400470 83 ad c8 0a 53 13 a5 ad 00 00 00 00 00 00 00 00 |....S...........|
23e7400480 00 00 00 00 00 00 00 00 2f 68 6f 6d 65 00 00 00 |......../home...|
23e7400490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
23e74004c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f6 03 |................|
23e74004d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
23e74004e0 08 00 00 00 00 00 00 00 c2 04 78 00 b0 02 ec d5 |..........x.....|
23e74004f0 ec de 4d 3b 87 ea c4 d0 8e 61 7f a3 01 01 00 00 |..M;.....a......|
23e7400500 0c 00 00 00 00 00 00 00 da 31 2c 53 0a f3 02 00 |.........1,S....|
23e7400510 04 00 00 00 00 00 00 00 00 00 00 00 ff 7f 00 00 |................|
23e7400520 00 80 20 01 ff 7f 00 00 01 00 00 00 ff ff 20 01 |.. ........... .|
23e7400530 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
23e7400540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 |................|
23e7400550 00 00 00 00 00 00 00 00 00 00 00 00 1c 00 1c 00 |................|
23e7400560 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
23e7400570 00 00 00 00 04 00 00 00 0d 3a 57 0e 00 00 00 00 |.........:W.....|
23e7400580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
23e7400c00
第二个EBR/第二个逻辑分区sda6
MBR和EBR中都有扩展分区的概念,但EBR中的扩展分区都属于MBR的扩展分区的一部分。EBR的扩展分区的概念主要是为了和逻辑分区区分开来。
第二个逻辑分区所在的EBR扩展分区起始地址:0x4833e00000。查看该分区的命令:
sudo hexdump -C -s 0x4833e00000 -n 4096 /dev/sda
EBR:
446未用字节
4833e00000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
4833e001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第一个parition entry:
00 fe |................|
00: 非启动分区
4833e001c0 ff ff 83 fe ff ff 00 08 00 00 b5 a8 ce 0a
83: 分区类型,GNU/Linux 0x0acea8b5 = 181315765 逻辑分区/dev/sda6的扇区数
0x0800: 相对于该EBR,对应逻辑分区(/dev/sda6)的起始地址
0x2419f000 + 0x0800 = 0x2419f800 = 605681664 (LBA)
605681664 * 512 = 0x4833f00000
第二个partition entry:
00 fe |................|
4833e001d0 ff ff 05 fe ff ff b7 00 f5 1c 4b b7 4f 0b
05: extended partition 0x0b4fb74b=189773643
0x11f39ffe + 0x1cf500b7 = 786997429
786997429 * 512 = 0x5dd1416a00
00 00 |..........K.O...|
4833e001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
4833e001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
signature
4833e00200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
4833e01000
逻辑分区/dev/sda6开始几个扇区的数据
命令:
sudo hexdump -C -s 0x4833f00000 -n 4096 /dev/sda
内容:
4833f00000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
4833f00400 00 80 56 00 16 d5 59 01 a7 4a 11 00 9a af 53 01 |..V...Y..J....S.|
4833f00410 f5 7f 56 00 00 00 00 00 02 00 00 00 02 00 00 00 |..V.............|
4833f00420 00 80 00 00 00 80 00 00 00 20 00 00 2d e5 85 59 |......... ..-..Y|
4833f00430 2d e5 85 59 04 01 ff ff 53 ef 01 00 01 00 00 00 |-..Y....S.......|
4833f00440 c8 e4 e4 53 00 00 00 00 00 00 00 00 01 00 00 00 |...S............|
4833f00450 00 00 00 00 0b 00 00 00 00 01 00 00 3c 00 00 00 |............<...|
4833f00460 46 02 00 00 7b 00 00 00 21 25 22 46 12 4f 4f 0d |F...{...!%"F.OO.|
4833f00470 93 6a b5 94 4a 10 c3 ce 00 00 00 00 00 00 00 00 |.j..J...........|
4833f00480 00 00 00 00 00 00 00 00 2f 6d 61 74 65 72 69 61 |......../materia|
4833f00490 6c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |l...............|
4833f004a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
4833f004c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fa 03 |................|
4833f004d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
4833f004e0 08 00 00 00 00 00 00 00 00 00 00 00 83 c2 0a d2 |................|
4833f004f0 13 87 49 b4 8c 48 8b fa 86 bd 6c a2 01 01 00 00 |..I..H....l.....|
4833f00500 0c 00 00 00 00 00 00 00 dd 31 2c 53 0a f3 04 00 |.........1,S....|
4833f00510 04 00 00 00 00 00 00 00 00 00 00 00 d9 5b 00 00 |.............[..|
4833f00520 27 24 00 00 d9 5b 00 00 25 24 00 00 01 84 00 00 |'$...[..%$......|
4833f00530 fe 7f 00 00 01 00 00 00 26 a8 00 00 ff 7f 00 00 |........&.......|
4833f00540 01 00 00 00 27 a8 00 00 00 00 00 00 00 00 00 08 |....'...........|
4833f00550 00 00 00 00 00 00 00 00 00 00 00 00 1c 00 1c 00 |................|
4833f00560 01 00 00 00 e5 7f 00 00 00 00 00 00 00 00 00 00 |................|
4833f00570 00 00 00 00 04 00 00 00 a6 80 02 02 00 00 00 00 |................|
4833f00580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
4833f01000
第三个EBR/第三个逻辑分区sda7
其所在的EBR:
sudo hexdump -C -s 0x5dd1416a00 -n 4096 /dev/sda
内容:
446未用字节
5dd1416a00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
5dd1416bb0 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第一个partition entry,对应/dev/sda7
00 fe |................|
0x00: 非启动分区
5dd1416bc0 ff ff 83 fe ff ff 4b 07 00 00 00 b0 4f 0b
0x0000074b: 相对于当前EBR的偏移量,为/dev/sda7的起始LBA
786997429 + 0x074b = 786999296
0x0b4fb000 = 189771776 /dev/sda7的扇区数
第二个partition entry为全0,没有其他的逻辑分区了。
00 00 |......K.....O...|
5dd1416bd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
5dd1416bf0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
5dd1416c00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
5dd1417a00