17年圣诞节网站的服务器出现问题需要使用引导盘进入救援模式, 奈何随身带的两个引导盘(Ubuntu 16.04 和 CentOS 6.8)都不能引导服务器, 反倒是后来找到的一个使用PE工具刻录的Windows PE盘能正常引导并启动, 联想到机器是06年的老古董, 遂决定自己制作MBR引导的启动盘.
1. 选择操纵系统加载引导器
有很多的系统引导加载程序都支持MBR引导, 所以针对不同的操作系统, 可以有多种不同的引导加载器可供选择, 例如Windows系统可以使用NTLDR、grub2、grub4dos等等, Linux系统则可以使用isolinux、grub2、grub4dos等等, Hackintosh的引导加载器只有变色龙支持mbr.
我个人选择的是grub4dos
2. 将系统加载引导程序写入mbr扇区
工具 :
在Windows上使用工具bootice(下载地址请百度之); 在Linux上可以使用grubinst(针对grub4dos)、bootlace.com(针对grub)、grub-install(针对grub2)甚至dd(大胆的想法), 总之Linux环境下要比Windows麻烦就是了.
实操:
Windows下使用bootice很简单, 以grub4dos为例: bootice主界面如下图示:
-
在目标磁盘选择要操作的磁盘(U盘或硬盘自己看着办)
- 点击主引导记录, 如图示:
可以看出我的U盘已经安装过grub4dos, 务必确认目标磁盘是要操作的磁盘
- 选择grub4dos并点击"安装/配置"
具体配置自行决定, 对于不明白的选项可以大胆尝试, 数据丢失这种小事请自行承担后果.
配置完之后点击"写入磁盘"
安装成功:
Linux下建议自己大胆去飞, 不多言.
注意: 只有将引导加载程序写入了mbr扇区它才能被BIOS引导并发挥作用. 一般来说, 小小的mbr扇区是无法完全容纳操作系统引导加载程序的, 所以很多引导加载程序只是在mbr分区写入了一小段"加载代码", 真正的引导加载程序往往放置在某分区根目录下.
3. 复制引导加载程序主体
如上所述, 我们还需要将引导加载程序的主体程序放置在合适的位置(例如将GRLDR放置在启动盘某分区根目录下). 以grub4dos为例:
- 首先到grub4dos下载页面下载grub4dos.
- 找到grldr文件并将其放置到启动盘的根目录下
4. 将镜像文件提取到启动盘
提取并不是刻录, 只需要将镜像文件挂载(或者使用某些解压软件, 如7zip/bindzip/好压)然后将文件复制到启动盘的合适(随意)位置即可.
5. 制作引导加载器的配置文件
这一步可以说是比较难的一步了, 因为这一步涉及到启动加载器对应的命令、操作系统启动过程等多方面的知识. 不过对于一个封装好的发行版操作系统, 即使不了解这些知识也可以制作配置文件, 以CentOS 5.11 + grub4dos为例:
1. 找到CentOS 5.11的iso镜像文件(下载地址)
2. 打开iso文件, 找到它的引导加载器配置文件
CentOS 5.11 iso文件的引导加载器目录在 /isolinux/isolinux.cfg
它的启动引导加载器是isolinux, 因为我用的是grub4dos, 所以需要一定的"移植"
打开此文件, 关键配置内容如下:
label linux
kernel vmlinuz
append initrd=initrd.img
3 制作适用于grub4dos的配置文件
这一步必须了解grub4dos的常用命令. grub4dos使用 title
指定菜单标题, 使用 kernel
指定内核镜像, 使用 initrd
指定init镜像, 使用 boot
开始引导操作系统, 等等等等.
grub4dos的配置文件是menu.lst, 一般将其与grldr放置在同一个目录下. 有menu.lst则修改, 无则新建. 当然在下载的grub4dos压缩包中也有附带的menu.lst模板可以用
参考isolinux.cfg, 可以得出grub4dos的对应代码如下:
title install centos 5.11
find --set-root /grldr
kernel /path/to/vmlinuz
initrd /path/to/initrd.img
boot
注意: 一般在使用grub4dos会指定一个根目录(用于绝对路径等), 使用find
命令查找grldr文件并使用 --set-root
附加选项将第一次找到grldr的目录设置为根目录. 在指定内核镜像和init镜像时, 可以使用相对路径或绝对路径, 但路径必须确保正确.
对于isolinux中append
指定的内核参数, 直接以空格分隔的方式附件给kernel即可. 例如:
# Some code in isolinux.cfg
label ks
kernel vmlinuz
append ks initrd=initrd.img
# In menu.lst
title ks
find --set-root /grldr
kernel /centos/isolinux/vmlinuz ks initrd=/centos/isolinux/initrd.img
boot
没错, initrd完全可以以内核附加参数的形式指定, 不过我还是喜欢使用initrd
命令指定.
6. 重启计算机并使用启动盘引导
结束
进入CentOS 5.11系统救援模式的方法.
1. 在menu.lst文件中添加救援模式菜单项
title centos 5.11 rescue
find --set-root /grldr
kernel /path/to/vmlinuz linux rescue
initrd /path/to/initrd.img
boot
其实就是给内核传参数"linux rescue
"
2. 将CentOS 5.11的iso镜像拷贝到U盘中
如果不这样做的话, 进入CentOS的救援模式之后, 它会提示如下错误:
Device/dev/sdb4 does not appear to contain centos CDROM image
解决方法就是将iso镜像文件放置到启动盘中, 在提示指定镜像目录时指定iso文件路径即可.