分享

Grub命令以及启动详解

 冰火S 2011-02-17
[编辑]clozxy的公告
欢迎光临我的博客 ^,^
[编辑]文章分类
ACE
C++ 程序开发
FAQ 集合
Grub
LFS
Linux 常用命令
Linux 管理
Linux 内核
Linux 启动
Linux 系统编程
Linux 系统配置
硬件配置
杂七杂八
[编辑]技术资料
How to make bootable usb disk.
Linux From Scratch
Linux 引导过程内幕
Linux 文件系统剖析
Linux内核配置系统浅析
Linux启动过程综述
使用 /proc 文件系统来访问 Linux 内核的内容
手把手教你如何建立自己的Linux系统 第二版
理解vmlinuz,initrd,system.map文件
存档
2010年09月(7)
2010年08月(35)
2010年07月(24)
2010年06月(29)
2010年05月(23)
2010年04月(20)
2010年03月(18)
2010年02月(17)
2010年01月(7)
公告:
CSDN 产品事业部开设官方博客了!来关注我们的一举一动吧![意见反馈][官方博客]   Grub 命令以及启动详解 收藏
Grub详解
rhgb表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到
quiet表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示
应樱家冢、Bluedata以及其他兄弟的要求,这里谈一谈自己在配置Grub当中积累的点滴,不存在什么高深的使用技巧——^_^,我自己也没有掌握, 实际上就是我们常用的功能整理了一下。如有错误和疑问,请大家指教!因为时间不够用,所以才这么迟的出来,希望两位兄弟谅解,同时感谢网络上曾经为了 linux的事业不停奋斗而无私贡献的人们——因为本文参考了他们的经验!
  1、一个GRUB配置文件
  2、解读grub.conf文件
  3、配置grub
  4、GRUB的交互性
  5、常见grub除错方法的思路
  1 一个GRUB配置文件
  基于本例的分区如下:
  hda 15G
  hda1 8G / RED HAT LINUX8.0
  hda5 7G /home
  hdc 20G
  hdc1 6.4G WinXP
  hdc5 6.4G
  hdc6 6.4G
  hdc7 6.4G
  #fdisk -l
  # Disk /dev/hdc: 255 heads, 63 sectors, 2434 cylinders
  Units = cylinders of 16065 * 512 bytes
  Device Boot Start End Blocks Id System
  /dev/hdc1 * 1 894 7181023+ b Win95 FAT32
  /dev/hdc2 895 2434 12370050 f Win95 Ext'd (LBA)
  /dev/hdc5 895 1787 7172991 b Win95 FAT32
  /dev/hdc6 1788 2434 5196996 b Win95 FAT32
  Disk /dev/hda: 255 heads, 63 sectors, 1867 cylinders
  Units = cylinders of 16065 * 512 bytes
  Device Boot Start End Blocks Id System
  /dev/hda1 * 1 1020 8193118+ 83 Linux
  /dev/hda2 1021 1802 6281415 83 Linux
  /dev/hda3 1803 1867 522112+ 82 Linux swap
  grub.conf,这个文件位于;/boot/grub/grub.conf
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE: You do not have a /boot partition. This means that
  # all kernel and initrd paths are relative to /, eg.
  # root (hd0,0)
  # kernel /boot/vmlinuz-version ro root=/dev/hda1
  # initrd /boot/initrd-version.img
  #boot=/dev/hda
  default=0
  timeout=3
  splashimage=(hd0,0)/boot/grub/splash.xpm.gz
  title Red Hat Linux (2.4.18-14)
  root (hd0,0)
  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/
  initrd /boot/initrd-2.4.18-14.img
  title Microsoft Windows XP
  root (hd1,0)
  chainloader (hd1,0)+1
  makeactive
  map (hd0) (hd1)
  map (hd1) (hd0)
  boot
  2 解读grub.conf文件
  我们将来看看grub.conf文件内语句,(注:...)内的东西是我们的解读内容.
  # grub.conf generated by anaconda
  #
  # Note that you do not have to rerun grub after making changes to this file
  # NOTICE: You do not have a /boot partition. This means that
  # all kernel and initrd paths are relative to /, eg.
  # root (hd0,0)
  # kernel /boot/vmlinuz-version ro root=/dev/hda1
  # initrd /boot/initrd-version.img
  #boot=/dev/hda (注:以上以符号井"#"开头的行表示被注释掉,没有任何意义)
   default=0 (注:默认的操作系统就是由default控制的。default后加一个数字n,表明是第 n+1个。需要注意的是,GRUB中,计数是从0开始的,第一个硬盘是hd0,第一 个软驱是fd0,等等。所以,default 0 表示默认的操作系统在这儿是 Red Hat Linux (2.4.18-14)如果你修改成1就是WinXP了)
  timeout=3 (注:timeout表示默认等待的时间,这儿是3秒钟。超过3秒,用户还没有作出选 择的话,系统将自动选择默认的操作系统;当然你可以改成任何你乐意的时间)
  splashimage=(hd0,0)/boot/grub/splash.xpm.gz (注:指定开机画面文件splash.xpm.gz的位置,也可以splash /boot/logo/800x600x8.img)
  title Red Hat Linux (2.4.18-14) (注:表示Red Hat Linux的菜单项)
  root (hd0,0) (注:表示第一个硬盘第一个分区,这里的root和系 统内的root不是一码事!详细如下说明)
  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ (注:指定内核的位置,详细说明如下 文)
  initrd /boot/initrd-2.4.18-14.img (注:初始化)
  title Microsoft Windows XP (注:表示Microsoft Windows XP的菜单项)
  map (hd0) (hd1) (注:map是命令,详细如下)
  map (hd1) (hd0)
  root (hd1,0) (注:这是指第二个硬盘(从硬盘)上第一个分区)
  chainloader (hd1,0)+1 (注:链式装入器,装入一个扇区的数据然后把引导 权交给它。详细说明如下)
  makeactive
  boot
   (注:在 Linux 中,当谈到 "root" 文件系统时,通常是指主 Linux 分区。但是,GRUB 有它自己的 root 分区定义。GRUB 的 root 分区是保存 Linux 内核的分区。这可能是您的正式 root 文件系统,也可能不是。我们讨论的是 GRUB,需要指定 GRUB 的 root 分区。进入 root 分区时,GRUB 将把这个分区安装成只读型,这样就可以从该分区中装入 Linux 内核。GRUB 的一个很“酷”的功能是它可以读取本机的 FAT、FFS、minix、ext2 和 ReiserFS 分区.到目前为止,您可能会感到一点疑惑,因为 GRUB 所使用的硬盘/分区命名约定与 Linux 使用的命名约定不同。在Linux 中,第一个硬盘的第五个分区称作 "hda5"。而 GRUB 把这个分区称作 "(hd0,4)"。GRUB 对硬盘和分区的编号都是从 0 开始计算。另外,硬盘和分区都用逗号分隔,整个表达式用括号括起。现在,可以发现如果要引导 Linux 硬盘 hda5,应输入 "root (hd0,4)"。
  知道了内核在哪儿,还要具体指出哪个文件是内核文件,这就是kernel的工作。
  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/说明/boot/vmlinuz-2.4.18-14就是要载入的内核。后面的都是传递给内核的参数。root=LABEL=/ 就是linux的硬盘分区表示法,ro是readonly的意思。initrd用来初始的linux image,并设置相应的参数。
  命令map:当你有两块硬盘,一个无法从第二块硬盘启动的操作系统,例如Windowsxp,就可以使用map命令.你能够将hd0映射为hd1,将hd1映射为hd0。换句话说,你可以虚拟的交换两个硬盘而启动所需要的操作系统 。命令形式如下:
  grub> map (hd0) (hd1)
  grub> map (hd1) (hd0)
  GRUB 使用了“链式装入器”(chainloader)。链式装入器从分区 (hd1,0) 的引导记录中装入winxp自己的引导装入器,然后引导它。这就是这种技术叫做链式装入的原因 -- 它创建了一个从引导装入器到另一个的链。这种链式装入技术可以用于引导任何版本的 DOS 或 Windows。
  GRUB的配置文件要简单就这么简单,如果你要更个性化一点,试一试把“color light-gray/blue ”加在default语句的下面
  3 配置grub
  grub启动时会在/boot/grub/中寻找一个名字为menu.lst的配置文件,如果找不到此文件则不进入菜单模式而直接进入命令行模式。
  现在,我们来看一下如何在启动后进入各种操作系统,如何建立menu.conf文件。我们就从GRUB支持的启动过程开始。可以有两种方法来完成启动过程:
  ?A.通过调用内核本地启动
  ?B.连续启动或者将控制转给另一个引导器
  A模式启动过程
  1.配置跟设备或者告诉GRUB你的根文件系统。
  2.告诉GRUB你的内核影像的位置,然后将参数传送给内核。
  3.重新启动,试一下。
  为了启动Linux,将内核以bzImage的文件名放在/boot/目录中,跟文件系统是
  /dev/hda1,或者GRUB中的(hd0,0)。启动过程如下:
  1.root (hd0,0) [This sets the root partition]
  2.kernel /boot/bzImage root=/dev/hda1 [This sets the kernel]
  B模式启动过程(这种模式假设当前的分区中安装了另一个启动管理器,例如LILO
  或者NTLDR):
  1.设置根分区但不要安装它
  2.激活这个分区
  3.配置需要启动的分区的第一个扇区
  4.重新启动,看一下效果。
  我们在试试启动安装在/dev/hdc1或者(hd1,0)的windows。启动windows的过程如下:
  1.rootnoverify (hd1,0)
  2.makeactive
  3.chainloader +1 [+1 sets the first sector of the current root
  partition]
  4.boot [transfers the control and quits GRUB]
  menu.conf文件:它用于建立启动多操作系统时的菜单。建立menu.conf并不难。它使用简单的英语,就象你在这一节看到的那样。
  所有的菜单项目都以没有逗号分隔的“title TITLENAME”开头。你可以随意设置
  TITLENAME。
  设置Linux启动菜单步骤如下:
  1.设置标题
  2.设置根分区
  3.设置内核的相应参数
  4.启动
  一个菜单例子:
  title Red Hat Linux (2.4.18-14)
  root (hd0,0)
  kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/
  initrd /boot/initrd-2.4.18-14.img
  前面有#的行是一个注释。
  建立启动Windows 或者 DOS的菜单:
  title Windoze
  rootnoverify (hd0,0)
  makeactive
  chainloader +1
  boot
  #----
  又或者:
  title Microsoft Windows XP
  map (hd0) (hd1)
  map (hd1) (hd0)
  root (hd1,0)
  chainloader (hd1,0)+1
  makeactive
  boot
  ----
   注意:root和rootnoverify都是一样的,把rootnoverify改成root也行。不过经过实践来看。有时引导win时,系统安装好 后,是rootnoverify (hdX.Y)这样形式的,这样会出现windows起不来,出现什么windows什么文件损坏的情况。这时,我们就要把在grub中,引导 windows的那段中的rootnoverify改为root
  root英文的意思就是根的意思,在这里是让linux知道自己所处的位置,也就是我们所安装linux的/根分区所在的位置 。
  4 GRUB的交互性
  GRUB 最好的优点之一就是其强健的设计 -- 在不断使用它时请别忘了这点。如果更新内核或更改它在磁盘上的位置,不必重新安装 GRUB。事实上,如有必要,只要更新 menu.lst 文件即可,一切将保持正常。
   只有少数情况下,才需要将 GRUB 引导装入器重新安装到引导记录。首先,如果更改 GRUB root 分区的分区类型(例如,从 ext2 改成 ReiserFS),则需要重新安装。或者,如果更新 /boot/grub 中的 stage1 和 stage2 文件,由于它们来自更新版本的 GRUB,很有可能要重新安装引导装入器。其它情况下,可以不必理睬!
  GRUB的最大的特点就是交互性特别强。在开机时,按一下“c”,将进入GRUB 控制台。显示如下:
  GRUB version 0.5.96.1 (640K lower / 3072K upper memory)
  [ Minimal BASH-like line editing is supported. For the first word, TAB
  lists possible command completions. Anywhere else TAB lists the possible
  completions of a device/filename. ]
  grub>
  欢迎使用 GRUB 控制台。现在,再研究命令:
  将通过GRUB 控制台绕过lilo来启动RedHat linux,
  grub> root (h
   现在,按一次 Tab 键。如果系统中有多个硬盘,GRUB 将显示可能完成的列表,从 "hd0" 开始。如果只有一个硬盘,GRUB 将插入 "hd0,"。如果有多个硬盘,继续进行,在 ("hd2") 中输入名称并在名称后紧跟着输入逗号,但不要按 Enter 键。部分完成的 root 命令看起来如下:
  grub> root (hd0,
  现在,继续操作,再按一次 Tab 键。GRUB 将显示特定硬盘上所有分区的列表,以及它们的文件系统类型。在我的系统中,按 Tab 键时得到以下列表:
  grub> root (hd0, (tab,按tab一下键)
  Possible partitions are:
  Partition num: 0, Filesystem type is fat, partition type 0x6
  Partition num: 2, Filesystem type is ext2fs, partition type 0x83
  Partition num: 4, Filesystem type unknown, partition type 0x7
  Partition num: 5, Filesystem type is ext2fs, partition type 0x83
  Partition num: 6, Filesystem type is fat, partition type 0xb
  Partition num: 7, Filesystem type is fat, partition type 0xb
  Partition num: 8, Filesystem type is ext2fs, partition type 0x83
  Partition num: 9, Filesystem type unknown, partition type 0x82
  如您所见,GRUB 的交互式硬盘和分区名称实现功能非常有条理。这些,只需要好好理解 GRUB 新奇的硬盘和分区命名语法,然后就可以继续操作了
  代码:
  grub> root (hd0, 8)
  现在已安装了 root 文件系统,到装入内核的时候了
  grub> kernel /boot/vmlinuz-2.4.2 root=/dev/hda5 ro
  [Linux-bzImage, setup=0x1200, size=0xe1a30]
  您已经安装了 root 文件系统并装入了内核。现在,可以引导了。只要输入 "boot",Linux 引导过程就将开始。是不是很cool啊,GRUB的menu.lst更像一个linux下的脚本程序。
  5 常见grub除错方法的思路
  首先进去Linux的rescue模式!
  用软盘或光盘启动,然后在启动的提示符输入:linux rescue
  按照提示进入一个Shell状态,你可以到/mnt/下面看到一个sysimage这么目录,进去以后,就是你安装linux的/分区.
  使用命令将根分区变为当前目录的根分区:chroot /mnt/sysimage
  然后转到/sbin/这个目录中.
  使用fdisk -l 显示当前分区情况,然后使用#grub-install /dev/hdx(x为你使用的是那块硬盘安装的,一般情况下是hda)
  使用exit推出chroot,再使用exit退出linux rescue模式,系统将重新启动!取出光盘,应该可以看到grub安装好了.
  在具体的环境中,编辑/boot/grub/grub.conf文件和menu.lst文件
  简化:
  1.安装盘启动
  2.进入linux rescue模式
  3.一系列键盘以及几项简单的配制,过后就[继续]了。。。这个过程,我不说了,比较简单。
  4.然后会出现这样的字符
  sh#
  5. sh#grub
  会出现这样的字符:grub>我们就可以在这样的字符后面,输入:grub>root (hdX,Y)
  grub>setup (hd0)
  如果成功会有一个successful......
  这里的X,如果是一个盘,就是0,如果你所安装的linux的根分区在第二个硬盘上,那X就是1了;Y,就是装有linux系统所在的根分区。 setup (hd0)就是把GRUB写到硬盘的MBR上。
  其他:
  grub菜单项丢失,只有字符grub>时的处理方法:
  grub>cat (hd0,0) /root/grub/grub.conf(为了看参数。)
  grub>root (hd0,1)
  grub>kernel (hd0,0) /boot/vmlinuz-2.4.18-11 ro root=/dev/hda2
  grub>initrd (hd0,0) /boot/initrd-2.4.18-11.img
  grub>boot
  如果看不明白,可以参考后面的命令慢慢看,这里不做注释,促使大家学习,哈哈
  98先装,用的是单独的硬盘,4.3G,那时候,LINUX8还没有到我手中
  后来到了,在家中安装好了,选择GRUB,就会有DOS的一个菜单,我的是在主分区
  到了公司,把LINUX挂在第一个盘的位置,那个盘挂在第四个盘的位置(这个无所谓)
  然后GRUB配置如下
  default=0
  timeout=10
  splashimage=(hd0,0)/grub/splash.xpm.gz
  title Red Hat Linux (2.4.18-14)
  root (hd0,0)
  kernel /vmlinuz-2.4.18-14 ro root=LABEL=/
  initrd /initrd-2.4.18-14.img
  title DOS
  rootnoverify (hd1,0)
  makeactive
  chainloader (hd1,0)+1
  map (hd0) (hd1)
  map (hd1) (hd0)
  boot
  下面是GRUB的可用命令列表:
  #大部分命令我们不常用,而且我也没有每个都试验!
  关于下面将要用到的三种模式的解释:
  GRUB的用户界面有三种:命令行模式,菜单模式和菜单编辑模式
  (a) 命令行模式:
  进入命令行模式后GRUB会给出一个命令提示符`grub>`,此时就可以键入命令,按回车执行。此模式下可执行的命令是在menu.lst中可执行的命令的一个子集。此模式下允许类似于Bash shell的命令行编辑功能:
  <C-f>或<右箭头键> 光标右移一个字符
  <C-b>或<左箭头键> 光标左移一个字符
  <C-a><HOME> 到这一行的开头
  <C-e>或<END> 到行尾
  <C-d>或<DEL> 删除光标处的字符
  <C-h>或<BackSpace> 删除光标左边的字符
  <C-k> 删除光标右边的所有字符(包括光标处的字符)
  <C-u> 删除光标左边的所有字符(包括光标处的字符)
  <C-y> 恢复上次删除的字符串到光标位置
  <C-p>或<向上键> 历史记录中的上一条命令
  <C-n>或<向下键> 历史记录中的下一条命令
   在命令行模式下<tab>键有补全命令的功能,如果你敲入了命令的前一部分,键入<tab>系统将列出所有可能以你给出的字符 串开头的命令。如果你给出了命令,在命令参数的位置按下<tab>键,系统将给出这条命令的可能的参数列表,具体的可用命令集将在后面给出。
  (b) 菜单模式
   当存在文件/boot/grub/menu.lst文件时系统启动自动进入此模式。菜单模式下用户只需要用上下箭头来选择他所想启动的系统或者执行某个 命令块,菜单的定义在menu.lst文件中,你也可以从菜单模式按<c>键进入命令行模式,并且可以按<ESC>键从命令行模 式返回菜单模式。菜单模式下按<e>键将进入菜单编辑模式。
  (c) 菜单编辑模式
  菜单编辑模式用来对菜单项进行编辑 改变,其界面和菜单模式的界面十分类似,不同的是菜单中显示的是对应某个菜单项的命令列表。如果在编辑模式下按下 <ESC>,则取消所有当前对菜单的编辑并回到菜单模式下。在编辑模式下选中一个命令行,就可以对这条指令进行修改,修改完毕后按下< RET>,GRUB将提示你确认并完成修改。如果你想在当前命令列表中增加一条命令,按<o>在当前命令的下面增加一条指令,按 <O>在当前命令前处增加一条指令。按<d>删除一条指令。
  仅用于菜单的命令(不包括菜单项内部的启动命令)
  default num
  设置菜单中的默认选项为num(默认为0,即第一个选项),超时将启动这个选项
  fallback num
  如果默认菜单项启动失败,将启动这个num后援选项。
  password passwd new-config-file
  关闭命令行模式和菜单编辑模式,要求输入口令,如果口令输入正确,将使用new-config-file
  作为新的配置文件代替menu.lst,并继续引导。
  timeout sec
  设置超时,将在sec秒后自动启动默认选项。
  title name ...
  开始一个新的菜单项,并以title后的字串作为显示的菜单名。
  在菜单(不包括菜单项内部的命令)和命令行方式下都可用的命令
  bootp
  以BOOTP协议初始化网络设备
  color normal [highlight]
  改变菜单的颜色,normal是用于指定菜单中非当前选项的行的颜色,highlight是用于指定当前菜单选项的颜色。如果不指定 highlight,GRUB将使用normal的反色来作为highlight颜色。指定颜色的格式是“前景色/背景色”,前景色和背景色的可选列表如下:
  * black
  * blue
  * green
  * cyan
  * red
  * magenta
  * brown
  * light-gray
  下面的颜色只能用于背景色
  * dark-gray
  * light-blue
  * light-green
  * light-cyan
  * light-red
  * light-magenta
  * yellow
  * white
  你可以在前景色前加上前缀"blink-",产生闪烁效果,你可以在menu.lst中加上下面这个选项来改变颜色效果:
  title OS-BS like
  color magenta/blue black/magenta
  device drive file
  在GRUB命令行中,把BIOS中的一个驱动器drive映射到一个文件file。你可以用这条命令创建一个磁盘映象或者当GRUB不能真确地判断驱动器时进行纠正。如下
  grub> device (fd0) /floppy-image
  grub> device (hd0) /dev/sd0
  这条命令只能在命令行方式下使用, 是个例外。
  dhcp
  用DHCP协议初始化网络设备。目前而言,这条指令其实就是bootp的别名,效果和bootp一样。
  hide partition
  这条指令仅仅对DOS和WINDOWS有用,当在一个硬盘上存在多个DOS/WIN的主分区时,有时需要这条指令隐藏其中的一个或几个分区,即在分区表中设置“隐藏”位。
  rarp
  用RARP协议初始化网络设备。
  setkey to_key from_key
  改变键盘的映射表,将from_key映射到to_key,注意这条指令并不是交换键映射,如果你要交换两个键的映射,需要用两次setkey指令,如下:
  grub> setkey capslock control
  grub> setkey control capslock
  其中的键必须是字母,数字或者下面的一些代表某一键的字符串:
  `escape', `exclam', `at', `numbersign', `dollar', `percent',
  `caret', `ampersand', `asterisk', `parenleft', `parenright',
  `minus', `underscore', `equal', `plus', `backspace', `tab',
  `bracketleft', `braceleft', `bracketright', `braceright', `enter',
  `control', `semicolon', `colon', `quote', `doublequote',
  `backquote', `tilde', `shift', `backslash', `bar', `comma',
  `less', `period', `greater', `slash', `question', `alt', `space',
  `capslock', `FX' (`X' is a digit), and `delete'.
  下面给出了它们和键盘上的键的对应关系:
  `exclam'=`!'
  `at'=`@'
  `numbersign'=`#'
  `dollar'=`$'
  `percent'=`%'
  `caret'=`^'
  `ampersand'=`&'
  `asterisk'=`*'
  `parenleft'=`('
  `parenright'=`)'
  `minus'=`-'
  `underscore'=`_'
  `equal'=`='
  `plus'=`+'
  `bracketleft'=`['
  `braceleft'=`{'
  `bracketright'=`]'
  `braceright'=`}'
  `semicolon'=`;'
  `colon'=`:'
  `quote'=`''
  `doublequote'=`"'
  `backquote'=``'
  `tilde'=`~'
  `backslash'=`'
  `bar'=`|'
  `comma'=`,'
  `less'=`<'
  `period'=`.'
  `greater'=`>'
  `slash'=`/'
  `question'=`?'
  `space'=` '
  unhide partition
  仅仅对DOS/WIN分区有效,清除分区表中的“隐藏”位。
  仅用于命令行方式或者菜单项内部的命令
  blocklist file
  显示文件file在所占磁盘块的列表。
  boot
  仅在命令行模式下需要,当参数都设定完成后,用这条指令启动操作系统
  cat file
  显示文件file的内容,可以用来得到某个操作系统的根文件系统所在的分区,如下:
  grub> cat /etc/fstab
  chainloader [`--force'] file
   把file装入内存进行chainload,除了能够通过文件系统得到文件外,这条指令也可以用磁盘块列表的方式读入磁盘中的数据块,如'+1`指定从 当前分区读出第一个扇区进行引导。如果指定了`--force`参数,则无论文件是否有合法的签名都强迫读入,当你在引导SCO UnixWare时需要用这个参数。
  cmp file1 file2
  比较文件的内容,如果文件大小不一致,则输出两个文件的大小,如下:
  Differ in size: 0x1234 [foo], 0x4321 [bar]
  如果两个文件的大小一致但是在某个位置上的字节不同,则打印出不同的字节和他们的位移:
  Differ at the offset 777: 0xbe [foo], 0xef [bar]
  如果两个文件完全一致,则什么都不输出。
  configfile FILE
  将FILE作为配置文件替代menu.lst。
  embed stage1_5 device
  如果device是一个磁盘设备的话,将Stage1_5装入紧靠MBR的扇区内。如果device是一个FFS文件系统分区的话,则将Stage1_5装入此分区的第一扇区。如果装入成功的话,输出写入的扇区数。
  displaymem
  显示出系统所有内存的地址空间分布图。
  find filename
  在所有的分区中寻找指定的文件filename,输出所有包含这个文件的分区名。参数filename应该给出绝对路径。
  fstest
  启动文件系统测试模式。打开这个模式后,每当有读设备请求时,输出向底层例程读请求的参数和所有读出的数据。输出格式如下:
  先是由高层程序发出的分区内的读请求,输出:<分区内的扇区偏移,偏移(字节数),长度(字节数)>之后由底层程序发出的扇区读请求,输出:[磁盘绝对扇区偏移] 可以用install或者testload命令关闭文件系统测试模式。
  geometry drive [cylinder head sector [total_sector]]
  输出驱动器drive的信息。
  help [pattern ...]
  在线命令帮助,列出符合pattern的命令列表,如果不给出参数,则将显示所有的命令列表。
  impsprobe
  检测Intel多处理器,启动并配置找到的所有CPU。
  initrd file ...
  为Linux格式的启动映象装载初始化的ramdisk,并且在内存中的Linux setup area中设置适当的参数。
  install stage1_file [`d'] dest_dev stage2_file [addr] [`p'] [config_file] [real_config_file]
  这是用来完全安装GRUB启动块的命令,一般很少用到。
  ioprobe drive
  探测驱动器drive所使用的I/O口,这条命令将会列出所有dirve使用的I/O口。
  kernel file ...
  装载内核映象文件(如符合Multiboot的a.out,ELF,Linux zImage或bzImage,FreeBSD a.out,NetBSD
  a.out等等)。文件名file后可跟内核启动时所需要的参数。如果使用了这条指令所有以前装载的模块都要重新装载。
  makeactive
  使当前的分区成为活跃分区,这条指令的对象只能是PC上的主分区,不能是扩展分区。
  map to_drive from_drive
  映射驱动器from_drive到to_drive。这条指令当你在chainload一些操作系统的时候可能是必须的,这些操作系统如果不是在第一个硬盘上可能不能正常启动,所以需要进行映射。如下:
  grub> map (hd0) (hd1)
  grub> map (hd1) (hd0)
  这个就用来对付双硬盘最过瘾!!!哈哈
  module file ...
  对于符合Multiboot规范的操作系统可以用这条指令来装载模块文件file,file后可以跟这个module所需要的参数。注意,必须先装载内核,再装载模块,否则装载的模块无效。
  modulenounzip file ...
  同module命令几乎一样,唯一的区别是不对module文件进行自动解压。
  pause message ...
  输出字符串message,等待用户按任意键继续。你可以用<^G>(ASCII码007)使PC喇叭发声提醒用户注意。
  quit
  退出GRUB shell,GRUB shell类似于启动时的命令行模式,只是它是在用户启动系统后执行/sbin/grub才
  进入,两者差别不大。
  read addr
  从内存的地址addr处读出32位的值并以十六进制显示出来。
  root device [hdbias]
   将当前根设备设为device,并且试图mount这个根设备得到分区大小。hdbias参数是用来告诉BSD内核在当前分区所在磁盘的前面还有多少个 BIOS磁盘编号。例如,系统有一个IDE硬盘和一个SCSI硬盘,而你的BSD安装在IDE硬盘上,此时,你就需要指定hdbias参数为1。
  rootnoverify device [hdbias]
  和root类似,但是不mount该设备。这个命令用在当GRUB不能识别某个硬盘文件系统,但是仍然必须指定根设备。
  setup install_device [image_device]
  安装GRUB引导在install_device上。这条指令实际上调用的是更加灵活但是复杂的install指令。如果
  image_device也指定了的话,则将在image_device中寻找GRUB的文件映象,否则在当前根设备中查找。
  testload file
  这条指令是用来测试文件系统代码的,它以不同的方式读取文件file的内容,并将得到的结果进行比较,如果正确的话,输出的`i=X,filepos= Y`中的X,Y的值应该相等,否则就说明有错误。通常这条指令正确执行的话,之后我们就可以正确无误地装载内核。
  uppermem kbytes
  强迫GRBU认为高端内存只有kbytes千字节的内存,GRUB自动探测到的结果将变得无效。这条指令很少使用,可能只在一些古老的机器上才有必要。通常GRUB都能够正确地得到系统的内存数量。
 
 
 
 
 
 
 
 
 
 
Grub命令详解
一、菜单命令
菜单命令只能用于grub配置文件的全局配置部分,不能用在grub命令行交互界面,菜单命令在配置文件中应放在其它命令之前。
1、default //设置默认启动的菜单项
2、fallback //设置启动某菜单项失败后反回的菜单项
3、hiddenmenu //隐藏菜单界面
4、timeout //设置菜单自动启动的延时时间
5、title //开始一个菜单项
二、常规命令
常规命令可以应该于配置文件和grub命令行交互界面,可使用的常规命令有
1、bootp //通过bootp初始化网络设备
2、color //设置菜单界面的颜色
3、device //指定设备文件作为驱动器
4、dhcp //通过DHCP初始化网络设备
5、hide //隐藏某分区
6、ifconfig //手工配置网络设备
7、pager //改变内部页程序的状态
8、partnew //新建一个主分区
9、parttype //改变分区的类型
10、password 为菜单界面设置口令
11、rarp //通过RARP初始化网络设置
12、serial //设置串口设备
13、setkey //设置键盘映射
14、splashimage //设置GRUB启动时的背景图片文件
15、termainal //选择终端类型
16、tftpserver //指定TFTP服务器
17、unhide //还原某隐藏分区
三、命令行和菜单项命令
命令行和菜单项命令可应该于GRUB配置文件的菜单项设置中,也可以用在GRUB命令交互界面。
1、bolcklist //显示某文件所在分区位置(block list notation)
2、boot //启动操作系统
3、cat //显示文件内容
4、chainloader //把启动控制权软交给另外的启动引导器
5、cmp //比较两个文件
6、configfile //加载已存在的GRUB配置文件
7、debug //设置为debug模式
8、displayapm //显示APM BIOS信息
9、displaymem //显示内存配置
10、embed //嵌入Stage 1.5文件
11、find //查找包括某文件的所有设备
12、fstest //测试文件系统
13、geometry //显示某驱动器的物理信息
14、halt //停止计算机运行(软件关机)
15、help //显示GRUB的命令帮助信息
16、impsprobe //查询对称多处理器(SMP)的信息
17、initrd //加载initrd文件
18、install //安装GRUB
19、ioprobe //查询某驱动器的输入输出(I/O)端口
20、kernel //引导操作系统内核
21、lock //锁定某GRUB导菜单项,使其输入密码后才可启动
22、makeactive //激活某主分区
23、map //虚拟映射某驱动器
24、md5crypt //使用MD5加密口令
25、module //加载模块
26、modulenounzip //加载模块不进行解压
27、pause //暂停并等待按键
28、quit //退出GRUB
29、reboot //重新启动计算机
30、read //读取内存中的内容
31、root //设置GRUB的root设备
32、rootnoverify //设备GRUB的root设备但不装载文件系统
33、savedefault //保存当前的启动菜单项为默认启动
34、setup //自动安装GRUB
35、testload //从文件系统中测试读取某文件
36、testvbe //测试VESA BIOS EXTENSION
37、uppermem //强制设置主机上位内存的大小
38、vbeprobe //查询VESA BIOS EXTENSION信息
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

GRUB的启动过程解释
GRUB 引导分为stage1和stage2两个部分。如果安装GRUB于MBR当中,则stage1直接写入了MBR,这样机器一启动就将控制权交给了GRUB 的代码。如果GRUB安装在BR当中,则需要有另外一个OS loader读入BR当中的stage1后才能把控制权交给GRUB。接下来的步骤是stage1找到stage2并将控制权交给stage2。这里有两 种方式,一种是直接方式,stage1根据记载的stage2所在硬盘的位置直接将stage2找到;另一种是间接方式,这需要stage1_5也就是通 常说的stage1.5,通过stage1.5对文件系统的 分析,通过路径方式找到stage2。stage1.5根据不同的文件系统有不同的版本,如果使用stage1.5,则该文件实际是嵌入到BR/MBR之 后的若干扇区内的。也就是说,安装好的GRUB,实际发挥作用的是stage2,而stage1/1.5都直接内嵌到BR/MBR当中,存在于硬盘文件上 的它们是不起作用的。因此,如果不希望改动windows系统的BR/MBR,则需要采用直接方式,找到stage2的位置,而stage1则使用直接的 文件由NT loader去调用(此时stage1文件是起作用的!)。
    GRUB引导的详细过程是(无stage1.5文件):
1、系统上电加载stage1(512B)
2、在stage1 0x40位置上得到boot drive信息(通常是0x80),0x41位置上得到force LBA标志
3、在0x42~43位置上(1 word)得到stage2加载到内存中的地址——0x8000,若使用stage1.5此值应当为0x2000
4、在0x44~47位置上得到stage2首扇区的位置
5、在0x48~49位置上得到stage2加载到内存当中的段地址,因为是实模式工作,所以参照第三条,应当分别是0x0800和0x0200
6、根据step 4得到的位置加载stage2首扇区到内存0x8000位置
7、从stage2首扇区末8字节得到stage2下一个blocklist位置,这8个字节的格式是:0~3,4字节表示的起始扇区位置,4~5,2字 节表示的这个blocklist所包含的扇区数,6~7,2字节表示这个blocklist的数据应当放置到的内存段地址,第一个blocklist的段 地址都是0x0820(0x8000 + 512B = 0x8200,然后取段地址)
8、在7的基础上再往前seek 8字节,若不为0,则表明数据为下一个blocklist,按照7的数据说明将它们加载到内存。重复本步骤直到所有的blocklist加载到内存
9、此时stage2已全部加载完毕,控制权可交给stage2
 
 

硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解
   硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)是电脑BIOS自检完成后,操作系统开始引导系统前整个电脑运作过程中需要 检查的重要参数,硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)参数错误可能导致系统无法启动或存储的数据丢失,这片文章我 们介绍一下硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)的详细信息。
  硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分 区表中登记了某个操作系统分区。MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同 而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所 有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(下图)。
 

  MBR由三部分构成:
  1.主引导程序代码,占446字节
  2.硬盘分区表DPT,占64字节
  3.主引导扇区结束标志AA55H
 一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
  主引导代码实现下列功能:
  1.扫描分区表查找活动分区;
  2.寻找活动分区的起始扇区;
  3.将活动分区的引导扇区读到内存;
  4.执行引导扇区的运行代码。
 如果主引导代码未完成这些功能,系统显示下列错误信息:
  Invalid partition table
  Error loading operating system
  Missing operating system
  二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(下图);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占 16字节。在这里我们可以看出,硬盘的总分区数为什么不能大于4。其中可激活分区数不得大于3,扩展分区数不得大于1,当前活动分区数必须小于等于 1。
 

  分区表的每一分区的第0个字节是自举标志,其值为80H时,表示该分区是当前活动分区,可引导,其值为00H时,表示该分区不可引导。
  第4字节是分区类型(下图)。
 

  每一分区的第1至第3字节是该分区起始地址。其中第1字节为起始磁头号(面号);第2字节的低6位为起始扇区号,高2位则为起始柱面号的高2 位;第3字节为起始柱面号的低8位。因此,分区的起始柱面号是用10位二进制数表示的,最大值为2^10 = 1024,因逻辑柱面号从0开始计,故柱面号的显示最大值为1023。同理,用6位二进制数表示的扇区号不会超过2^6 - 1 = 63;用8位二进制数表示的磁头号不会超过2^8 - 1 = 255。每一分区的第5至第7字节表示分区的终止地址,各字节的释义与第1至第3字节相同。这里我们假设一种极端的情况:如果让第5至第7字节的所有二进 制位都取1,就获得了柱面号、磁头号和扇区号所能表示的最大值,从而得到最大绝对扇区号为:
  1024 × 256 × 63 = 16,515,072
 这个扇区之前的所有物理扇区所包含的字节数为:
 16,515,072 × 512Bytes ≈ 8.46GB。
  由此可知硬盘的容量设计为什么会有8.4GB这一档,分区表每一分区的第1至第3字节以及第5至第7字节的数据结构已经不能满足大于 8.46GB的大容量硬盘的需要。考虑到向下兼容的需要,业界并未对从DOS时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的面太广,会造成硬 件和软件发展上的一个断层,几乎无法被业界和用户所接受。硬盘厂商解决这一问题的方法是定义了新的INT 13服务扩展标准。新的INT 13服务扩展标准不再使用操作系统的寄存器传递硬盘的寻址参数,而使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持 LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。通过这种方式,能实现在 ATA总线基础上CHS寻址的最大容量是136.9 GB,而LBA寻址的最大容量是137.4GB。新的硬盘传输规范ATA 133规范又把28位可用的寄存器空间提高到48位,从而支持更大的硬盘。
  分区表每一分区的第8至第11字节表示该分区的起始相对扇区数(即该扇区之前的绝对扇区个数),高位在右,低位在左;第12至第15字节表示该分区实 际占用的扇区数,也是高位在右,低位在左;分区表这类数据结构的表达方式与机器中数据的实际存储方式在顺序上是一致的,即低位在前,高位在后。因此,在从 16进制向十进制作数值转换时,需将字段中的16进制数以字节为单位翻转调位,用4个字节可以表示最大2^32个扇区,即2TB=2048GB。
  系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。在未超过8.4GB的分区上,C/H/S的表示方法和扇区数的表 示方法所表示的分区大小是一致的。超过8.4GB的/H/S/C一般填充为FEH/FFH/FFH,即C/H/S所能表示的最大值;有时候也会用柱面对 1024的模来填充。不过这几个字节是什么其实都无关紧要了。
  扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录(Extended Boot Record,EBR)。
 

  扩展引导记录包括一个扩展分区表和扇区结束标志55AA。一个逻辑驱动器中的引导扇区一般位于相对扇区32或63。如果磁盘上没有扩展分区,那么就不 会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区;第二项指向下一个逻辑驱动器的EBR,如果不存在进一步的 逻辑驱动器,第二项就不会使用,而被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区,第二个 逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。
  扩展分区表项中的相对扇区数是从扩展分区开始的扇区到该逻辑驱动器中第一个扇区的扇区数;占用的扇区数是指组成该逻辑驱动器的扇区数目。
      有时候在磁盘的末尾会有剩余空间,由于分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。
  三、主引导扇区的最后两个字节(偏移1FEH和偏移1FFH),其值为AA55H,它表示该扇区是个有效的引导扇区,可用来引导硬磁盘系统。
  分区引导扇区DBR(DOS BOOT RECORD)是由FORMAT高级格式化命令写到该扇区的内容;DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主 要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区的DBR才会被MBR装入内存运行。
        DBR主要由下列几个部分组成:
          1.跳转指令,占用3个字节的跳转指令将跳转至引导代码。
          2.厂商标识和DOS版本号,该部分总共占用8个字节。
          3.BPB(BIOS Parameter Block, BIOS 参数块)。
          4.操作系统引导程序。
          5.结束标志字,结束标志占用2个字节,其值为AA55
  DBR中的内容除了第5部分结束标志字固定不变之外,其余4个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。

-------------------------------下面是2楼中的图,编辑错了 ,版版能不能把这几个图删了
附件
 5.jpg (195.24 KB)
2008-11-2 20:57
 
 6.jpg (171.03 KB)
2008-11-2 20:57
 
 7.jpg (176.64 KB)
2008-11-2 20:57
 
 8.jpg (194.33 KB)
2008-11-2 20:57
 
 9.jpg (191.92 KB)
2008-11-2 20:57
 
 10.jpg (93.84 KB)
2008-11-2 20:57
 

TOP
zw2312914
 
少将
  
?    个人空间
?    发短消息
?    加为好友
?    当前离线     2# 大 中 小 发表于 2008-11-2 20:58  只看该作者
 一、FAT32的分区引导扇区

  为了使加载文件的操作更加灵活,加上FAT32文件系统采用"活动"的FDT表,,同时考虑到引导程序的代码量和为今后发展保留适当的余 量,FAT32文件系统分区引导扇区占据了6个扇区,只有前3个扇区作为系统的分区引导扇区,其余3个扇区保留暂未使用。分区引导扇区对于操作系统的启动 和磁盘文件的访问具有至关重要的作用;引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。
  由于分区引导扇区的重要性,FAT32文件系统在在第一个分区引导扇区的6个扇区后的6个扇区里保留了分区引导扇区的备份,在启动时操作系统可以对两 份引导扇区进行比较,以便选择正确的引导扇区来引导系统。由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏 的可能性非常小。
  分区引导扇区的第一个扇区(图六)的前三个字节是一条跳转指令,然后是8个字节长的OEM ID(厂家标识)和版本号,其后是简称为BPB的BIOS参数块(BIOS Parameter Block)。
 

对于FAT32其各部分的意义如下表:
 

  从偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00开始的跳转指令所指向的,此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。
  扇区的最后两个字节存储值为0x55AA的DBR有效标志,对于其他的取值,系统将不会执行DBR相关指令。
  
    分区引导扇区的第2个扇区作为文件系统相关参数存储标识扇区(下图),除了保存扇区的标识信息(RraA(00H)和rrAa(1E4H))外,还可能在 偏移地址1E8H处存储了文件系统有关的信息。其中扇区偏移地址1E8H~1EBH的4个字节存储了逻辑磁盘中未使用的簇数,通常用于快速计算逻辑磁盘的 剩余空间(典型的操作是在资源管理器状态栏上列出的"可用磁盘空间"参数),而1ECH~1EFH 4个字节给出了逻辑盘中下一个可以分配给文件使用的空闲簇的簇号,这样操作系统可以不访问FAT表就直接获得磁盘剩余空间和可以分配的簇号。
 

  分区引导扇区的第3个扇区则存储了引导扇区的后一部分引导系统的程序代码。
 

  二、NTFS的分区引导扇区
  对于NTFS分区来说,分区引导扇区DBR只占用一个扇区(下图),并且在该分区的最后一个扇区做了备份;NTFS的引导扇区也是完成引导和定义分区参数,NTFS分区的引导扇区不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。
 

其BPB参数如下表所示:
 
详解硬盘MBR(转)
上一篇 / 下一篇  2009-01-23 18:06:11 / 个人分类:低层知识
查看( 276 ) / 评论( 0 ) / 评分( 0 / 0 )
硬盘是 现在计算机上最常用的存储器之一。我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。而这些数据都以文件的形式存储在硬盘里。不过,计 算机可不像人那么聪明。在读取相应的文件时,你必须要给出相应的规则。这就是分区概念。分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬 盘所需要的信息则是通过以后的高级格式化,即Format命令来实现。面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区 (Sector)。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道。先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。我们所说,每 个圆形薄膜都有两个“面”,这两个面都是用来存储数据的。按照面的多少,依次称为0面、1面、2面……由于每个面都专有一个读写磁头,也常用0头 (head)、1头……称之。按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。各面上磁道号相同的磁道合起 来,称为一个柱面(Cylinder)。
上 面我们提到了磁道的概念。那么究竟何为磁道呢?由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。我们称这样的圆周为一个磁道。如果读写磁头沿着 圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB的 数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区。一个扇区一般存放512字节的数据。扇区也需要编号,同 一磁道中的扇区,分别称为1扇区,2扇区……
计 算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。即使计算机只需要硬盘上存储的某个字节,也必须一次把这个字节所在的扇区中的512字节全部读 入内存,再使用所需的那个字节。不过,在上文中我们也提到,硬盘上面、磁道、扇区的划分表面上是看不到任何痕迹的,虽然磁头可以根据某个磁道的应有半径来 对准这个磁道,但怎样才能在首尾相连的一圈扇区中找出所需要的某一扇区呢?原来,每个扇区并不仅仅由512个字节组成的,在这些由计算机存取的数据的前、 后两端,都另有一些特定的数据,这些数据构成了扇区的界限标志,标志中含有扇区的编号和其他信息。计算机就凭借着这些标志来识别扇区。硬盘的数据结构 在上文中,我们谈了数据在硬盘中的存储的一般原理。为了能更深入地了解硬盘,我们还必须对硬盘的数据结构有个简单的了解。硬盘上的数据按照其不同的特点和 作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。
我们来分别介绍一下:
1.MBR 区 MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。不过,在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节交给了 DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。
主引导记录中包含了硬盘的一系列参数和一段引导程序。 其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。MBR是由 分区程序(如Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存。
下面,我们以一个实例让大家更直观地来了解主引导记录:
例:80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00 在这里我们可以看到,最前面的“80”是一个分区的激活标志,表示系统可引导;“01 01 00”表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;“0B”表示分区的系统类型是FAT32,其他比较常用的有 04(FAT16)、07(NTFS);“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;“3F 00 00 00”表示首扇区的相对扇区号为63;“7E 86 BB 00”表示总扇区数为12289622。
2.DBR 区 DBR(Dos Boot Record)是操作系统引导记录区的意思。它通常位于硬盘的0磁道1柱面1扇区,是操作系统可以直接访问的第一个扇区,它包括一个引导程序和一个被称为 BPB(Bios Parameter Block)的本分区参数记录表。引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(以DOS为 例,即是Io.sys和Msdos.sys)。如果确定存在,就把它读入内存,并把控制权 交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数,分配单元的大小等重要参数。DBR 是由高级格式化程序(即Format.com等程序)所产生的。
3.FAT 区 在DBR之后的是我们比较熟悉的FAT(File Allocation Table文件分配表)区。在解释文件分配表的概念之前,我们先来谈谈簇(Cluster)的概念。文件占用磁盘空间时,基本单位不是字节而是簇。一般情 况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64…… 同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。由于硬盘上保 存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出。 为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一 簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT对于文件管理的重要性,所以FAT有一个备 份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为“未占用”,但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相 应的项中标为“坏簇”,以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放 簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。
4.DIR区 DIR(Directory)是根目录区,紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
5.数据(DATA)区 数据区是真正意义上的数据存储的地方,位于DIR区之后,占据硬盘上的大部分数据空间。
一、硬盘的物理结构:
     硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
 
硬 盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中 “写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指 定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽量 提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、写灵敏度和速 度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数据。
二、硬盘的逻辑结构:
    硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。如果有N个盘片。就有2N个面,对应2N个磁头(Heads),从0、1、2 开始编号。每个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。)每个盘片的划分规则通常是一样的。这样每个盘片的半径均为固定值R的同心圆再逻辑 上形成了一个以电机主轴为轴的柱面(Cylinders),从外至里编号为0、1、2……每个盘片上的每个磁道又被划分为几十个扇区(Sector),通 常的容量是512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区。这三个参数即是硬盘的物理参 数。我们下面的很多实践需要深刻理解这三个参数的意义。

    硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
   三、磁盘引导原理:
3.1 MBR(master boot record)扇区:
  计算机在按下power键以后,开始执行主板bios程序。进行完一系列检测和配置以 后。开始按bios中设定的系统引导顺序引导系统。假定现在是硬盘。Bios执行完自己的程序后如何把执行权交给硬盘呢。交给硬盘后又执行存储在哪里的程 序呢。其实,称为mbr的一段代码起着举足轻重的作用。MBR(master boot record),即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以 后就会jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字 节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两个字节“55 AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。
  MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质。具有公共引导的特性。
 
  我们来分析一段mbr。下面是用winhex查看的一块希捷120GB硬盘的mbr。
MBR扇区代码
 
你的硬盘的MBR引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。这里找wowocock关于磁盘mbr的反编译,已加了详细的注释,感兴趣可以细细研究一下。
  我们看DPT部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于C~Z的英文字母的数目,在上图DPT共64个字节中如何表示多个分区的属性呢?microsoft通过链接的方法解决了这个问题。在DPT共64个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表1。
 
DPT代码分析
注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。
  也可以在winhex中看到这些参数的意义:
winhex中参数的意义
 
说明:每个分区表项占用16个字节,假定偏移地址从0开始。如图3的分区表项3。分区表项4同分区表项3。
  1、0H偏移为活动分区是否标志,只能选00H和80H。80H为活动,00H为非活动。其余值对microsoft而言为非法值。
   2、重新说明一下(这个非常重要):大于1个字节的数被以低字节在前的存储格式格式(little endian format)或称反字节顺序保存下来。低字节在前的格式是一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号中。例如,相对扇区数字段的值 0x3F000000的低字节在前表示为0x0000003F。这个低字节在前的格式数的十进制数为63。
   3、系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。有时候我们分区是输入分区的大小为7000M,分出来却是 6997M,就是这个原因。 偏移2H和偏移6H的扇区和柱面参数中,扇区占6位(bit),柱面占10位(bit),以偏移6H为例,其低6位用作扇区数的二进制表示。其高两位做柱 面数10位中的高两位,偏移7H组成的8位做柱面数10位中的低8位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁头从0开始编号,扇区 从1开始编号,所以最多只能表示1024个柱面×63个扇区×256个磁头×512byte=8455716864byte。即通常的8.4GB(实际上 应该是7.8GB左右)限制。实际上磁头数通常只用到255个(由汇编语言的寻址寄存器决定),即使把这3个字节按线性寻址,依然力不从心。 在后来的操作系统中,超过8.4GB的分区其实已经不通过C/H/S的方式寻址了。而是通过偏移CH~偏移FH共4个字节32位线性扇区地址来表示分区所 占用的扇区总数。可知通过4个字节可以表示2^32个扇区,即2TB=2048GB,目前对于大多数计算机而言,这已经是个天文数字了。在未超过 8.4GB的分区上,C/H/S的表示方法和线性扇区的表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即使不协调,也以线性寻址为 准。(可能在某些系统中会提示出错)。超过8.4GB的分区结束C/H/S一般填充为FEH FFH FFH。即C/H/S所能表示的最大值。有时候也会用柱面对1024的模来填充。不过这几个字节是什么其实都无关紧要了。
   虽然现在的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须是柱面 容量的整数倍。(保留扇区中的第一个扇区就是存放分区表的MBR或虚拟MBR的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。如果是第一个分 区,保留扇区是本分区前的所有扇区。
附:分区表类型标志如图4
分区表类型标志
 
3.2 扩展分区
扩 展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录( Extended Boot Record, EBR),也有人称之为虚拟mbr或扩展mbr,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个 逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区32或63。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记 录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的EBR。如果不存在进一步的逻辑驱动器,第 二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的 扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。
    通过一幅4分区的磁盘结构图可以看到磁盘的大致组织形式。如图5
 
关于扩展分区,如图6所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异。
 
除 了扩展分区上最后一个逻辑驱动器外,表2中所描述的扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标 识了下一个逻辑驱动器的EBR。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
 
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。
    有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以1柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决 定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按 照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来CHS。可能其实际空间容量不一定正好为整数个柱面的容量。
 
 
发表于 @ 2010年04月15日 10:21:00 | 评论( 0 ) | 编辑| 举报| 收藏

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多