EBR:扩展分区和逻辑分区
扩展分区和逻辑分区之关系
由于MBR里磁盘分区结构只有64字节的空间可用,而每个分区项需要16个字节,因此,MBR里最多只能存储4个分区。这就是为什么会有扩展分区和逻辑分区的原因:在一块磁盘上不受限于只能有4个分区,可以按需制作多个分区。那么,扩展分区是怎么实现的呢?
扩展分区和逻辑分区的关系,可以用下图表示,其中绿色块代表的是2048块扇区。很明显,每个逻辑分区前面都有2048块没有使用的扇区

逻辑分区的分区数据,就存储在这些没有使用的扇区里,准确的说,是储存在其中的第一个扇区里(这个扇区叫做扩展引导扇区,简称EBR)。虽然EBR使用和MBR一样的分区表结构。但是,不同于MBR分区表,每个EBR分区表都只是使用前两项记录。一项记录当前的逻辑分区,一项记录下一个逻辑分区。这样,EBR数据之间就构成了一个树结构,可以任意扩展

当然,这也意味着每个逻辑分区,除了第一个逻辑分区外,都是有两条分区数据的。有趣的是,这两条记录并不完全一样。
让我们综合一下。从MBR分区数据我们能够确定扩展分区,然后根据扩展分区,我们可以确定逻辑分区

验证
我们使用如下的数据来验证扩展分区和逻辑分区以及其间之关系

我们首先验证每个逻辑分区前都有2048块空闲扇区

接下来我们验证这些空闲的2048块扇区的第一块扇区里都有两个分区数据。当然,最后一块逻辑分区例外

一个逻辑分区的两条记录并不一致

我们验证一下fdisk的输出和磁盘MBR和EBR记录之间的关系

