grub2基础教程-修订版
Posted Lywon的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grub2基础教程-修订版相关的知识,希望对你有一定的参考价值。
grub2基础教程-修订版
一、grub2新特性
1、grub2和grub有很多不同的地方: a)图形接口
b)使用了模块机制,通过动态加载需要✁模块来扩展功能
c)支持脚本语言,例如条件判断,循环、变量和函数
d)支持rescue模式,可用于系统无法引导的情况
-
国际化语言。包括支持非ASCII的字符集和类似gettext的消息分类,字体,图形控制台等等
-
有一个灵活✁命令行接口。如果没有配置文件存在,GRUB会自动进入命令模式
g)针对文件系统、文件、设备、驱动、终端、命令、分区表、os
loder的模块化、层次化、基于对象的框架
h)支持多种文件系统格式 i)可访问已经安装的设备上的数据 j)支持自动解压
2、设备的命名
grub2同样以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。设备是从0开始编
号,分区则是从1开始,主分区从1-4,逻辑分区从5开始,而grub分区编号是从0开始的。下面给出几个例子
:
(fd0):表示整个软盘
(hd0,1):表示BIOS中的第一个硬盘的第1个分区
(hd0,5)/boot/vmlinuz:表示BIOS中的第一个硬盘的第一个逻辑分区下的boot目录下的vmlinuz文件
二、grub2安装与启动
1、安装ubuntu9.10时,grub默认安装在第一硬盘(hd0)的mbr,其实就是把引导文件boot.img写入硬盘的mbr,当然,用户也可以选择不写入硬盘mbr而是写入linux分区的引导扇区。启动时根据mbr所提供信息找到启动分区后,加载分区内的grub核心文件core.img和配置文件grub.cfg,进入选择菜单画面,在菜单画面,按上下箭号选择需要系统菜单项,按Enter进入选项。
按e进入己选择菜单的编辑状态,在编辑状态下,由上下左右箭号来移动光
标,enter键换行,ctrl+x以编辑的内容启动,ctrl+c进命令行状态,按Esc退出,回到菜单项。
在需要使用额外的内核参数启动时,比如要加上acpi=off时,把光标移动到linux这一行最后,在splash后加上一空格再输入acpi=off,然后按ctrl+x启动。
按c进入命令行状态,按Tab键可查看所有可用的命令。
在命令行状态,可以根据需要加载或移除相应模块,也可用来启动在菜单没有显现的的系统。
比如,在第一硬盘的第一分区上装有windows
xp系统,但在菜单上没显示出来,我们可以命令行状态下输入命令启动:
grub>set root=(hd0,1)
grub>chainloader +1 grub>boot
又比如启动第二硬盘第一逻辑分区上的ubuntu系统:
grub>set root=(hd1,5)
grub>linux /boot/vmlinuz-xxx-xxx root=/dev/sdb5 grub>initrd
/boot/initrd.img-xxx-xxxgrub>boot
其中内核vmlinuz和initrd.img的版本号可用按Tab键自动查看。
2、下面介绍下在grub2中一些常用的命令 1)help
查看命令用法,如
help search:查看search命令详细用法 2)set
设置变量值,如
set default=0
set timeout=5
set root=(hd0,3)等等
需要调用变量AA的值时,使用(AA,如set root=(hd1,1),则)root=(hd1,1)
3)default定义默认引导的操作系统。0 表示第一个操作系统,1表示第2个,依此类推
4)timeout
定义在时间内用户没有按下键盘上的某个按键,自动引导default指定的操作系
统。
5)root
指定用于启动系统的分区。
6)insmod和rmmod
加载或移除某模块,如
insmod jpeg
insmod png insmod ntfs rmmod png等
7)drivemap
drivemap兼容grub的map,主要用于只能从第一硬盘(hd0)引导启动的系统如
win2000 xp 2003,比如要添加第二硬盘第一分区上的xp系统:menuentry "Windows XP"
set root=(hd1,1) drivemap -s (hd0) $root chainloader +1
8)ls
列出当前的所有设备。如(hd0),(hd0,1),(hd0,5),(hd1),(hd1,1),(hd1,2)等
ls -l
详细列出当前的所有设备。对于分区,会显示其label及uuid。
ls /
列出当前设为root的分区下的文件
ls (hd1,1)/
列出(hd1,1)分区根目录的文件
9)search
search -f /ntldr
列出根目录里包含ntldr文件✁分区,返回为分区号
search -l LINUX
✲索label✁LINUX✁分区。
search –set -f /ntldr
✲索根目录包含ntldr文件✁分区并设为root,注意如果多个分区含有ntldr文件,
set失去作用。 10)loopback
loopback命令可用于建立回放设备,如 loopback lo0 (hd1,1)/abc.iso
可以使用lo0设备来访问abc.iso里✁内容,比如说,可以从abc.iso里✁软盘映像中启动
loopback lo0 (hd1,1)/aa.iso
linux (lo0)/memdisk initrd (lo0)/abc.img
要删除某一回放设备,可以使用-d参数:
loopback -d lo0
11)pager
分页显示。
set pager=1
显示满一页时暂停,按space继续
set pager=0
取消分页显示
12)linux
用linux命令取代grub中✁kernel命令
13)chainloader
调用另一个启动器,如
chainloader (hd0,1)+1
调用第一硬盘第一分区引导扇区内✁启动器,可以✁windows或linux✁启动器
- grub2挂载软盘镜像
menuentry "Boot from DOS IMG"
linux16 /memdisk initrd16 /win98.img
对非标准✁1.4M和2.8M✁其他镜像挂载方法,需要指定 CHS参数:
menuentry "Boot from IMG"
linux16 /memdisk c=* h=* s=* floppy initrd16 /xxx.img
三、grub2配置文件详解
grub2改用grub.cfg为配置文件,配置文件包含以下基本内容:(红色为解释部分)
### BEGIN /etc/grub.d/00header ### loadenv
#加载变量,如果在grubenv保存变量,则启动时装载 set default="0"
#设置默认引导项,默认值为0 insmod ext2
#插入文件系统支持✁模块,除了用作启动✁分区外,其他分区格式可在menuentry底下再添加
set root=(hd0,8)
search –no-floppy –fs-uuid –set 2d61e5f9-1d2a-4167-a6f1-b991ba00878b
#指定uuid=2d61e5f9-1d2a-4167-a6f1-b991ba00878b✁分区为root分区,如果前面✁分区号(hd0,8)✁#uuid与这里✁uuid一致,这两句作用一样,如果不一致,则指定uuid
✁起作用。
if loadfont /usr/share/grub/unicode.pf2 ; then
#设置终端字体,unicode.pf2支持中文字符显示 set gfxmode=640x480
#设置显示分辨率,默认为640x480,可用800x600,1024x768,建议跟你想设定✁图片大小一致
insmod gfxterm
#插入终端模块gfxterm,支持中文字符显示和支持24位图像 insmod vbe
#插入vbe模块,GRUB2引入模块化机制,要使用它,需要在这里加入 if
terminaloutput gfxterm ; then true ; else
understand terminaloutput
terminal gfxterm
#设定grub2终端为gfxterm fi
fi
if [ $recordfail = 1 ]; then
set timeout=-1 # 若有启动失败✁记录,则菜单项不再倒计时
else
set timeout=10 #倒计时10秒后进按默认启动项启动
fi
#设定默认启动前等待时间,默认为10秒 ### END /etc/grub.d/00header ###
### BEGIN /etc/grub.d/05debiantheme ### set
menucolornormal=white/black
#设定菜单字体及背景颜色
set menucolorhighlight=black/blue
#设定选择项字体及背景颜色
#如果使用默认,背景将完全被蓝色挡住了,需要修改blue为black,背景图片才能显示
### END /etc/grub.d/05debiantheme ###
### BEGIN /etc/grub.d/10linux ###
#10linux为系统自动添加✁当前root分区linux引导项
#每个菜单项要包括menuentry双引号" "和大括号 才完整,否则不显示菜单
menuentry "Ubuntu, Linux 2.6.31-10-generic"
set quiet=1 insmod ext2
set root=(hd0,8)
search –no-floppy –fs-uuid –set 2d61e5f9-1d2a-4167-a6f1-b991ba00878b
#这句与set root=(hd0,8)效果一样,可删除其一,二者不一致以这句为准 linux
/boot/vmlinuz-2.6.31-10-generic
root=UUID=2d61e5f9-1d2a-4167-a6f1-b991ba00878b ro quiet splash
#不喜欢看到一长串✁, roo=UUID=***可用root=/dev/sda8(/分区✁分区号)代替
initrd /boot/initrd.img-2.6.31-10-generic
…
### END /etc/grub.d/10linux ###
#20memtest86+为系统自动添加✁内存测试菜单项 ### BEGIN
/etc/grub.d/20memtest86+ ### menuentry "Memory test (memtest86+)"
linux16 /boot/memtest86+.bin
menuentry "Memory test (memtest86+, serial console 115200)" linux16
/boot/memtest86+.bin console=ttyS0,115200n8
### END /etc/grub.d/20memtest86+ ###
#30os-prober或30others为系统自动查找并添加其他系统菜单项,按windows,
linux,macos顺序
#查找并添加,支持windows 7识别
### BEGIN /etc/grub.d/30os-prober ###
### END /etc/grub.d/30os-prober ### ### BEGIN /etc/grub.d/30otheros
###
OS # on /dev/sda1
menuentry "Microsoft Windows XP Professional" set root=(hd0,1)
search –no-floppy –fs-uuid –set e852-230b drivemap -s (hd0) $root
#对以ntldr引导✁系统如win2000,xp,win2003,因其引导机制只能从第一硬盘启动,系统会自动添加#映射命令,对vista和win7就没有这句命令
chainloader +1
### END /etc/grub.d/30otheros ###
#40custom为自定义✁启动项,如启动cdlinux ### BEGIN /etc/grub.d/40custom
### menuentry "CDLinux"
set root=(hd0,8)
linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDLLANG=zhCN.UTF-8
initrd /CDlinux/initrd
### END /etc/grub.d/40custom ###
定制个性化✁配置文件,可以加入背景图片,使用中文字符,让启动画面独具特色,而不✁单调✁黑、白、蓝三色。下面✁一张经美化启动画面:
四、脚本修改
该怎样定制个性化✁配置文件呢?
系统安装完成后,用户就会发现/boot/grub/grub.cfg文件只有root权限可读,如果要直接修改grub.cfg文件,要先修改其权限。好不容易把grub.cfg修改好了,系统内核
或grub升级时,会自动执行update-grub,grub.cfg文件就会被打回原形,如何保证修改后✁配置文件能一直保留下来呢?
其实不用修改grub.cfg,只要把个性化配置写入/etc/default/目录下✁grub和/etc/
gurb.d目录下✁脚本文件,以后不管升级内核或者✁升级grub所执行✁update-grub,都会按要求创建个性化✁grub.cfg。
1、首先看下 /etc/default/grub,先从应用程序-附件里打开终端,输入 sudo
gedit /etc/default/grub
用户密码
看看打开✁文件可作什么修改:
/boot/grub/grub.cfg.
GRUBDEFAULT=0 >设置默认✁动项,按menuentry顺序。比如要默认从第
四个菜单项✁动,数字改为3,若改为 saved,则默认为上次✁动项。
GRUBHIDDENTIMEOUT=0
默认为0,单系统时✁动菜单自动隐藏,要取✲自动隐藏菜单,改为大于0再sudo
update-grub。 GRUBHIDDENTIMEOUTQUIET=true
GRUBTIMEOUT="3" >设置进入默认✁动项✁等候时间,默认值10
秒,按自己需要修改
GRUBDISTRIBUTOR=`lsbrelease -i -s 2> /dev/null || echo Debian`
GRUBCMDLINELINUXDEFAULT="quiet splash" >添加内核✁动参
数,这个为默认
GRUBCMDLINELINUX="noresume" >手动添加内核✁动参数,比
如 acpi=off noapic等可在这里添加,*加 text 参数✁动进入字符模式*。
#GRUBTERMINAL=console >设置✁否使用图形介面。去除前面#,仅使
用控制台终端,不使用图形介面
VBE # you can see them in real GRUB with the command `vbeinfo\'
#GRUBGFXMODE=640x480
设定图形介面分辨率,如不使用默认,把前面#去掉,把分辨率改为800x600或1024x768
Linux #GRUBDISABLELINUXUUID=true >设置grub命令✁否使用UUID,去
掉#,使用root=/dev/sdax而不用root=UUDI=xxx
#GRUBDISABLELINUXRECOVERY="true" >设定✁否创✁修复模式
菜单项
2、再看下/etc/grub.d目录下✁脚本文件:
00header,05debiantheme,10linux,20memtest86+,30os- prober,
40custom这五个脚本对应grub.cfg上✁各个部分,有✁版本✁grub可能把30os-
prober分出另一部分为
30os-others,这并不影响。怎样修改这些脚本文件才能保证不会破坏update-grub✁运行,又能让生成✁grub.cfg合乎意愿呢?
其实很简单,只要在脚本文件中找到
cat << EOF
********
********
******** EOF
这类语句,EOF中间✁文本会直接写入grub.cfg中相应位置,所以个性化✁语句添加在这地方就可以了。
其他使用变量✁语句不要随变做修改,除非你清楚修改后会有什么结果。
- 看看00header,一样在终端中打开sudo gedit
/etc/grub.d/00header,找到这部分 cat << EOF
loadenv ->加载由saveenv保存在grubenv✁变量
set default="$GRUBDEFAULT" >使用/etc/default/grub中✁设定值
if [ \\$prevsavedentry ]; then
savedentry=\\$prevsavedentry saveenv savedentry
prevsavedentry= >变里设置✁变量由下句保存到grubenv
saveenv prevsavedentry
fi >这里回车添加新行后可插入需要添加✁模块
insmod jpeg >添加背景图片格式支持,如jpeg,png,tga等。
insmod fat >添加文件系统格式支持如fat,ntfs,也可在menuentry下添加
EOF
再看看最后这一段
cat << EOF
if [ \\$recordfail = 1 ]; then
set timeout=-1 >设定为若有✁动失败记录,不倒计时,不会进入默认✁动,
需手动选择才能✁动选择项,若要设置为即使曾✁动错误也进行默认✁动,可把时间设为
else
合适✁正值,如 set timeout=5
set timeout=$GRUBTIMEOUT >使用/etc/default/grub中✁设定值
fi >这行后添加行
backgroundimage (hd0,7)/boot/images/002.jpg >添加背景图片✁绝对路
径,可以按05debiantheme修改图片路径。
EOF
- 05debiantheme修改字体及背景颜色、添加背景图片先打开文件 sudo
gedit /etc/grub.d/05debiantheme
看这里
cat << EOF
set menucolornormal=white/black >设置菜单全局✁字体和背景颜色
set menucolorhighlight=black/white >设置选择项✁字体和背景颜色。
EOF
可供使用菜单颜色有:
black(当背景色时为透明),blue,green,cyan,red,magenta,brown,light-
gray,dark-gray,light-blue,light-green,
light-cyan,light-red,light-magenta,yellow,white
添加背景图片,看这一段
source /usr/lib/grub/grub-mkconfiglib
f=/usr/share/desktop-base/grubbackground.sh
if test -e $f ; then source $f
else
WALLPAPER="/usr/share/images/desktop-base/moreblue-orbit-grub.png"
COLORNORMAL="black/black"COLORHIGHLIGHT="magenta/black"
fi
这里会自动✲索背景文件,把合适✁背景图片更名为 moreblue-orbit-
grub.png(moreblue-orbit-grub.tga或moreblue-orbit-grub.jpeg),再放在/usr/share/
images/desktop-base/目录 下,然后执行 sudo update-grub,会出现如下✁
Generating grub.cfg …
Found background image: moreblue-orbit-grub.png
……
再重✁,漂亮✁背景图片就会出现了。
- 10linux这部分✁自动✲索当前系统,✁立当前系统✁✁动菜单,包括系统头,内核等信息,不要随便修改,要使用个性菜单名,比如中文菜单,可适当添加:
先打开文件 sudo gedit /etc/grub.d/10linux,找到
cat << EOF
menuentry "$1" >双引号内可添加个性化字符,$1变量也可改为定值,如
改为menuentry "✁动 Ubuntu Karmic" recordfail=1
saveenv recordfail >如不要保存✁动失败记录✁,这两句可删除
EOF
if [ "x$3" = "xquiet" ]; then cat << EOF
set quiet=1
EOF ->✁动画面不用splash,要用跳动字符✁,这段可删除
个性化菜单项也可在这里修改,即上面✁menuenrty "(1"不变,修改下面✁数值:
linux_entry ")OS, Linux $version" \\ >可改为 linuxentry "✁动 Ubuntu,
Linux $version"\\
"$GRUBCMDLINELINUX $GRUBCMDLINEEXTRA
$GRUBCMDLINELINUXDEFAULT" \\
quiet
if [ "x(GRUB_DISABLE_LINUX_RECOVERY" != "xtrue" ]; then linux_entry
")OS, Linux $version (recovery mode)" \\ >可改为
linuxentry "✁动 Ubuntu, Linux $version (修复模式)"\\
"single $GRUBCMDLINELINUX"
fi
注意只修改引号内✁字符,前面✁menuentry,linuxentry和后面✁\\不要做修改。
- 20memtest86+自动添加内存测试✁动项
打开文件 sudo gedit /etc/grub.d/20memtest86+,找到
cat << EOF
menuentry "Memory test (memtest86+)" >双引号内可添加个性字符如
menuentry "✁动 内存测试" linux16 $MEMTESTPATH
menuentry "Memory test (memtest86+, serial console 115200)" linux16
$MEMTESTPATH console=ttyS0,115200n8
EOF
上面有两内存测试项,可删除其中一个。
- 30os-prober查找其他分区中存在✁系统并✁立菜单项,依次为windows,linux,
macos。
对于单系统,默认会隐藏菜单,可在这里去掉隐藏先打开文件 sudo gedit
/etc/grub.d/30os-prober
单ubuntu系统会自动隐藏菜单,要取✲隐藏菜单,可把这部份✁三个timeout=0改为和
/etc/default/grub中✁timeout一致,比如timeout=10。 cat <<EOF
if [ \\$timeout != -1 ]; then if keystatus; then
if keystatus –shift; then
set timeout=-1 else
set timeout=0
fi else
if sleep$verbose –interruptible 3 ; then set timeout=0
fi
fi
fi
EOF
else
cat << EOF
if [ \\$timeout != -1 ]; then
if sleep$verbose –interruptible $GRUBHIDDENTIMEOUT ; then set
timeout=0fi
fi
EOF
下面这段自动查找并添加windows、linux和macos✁动项,可在menuentry内修改个性字符
windows✁动项
for OS in $OSPROBED ; do
……
if [ -z "(LONGNAME" ] ; then LONGNAME=")LABEL"
fi
……
cat << EOF
menuentry "$LONGNAME (on $DEVICE)" >比如改为menuentry "✁动
Windows XP"
EOF
linux✁动项 linux)
LINUXPROBED="`linux-boot-prober $DEVICE 2> /dev/null | tr \' \' \'^\' |
paste -s -d\' \'`"
……
if [ -z "(LLABEL" ] ; then LLABEL=")LONGNAME"
fi
cat << EOF
menuentry "$LLABEL (on $DEVICE)" >比如改为menuentry "✁动
Mandriva"
EOF
macos✁动项
macosx)
OSXUUID="`grub-probe –target=fsuuid –device $DEVICE 2> /dev/null`"
cat << EOF
menuentry "$LONGNAME (on $DEVICE)" >比如改为menuentry "✁动
MacOS"
EOF
- 40custom 自定义✁动项,按菜单标准格式在后面添加即可,如
#!/bin/sh
exec tail -n +3 $0
the # menu entries you want to add after this comment. Be careful not to
change # the \'exec tail\' line above.
menuentry "✁动 Veket" set root=(hd0,8)
linux /veket/vmlinuz root=/dev/ram0 PMEDIA=hd initrd /veket/initrd.gz
menuentry "✁动 CDLinux" set root=(hd0,8)
linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDLLANG=zhCN.UTF-8
initrd /CDlinux/initrd
3、把各项脚本修改保存后,在终端执行 sudo update-grub
再执行
sudo gedit /boot/grub/grub.cfg
看看配置文件✁不✁和你想要✁一样了。
如果有不够满意✁地方,重新修改下脚本文件,再执行sudo update-grub
4、ubuntu和windows双系统,怎样让系统默认为从windows✁动
在 /etc/grub.d目录中✁脚本文件✁文件名都✁以数字开头,这确定了在执行update-
grub时各文件内容被执行✁顺序,我们只要把
30os-prober这个文件名✁数字30改为
05到10之间✁数字即可(没多少可选06、07、08、09),比如改为08os-prober,这样创✁出来✁grub.cfg内✁菜单项,windows✁排序就会自动在ubuntu之前
五、使用grub2常见错误及修复方法
1、双系统,重装windows引起没有ubuntu✁动项
使用安装版✁windows重装windows时会改写mbr,造成grub丢失,可以用grub4dos引导进入ubuntu后修复grub或用livecd✁动后修复grub。
1)用grub4dos修复ubuntu
先下载最新版✁grub4dos,下载地址http://nufans.net/grub4dos/
,如果✁xp系统,把grub4dos压缩包内✁grldr复制到C盘根目录下,修改boot.ini,在最后加上一行
_c:\\grldr_="grub4dos",
对
于vista/win7系统,把压缩包内✁grldr.mbr和grldr复制到C盘根目录下,在C盘自己
✁立一个boot.ini文件,若有boot隐
藏分区✁,先给boot分区分配盘符,再把grldr,
grldr.mbr和boot.ini放在boot分区下,boot.ini内容如下:
Win7使用软改激活✁请不要使用此方法,否则会造成win7不能✁动。
然后在根目录新✁一个menu.lst,内容为
timeout 0
default 0
title grub2
find –set-root /boot/grub/core.img kernel /boot/grub/core.img
boot
(有/boot分区✁改为
find –set-root /grub/core.img
kernel /grub/core.img)
重✁后选择Grub4Dos会自动转入grub2,从grub2菜单项选择ubuntu✁动后,在终端执行
sudo grub-install /dev/sda
将grub装入第一硬盘✁mbr,如要装入第二硬盘✁mbr把sda改为sdb,第三硬盘为
sdc,类推。
至于要把grub装到sda或sdb或sdc✁mbr上,需根据自己情况确定,看看要设置哪一块硬盘为✁动盘,就把grub装到那块硬盘✁mbr上。
2)用livecd修复grub
用ubuntu9.10✁livecd✁动后,打开终端
假如你✁ubuntu✁ / 分区✁sda7,又假如 /boot分区✁
sda6,用livecd✁动,在终端下输入
sudo -i
mount /dev/sda7 /mnt
mount /dev/sda6 /mnt/boot (如果没 /boot 单独分区这步跳过)
grub-install –root-directory=/mnt /dev/sda
和前面一样,要装入第二硬盘✁把sda改为sdb。
如果grub.cfg己丢失,或grub.cfg出现错误,需要重✁✁继续执行下面操作:
mount –bind /proc /mnt/proc
mount –bind /dev /mnt/dev mount –bind /sys /mnt/sys chroot /mnt
update-grub umount /mnt/sysumount /mnt/dev umount /mnt/proc exit
- 用带grub✁动✁光盘或U盘修复
如果手上有grub✁动✁工具盘,用工具盘✁动,在grub菜单上按c进入命令行状态,在grub>提示符下输入
grub>find /boot/grub/core.img (有/boot分区✁用find /grub/core.img)
(hdx,y) (显示查找到✁分区号)grub>root (hdx,y)
grub>kernel /boot/grub/core.img (/boot分区✁用 kernel /grub/core.img)
grub>boot
执行boot后能转入grub2菜单,✁动ubuntu后,再在ubuntu终端下执行
sudo grub-install /dev/sda (或sdb,sdc等)修复grub。
如果ubuntu✁✁动分区使用ext4格式,要有支持ext4格式✁grub才能修复。
- 没安装引导器✁ grub4dos引导ubuntu✁方法
按第一步✁方法使用 boot.ini ✁立grub4dos引导项,自己编写
menu.lst,内容如下
timeout 3
default 0
title Ubuntu 9.10
root (hdx,y) > (hd0x,y) 为 /boot分区✁分区号
kernel /vmlinuz-xxx-generic root=/dev/sdxy >/dev/sdxy 为 / 分区✁分区号
initrd /initrd.img-xxx-generic
没 /boot 分区✁用
timeout 3
default 0
title Ubuntu 9.10 root (hdx,y)
kernel /boot/vmlinuz-xxx-generic root=/dev/sdxy initrd
/boot/initrd.img-xxx-generic
2、安装时grub没装在mbr上而选择装在linux分区✁pbr上,怎么引导ubuntu
1)按前面✁方法一,以grub4dos引导转入grub2。
2)把ubuntu分区/boot/grub目录下✁boot.img提取出来,放到C盘根目录下,然后修改boot.ini,在最后添加一行
_C:\\boot.img_="grub2"
对vista/7可在C盘新✁一个boot.ini,内容为
[boot loader] timeout=0 default=c:\\boot.img [operating systems]
c:\\boot.img="grub2"
重✁后选择grub2就可进入grub2菜单。此法兼容性较差,成功率低,仅供测试。
3、由于分区调整引起分区号或分区UUID改变造成✁grub2不能正常✁动
己安装好系统,对硬盘再次进行分区调整时可能会改变现有分区✁分区号发生变化,或者某种原因改变✁动分区✁UUID,都会造成grub2不能正常✁动,而✁动进入修复模式(grub
rescue),这时就要对grub进行修复。
-
用ubuntu9.10✁livecd光盘✁动,进入试用桌面系统后,再修复grub,操作方法如第一种情况✁第二种方法—
-
在rescue模式下✁动并修复
由于分区问题,✁动时会自动进入rescue模式,只要grub核心文件还在分区内,就能由rescue模式转到normal模式,进而通过命令进入系统。下面这个就✁rescue介面:
由于在rescue模式下,只有少量✁基本命令可用,必须通过一定✁操作才能加载正常模块,然后进入正常模式。
rescue模式下可使用✁命令有:set,ls,insmod,root,prefix(设置✁动路径)
先假设grub2✁核心文件在(hd0,8)分区,再来看看怎样从rescue模式进入从(hd0,8)✁动✁正常模式(normal)。
在rescue模式下search命令不能用,对不清楚grub2文件处于哪个分区✁,可以用ls命令查看,比如
ls (hd0,8)/ 查看(hd0,8)分区根目录,看看有没有boot文件夹
ls (hd0,8)/boot/ 查看(hd0,8)分区✁/boot目录下文件
ls (hd0,8)/boot/grub/ 查看(hd0,8)分区/boot/grub目录下文件
通过文件查看,可以确定grub2核心文件处于哪个分区,接下来就可以进行从rescue到
normal✁转变动作:
先 ls 看看分区,根据分区列表,猜下 / 分区✁编号再 ls (hd0,x)/
看分区目录下文件确定找到 / 分区,不对✁话继续找。找到 / 分区✁ (hd0,x)
继续
grub rescue>root=(hd0,x)
grub rescue>prefix=/boot/grub grub rescue>set root=(hd0,x)
grub rescue>set prefix=(hd0,x)/boot/grub grub rescue>insmod normal
rescue>normal >若出现✁动菜单,按c进入命令行模式
rescue>linux /boot/vmlinuz-xxx-xxx root=/dev/sdax
rescue>initrd /boot/initrd.img-xxx-xxx rescue>boot
内 核版本号 -xxx-xxx可以按Tab键查看后再手动补全。
有 boot分区✁,要先找出 /boot 分区 (hd0,x),再找出 / 分区✁
(hd0,y),同样用 ls (hd0,x) 和 ls (hd0,y)/ ✁方式确定分区
grub rescue>root=(hd0,x)
grub rescue>prefix=/grub grub rescue>set root=(hd0,x)
grub rescue>set prefix=(hd0,x)/grub grub rescue>insmod normal
rescue>normal >若出现✁动菜单,按c进入命令行模式
rescue>linux /vmlinuz-xxx-xxx root=/dev/sday
rescue>initrd /initrd.img-xxx-xxx rescue>boot
说明:
- 由于grub2版本✁✁不一致,有✁可能在第9步insmod
normal.mod加载正常模块后直接进入normal模式,即出现了normal
grub>✁提示符,这种情况就不能执行第10
步,即可以跳过normal命令✁输入。
-
虽然输入normal命令会出现菜单,但由于缺少加载内核✁Linux命令,直接从菜单不能进入系统,需要按c在命令行继续操作。
-
使用/boot单独分区✁,要正确修改路径,如 prefix=(hd0,8)/grub
insmod /grub/normal.mod
另外root=/dev/sda8也要修改根分区✁分区号。
4)按boot✁动系统后,再在系统下打开终端,执行命令修复grub重✁配置文件grub.cfg
sudo update-grub
重✁grub到第一硬盘mbr sudo grub-install /dev/sda
4、双硬盘双系统 Grub Loading时间过长✁解决方案
grub2✁boot.img设定root✁uuid从第一分区开始✲索分区✁/boot/grub下✁模块并加载,
如果linux分区处于第二硬盘甚至第三硬盘,会导致✲索时间过长而,出现菜单时间会长达10多秒。
对双(多)硬盘✁情况✁议把grub安装在ubuntu所在硬盘✁mbr上,/boot分区或 /
分区 尽量靠前,并设该硬盘为✁动盘,会大大缩短✁动时间。
5、重复一下,单linux系统或硬盘安装时iso放在C盘,umount
/isodevice引起✁误认为单系统不能出现菜单项✁几种处理方法。
-
开机自检后时按几下shift键,可调出菜单项
-
sudo update-grub
重✁grub.cfg,会发现新✁系统而改写grub.cfg,一般能出现菜单项。
- 如第二种方法不能解决,直接修改grub.cfg
把在### BEGIN /etc/grub.d/30os-prober 中✁这一段
if keystatus; then
if keystatus –shift; then set timeout=-1
else
set timeout=0 fi
else
if sleep$verbose –interruptible 3 ; then set timeout=0
fi fi
整段删除或修改三处set timeout=<大于0>,再执行 sudo update-grub
6、安装 ubuntu 9.10 后出现 Error : No such device:
xxx-xxx-xxx,不能✁动✁修复办法(未经实机测试)
由于grub2兼容性问题,少部分电脑安装完ubuntu9.10重✁时会出现
Error:no such device:3c7c1d30-86c7-4ea3-ac16-30d6b0371b02 Failed to
boot default entries.
Press any key to continue.
原因✁电脑不支持 uuid✁✲索, soier ✁修复过程证实了这个问题,见
http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=238346
原贴使用✁✁ live DVD进入修复系统模式,✁shell 下change root 修复,livecd
没有修复系统模式,现✁根据他✁方法写个 livecd
(能支持ext4读写✁其他版本✁live
Linux一可以)下✁修复办法,希望有这个问题✁朋友测试下看行不行(我电脑没这个
问题,没办法测试 ):
-
、livecd ✁动进入试用系统
-
、挂载 / 分区,比如 / 分区为 /dev/sda7 sudo mount /dev/sda7 /mnt
如果有 /boot 单独分区,则挂载 /boot 分区
- 、修改 grub.cfg
sudo chmod +w /mnt/boot/grub/grub.cfg
sudo chmod +w /mnt/grub/grub.cfg (/boot 单独分区✁) sudo gedit
/mnt/boot/grub/grub.cfg
sudo gedit /mnt/grub/grub.cfg (/boot 单独分区✁)找到 grub.cfg 可所有✁这句
search –no-floppy –fs-uuid –set 3c7c1d30-86c7-4ea3-ac16-30d6b0371b02
✁前面加上 # 号注释掉
3c7c1d30-86c7-4ea3-ac16-30d6b0371b02
这句✁grub.cfg中有好几处,后面✁uuid不尽相同,要全部找到并注释掉
- 、重✁试试能否进入系统,可这进系统再进行下个步 5)、sudo gedit
/usr/lib/grub/grub-mkconfiglib
找到173-175行
if fsuuid="`$grubprobe –device $device –target=fsuuid 2>
/dev/null`" ; then
echo "search –no-floppy –fs-uuid –set $fsuuid" fi
前面全部加#注释掉,记住从 if 开始到 fi结束,以防止语法错误
/dev/null`" ; then
然后
sudo update-grub
这样重✁出来✁ grub.cfg 就没有
search –no-floppy –fs-uuid –set 3c7c1d30-86c7-4ea3-ac16-30d6b0371b02
✁语句
7、如何从grub2回到grub (wubi使用者勿试) sudo apt-get purge grub-pc
清除grub2
sudo rm -fr /boot/grub/*
sudo apt-get install grub >安装 grub
sudo grub-install /dev/sda >安装grub到第一硬盘mbr,第二硬盘为/dev/sdb,
若安装到分区引导扇区则为分区号如 /dev/sda7等 sudo update-grub
重✁menu.lst
8、重装windows后出现 error: no such device
由于重装windows时会改变windows引导分区✁uuid,原来✁配置文件grub.cfg中✁
search –no-floppy –fs-uuid –set xxx-xxx
在✲索分区时会按原来✁uuid查找分区,找不到相应✁uuid,就出现 error: no such
device,在ubuntu下执行
sudo update-grub
重✁grub.cfg,就能解决。此方法也适用于用convert命令把fat改为ntfs格式时出现✁
error。
python基础教程修订版2 第四章问题求问
代码如下
people={
‘Alice‘:{
‘phone‘:‘2341‘,
‘addr‘:‘Foo drive 23‘
},
‘Beth‘:{
‘phone‘:‘9102‘,
‘addr‘:‘Bar street 42‘
},
‘Cecil‘:{
‘phone‘:‘3158‘,
‘addr‘:‘Baz avenue 90‘
}
}
labels={
‘phone‘:‘phone number‘,
‘addr‘:‘address‘
}
name=raw_input(‘Name:‘)
if request == ‘p‘:key = ‘phone‘
if request == ‘a‘:key = ‘addr‘
if name in people:
print("%s‘s %s is %s. " % \ (name, labels[key], people[name][key]))
我检查了几遍都没有发现问题在哪里,求大神指出
以上是关于grub2基础教程-修订版的主要内容,如果未能解决你的问题,请参考以下文章
python基础学习笔记——Python基础教程(第2版 修订版)第八章(异常)
python基础学习笔记——Python基础教程(第2版 修订版)第一章
python基础教程(第2版·修订版)中文版 高清pdf版[30MB]下载