Ubuntu grub2的启动配置文件grub.cfg,为了修改另人生厌的时间

本文详细介绍了在Ubuntu9.10中使用GRUB2作为启动管理器的配置方法,包括如何修改启动配置文件grub.cfg,设置默认启动系统及等待时间,以及如何使系统自动检测并列出所有可启动的操作系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转自http://hi.baidu.com/detax/blog/item/90f18b54a8ef5253d00906e4.html

升级到Ubuntu 9.10后,就要接触grub2了,它和以前的版本有了很多的不同。这里是一个基础教程。

一、grub2的启动配置文件grub.cfg

grub2的启动配置文件grub.cfg是/boot/grub/grub.cfg,而不是以前的memu.lst。
如果你是多系统,有Ubuntu和windows,那么用下面的命令,可以使grub2得到所以可以启动的系统。
sudo update-grub
实际就是让系统自己生成合适的grub.cfg文件。
这个grub.cfg文件是只读属性,so如果你要修改它,需要权限。
sudo chmod +w /boot/grub/grub.cfg
然后可以编辑grub.cfg了。
sudo gedit /boot/grub/grub.cfg

二、默认系统和等待时间
1、set default=0
这是说从第一项启动。每个启动项都是以menuentry开始,menuentry后面“xxx”是启动项名称,然后{xxx}是启动代码。
### BEGIN /etc/grub.d/10_linux ###menuentry “Ubuntu, Linux 2.6.31-14-generic” {recordfail=1if [ -n ${have_grubenv} ]; then save_env recordfail; fiset quiet=1insmod ext2set root=(hd0,6)search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro   quiet splashinitrd /boot/initrd.img-2.6.31-14-generic}menuentry “Ubuntu, Linux 2.6.31-14-generic (recovery mode)” {recordfail=1if [ -n ${have_grubenv} ]; then save_env recordfail; fiinsmod ext2set root=(hd0,6)search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro singleinitrd /boot/initrd.img-2.6.31-14-generic}### END /etc/grub.d/10_linux ###### BEGIN /etc/grub.d/20_memtest86+ ###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/20_memtest86+ ###### BEGIN /etc/grub.d/30_os-prober ###menuentry “Microsoft Windows XP Home Edition (on /dev/sda1)” {insmod ntfsset root=(hd0,1)search –no-floppy –fs-uuid –set 5c108a1c1089fd70drivemap -s (hd0) ${root}chainloader +1}if keystatus; thenif keystatus –shift; thenset timeout=-1elseset timeout=10fielseif sleep$verbose –interruptible 3 ; thenset timeout=10fifi### END /etc/grub.d/30_os-prober ###### BEGIN /etc/grub.d/10_linux ###
menuentry “Ubuntu, Linux 2.6.31-14-generic” {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,6)
search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro   quiet splash
initrd /boot/initrd.img-2.6.31-14-generic
}
menuentry “Ubuntu, Linux 2.6.31-14-generic (recovery mode)” {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
insmod ext2
set root=(hd0,6)
search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro single
initrd /boot/initrd.img-2.6.31-14-generic
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_memtest86+ ###
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/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry “Microsoft Windows XP Home Edition (on /dev/sda1)” {
insmod ntfs
set root=(hd0,1)
search –no-floppy –fs-uuid –set 5c108a1c1089fd70
drivemap -s (hd0) ${root}
chainloader +1
}
if keystatus; then
if keystatus –shift; then
set timeout=-1
else
set timeout=10
fi
else
if sleep$verbose –interruptible 3 ; then
set timeout=10
fi
fi
### END /etc/grub.d/30_os-prober ###
我 的第五个启动项是menuentry “Microsoft Windows XP Home Edition (on /dev/sda1)”,我要它默认是以xp启动,所以修改为set default=”4″。(hd0,1)表示第一块硬盘的第一个分区,我的Linux在(hd0,6)。
当然,你也可以把你需要默认启动的系统放到最前面,那么就还是set default=0
2、set timeout=10
if [ ${recordfail} = 1 ]; then
set timeout=-1
else
set timeout=10
fi
这里停留在grub选择系统界面的时间就是10秒,即set timeout=10。
有时候我并不想等待这么久,我直接启动xp,需要Ubuntu时才按几下Shift键进入grub选择系统界面。可以添加如下代码:
if keystatus; then
if keystatus –shift; then
set timeout=-1
else
set timeout=10
fi
else
if sleep$verbose –interruptible 3 ; then
set timeout=10
fi
fi

三、其他详细配置说明

请点击此处下载grub2基础教程-修订版.pdf

四、我的grub.cfg文件

安装了xp和Ubuntu,默认启动xp,在电脑启动grub时,按Shift键进入系统选择界面。

#

# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s /boot/grub/grubenv ]; then
have_grubenv=true
load_env
fi
set default=”4″
if [ ${prev_saved_entry} ]; then
saved_entry=${prev_saved_entry}
save_env saved_entry
prev_saved_entry=
save_env prev_saved_entry
fi
insmod ext2
set root=(hd0,6)
search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=640×480
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don’t
# understand terminal_output
terminal gfxterm
fi
fi
if [ ${recordfail} = 1 ]; then
set timeout=-1
else
set timeout=10
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
menuentry “Ubuntu, Linux 2.6.31-14-generic” {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
set quiet=1
insmod ext2
set root=(hd0,6)
search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro   quiet splash
initrd /boot/initrd.img-2.6.31-14-generic
}
menuentry “Ubuntu, Linux 2.6.31-14-generic (recovery mode)” {
recordfail=1
if [ -n ${have_grubenv} ]; then save_env recordfail; fi
insmod ext2
set root=(hd0,6)
search –no-floppy –fs-uuid –set 040508ff-fec7-4c66-ba64-a09f8abe8059
linux /boot/vmlinuz-2.6.31-14-generic root=UUID=040508ff-fec7-4c66-ba64-a09f8abe8059 ro single
initrd /boot/initrd.img-2.6.31-14-generic
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_memtest86+ ###
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/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry “Microsoft Windows XP Home Edition (on /dev/sda1)” {
insmod ntfs
set root=(hd0,1)
search –no-floppy –fs-uuid –set 5c108a1c1089fd70
drivemap -s (hd0) ${root}
chainloader +1
}
if keystatus; then
if keystatus –shift; then
set timeout=-1
else
set timeout=10
fi
else
if sleep$verbose –interruptible 3 ; then
set timeout=10
fi
fi
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###
一、grub.cfg详解(红色为说明)
说明:grub.cfg默认为只读,需要个性化配置文件的,建议不要直接修改grub.cfg,请参考链接的pdf文档和google文档。

转载于:https://www.cnblogs.com/AI-Algorithms/p/3586020.html

<think>我们之前已经讨论过,直接修改`grub.cfg`文件是无效的,因为它在系统更新或执行`update-grub`时会被覆盖。用户的问题正是修改后重启发现文件恢复,说明用户可能直接修改了`grub.cfg`。因此,我们需要引导用户使用正确的方法修改GRUB配置,并确保修改持久化。 ### 解决方案: 1. **修改正确的配置文件**:用户应该修改`/etc/default/grub`文件,而不是`grub.cfg`。 2. **更新配置**:修改后运行`sudo update-grub`命令,使更改写入`grub.cfg`。 3. **处理可能的覆盖问题**:如果用户修改了`/etc/default/grub`后仍然被覆盖,则需要检查是否有其他进程(如cloud-init)在重置配置,或者考虑锁定文件。 ### 详细步骤: #### 步骤1:修改GRUB的默认配置文件 打开`/etc/default/grub`文件进行编辑: ```bash sudo nano /etc/default/grub ``` 在此文件中,你可以修改GRUB的配置参数。例如: - `GRUB_TIMEOUT`:设置菜单等待时间(秒) - `GRUB_CMDLINE_LINUX_DEFAULT`:设置内核启动参数(例如添加`quiet splash`等) #### 步骤2:更新GRUB配置 修改保存后,运行以下命令来更新`/boot/grub/grub.cfg`: ```bash sudo update-grub ``` 此命令会根据`/etc/default/grub`和`/etc/grub.d/`中的脚本重新生成`grub.cfg`。 #### 步骤3:验证更改 重启系统前,可以检查`grub.cfg`文件是否已更新: ```bash grep "GRUB_TIMEOUT" /boot/grub/grub.cfg ``` 如果显示的时间与你设置的相同,则说明更新成功。 #### 特殊情况:修改后仍然被覆盖 如果按照上述步骤操作后,重启系统仍然发现配置被恢复,则可能是以下原因: ##### 原因1:cloud-init重置配置(常见于云服务器) cloud-init在每次启动时可能会重置网络和GRUB配置。解决方法:禁用cloud-init对GRUB配置的修改。 ```bash # 创建配置文件禁用cloud-init的network配置(这也会影响GRUB配置的生成) echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg # 清理cloud-init缓存并重启 sudo cloud-init clean -r ``` ##### 原因2:系统更新或自动脚本覆盖 某些系统更新(尤其是内核更新)会自动运行`update-grub`。如果你修改了`/etc/default/grub`,那么更新后生成的`grub.cfg`会包含你的修改。但如果你发现`/etc/default/grub`本身被重置,则可能是其他脚本所为。检查是否有自动化任务修改该文件。 ##### 原因3:文件权限问题 确保`/etc/default/grub`文件的所有者和权限正确: ```bash sudo chown root:root /etc/default/grub sudo chmod 644 /etc/default/grub ``` ##### 原因4:需要锁定配置文件(极端情况) 如果以上方法无效,可以设置文件为不可变(谨慎使用): ```bash sudo chattr +i /etc/default/grub ``` 注意:这会使该文件无法被修改,包括系统更新。在需要更新GRUB配置时,先取消不可变属性: ```bash sudo chattr -i /etc/default/grub ``` #### 步骤4:重启系统 完成配置后,重启系统使更改生效: ```bash sudo reboot ``` ### 错误修改后的恢复方法 如果因为修改`grub.cfg`导致系统无法启动,可以按照以下步骤恢复: 1.GRUB启动菜单出现时,按`e`键进入编辑模式。 2. 找到以`linux`开头的行,在行尾添加`init=/bin/bash`(临时指定启动后的shell)。 3. 按`Ctrl+X`启动,系统会进入bash。 4. 重新挂载根文件系统为可读写: ```bash mount -o remount,rw / ``` 5. 运行`update-grub`重新生成正确的`grub.cfg`: ```bash update-grub ``` 6. 如果之前修改了`/etc/default/grub`,请用文本编辑器修正错误。 7. 重启系统: ```bash exec /sbin/init ``` ### 总结 - **永远不要直接修改`grub.cfg`**,而应修改`/etc/default/grub`并运行`update-grub`。 - 如果修改后重启仍被覆盖,检查是否有其他进程(如cloud-init)干扰,并考虑锁定文件。 - 修改错误导致无法启动时,可以通过GRUB编辑模式进入临时shell修复。 ### 相关问题 1. 如何自定义GRUB启动菜单的背景和主题? 2. 如何在GRUB中添加自定义启动项(如启动一个操作系统)? 3. 如何修复因GRUB配置错误导致的系统无法启动? 4. Ubuntu系统启动过程中GRUB的作用是什么?</think>### Ubuntu 修改 GRUB 配置后恢复原状的解决方案 #### 核心问题分析 当您直接修改 `/boot/grub/grub.cfg` 后重启系统时文件自动恢复,这是**正常且预期的行为**。根本原因在于: 1. `grub.cfg` 是自动生成的引导配置文件[^1] 2. 系统在以下情况会自动重建该文件: - 内核更新时 - 执行 `update-grub` 命令时 - 系统检测到硬件变化时 3. 直接修改 `grub.cfg` 会被系统更新覆盖[^1] #### 正确修改方法(永久生效) ```mermaid graph LR A[修改配置源文件] --> B[更新GRUB配置] B --> C[重启系统] C --> D[配置永久生效] ``` ##### 具体步骤: 1. **修改配置源文件**(非 `grub.cfg`) ```bash sudo nano /etc/default/grub # 编辑核心配置文件 ``` 修改关键参数: ```ini GRUB_TIMEOUT=10 # 启动菜单等待时间 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" # 内核参数 GRUB_GFXMODE=1920x1080 # 分辨率设置 ``` 2. **更新 GRUB 配置** ```bash sudo update-grub # 生成新的grub.cfg[^1] ``` 3. **验证修改** ```bash # 检查超时设置 grep 'set timeout=' /boot/grub/grub.cfg # 检查内核参数 grep 'linux.*root' /boot/grub/grub.cfg ``` #### 特殊场景处理 若修改后配置仍被重置,需处理深层原因: 1. **禁用 cloud-init 覆盖**(云服务器常见问题) ```bash echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable.cfg sudo cloud-init clean && sudo reboot ``` 2. **锁定配置文件**(防止意外修改) ```bash sudo chattr +i /etc/default/grub # 设置不可变标志 ``` > 解锁命令:`sudo chattr -i /etc/default/grub` 3. **检查自动更新服务** ```bash # 查看可能触发grub更新的服务 systemctl list-unit-files | grep -E 'grub|kernel' ``` #### 配置错误导致无法启动的修复方法[^2] 1.GRUB 救援界面: ```grub ls # 查看磁盘分区 set root=(hd1,gpt4) # 设置根目录(根据实际分区调整) linux /boot/vmlinuz-5.15.0-generic root=/dev/sdb4 # 指定内核和根分区 initrd /initrd.img # 加载初始化内存盘 boot # 启动系统 ``` 2. 进入系统后修复: ```bash sudo nano /etc/default/grub # 修正错误配置 sudo update-grub sudo reboot ``` #### 高级定制方法 如需深度定制菜单: 1. 创建自定义脚本: ```bash sudo nano /etc/grub.d/40_custom ``` 添加自定义菜单项: ```grub menuentry "My Custom Boot" { set root=(hd0,1) linux /vmlinuz-custom root=/dev/sda1 } ``` 2. 更新配置: ```bash sudo chmod +x /etc/grub.d/40_custom sudo update-grub ``` #### 验证流程 ```bash # 检查修改持久性 md5sum /boot/grub/grub.cfg # 重启前后对比校验值 # 监控文件变化 sudo apt install inotify-tools sudo inotifywait -m /etc/default/grub # 监控文件修改事件 ``` > **关键提示**:永远通过 `/etc/default/grub` 修改配置,执行 `sudo update-grub` 使更改永久生效[^1]。直接编辑 `grub.cfg` 的修改会在系统更新时丢失。 --- ### 相关问题 1. 如何为 GRUB 菜单添加自定义背景图片? 2. Ubuntu 系统启动过程中各阶段的配置文件是什么? 3. 如何修复因 GRUB 配置错误导致的系统无法启动? 4. 哪些系统服务会影响 Linux 的引导配置持久化? 5. 如何在多系统环境中配置 GRUB 启动顺序?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值