用到的命令
ddif=/dev/sdbbs=1count=64skip=4462/dev/null|od-v-tx1fornin88407040;do\fisrt_sector_number=$(expr$n-2048);\ddif=/dev/sdbbs=1count=64skip=$(expr${fisrt_sector_number}\*512+446)2/dev/null|\od-v-tx1;\done{ddif=/dev/sdbbs=1count=64skip=4462/dev/null|od-v-tx1;\fornin88407040;do\fisrt_sector_number=$(expr$n-2048);\ddif=/dev/sdbbs=1count=64skip=$(expr${fisrt_sector_number}\*512+446)2/dev/null|\od-v-tx1;\done}|\perl-nE'chomp;printqq[$_];if(/\s[0-9a-f]+\s*/){@fields=split;printhex(qq{$fields[11]$fields[10]$fields[9]$fileds[8]});}printqq[\n];'LVM:又一层包装
我们直接给出LVM的实际例子,供大家自行分析如下信息
物理卷
卷组
逻辑卷
很明显,LVM有关的数据结构和关系都是记录在磁盘上的。
LVM分区信息
[root@localhost~]o-currentlysetto256Blockdevice251:0---Logicalvolume---LVName/dev/ubuntu/swap_1VGNameubuntuLVUUIDHiLDjt-0TVl-zNj2-QxIM-Vl7m-Upsd-NyfcjwLVWriteAccessread/writeLVStatusavailable
二进制编辑器里的LVM信息
00000000:4c4142454c4f4e450100000000000000LABELONE..00000010:9ebe7a39200000004c564d3220303031..z9LVM200100000020:47064545330395a616341AIie9rpdTS09ZacA00000030:54575543366a6e336c4f347272614763TWUC6jn3lO4rraGc00000040:0000a070020000000000030000000000p00000e00:1[5A%r00000e10:304e2a3e0100000000100000000000000N*00000e20:00:8:00000000000000000000000000000000.00000e50:00000000000000000000000000000000.00000e60:00000000000000000000000000000000.00000e70:00000000000000000000000000000000.00000e80:00000000000000000000000000000000.00000e90:00000000000000000000000000000000.00000ea0:00000000000000000000000000000000.00000eb0:00000000000000000000000000000000.00000ec0:00000000000000000000000000000000.00000ed0:00000000000000000000000000000000.00000ee0:00000000000000000000000000000000.00000ef0:00000000000000000000000000000000.00000f00:00000000000000000000000000000000.00000f10:00000000000000000000000000000000.00000f20:00000000000000000000000000000000.00000f30:00000000000000000000000000000000.00000f40:00000000000000000000000000000000.00000f50:00000000000000000000000000000000.00000f60:00000000000000000000000000000000.00000f70:00000000000000000000000000000000.00000f80:00000000000000000000000000000000.00000f90:00000000000000000000000000000000.00000fa0:00000000000000000000000000000000.00000fb0:00000000000000000000000000000000.00000fc0:00000000000000000000000000000000.00000fd0:00000000000000000000000000000000.00000fe0:00000000000000000000000000000000.00000ff0:00000000000000000000000000000000.00001000:7562756e7475207b0a6964203d202270ubuntu{.id="p00001010:61644f6c312d4550574e2d4174314d2dadOl1-EPWN-At1M-00001020:33474a6b2d4d6746522d6d5069632d473GJk-MgFR-mPic-G00001030:40a7365716e6f203d2031ATrFp".seqno=100001040:0=["RESI00001050:5a4541424c45222c202252454144222cZEABLE","READ",00001060:20225752495445225d0a666c61677320"WRITE"].flags00001070:3d205b5d0a657874656e745f73697a65=[].extent_size00001080:203d20383139320a6d61785f6c76203d=8192.max_lv=00001090:20300_pv=0..p000010a0:6879736963616c5f766f6c756d657320hysical_volumes000010b0:7b0a0a707630207b0a6964203d202241{..pv0{.id="A000010c0:49696539722d706454532d30395a612dIie9r-pdTS-09Za-000010d0:634154572d5543366a2d6e336c4f2d34cATW-UC6j-n3lO-4000010e0:7272614763220a646576696365203d20rraGc".device=000010f0:222f6465762f73646135220a0a737461"/dev/sda5"..sta00001100:747573203d205b22414c4c4f43415441tus=["ALLOCATA00001110:424c45225d0a666c616773203d205b5dBLE"].flags=[]00001120:0_size=204600001130:373731320_start=00001140:3338340_count=200001150:3439380a7d0a7d0a0a7d0a232047656e498.}.}..}.Linux00001210:7562756:2d67656e65726963202333322d556275-genericMonApr200001280:342030383a35343a3370a408:54:192017.00001290:0:7562756e7475207b0a6964203d202270ubuntu{.id="p00001410:61644f6c312d4550574e2d4174314d2dadOl1-EPWN-At1M-00001420:33474a6b2d4d6746522d6d5069632d473GJk-MgFR-mPic-G00001430:40a7365716e6f203d2032ATrFp".seqno=200001440:0=["RESI00001450:5a4541424c45222c202252454144222cZEABLE","READ",00001460:20225752495445225d0a666c61677320"WRITE"].flags00001470:3d205b5d0a657874656e745f73697a65=[].extent_size00001480:203d20383139320a6d61785f6c76203d=8192.max_lv=00001490:20300_pv=0..p000014a0:6879736963616c5f766f6c756d657320hysical_volumes000014b0:7b0a0a707630207b0a6964203d202241{..pv0{.id="A000014c0:49696539722d706454532d30395a612dIie9r-pdTS-09Za-000014d0:634154572d5543366a2d6e336c4f2d34cATW-UC6j-n3lO-4000014e0:7272614763220a646576696365203d20rraGc".device=000014f0:222f6465762f73646135220a0a737461"/dev/sda5"..sta00001500:747573203d205b22414c4c4f43415441tus=["ALLOCATA00001510:424c45225d0a666c616773203d205b5dBLE"].flags=[]00001520:0_size=204600001530:373731320_start=00001540:3338340_count=200001550:3439380a7d0a7d0a0a6c6f676963616c498.}.}..logical00001560:5f766f6c756d6573207b0a0a726f6f74_volumes{..root00001570:207b0a6964203d2022716a6f6e7a642d{.id="qjonzd-00001580:79714a682d634c69312d4b5a76682d30yqJh-cLi1-KZvh-000001590:7836482d57397a422d46793236496322x6H-W9zB-Fy26Ic"000015a0:0=["READ000015b0:222c20225752495445222c2022564953","WRITE","VIS000015c0:49424c45225d0a666c616773203d205bIBLE"].flags=[000015d0:5d0a7365676d656e745f636f756e7420].segment_count000015e0:3d20310a0a7365676d656e7431207b0a=1..segment1{.000015f0:73746172745f657874656e74203d2030start_extent=000001600:0_count=00001610:323337390a0a74797065203d202273742379..type="st00001620:7269706564220a7374726970655f636friped".stripe_co00001630:756e74203d20310923206c696e656172unt=1.Generatedby00001670:4:322(1)(2:2d3236293a204d6f6e204-26):MonApr24000016a0:2030383a35343a323120323031370a0a08:54:212017..000016b0:636f6e74656e7473203d202254657874contents="Text000016c0:20466f726d617420566f6c756d652047FormatVolumeG000016d0:726f7570220a76657273696f6e203d20roup".version=000016e0:310a0a6465736372697074696f6e203d1..description=000016f0:2022220a0a6372656174696f6e5f686f""..creation_ho00001700:7374203d20227562756e747522092320st="ubuntu".00001730:33322d5562756e747520534d5020467232-UbuntuSMPFr00001740:692042030383a31303a30iApr1608:10:000001750:32205554432032303360:6372656174696f6e5f74696d65203d20creation_time=00001770:3343036310923204:0a0a73747269706573203d205b0a2270..stripes=[."p00001a50:7630222c20300a5d0a7d0a7d0a0a7377v0",0.].}.}..sw00001a60:61705f31207b0a6964203d202248694cap_1{.id="HiL00001a70:446a742d3054566c2d7a4e6a322d5178Djt-0TVl-zNj2-Qx00001a80:494d2d566c376d2d557073642d4e7966IM-Vl7m-Upsd-Nyf00001a90:636a77220a737461747573203d205b22cjw".status=["00001aa0:52454144222c20225752495445222c20READ","WRITE",00001ab0:2256495349424c45225d0a666c616773"VISIBLE"].flags00001ac0:203d205b5d0a7365676d656e745f636f=[].segment_co00001ad0:756e74203d20310a0a7365676d656e74unt=1..segment00001ae0:31207b0a73746172745f657874656e741{.start_extent00001af0:203d20300a657874656e745f636f756e=0.extent_coun00001b00:74203d203131390a0a74797065203d20t=119..type=00001b10:2273747269706564220a737472697065"striped".stripe00001b20:5f636f756e74203d20310923206c696e_count=1.Generat00001b60:6564206279204c564d32207665727369edbyLVM2versi00001b70:6(1)(200001b80:3030392d31302d3236293a204d6f6e20009-10-26):Mon00001b90:42030383a35343a323220Apr2408:54:2200001ba0:323031370a0a636f6e74656e7473203d2017..contents=00001bb0:20225465787420466f726d617420566f"TextFormatVo00001bc0:6c756d652047726f7570220a76657273lumeGroup".vers00001bd0:696f6e203d20310a0a64657363726970ion=1..descrip00001be0:74696f6e203d2022220a0a6372656174tion=""..creat00001bf0:696f6e5f686f7374203d20227562756eion_host="ubun00001c00:7475220923204c696e7578207562756etu".32-Ubuntu00001c30:534d50204672692042030SMPFriApr16000001c40:383a31303a30322055544320323031308:10:02UTC201000001c50:20693638360_t00001c60:696d65203d20334303632ime=0001c70:0923204,data16,intel--adjust-vma=0x7c00path_to_mbr_看看效果

一睹真实引导代码风采
现在的引导代码并非只是简单的一段实模式下的二进制程序,因此反编译的结果就差强人意了。如果你想一睹真实代码风貌,请看grub-core/boot/i386/pc/文件内容
/*-*-Asm-*-*//**GRUB--GRandUnifiedBootloader*Copyright(C)1999,2000,2001,2002,2005,2006,2007,2008,2009FreeSoftwareFoundation,Inc.**GRUBisfreesoftware:youcanredistributeitand/ormodify*itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby*theFreeSoftwareFoundation,eitherversion3oftheLicense,or*(atyouroption)anylaterversion.**GRUBisdistributedinthehopethatitwillbeuseful,*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof**GNUGeneralPublicLicenseformoredetails.**YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense*,see;.*/includegrub/machine//**definesforthecodegohere*//*Printmessagestring*/defineERR(x)movw$x,%si;jmpLOCAL(error_message).macrofloppypart_start:LOCAL(probe_values):.byte36,18,15,9,0LOCAL(floppy_probe):pushw%dx/**Performfloppyprobe.*/elsemovwMACRO_DOLLAR(LOCAL(probe_values))-1,%siifdefHYBRID_BOOTnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopnopjmpLOCAL(after_BPB)ifelsescratchifndefHYBRID__BOOT_MACHINE_KERNEL_SECTORLOCAL(kernel_sector):.long1LOCAL(kernel_sector_high):.long0ifdefHYBRID_(kernel_sector):.long1LOCAL(kernel_sector_high):.long0ifndefHYBRID__BOOT_MACHINE_PART_END/*thelast2bytesinthesector0containthesignature*/.wordGRUB_BOOT_MACHINE_SIGNATURE