- 论坛徽章:
- 2
|
接上
第二部分:FreeBSD分区
我们继续前面的安装过程,进行到下步图10:
图10: BSD分区
这里我们同样看到了/dev/ad0s1和/dev/ad0s2的区分信息。我们在FreeBSD中分三个分区,第一个128M作为swap,接着是1G的/根,最后剩下的都分给/usr。默认剩下的操作步骤,就可以将FreeBSD系统安装到bochs虚拟机中,下面的实验操作(以及上面提及的相关操作都可以在完整系统中实验了)。
那么BSD分区结构又是什么样的呢,它在磁盘上的布局又是怎样?
首先源代码src/sys/sys/disklabel.h中的struct disklabel结构告诉了我们关于BSD分区结构的答案(分区类型号也记录在这个文件里)。
简单起见,我们只引用本文关心的结构域和分区类型:
- #define MAXPARTITIONS 8
- struct disklabel {
- u_int32_t d_magic; /* the magic number */
- char d_typename[16]; /* type name, e.g. "eagle" */
- struct partition { /* the partition table */
- u_int32_t p_size; /* number of sectors in partition */
- u_int32_t p_offset; /* starting sector */
- u_int8_t p_fstype; /* filesystem type, see below */
- } d_partitions[MAXPARTITIONS]; /* actually may be more */
- };
- #define FS_UNUSED 0 /* unused */
- #define FS_SWAP 1 /* swap */
- #define FS_V6 2 /* Sixth Edition */
- #define FS_V7 3 /* Seventh Edition */
- #define FS_SYSV 4 /* System V */
- #define FS_V71K 5 /* V7 with 1K blocks (4.1, 2.9) */
- #define FS_V8 6 /* Eighth Edition, 4K blocks */
- #define FS_BSDFFS 7 /* 4.2BSD fast filesystem */
- #define FS_MSDOS 8 /* MSDOS filesystem */
- #define FS_BSDLFS 9 /* 4.4BSD log-structured filesystem */
- #define FS_OTHER 10 /* in use, but unknown/unsupported */
- #define FS_HPFS 11 /* OS/2 high-performance filesystem */
- #define FS_ISO9660 12 /* ISO 9660, normally CD-ROM */
- #define FS_BOOT 13 /* partition contains bootstrap */
- #define FS_VINUM 14 /* Vinum drive */
- #define FS_RAID 15 /* RAIDFrame drive */
- #define FS_JFS2 21 /* IBM JFS2 */
复制代码
d_magic表示分区的幻数,BSD的分区幻数表示为:0x82564557。d_packname是分区所在的磁盘标识符,也就是引用它的设备名。d_partitions中的p_size代表分区长度,p_offset代表起始扇区号,p_fstype表示分区类型。
FreeBSD系统正常安装之后,通过bsdlabel命令我们看到下面的BSD分区结构图11:
图11: BSD分区结构
图11: BSD分区结构
那么BSD分区是如何在磁盘上分布的呢?图12显示出一个最一般的FreeBSD分区的磁盘分布。
图12: BSD分区磁盘分布
图12: BSD分区磁盘分布
注意,这里的扇区号是相对/dev/ad0s2的扇区号。因此0,1,. . .,15,16等相对扇区需要在整个磁盘上引用的话,需要加上/dev/ad0s2的绝对起始扇区,也就是2096640。
简单解释一下这个图:在我们的实例系统里,FreeBSD分区的前128个扇区(64k)作为FreeBSD本身的引导区,后面接着是文件系统超级块,柱面组信息等等,这里就不详述了。其中第二个扇区开始的sizeof struct disklabel = 276个字节存放的是BSD分区表信息,这是我们这里的重点。围绕第二个扇区的其余十五个扇区,是FreeBSD的引导代码。。。(可恶,怎么又出来一个引导说-_-;),在图12中的boot1和boot2都是FreeBSD的引导代码,至于它们怎么一起工作,这里也不再关注(以后专文呈诉)。
为什么强调“我们的实例系统里”?因为FreeBSD的引导扇区并不固定为64K,还有其他尺寸可以选择,而我使用的刚好是最通常的情况:64K。
前面我们成功的从mbr里面找到了FreeBSD分区的起始扇区号:2096640。/boot/mbr读取2096640扇区的内容,正式进入FreeBSD系统的引导三部曲(man 8 boot)。
那么2096640扇区存放的是什么让我们感兴趣的东西呢?很容易从man 8 boot中找到信息:FreeBSD分区的第一个扇区存放的是boot1,图12中的第一部分。可以通过命令
dd if=/dev/ad0s2 of=boot1.bin bs=512 count=1 得到这个引导块。
紧接着的磁盘块是我们的目标,呃,很简单,用命令dd if=/dev/ad0s2 of=bsdlabel.bin bs=512 count=1 skip=1 就取得了。用十六进制编辑器查看bsdlabel.bin这个文件的前276 个字节:
00000000 57 45 56 82 05 00 00 00 61 64 30 73 32 00 00 00 |WEV.....ad0s2...|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 02 00 00 3f 00 00 00 |............?...|
00000030 10 00 00 00 45 51 00 00 f0 03 00 00 b0 ff 3f 01 |....EQ........?.|
00000040 00 00 00 00 00 00 00 00 10 0e 01 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 57 45 56 82 f3 96 08 00 00 20 00 00 |....WEV...... ..|
00000090 00 00 00 00 00 00 20 00 00 fe 23 00 00 08 00 00 |...... ...#.....|
000000a0 07 08 88 6f 00 00 04 00 00 fe 1f 00 00 00 00 00 |...o............|
000000b0 01 00 00 00 b0 01 20 01 00 fe 1f 00 00 00 00 00 |...... .........|
000000c0 00 00 00 00 b0 01 fc 00 00 fe 43 00 00 08 00 00 |..........C.....|
000000d0 07 08 88 6f 00 00 00 00 00 00 00 00 00 00 00 00 |...o............|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 |
结合struct disklabel的结构域,我们清楚的看到:d_magic = 0x82564557,d_typename = da0s2,第一个BSD分区的分区信息从0x94字节偏移开始共16字节。前面8个字节是p_size = 0x200000 = 2097152个扇区,p_offset = 0x23fe00 = 2358784号扇区,p_fstype = 0x07。
咦,怎么回事,offset居然跑那么远?嗯,不要忘记了还要算上/dev/ad0s2的绝对偏移:2096640 + 262144 = 2358784。这样就对了,我们在图11中看到这个分区就是分区'a',在FreeBSD里面表示“/” 根分区,表示为/dev/ad0s2a,由于这个条目在bsdlabel中是第一个条目,所以就是'a'咯。类型号0x07经过查表,知道这个分区表示FS_BSDFFS。
然后下面的第二个条目,类推当然就是'b':/dev/ad0s2b,大小为0x40000 = 262144 个扇区,绝对偏移为0x1ffe00 = 2096640号扇区。相对于/dev/ad0s2的启示扇区,这个相对偏移当然就是0(图11中的offset域)。类型号0x01,表示FS_SWAP。
下面的第三个和第四个条目,可以用相同的方法推知。需要特别说明的是,'c' 在BSD分区里面表示整个Slice。
bingo!通过我们的分析,得到了和图11完全一致的结果
最后,说了这么多,终于可以总结DOS分区和BSD分区的关系:
图13: 磁盘上的分区总览
图13: 磁盘上的分区总览
[ 本帖最后由 gvim 于 2008-7-1 09:50 编辑 ] |
评分
-
查看全部评分
|