一、前言
在了解MBR引导之前,先需要了解读取MBR之前,机器都干什么了。
直接总结其他博主的文章罗列在此,以便查阅:
首先我们要了解整个启动过程的轮廓,可以读下边这篇文章
读完这篇文章,我们可以深入研究一下BIOS在将控制权交给MBR之前的一系列动作,可以读下边文章
了解BIOS之后,可以看看MBR的具体结构。
总结一下:
二、MBR的类型
MBR的类型很多,仅总结自己用过的,随着了解的越多,会不断补充:Windows NT 5.X(主要用于WIndows XP)
Windows NT 6.X(主要用于Windows7,8,10;Windows Server 2010,2012等)
Grub 2.00(boot.img+core.img)(主要用于Linux)
Grub 4 DOS
Xorboot(Pauly开发的多系统引导程序,可以引导多种系统)
三、Windos NT 5.x
- 系统盘(System Volue)和引导盘(Boot Volume)的区别:系统盘是指保存了用于引导Windows的文件(即ntldr,boot.ini)的银盘分区,而引导盘是指保存了Windows系统文件的硬盘分区。保存了引导系统所需文件的分区被叫做“系统盘”,反而保存了操作系统文件的分区被叫做“引导盘”,正好颠倒了。不过微软就是这样规定的。
- 安装好系统后,使用DiskGenius取消系统所在分区的激活状态,将无法进入系统。因为从MBR查找不到激活分区,不知道到那个分区寻找启动文件ntldr。
3.1典型的Boot.ini文件格式
[boot loader]
timeout=5(设置延时时间)
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS(设置默认操作系统的路径)
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect(操作系统列标)
参数详解:
/3GB:这是Win2000 SP3新引入的。这使得用户区和系统区分为3G比1G的比例。只有用户使用NT企业版,应用程序也支持3GB选项时,此选项才生效。
/BASEVIDEO:使用标准VGA方式启动。这种方式主要用于显示驱动程序失效时。
/BAUDRATE:指出用于调度的波特率,如果用户不设置,则使用默认的9600,而对于线缆Modem则使用19200。
/BOOTLOG:使Win2000将日志写入 %SystemRoot%\NTBTLOG.TXT 。
/BURNMEMORY=:使NT在已知的内存上少使用指定的数量,如果/burnmemory=64,则有64M内存NT不使用。
/CRASHDEBUG:调度器在NT启动时启动,只有在内核错误时才有用,如果系统经常会无故出错,这个选项就很有用了。
/DEBUG:在启动NT时调入调度器,它可以在任何时间激活,在错误可以再次出现时使用它比较合适。
/DEBUGPORT= comx :指定用于调度的端口,其它X就指端口号。
/HAL=:允许用户不使用默认的HAL。
/INTAFFINITY:设置多处理器HAL(HALMPS.DLL),使编号最大的处理器接收中断请求。如果不设置此选项,Win2000会使所有处理器接收中断请求。
/KERNEL=:与上面的功能相同,不过是针对SMP中的内核而言的。
/MAXMEM:n:指定NT可以使用的最大内存数,如果一个内存片损坏,这个开关就十分有用了。
/NODEBUG:不使用调试信息。
/NOGUIBOOT:指定此选项会使Win2000不加载VGA驱动程序,也就不会显示启动过程和失败时的兰屏信息。
/NOSERIALMICE=[COMx | COMx,y,z…]:在特定的COM中上禁止对串行鼠标的检测。如果用户有一个非鼠标设备接在COM口上,这个选项会十分有用。如果此开关未加参数,系统会禁止所有COM口。
/NUMPROC=n:只允许前N个系统处理器工作。
/ONECPU:在多处理器中只使用一个处理器。
/PCILOCK:不让NT为PCI设置分配IO/IRQ资源,而启用BIOS设置。
/SAFEBOOT:安全启动,这个大家一定十分熟悉,Win2000只启动HKLM\System\CurrentControlSetControl\SafeBoot中的驱动程序和服务,其后跟三个参数MINIMAL,NETWORK或DSREPAIR之一。MINIMAL和NETWORK在允许网络下启动系统。而DSREPAIR要求系统从备份设备中调入活动目录的设置。还有一个选项是"(ALTERNATESHELL)",它让系统调入由HKLM\System\CurrentControlSetSafeBoot\AlternateShell指定的SHELL程序,而不使用默认的Explorer。
/SOS:在调入驱动程序名时显示它的名字,在因驱动问题而无法启动时使用比较好。
/WIN95:在装有三个系统DOS、Win9x和Windows NT的系统上,让NTLDR直接调用Win9x。启动文件BOOTSECT.W40。
/WIN95DOS:在装有三个系统DOS、Win9x和Windows NT的系统上,让NTLDR直接调用DOS启动文件BOOTSECT.DOS
/YEAR=:使用指定的年份,如果设置为/YEAR=2005,那现在的时间就是2005年,此选项仅对NT4+SP4和Win2000生效。
/fastdetect:快速检测对于Win2000启动时,它使系统不检查串行口和并行口。对于“fastdetect”这个参数,微软给出的解释是“关闭Ntdetect.com在开机时对串口鼠标的检测”。
3.2、Boot.ini添加多系统引导
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
C:\WINDOWS\arboot\dos\ar.BIN="矮人工作室纯DOS模式"(引导BIN文件)
四、Windos NT 6.x
- bootmgr文件与\Boot\BCD文件必须位于同一磁盘,bootmgr不具备跨磁盘分区查找BCD文件的能力,且路径是指定的,即BCD文件必须位于\Boot文件夹下。
- 若BCD文件加载其他分区内的文件,如WIM文件。则其他分区的格式必须是FAT、FAT16、FAT32、NTFS这几种bootmgr支持的文件系统,否则不能加载。
4.1、BCD文件内容
- Windows 7/8/8.1/10
- Winsow XP/2003
- RealMode (Grub/Linux)
- VHD boot
- WIM boot
- ramdisk
- memory tester
--------------------
identifier {bootmgr}
device partition=C:【标记bootmgr所在的分区】
description Windows Boot Manager
locale en-US
inherit {globalsettings}
default {current}【 Windows 10的identifer】
resumeobject {2449b2d7-5383-11e6-9620-86dedc2bf396}【Windows恢复模式的identifer】
displayorder {current}【 Windows 10的identifer】
{6900be0c-e149-11e7-825e-005056c00008} 【 RemixOS的identifer】
toolsdisplayorder {memdiag}
timeout 30
Windows Boot Loader【Windows启动加载器】
-------------------
identifier {current}【与default的current对应】
device partition=C:【操作系统所在分区】
path \Windows\system32\winload.exe【系统加载器的路径】
description Windows 10【系统描述,将显示在启动菜单】
locale en-US
inherit {bootloadersettings}
recoveryenabled Yes
allowedinmemorysettings 0x15000075
osdevice partition=C:
systemroot \Windows
resumeobject {2449b2d7-5383-11e6-9620-86dedc2bf396}
nx OptIn
bootmenupolicy Standard
---------------------
identifier {6900be0c-e149-11e7-825e-005056c00008}
device partition=C:
path \ubnldr.mbr
description Remix OS
4.2、Windows XP/2003入口添加
4.3、Windows7/8/8.1/10入口添加
4.4、VHD入口添加
4.5、WIM入口添加
4.6、Realmode 入口添加
4.7、ramdisk入口添加
4.8、Memory Test入口添加
五、XorBoot BIOS版
- GRLDR/GRLDR.MBR、
- NTLDR / SETUPLDR.BIN / BOOTMGR、
- SYSLINUX 的 LDLINUX.BIN/ISOLINUX.BIN(3.00~6.02)、
- PLoP Boot Manager、
- MS-DOS(IO.SYS)、
- FreeDOS(KERNEL.SYS)以及磁盘映像文件(IMG; IMA; ISO; VHD/VHDX(MS NT 6x);
- WIM(MS NT5x/6x);
- VHD/VMDK(VBOOT驱动);
- Windows NT5x PE(IMG/ISO/WIM))的启动。
- 按文件系统读取文件时,文件名最大长度为 31 个英文字符,仅支持 FAT16/FAT32/EXFAT/NTFS 文件系统。
- XORBOOT 可以安装在硬盘的 MBR 上启动,也可以安装到 PBR 上,也可以部署到 ISO 镜像,还可以将配置输出后由 GRUB4DOS 或 BOOTMGR (使用RealMode添加引导)加载启动。
- XORBOOT没有Windows NT6.x里的激活分区概念,直接进分区进行搜索,或者直接搜索文件,两种模式。
- 引导文件文件可以放在分区的根目录下,也可以放在子目录下,还可以放到剩余分区等不可见的地方;目录分隔符/ 等同于 \,即 /NTLDR 和 \NTLDR 是一样的。需要强调的是,文件名中不可出现盘符,如 C:\NTLDR或C:NTLDR都是错误的,将不被XORLDR识别。盘符由“工作磁盘及分区号”替代。
- XORLDR 支持FAT16/FAT32/NTFS 三种文件系统,其中FAT分区上仅支持 8.3 格式的短文件名;NTFS 分区上要求 $MFT 必须是连续的,否则可能搜索不到指定的文件,且文件不能是加密或压缩的。
- XORBOOT添加图形界面BMP图片的大小需限制在2M,可以通过压缩软件进行压缩,保证图片的大小,负责会造成图片的变形和颜色的丢失。
5.1、XORBOOT的部署位置
根据需要,选择部署的位置,计算机上一般选用MBR
5.2、添加引导
- 设置BootType
- 设置SystmeType
- 其他功能设置
5.2.1、确定BootType(启动类型)
5.2.3、确定SystemType
PBR fPartition Boot Record) 磁盘分区导出的PBR文件
General Programs 一些独立的应用程序,入memtest.exe
FreeDOS (KERNEL.SYS) 启动FreeDOS
FDD image (*.img;*.ima) 启动软盘镜像文件
HDD image (*.img;*.ima) 启动硬盘镜像文件
ISO image (*. iso) 启动光盘镜像文件
VHD/VHDX (Windows NT 6.x) 启动Windows NT6.x系统的虚拟硬盘
WIM (Windows NT 6.x PE) 启动Windows NT6.xPE系统的WIM文件
VBOOT (VHD/VMDK) 启动VHD虚拟硬盘
Windows NT5 PE(*.IMG;*.IMG*.ISO;*.IS_) 启动Windows NT5 PE的镜像文件、
5.2.4、功能设置
5.2.5、引导部署
六、Grub2.00
6.1、Grub2.00的启动流程及文件组成
6.2、典型的grub.cfg配置文件
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
### END /etc/grub.d/00_tuned ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n "${GRUB2_PASSWORD}" ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Windows 10 (loader) (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-80D6F4D9D6F4D100' {
insmod part_msdos【载入dos分区模块】
insmod ntfs 【载入ntfs文件系统模块】
set root='hd0,msdos1' 【将磁盘0的第一个分区设置为root】
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 80D6F4D9D6F4D100
else
search --no-floppy --fs-uuid --set=root 80D6F4D9D6F4D100
fi
parttool ${root} hidden-
chainloader +1【跳转】
}
menuentry 'Remix OS (Resident mode - All your data and apps are saved )' --class remixos --class android-x86 --class gnu-linux --class os {
search --file --no-floppy --set=root /kernel【查找kernel,并设置为root】
linux /kernel root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive quiet DATA= CREATE_DATA_IMG=1 SRC=/ #将data目录指定给data.img文件,也可以新建data文件夹,赋值为/data,注意=号后的空格
}
menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-8939dd63-b289-4149-a4d1-8a5bb3ee56d1' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos6'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 --hint='hd0,msdos6' d1a621a8-a3ef-427e-9094-16e45c9e986e
else
search --no-floppy --fs-uuid --set=root d1a621a8-a3ef-427e-9094-16e45c9e986e
fi
linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet LANG=zh_CN.UTF-8
initrd16 /initramfs-3.10.0-514.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-0207c6e32eb942c3bbdb027fade548cb) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-0207c6e32eb942c3bbdb027fade548cb-advanced-8939dd63-b289-4149-a4d1-8a5bb3ee56d1' {
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos6'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 --hint='hd0,msdos6' d1a621a8-a3ef-427e-9094-16e45c9e986e
else
search --no-floppy --fs-uuid --set=root d1a621a8-a3ef-427e-9094-16e45c9e986e
fi
linux16 /vmlinuz-0-rescue-0207c6e32eb942c3bbdb027fade548cb root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet
initrd16 /initramfs-0-rescue-0207c6e32eb942c3bbdb027fade548cb.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
================================================================================
6.3、Grub2.00不同种功能实现方式
- Grub可以引导WindowsNT x.x
- Grub可以引导ISO镜像,需要根据镜像内系统的不同,修改相关参数。
- Grub可以通过网络进行安装系统
linux16 $prefix/memdisk iso raw
initrd16 /os/WinPE.iso
}
menuentry '系统救援(WinPE)' --users=root {
chainloader /os/bootmgfw.efi
}
linux /os/gentoo/gentoo cdroot looptype=squashfs loop=/os/gentoo/image.squashfs rootwait doscsi nodmraid nokeymap docache dosshd scandelay slowusb passwd=123
initrd /os/gentoo/gentoo.igz
}
loopback loop0 /os/install-amd64-minimal.iso
linux (loop0)/isolinux/gentoo cdroot isoboot=/os/install-amd64-minimal.iso rootwait doscsi nodmraid nokeymap docache dosshd scandelay slowusb passwd=123
initrd (loop0)/isolinux/gentoo.igz
}
loopback loop0 /os/CentOS-7-x86_64-NetInstall-1708.iso
linux (loop0)/images/pxeboot/vmlinuz ip=dhcp nameserver=223.6.6.6 inst.repo=http://mirrors.aliyun.com/centos/7/os/x86_64/ rootwait inst.lang=zh_CN.UTF-8
initrd (loop0)/images/pxeboot/initrd.img
#这里的方法也适用于 CentOS-7-x86_64-DVD-1708.iso 与 CentOS-7-x86_64-Everything-1708.iso
menuentry '硬盘安装 CentOS 7.4 [最小安装]' --unrestricted {
loopback loop0 /os/CentOS-7-x86_64-Minimal-1708.iso
linux (loop0)/isolinux/vmlinuz inst.repo=hd:LABEL=GRUB2:/os/CentOS-7-x86_64-Minimal-1708.iso rootwait inst.lang=zh_CN.UTF-8 #inst.repo指定从本地查找ISO镜像文件
initrd (loop0)/isolinux/initrd.img
}
七、Grub4Dos
7.1、典型的menu.lst
timeout 10
title Resident mode - All your data and apps are saved
find --set-root /RemixOS/kernel
kernel /RemixOS/kernel root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive quiet SERIAL=random logo.showlogo=1 SRC=RemixOS/ DATA= CREATE_DATA_IMG=1
initrd /RemixOS/initrd.img
boot
7.2、menu.lst命令索引
blocklist 输出文件的块清单表达法。
boot 引导已加载的操作系统或扇区链式加载器。
bootp 通过BOOTP初始化网络设备。
cat 显示指定文件的内容。
cdrom 初始化或者停止所有的 ATAPI CDROM 设备。
chainloader 加载扇区链式加载器。
cmp 比较两个文件, 并且报告两者之间的差异。
color 改变菜单的颜色。
configfile 将指定文件作为配置文件予以加载。
debug 打开/关闭调试模式。
default 把 NUM 项菜单设为缺省值。
device 声明BIOS驱动器对应的实际物理设备。
dhcp 通过DHCP初试化网络设备。
splashimage 图形模式下载入背景图片文件。
foreground 设置图形模式下的前景色。
background 设置图形模式下的背景色。
clear 清屏。
displayapm 显示 APM BIOS 的相关信息。
displaymem 显示 GRUB 所判断到的当前系统的内存分布,包括所有物理内存区域。
displaymem 显示诸多文件的内容。
embed 如果设备是个驱动器, 则将Stage 1.5嵌入到主引导扇区之后。
fallback 如果调用当前的菜单项时出现错误,则跳转到 NUM 项后重试。
commandline 进入命令行方式。
find 在所有分区上查找文件名, 并显示包含该文件的设备。
fstest 切换文件系统的试验模式。
geometry 输出驱动器的相关信息。
halt 关闭系统(计算机)。
help 显示内部命令的帮助信息。
hiddenmenu 隐藏菜单。
hide 通过在分区类型上置隐藏标志,隐藏指定分区。
ifconfig 指定 IP 地址, 子网掩码, 网关和服务器地址。不带参数时,将显示当前的网络配置。
impsprobe 探测 Intel 多处理器规范 1.1/1.4 配置表并使所找到的各处理器启动进入闭循环。
initrd 加载Linux格式的初始化虚拟盘, 并设置必要的参数。
install 安装STAGE1到指定设备上,安装加载STAGE2需要的块列表到STAGE2上。
ioprobe 侦测指定设备的 I/O 端口号。
kernel 尝试载入主引导影像文件(Linux内核格式)。
lock 如果用户未被认证,则终止命令的执行。
makeactive 将 root 设备置为活动分区。
map 对设备进行映射。
md5crypt 产生一个 MD5 格式的密码。
module 对多重启动影像, 加载启动模块文件 (不处理该文件的内容, 用户必须自己确定核心的要求)。
modulenounzip 与 'module' 类似, 但是禁用了自动解压缩。
pager 没有参数时,切换页模式。
partnew 创建一个新的主分区。
parttype 改变指定分区(PARTITION)的分区类型(TYPE)。
password 设置密码。
pause 终止命令的运行,并给出一段信息。任意键按下后,将继续。
quit 从 GRUB 命令行中退出。
rarp 用 RARP 初始化网络设备。
read 从内存的指定位置读取一个 32-bit 的值,并以十六进制形式显示出来。
write 写一个 32 位的值 VAL 到内存地址 ADDR。
reboot 重启系统(计算机)。
fontfile 指定中文字体文件,并切换到中文显示方式。
root 设置根分区。
rootnoverify 类似`root'指令, 但不测试安装该分区。
savedefault 将当前项设置为默认的引导项。
serial 初始化一个串口设备。
setkey 改变键盘映射关系。
setup 自动安装GRUB.
terminal 选择一个终端。
terminfo 指定终端的功能。
testload 以多种不同的方式读取文件(由FILE指定)的整个内容,并予以比较,以测试文件系统的代码。
testvbe 测试所指定(MODE)的 VBE 模式。
setvbe 为后续的每个kernel命令行设置VBE模式。
tftpserver 指定 TFTP 服务器的 IP 地址。
timeout 设置在自动启动缺省菜单前所等待的秒数。
title 命名菜单项。
unhide 通过清除隐藏标志,解除指定分区(PARTITION)的隐藏。
uppermem 强制指定仅有(KBYTES) KB 的上位内存。
vbeprobe 侦测 VBE 的信息。
7.3、menu.lst添加各种系统引导
title Resident mode - All your data and apps are saved
find --set-root /RemixOS/kernel
kernel /RemixOS/kernel root=/dev/ram0 androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive quiet SERIAL=random logo.showlogo=1 SRC=RemixOS/ DATA= CREATE_DATA_IMG=1
initrd /RemixOS/initrd.img
boot
title 启动 Windows 8