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默认内容如下:

 

    还有一个常用的选项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和/处于同一个硬盘分区的情况):

 

    注意在内核启动参数中还可以添加常用的quiet,splash,locale等参数。
    (2)引导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选项。操作流程如下:

 

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

 


    附: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,只是这是一个一次性的设备。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值