系统安装完成后,用户就会发现/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
用户密码
看看打开的文件可作什么修改:
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
GRUB_DEFAULT=0 -------->设置默认启动项,按menuentry顺序。比如要默认从第
四个菜单项启动,数字改为3,若改为 saved,则默认为上次启动项。
GRUB_HIDDEN_TIMEOUT=0
默认为0,单系统时启动菜单自动隐藏,要取消自
动隐藏菜单,改为大于0再sudo update-grub。
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT="3"
----------->设置进入默认启动项的等候时间,默认值10
秒,按自己需要修改
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
----------->添加内核启动参
数,这个为默认
GRUB_CMDLINE_LINUX="noresume"
--------->手动添加内核启动参数,比
如 acpi=off noapic等可在这里添加,加 text 参数启动进入字符模式
加
参数启动进入字符模式。
# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console
---------->设置是否使用图形介面。去除前面#,仅使
用控制台终端,不使用图形介面
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480 设定图形介面分辨率,如不使用默认,把前面#去掉,
把分辨率改为800x600或1024x768
# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true
---------->设置grub命令是否使用UUID,去
掉#,使用root=/dev/sdax而不用root=UUDI=xxx
# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY="true"
----------->设定是否创建修复模式
菜单项
2、再看下/etc/grub.d目录下的脚本文件:
00_header,05_debian_theme,10_linux,20_memtest86+,30_os- prober,
40_custom这五个脚本对应grub.cfg上的各个部分,有的版本的grub可能把30_os-
prober分出另一部分为 30_os-others,这并不影响。怎样修改这些脚本文件才能保证
不会破坏update-grub的运行,又能让生成的grub.cfg合乎意愿呢? 其实很简单,只要
在脚本文件中找到
cat << EOF
********
********
********
EOF
这类语句,EOF中间的文本会直接写入grub.cfg中相应位置,所以个性化的语句添加
在这地方就可以了。
其他使用变量的语句不要随变做修改,除非你清楚修改后会有什么结果。
1)看看00_header,一样在终端中打开sudo gedit /etc/grub.d/00_header,找到这部分
cat << EOF
load_env ->加载由save_env保存在grubenv的变量
set default="${GRUB_DEFAULT}"
---------->使用/etc/default/grub中的设定值
if [ \${prev_saved_entry} ]; then
saved_entry=\${prev_saved_entry}
save_env saved_entry
prev_saved_entry=
------------>变里设置的变量由下句保存到grubenv
save_env prev_saved_entry
fi -------->这里回车添加新行后可插入需要添加的模块
insmod jpeg
------->添加背景图片格式支持,如jpeg,png,tga等。
insmod fat
-------->添加文件系统格式支持如fat,ntfs,也可在menuentry下添加
EOF
再看看最后这一段
cat << EOF
if [ \${recordfail} = 1 ]; then
set timeout=-1 -------->设定为若有启动失败记录,不倒计时,不会进入默认启动,
需手动选择才能启动选择项,若要设置为即使曾启动错误也进行默认启动,可把时间
设为
合适的正值,如 set timeout=5
else
set timeout=${GRUB_TIMEOUT}
------>使用/etc/default/grub中的设定值
fi
-------->这行后添加行
background_image (hd0,7)/boot/images/002.jpg
-------->添加背景图片的绝对路
径,可以按05_debian_theme修改图片路径。
EOF
2)05_debian_theme修改字体及背景颜色、添加背景图片
先打开文件 sudo gedit /etc/grub.d/05_debian_theme
看这里
cat << EOF
set menu_color_normal=white/black
set menu_color_highlight=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-mkconfig_lib
# this allows desktop-base to override our settings
f=/usr/share/desktop-base/grub_background.sh
if test -e ${f} ; then
source ${f}
else
WALLPAPER="/usr/share/images/desktop-base/moreblue-orbit-grub.png"
COLOR_NORMAL="black/black"
COLOR_HIGHLIGHT="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
......
再重启,漂亮的背景图片就会出现了。
3)10_linux这部分是自动搜索当前系统,建立当前系统的启动菜单,包括系统头,内
核等信息,不要随便修改,要使用个性菜单名,比如中文菜单,可适当添加:
先打开文件 sudo gedit /etc/grub.d/10_linux,找到
cat << EOF
menuentry "$1" {
-------->双引号内可添加个性化字符,$1变量也可改为定值,如
改为menuentry "启动 Ubuntu Karmic" {
recordfail=1
save_env recordfail
-------->如不要保存启动失败记录的,这两句可删除
EOF
if [ "x$3" = "xquiet" ]; then
cat << EOF
set quiet=1
EOF ->启动画面不用splash,要用跳动字符的,这段可删除
个性化菜单项也可在这里修改,即上面的menuenrty "$1"不变,修改下面的数值:
linux_entry "${OS}, Linux ${version}" \
------->可改为 linux_entry "启动 Ubuntu,
Linux ${version}"\
"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA}
${GRUB_CMDLINE_LINUX_DEFAULT}" \
quiet
if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then
linux_entry "${OS}, Linux ${version} (recovery mode)" \ --------->可改为
linux_entry "启动 Ubuntu, Linux ${version} (修复模式)"\
"single ${GRUB_CMDLINE_LINUX}"
fi
注意只修改引号内的字符,前面的menuentry,linux_entry和后面的\不要做修改。
4)20_memtest86+自动添加内存测试启动项
打开文件 sudo gedit /etc/grub.d/20_memtest86+,找到
cat << EOF
menuentry "Memory test (memtest86+)" {
-------->双引号内可添加个性字符如
menuentry "启动 内存测试"
linux16 $MEMTESTPATH
}
menuentry "Memory test (memtest86+, serial console 115200)" {
linux16 $MEMTESTPATH console=ttyS0,115200n8
}
EOF
上面有两内存测试项,可删除其中一个。
5)30_os-prober查找其他分区中存在的系统并建立菜单项,依次为windows,linux,
macos。
对于单系统,默认会隐藏菜单,可在这里去掉隐藏
先打开文件 sudo gedit /etc/grub.d/30_os-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 ${GRUB_HIDDEN_TIMEOUT} ; then
set timeout=0
fi
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=fs_uuid --device ${DEVICE} 2> /dev/null`"
cat << EOF
menuentry "${LONGNAME} (on ${DEVICE})" {
-------->比如改为menuentry "启动
MacOS" {
EOF
6)40_custom 自定义启动项,按菜单标准格式在后面添加即可,如
#!/bin/sh
exec tail -n +3 $0
# 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.
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 CDL_LANG=zh_CN.UTF-8
initrd /CDlinux/initrd
}
3、把各项脚本修改保存后,在终端执行
sudo update-grub
再执行
sudo gedit /boot/grub/grub.cfg
看看配置文件是不是和你想要的一样了。
如果有不够满意的地方,重新修改下脚本文件,再执行sudo update-grub