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)
cat 显示文件内容
cmp 比较两个文件内容
TAB键可以自动填充,如填充hd后面的序号,以及之后的分区号
clear 清屏
displaymem 显示 GRUB 所判断到的当前系统的内存分布,包括所有物理内存区域
find 在所有分区上查找文件名, 并显示包含该文件的设备。如果设置了参数 --set-root,则在找到第一个匹配后马上停止,并且把该设备设为根。
halt,reboot 关机 重启
help 帮助,后可跟命令名
hide,unhide 隐藏分区
makeactive 激活分区
map --mem /test.iso (0xff)
chainloader (0xff) 这里不用+1,
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,网上说要引导分区的第一个扇区,不是很明白。。
kernel (hd0,0)/boot/grub/i386-pc/core.img
boot
set root=(hd0,msdos1)
set prefix=/boot/grub
insmod normal
normal
linux (hd1,msdos3)/boot/vmlinuz root=/dev/sda3 rw
initrd (hd1,msdos3)/boot/initrd
boot
准备文件:
重启进入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
sudo mount /dev/sda1 /mnt
sudo grub-install --root-directory=/mnt/ /dev/sda
/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
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