Grub

安装方式

  1. 覆盖安装 替换主引导扇区和GRUB所在分区的引导记录,要用到GRUB的安装程序来完成
  2. 作为附加启动项安装 拷贝grldr到之前系统分区,添加boot.ini中内容c:\grldr=grub

GRUB启动方式

  1. 主引导扇区(stage1)->调用第二个扇区(512K,start)->加载第三到第N个扇区并调用(stage2)
  2. 主引导扇区->激活状态的分区的引导记录->NTLDR->boot.ini->grldr

GRUB菜单

menu.lst可以存放在C: C:/grub C:/boot/grub 任一位置,GRUB会自动搜索,若找不到则显示命令行

例子:加载XP

title WinXP
rootnoverify (hd0,0)
chainloader +1

例子:加载img,iso

title Windows xp
find –set-root /firadisk.ima
map –mem /firadisk.ima (fd0) #映射ima到fd0,ima会预读到内存
find –set-root –ignore-floppies /xp.iso
map /xp.iso (hd32) #映射iso到hd32
map –hook #GRUB 环境下立即发生作用,而不是等到敲入 boot 命令之后才起作用。
chainloader (hd32)

GRUB命令

cat 显示文件内容
cmp 比较两个文件内容
TAB键可以自动填充,如填充hd后面的序号,以及之后的分区号
clear 清屏
displaymem 显示 GRUB 所判断到的当前系统的内存分布,包括所有物理内存区域
find 在所有分区上查找文件名, 并显示包含该文件的设备。如果设置了参数 --set-root,则在找到第一个匹配后马上停止,并且把该设备设为根。
halt,reboot 关机 重启
help 帮助,后可跟命令名
hide,unhide 隐藏分区
makeactive 激活分区

引导iso时,一定映射到0xff或hd32上,这是专用于处理iso格式的分区

map --mem /test.iso (0xff)
chainloader (0xff)   这里不用+1,

引导dos或windows系统时,由于系统默认从第0个硬盘启动,所以要map系统位置到hd0

map (hd0) (hd2) 把hd0移动到hd2
map --hook
map --mem (hd2,0)/03pe.img (hd0)    从hd2上map系统文件(如03pe.img)到hd0,系统必须在hd0上,否则无法启动,提示找不到command
map --hook
chainloader (hd0,0)+1  这里要+1,网上说要引导分区的第一个扇区,不是很明白。。

grub4dos引导grub2, 只要引导core.img即可:

kernel (hd0,0)/boot/grub/i386-pc/core.img
boot

grub2 rescue进入grub2, 找到U盘中grub位置, 然后加载mnoral.mod模块:

set root=(hd0,msdos1)
set prefix=/boot/grub
insmod normal
normal

grub2引导linux系统, linux命令就是grub中的kernel命令, 注意后面两个参数, 必须要有, 指定root位置和读写方式:

linux (hd1,msdos3)/boot/vmlinuz root=/dev/sda3 rw
initrd (hd1,msdos3)/boot/initrd
boot

例子, U盘或硬盘安装linux系统:

grub引导安装linux系统的命令

准备文件:

重启进入Grub 命令行, 执行:

kernel (hd0,1)/vmlinuz boot=casper iso-scan/filename=/ubuntu-12.10-beta1-desktop-amd64.iso ro locale=zh_CN.UTF-8
initrd (hd0,1)/initrd.lz

进入ubuntu光盘系统, 安装ubuntu前, 懒卸载iso文件的挂载点:

sudo umount -l /isodevice

否则安装时无法格式化分区,也无法挂载根分区.

改变启动顺序

ls /etc/grub.d

有很多配置脚本,修改30_os-prober文件名成09_os-prober

执行

update-grub

说明:update-grub根据/etc/grub.d下文件,自动生成/boot/grub/grub.cfg(类似menu.lst文件)

另外还有/etc/default/grub,用来配置等待时间等,也是最后用update-grub,生成最终的grub.cfg

LiveCD下重装grub

sudo mount /dev/sda1 /mnt
sudo grub-install --root-directory=/mnt/ /dev/sda

Grub2

/etc/grub.d 这里有很多脚本,用来生成/boot/grub.conf

update-grub2, 使用上面的grub.d/*,生成grub.conf,当新安装系统时要调用 只能在linux菜能调用

grub2的优势是支持更多的文件系统,缺点是旧版本有bug,insmod时会报错,但安装新版到u盘就不怕了

安装最新grub2到u盘:

apt-get grub2
grub2-install --boot-directory=/media/udisk/boot(u盘路径)  /dev/sdb(u盘设备)

grub-rescue进入grub:

看有哪些分区, 依次测试是否存在文件

ls  
ls (hd0,msdos1)/boot/grub
ls (hd0,msdos2)/boot/grub

设置grub2里的root变量,唯一用途就是在grub2中表示一个文件时,不用再加上盘符

set root=(hd0,msdos1)

设置grub2的prefix变量,用途是insmod命令的搜索路径

set prefix=(hd0,msdos1)/boot/grub

加载normal模块,这里不能用(hd0,msdos1)/boot/grub/normal,因为prefix一定会附加在(hd0,msdos1)前面,出现错误路径

insmod normal

进入normal,进入grub2

normal

grub引导linux:

set root=(hd1,msdos1)    设置root变量,也可以不设,但后面的路径要加上盘符
linux /boot/vmlinuz[tab] root=/dev/sda1   注意这里是sda1,不是sda!!!
initrd /boot/initrd.gz[tab]
boot

grub引导windows:

drivemap -s (hd0) (hd1)     交换hd0和hd1,把硬盘放到hd0
chainloader(hd1,msdos1)    这里用了hd1,是因为输入hd1,按tab后,列出的是硬盘的内容。因为上面交换了hd0,hd1,这里应该用hd0的,可能是程序有问题。

grub2引导grub4dos:

linux16 (hd0,msdos1)/grldr.mbr
boot

grub4dos 进入archlinux.iso

进入grub4dos

map --heads=0 --sectors-per-track=0 --mem (hd1,4)/archlinux-2015.12.01-dual.iso (0xFF)  这里可以不用mem选项,节省内存
map --hook
kernel (0xFF)/arch/boot/i686/vmlinuz archisolabel=ARCH_201512   这里要指定iso设备的label,为ARCH_2015XX   就算指定错了,也可以在后面的ln -s中设置新label
initrd (0xFF)/arch/boot/i686/archiso.img
boot

提示wait 30s for /dev/disk/by-label/ARCH_201512

进入kernel

手动挂载iso

mkdir -p /mnt/sda5
mount /dev/sda5 /mnt/sda5
losetup -f /mnt/sda5/archlinux-2015.12.01-dual.iso
ln -s /dev/loop0 /dev/disk/by-label/ARCH_2015  这一步可以不要,因为上一步losetup之后/dev/disk/by-label目录中会出现新的iso设备,label为iso的label
exit