Linux系统管理实践(3):GRUB系统引导配置

    安装ubuntu时,grub默认安装在第一个硬盘(hd0)的mbr中,其实就是把引导文件boot.img写入硬盘的mbr,当然,用户也可以选择不写入硬盘mbr 而是写入linux分区的引导扇区。grub以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。以前版本的grub其设备是从0开始编号,分区也是从0开始,主分区从0-3,逻辑分区从4开始,而从grub 2开始分区编号是从1开始的。下面给出几个例子 :
(fd0):表示整个软盘
(hd0,1):表示BIOS中的第一个硬盘的第2个分区
(hd0,4)/boot/vmlinuz:表示BIOS中的第一个硬盘的第一个逻辑分区下boot目录下的vmlinuz文件。
   1、grub的配置文件: 为/boot/grub/grub.conf或/boot/grub/menu.lst(grub2中改为grub.cfg)。Ubuntu下的menu.lst默认内容如下:

# menu.lst - 参看: grub(8), info grub, update-grub(8)
#            grub-install(8), grub-floppy(8),
#            grub-md5-crypt, /usr/share/doc/grub
#            以及/usr/share/doc/grub-doc/.
## default:设置默认启动的菜单项
# 用数字编号设置默认启动项,数字从0开始,如果没有没有设置default命令,则使用第0项(即默认启动引
# 导菜单中的第一个菜单项)。也可以后跟'saved'字样而不是数字,默认的启动项为带有命令'savedefault'
# 启动项。
default		0
## timeout:超时秒数
# 设置一个超时秒数,一旦超时,则启动默认菜单项
timeout		30
## hiddenmenu:是否隐藏菜单
# 若被设置则启动的时候会隐藏选项菜单(通过按ESC来调出菜单)
#hiddenmenu
# 指定grub菜单的默认颜色
#color cyan/blue white/blue
## password ['--md5'] passwd
# 如果本选项在菜单文件第一部分中被使用,则禁用所有的交互式编辑控制(菜单项编辑和命令行),
# 并且进入受命令'lock'保护的模式中。可用--md5指定一个密码,启用grub的密码保护。为安全起见,
# 一般使用md5值,这个值可以使用grub-md5-crypt或者在grub shell中使用md5crypt生成
# 例如: password topsecret
#       password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/
# password topsecret
# 一个启动菜单项例子
#
# title		Windows 95/98/NT/2000
# root		(hd0,0)
# makeactive
# chainloader	+1
#
# title		Linux
# root		(hd0,1)
# kernel	/vmlinuz root=/dev/hda2 ro
#
# 在“自动内核启动列表”的前面或后面放置静态的引导设置段
### “自动内核启动列表”的开始
## 除了下面的默认选项外,在“自动内核启动列表“标号之间的行将会被debian update-grub脚本修改
## 不要取消这些注释,只需根据你的需要编辑它们即可
## ## 默认选项的开始 ##
## 自动引导选项的默认内核选项:如果你想对指定内核的特殊选项使用kopt_x_y_z,这里
## x.y.z为内核的版本,则较小的版本会被忽略
## 例如  kopt=root=/dev/hda1 ro
##      kopt_2_6_8=root=/dev/hdc1 ro
##      kopt_2_6_8_2_686=root=/dev/hdc2 ro
# kopt=root=UUID=e10c684b-11bb-4aff-936e-3a5b984db9dd ro
## 设置crashdump菜单项
## 例如: crashdump=1
# crashdump=0
## 默认的grub根设备
## 例如: groot=(hd0,0)
# groot=(hd0,6)
## 应该让update-grub创建可选项的自动引导选项吗
## 例如  alternative=true
##      alternative=false
# alternative=true
## 应该让update-grub锁定可选的自动引导选项吗
## 例如  lockalternative=true
##      lockalternative=false
# lockalternative=false
## 另外的与默认引导选项(而不是与可选的选项)一起使用的选项
## 例如  defoptions=vga=791 resume=/dev/hda5
# defoptions=quiet splash locale=zh_CN
## 应该让update-grub锁住老的自动引导选项
## e.g. lockold=false
##      lockold=true
# lockold=false
## 与默认的Xen引导选项一起使用Xen管理程序选项
# xenhopt=
## 与默认的Xen引导选项一起使用Xen Linux内核选项
# xenkopt=console=tty0
## altoption引导目标选项,多个altoption行是允许的
## 例如  altoptions=(extra menu suffix) extra boot options
##      altoptions=(recovery) single
# altoptions=(recovery mode) single
## 控制有多少内核应该被放入menu.lst中,一个内核只计数它的第一次出现,不计数可选的内核选项
## 例如  howmany=all
##      howmany=7
# howmany=all
## 应该让update-grub创建memtest86引导选项吗
## 例如  memtest86=true
##      memtest86=false
# memtest86=true
## 应该让update-grub调整默认被引导的系统的值吗
## 可以是true或false
# updatedefaultentry=false
## 应该让update-grub添加saveddefault到默认选项中吗
## 可以是true或false
# savedefault=false
## ## 默认选项的结束 ##
title		Ubuntu 8.04.3 LTS, kernel 2.6.24-24-generic
root		(hd0,6)
kernel		/boot/vmlinuz-2.6.24-24-generic root=UUID=e10c684b-11bb-4aff-936e-3a5b984db9dd ro quiet splash locale=zh_CN
initrd		/boot/initrd.img-2.6.24-24-generic
quiet
title		Ubuntu 8.04.3 LTS, kernel 2.6.24-24-generic (recovery mode)
root		(hd0,6)
kernel		/boot/vmlinuz-2.6.24-24-generic root=UUID=e10c684b-11bb-4aff-936e-3a5b984db9dd ro single
initrd		/boot/initrd.img-2.6.24-24-generic
title		Ubuntu 8.04.3 LTS, memtest86+
root		(hd0,6)
kernel		/boot/memtest86+.bin
quiet
### Debian自动内核启动列表的结束
# 这是一个分隔线,以便把下面的菜单项与Debian的菜单项分开
title		Other boot options:
root
# 这个菜单项是Debian安装程序为/dev/sda1上的非linux操作系统自动添加的
title		ThinkVantage Rescue and Recovery 4
root		(hd0,0)
savedefault
chainloader	+1
# 这个菜单项是Debian安装程序为/dev/sda1上的非linux操作系统自动添加的
title		Windows Vista (loader)
root		(hd0,1)
savedefault
chainloader	+1

 

    还有一个常用的选项splashimage,用于指定引导菜单的背景画面。注意从grub2起,配置文件grub.cfg格式的改变较大,它支持脚本语言,例如条件判断,循环、变量和函数。
    (1)Linux菜单项的各个命令含义:
    title:指定此菜单项的名称,既在grub列表里的名称
    root:指定启动分区,注意编号从0开始,比如第一块硬盘的第一个分区应该是(hd0,0)。启动分区的编号可以使用fdisk -l查询,但是需要root权限。
    kernel:指定启动的内核的绝对路径和名称,后面跟内核启动参数,一般来说root参数就是你的根文件系统,一定要有的,可以像范例中使用uuid表示,也可以直接使用/dev/sda2或者/dev/hda1这样的表示。其实有root和kernel两行就可以启动linux了。
    initrd:指定在系统启动访问真正的根文件系统前,访问的ramdisk映象。具体可以参照Linux2.6内核的Initrd机制解析。
    quiet:安静模式,即不显示启动过程中具体的信息(此项与内核参数中的quiet区别不明)
    savedefault:如果选择了这个启动项,那么下次启动时就用此项作为默认项。在前面设置为default saved时有效。
    (2)Linux内核常用的启动参数:
    root:根文件系统的位置。
    ro:可读写,当启动分区是JFS等格式时需要使用此参数使得系统可以在启动是存放日志。
    quiet:安静模式,不显示启动详细信息。
    splash:显示徽标。
    locale:指定区域设置。
    vga:指定framebuffer的显示模式。一般对应关系为:
         640x480      800x600      1024x768      1280x1024
256     0x301         0x303         0x305         0x307
32k     0x310         0x313         0x316         0x319
64k     0x311         0x314         0x317         0x31A
16M     0x312         0x315         0x318        0x31B
    (3)Windows菜单项的含义:title,root,savedefault同上。chainloader +1告诉grub不要自己加载此操作系统,而是调用这个分区上的加载器,比如ntldr。双如chainloader (hd0,1)+1调用第一个硬盘的第2个分区的引导扇区内的启动器,可以是windows或linux的启动器。通常还有makeactive命令,即使此分区(即root命令指定的分区)成为活动分区,Windows必须从活动分区启动,而且NT内核的启动分区一般应该为第一个主分区。
    2、用grub命令来引导操作系统: 有些候我们需要用grub命令来引导操作系统(比如menu.lst损坏或丢失,导致开机时没有了启动菜单),通过命令行来引导操作系统的流程也没什么难的,无非是把指令手工输入到grub>提示符的后面。在这个过程中,tab键的命令补齐功能就显得很重要了。如果您不知道有哪些命令只要输入help即可获取帮助。
    在启动菜单上可以使用下面命令来操作grub:   
e:编辑当前的启动菜单项
a:添加内核的启动参数
c:进入grub的命令行方式(即grub shell)
b:启动当前的菜单项
d:删除当前行
esc:返回grup启动菜单界面,取消对当前菜单项所做的任何修改
    (1)引导Linux系统,操作流程如下(/boot和/处于同一个硬盘分区的情况):

 

grub> cat               # 按tab键会列出各个硬盘,如hd0,hd1之类的(编号从0开始)
grub> cat (hd0,         # 加上(hd0,然后再按tab键,会列出硬盘hd0上的所有分区情况
Possible partitions are:
Partition num: 0, Filesystem type unknown, partition type 0x7
Partition num: 4, Filesystem type is fat, partition type 0xb
Partition num: 5, Filesystem type is reiserfs, partition type 0x83
Partition num: 6, Filesystem type is ext2fs, partition type 0x83
Partition num: 7, Filesystem type unknown, partition type 0x83
Partition num: 8, Filesystem type is reiserfs, partition type 0x83
Partition num: 9, Filesystem type unknown, partition type 0x82

grub> cat (hd0,6)               # 假设要引导的Linux系统在第7个分区上(注意编号是从0开始的)
grub> cat (hd0,6)/etc/fstab     # 查看一下(hd0,6)/etc/fstab,说明Linux安装在标签为LABEL=/的分区中
LABEL=/ / ext3 defaults 1 1
/dev/devpts /dev/pts devpts gid=5,mode=620 0 0
/dev/shm /dev/shm tmpfs defaults 0 0
/dev/proc /proc proc defaults 0 0
/dev/sys /sys sysfs defaults 0 0
LABEL=SWAP-hda1 swap swap defaults 0 0
/dev/hdc /media/cdrecorder auto pamconsole,exec,noauto,
managed 0 0    

grub> root (hd0,6)        # 指定内核引导文件所在的设备及分区
Filesystem type is ext2fs, partition type 0x83 
   
grub> kernel /boot/       # 指定该分区上的内核引导文件:按tab键补齐,会列出/boot下所有的文件
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  # 后面要添加内核启动参数,ro表示以只读方式加载根文件系统
                                                                # root指定根文件系统所在的设备
[Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/      # 指定启动系统的initd文件:按tab键补齐,会列出/boot下的所有initrd文件
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.img
[Linux-initrd @ 0x2e1000, 0x10e685 bytes]

grub> boot               # 大功告成,开始引导Linux系统

    注意在内核启动参数中还可以添加常用的quiet,splash,locale等参数。
    (2)引导Windows系统:下面是操作流程。

grub>root (hd0,0)         # 假设Windows在第1个分区上
grub>makeactive           # 指定这个分区成为活动分区,Windows必须从活动分区启动
grub>chainloader +1       # 调用这个分区上的引导器
grub>boot                 # 开始用Windows的引导器引导Windows系统

    3、定制grub启动菜单: 通过修改menu.lst配置文件来完成,常用的有设置默认启动项、超时时间、修改菜单项的标题、添加内核启动参数、添加或删除菜单项等。
    4、修改引导菜单的颜色或背景画面: 修改颜色可在menu.lst中使用color命令。格式为color NORMAL [HIGHLIGHT]。NORMAL表示菜单行的颜色,可选的HIGHLIGHT表示当光标移动到菜单行上时的加亮色,忽略它时加亮色使用NORMAL的反转色。颜色的格式为"FG/BG"(前景色/背景色),FG和BG为颜色记号名,可以是black, blue, green, cyan, red, magenta, brown, light-gray, dark-gray, light-blue, light-green, light-cyan, light-red, light-magenta, yellow 和 white,但只有前面8个能用于BG。如果你想让前景色闪烁,可以给FG加上“blink-”前缀。
    修改背景画面可用splashimage选项。操作流程如下:

 

convert -geometry 640x480 -colors 14 splash.jpg splash.xpm  # 将一幅图片转换成xpm文件,14色,分辨率为640x480(用字母x而不是*)
gzip splash.xpm    # 压缩图片文件
sudo cp splash.xpm.gz /boot/grub/    # 把文件拷贝到/boot/grub下

splashimage  (hd0,6)/boot/grub/splash.xpm.gz   # 在menu.lst的全局设置里添加这一设置即可

    5、给grub设置密码: 可用使用明文的密码或者md5 128位加密的密码。对于明文密码方式,在menu.lst的全局设置里用password选项指定一个密码,然后在菜单项的title的下一行加上一个'lock'命令,这样在开机引导该菜单项时,就要用p命令解锁,并输入密码,才能引导该系统。对于md5加密方式,操作流程如下:

 

grub> md5crypt                     # 使用md5加密(也可直接在Linux的Shell中用grub-md5-crypt)
Password:                          # 输入密码
Encrypted: $1$ZWnke0$1fzDBVjUcT1Mpdd4u/T961 (encrypted password)   # 计算出密码的md5值
grub> quit                         # 退出grub

password --md5 $1$ZWnke0$1fzDBVjUcT1Mpdd4u/T961    # 在menu.lst里添加这一设置(用前面计算出的md5加密值)

title		Ubuntu 8.04.3 LTS, kernel 2.6.24-24-generic
lock                                               # 在菜单项的title下添加一个'lock'命令
root		(hd0,6)


    附:Linux内核的启动参数
    Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。如果不使用启动管理器,比如直接从BIOS或者把内核文件用“cp zImage /dev/fd0”等方法直接从设备启动,就不能给内核传递参数或选项,这也许是我们使用引导管理器比如LILO的好处之一吧。
    Linux的内核参数是以空格分开的一个字符串列表,通常具有如下形式:
    name[=value_1][,value_2]...[,value_10]
    “name”是关键字,内核用它来识别应该把“关键字”后面的值传递给谁,也就是如何处理这个值,是传递给处理例程还是作为环境变量或者抛给“init”。值的个数限制为10,你可以通过再次使用该关键字使用超过10个的参数。
    首先,内核检查关键字是不是 “root=”,“nfsroot=”, “nfsaddrs=”, “ro”, “rw”, “debug”或 “init”,然后内核在bootsetups数组里搜索于该关键字相关联的已注册的处理函数,如果找到相关的已注册的处理函数,则调用这些函数并把关键字后面的值作为参数传递给这些函数。比如你在启动时设置参数name=a,b,c,d,内核搜索bootsetups数组,如果发现“name”已注册, 则调用“name”的设置函数如name_setup(),并把a,b,c,d传递给name_setup()执行。
    所有型如“name=value”参数,如果没有被上面所述的设置函数接收,将被解释为系统启动后的环境变量,比如“TERM=vt100”就会被作为一个启动时参数。
    所有没有被内核设置函数接收也没又被设置成环境变量的参数都将留给init进程处理,比如“single”。
    1、常用的设备无关启动时参数。
    (1)init=...:设置内核执行的初始化进程名,如果该项没有设置,内核会按顺序尝试/etc/init,/bin/init,/sbin/init, /bin/sh,如果所有的都没找到,内核会抛出kernel panic:的错误。
    (2)nfsaddrs=...:设置从网络启动时NFS的启动地址,以字符串的形式给出。
    (3)nfsroot=...:设置网络启动时的NFS根名字,如果该字符串不是以 "/"、","、"."开始,默认指向“/tftp-boot”。以上(2)、(3)在无盘站中很有用处。
    (4)no387:该选项仅当定义了CONFIG_BUGi386时才能用,某些i387协处理器芯片使用32位的保护模式时会有BUG,比如一些浮点运算,使用这个参数可以让内核忽略387协处理器。
    (5)no-hlt:该选项仅当定义了CONFIG_BUGi386时才能用,一些早期的i486DX-100芯片在处理“hlt”指令时会有问题,执行该指令后不能可靠的返回操作系统,使用该选项,可以让linux系统在CPU空闲的时候不要挂起CPU。
    (6)root=...:该参数告诉内核启动时使用哪个设备作为根文件系统。比如可以指定根文件为hda8:root=/dev/hda8。
    (7)ro和rw:ro参数告诉内核以只读方式加载根文件系统,以便进行文件系统完整性检查,比如运行fsck。rw参数告诉内核以读写方式加载根文件系统,这是默认值。
    (8)reserve=...:保留端口号。格式:reserve=iobase,extent[,iobase, extent]...,用来保护一定区域的I/O端口不被设备驱动程序自动探测。在某些机器上,自动探测会失败,或者设备探测错误或者不想让内核初始化设备时会用到该参数。比如: reserve=0x300,32 device=0x300,除device=0x300外所有设备驱动不探测0x300-0x31f范围的I/O端口。
    (9)mem=...:限制内核使用的内存数量。早期BIOS设计为只能识别64M以下的内存,如果你的内存数量大于64M,你可以指明,如果你指明的数量超过了实际安装的内存数量,系统崩溃是迟早的事情。如:mem=0x1000000意味着有16M内存,如果是 mem=0x6000000,就是96M内存了。注意很多机型把部分内存作为BIOS的映射,所以你在指定内存大小的时候一定要预留空间。你也可以在 pentium或者更新的CPU上使用mem=nopentium关闭4M的页表,这要在内核配置时申明。
    (10)panic=N:默认情况,内核崩溃--kernel panic后会宕机而不会重启,你可以设置宕机多少秒之后重启机器,也可以在/proc/sys/kernel/panic文件里设置。
    (11)reboot=[warm|cold][,[bios|hard]:该选项仅当定义了CONFIG_BUGi386时才能用。2.0.22的内核重启默认为cool reboot,warm reboot 更快,使用"reboot=bios"可以继承bios的设置。
    (12)nosmp和maxcpus=N:仅当定义了 __SMP__,该选项才可用。可以用来禁用多CPU或者指明最多支持的CPU个数。
    2、内核开发和调试的启动时参数: 这些参数主要用在内核的开发和调试上,如果你不进行类似的工作,你可以简单的跳过本小节。
    (1)debug:linux的日志级别比较多(详细信息可以参看linux/kernel.h),一般地,日志的守护进程klogd只把比DEBUG级别高的日志写进磁盘,如果使用该选项,klogd也把内核的DEBUG信息写进日志。
    (2)profile=N:在做内核开发的时候,如果想清楚的知道内核在什么地方耗用了多少CPU的时钟周期,可以使用核心的分析函数设置变量prof_shift为非0值,有两种方式可以实现:一种是在编译时指定,另一种就是通过“profile=”来指定;他给出了一个相当于最小单位--即时钟周期;系统在执行内核代码的时候,profile[address >;>; prof_shift]的值就会累加,你也可以从/proc/profile得到关于它的一些信息。
    (3)swap=N1,N2,N3,N4,N5,N6,N7,N8:设置内核交换算法的八个参数max_page_age, page_advance, page_decline,page_initial_age, age_cluster_fract, age_cluster_min, pageout_weight,bufferout_weight。
    (4)buff=N1,N2,N3,N4,N5,N6:设置内核缓冲内存管理的六个参数max_buff_age, buff_advance, buff_decline,buff_initial_age, bufferout_weight, buffermem_grace。
    3、使用ramdisk的参数: (仅当内核配置并编译了 CONFIG_BLK_DEV_RAM)。一般的来说,使用ramdisk并不是一件好事,系统自己会更加有效的使用可用的内存;但是,在启动或者制作启动盘时,使用ramdisk可以很方便的装载软盘等设备上的映象(尤其是安装程序、启动过程中),因为在正真使用物理磁盘之前,必须要加载一些必要的模块,比如文件系统模块,scsi驱动等(可以参见我的initrd-x.x.x.img文件分析-制作安装程序不支持的根文件系统)。早期的ramdisk(比如1.3.48的核心)是静态分配的,必须以ramdisk=N来指定ramdisk的大小;现在ramdisk可以动态增加。一共有四个参数,两个布尔型,两个整形。
    (1)load_ramdisk=N:如果N=1,就加载ramdisk;如果N=0,就不加载ramdisk;默认值为0。
    (2)prompt_ramdisk=N:N=1,提示插入软盘;N=0,不提示插入软盘;默认为1。
    (3)ramdisk_size=N或者ramdisk=N:设定ramdisk的最大值为N KB,默认为4096KB。
    (4)ramdisk_start=N:设置ramdisk的开始块号为N,当ramdisk有内核的映象文件是需要这个参数。
    (5)noinitrd:(仅当内核配置了选项 CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_INITRD)现在的内核都可以支持initrd了,引导进程首先装载内核和一个 初始化的ramdisk,然后内核将initrd转换成普通的ramdisk,也就是读写模式的根文件系统设备。然后linuxrc执行,然后装载真正的根文件系统,之后ramdisk被卸载,最后执行启动序列,比如/sbin/init。选项noinitrd告诉内核不执行上面的步骤,即使内核编译了initrd,而是把initrd的数据写到/dev/initrd,只是这是一个一次性的设备。

转载于:https://my.oschina.net/abcijkxyz/blog/722794

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值