Grub_blog

来源:互联网 发布:java工程师认证考试 编辑:程序博客网 时间:2024/06/08 16:25

Grub_blog

    • Grub_blog
  • BIOS
    • 主要功能
    • 执行顺序
  • MBR
  • GRUBGRand Unified Bootloader
    • grub legacy
    • grub之识别设备
    • grub命令行接口
    • gurb configuration
  • 实例
    • 添加新硬盘并提供直接单独运行的bash系统CentOS 67为例
    • 破坏本机grub stage 1并救援模式修复以CentOS 7为例

BIOS

BIOS是固化在motherboard上的ROM芯片上的程序,它可以从CMOS中读写系统设置信息,确保其他的chips、hard drivers、ports和CPU协同工作。

主要功能

1、载入操作系统,为CPU提供执行指令
2、加电自检
3、驱动其他芯片上的BIOS(比如SCSI和显卡)
4、提供底层子程序供OS调用,比如键盘、显示器、串/并口
5、管理硬件设置如硬盘和系统时钟

执行顺序

1、检查CMOS中的系统设置信息
CMOS是motherboard上一块特殊的RAM芯片,用于存放系统参数,而BIOS是完成参数设置的程序
2、载入中断处理程序和设备驱动
正因为如此BIOS中的程序通常会被后续复制到RAM中驻存以提高其中断处理速度
3、初始化寄存器和电源管理
4、POST
5、显示系统设置
就是通常的BIOS设置界面
6、决定哪个程序是可启动的
BIOS中控制这种设定的程序
7、初始化bootstrap sequence
在BIOS知道启动媒介之后就要初始化启动次序。一旦BIOS决定了目标启动媒介,它就会寻找启动信息(这个启动信息就是MBR,至于硬盘/光驱中的信息是如何到内存中的,大概是BIOS会设置固定的位置让CPU跳转到那里并执行指令)来启动操作系统。
如果是硬盘,它就会在cylinder(柱面)0、head(磁头)0、sector(扇区)1寻找MBR(Master Boot Record)。如果是floppy disk(光盘),就会在光盘上的同样的位置寻找VBR(Volume Boot Record)

MBR

参考资料:http://www.dewassoc.com/kbase/hard_drives/master_boot_record.htm

在标准硬盘(扇区大小是512bytes)中,第一个扇区就是MBR,MBR包括物理磁盘上4个逻辑分区(NTFS,FAT,ext4)的入口(其中一个标记为活动的)、446bytes的bootloader、2bytes magic number(signature)。MBR会让CPU知道OS的位置。MBR指向的位置是没有分区介质中的第一个扇区、或者分区介质中独立分区的第一个扇区,这个扇区也被称作VBR。VBR中的代码会直接被机器或者boot manager执行,常见的boot manager就是grub了。MBR我的理解程度只有这么多了。。。。。

GRUB(GRand Unified Bootloader)

GRUB是引导装入器(系统启动管理器),负责装入内核并引导Linux系统,而且它还可以引导其他操作系统(Windows)。
它还提供各种配置属性,即使有些属性配置不正确,仍然可以引导系统(手动引导),在进入系统之后,还可以重新修复配置文件。

grub legacy

参考资料:http://www.uruk.org/orig-grub/technical.html

stage 1    只是用来加载stage 2的。在光盘上,grub通常就在第一个启动扇区,在硬盘上,grub可以在bootloader中或者第一个分区的扇区中。stage 1是如何知道stage 2的位置的?stage 1种存储着硬盘的快列表元数据,这种数据可以通过BIOS中的硬盘“几何测量”而得知其CHS地址,这种CHS地址是INT 13号中断获取硬盘数据的方式。stage 1.5    因为stage 2非常大,并不能一次性被stage 1加载,所以stage 1.5就用于来直接加载文件系统上/boot/grub目录下的文件,这个目录下的文件就是stage 2。stage 1.5位于保留给bootloader的位置,通常在MBR的后面。stage 2    stage 2会获得各种需要的物理信息,然后会寻找它的配置文件。如果没有找到配置文件,grub就会退变为一个命令行接口。如果找到了配置文件,一个菜单接口就会被激活,这个菜单会提供配置文件中的启动文件的入口。    stage 2功能总结:        1、提供菜单、并提供交互接口            e:编辑模式,用于编辑菜单            c:命令模式,交互式接口        2、加载用户选择的内核或者操作系统            允许传递参数给内核            可隐藏此菜单        3、可为菜单提供保护机制            为编辑菜单进行认证            为启用内核或操作系统进行认证

grub之识别设备

这里的设备指的是启动根设备,用于设置grub所在的位置,即gurb得“根”而非Linux文件系统的“根”,当然他们二者可以在同一个分区,也可以在不同的分区。(hd#,#)    hd#:磁盘编号,用数字表示,从0开始编号    \#:分区编号,用数字表示,从0开始编号    (hd0,0)

grub命令行接口:

help:获取帮助列表help COMMAND:详细帮助信息find (hd#,#)/PATH/TO/SOMEFILE    find (hd0,0)/vmlinuz-2.6.32-504.el6.x86_64root (hd#,#):设置启动跟设备kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的命令行参数,例如:init=/path/to/init表示以这个文件作为启动脚本,selinux=0表示不启用selinuxinitrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk;ramdisk的版本号必须与内核版本号完完全全匹配,否则ramdisk将无法被kernel装载boot:引导启动选定的内核chainloader:将指定的文件作为一个链式装载程序载入。为了获取在一个指定分区第一个扇区的文件,使用+1作为文件名。它创建了一个从引导装入器到另一个的链,这种链式装入技术可用用于引导Windows系统,制作双系统。

gurb configuration

配置文件:/etc/grub.conf(链接文件,指向) ---->  /boot/grub/grub.conf
[root@localhost ~]# ls -l /etc/grub.conflrwxrwxrwx. 1 root root 22 Dec  7 10:48 /etc/grub.conf -> ../boot/grub/grub.conf

字段详细解释:

default=#:设定默认启动的菜单项,菜单项(title)编号从0开始timeout=#:指定菜单项等待用户选择的等待时长splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片路径hiddenmenu:隐藏菜单,不要用户选择直接默认选择某项password [--md5] STRING:设定认证方式,菜单编辑认证,输入STRING匹配才允许编辑title TITLE:定义菜单项“标题”    root (hd#,#):grub查找stage2及kernel文件所在设备分区,这里是grub的根而不是文件系统的“根”    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核    initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件;    password [--md5] STRING:启用选定的内核或操作系统时进行认证

关于如何生成密码?

1、明文密码,直接添加字符串作为密码,但是不安全2、加密密码:openssl或者grub-md5-crypt
[root@localhost rc.d]# grub-md5-cryptPassword: Retype password: $1$98tbY$bB5BZUUb7CuPxhLMQWfl6/

如何进入单用户模式?

1、编辑grub菜单(选定要编辑的title,而后使用e命令)2、在选定的kernel后附加    1,s,S或single或者init=/bin/bash3、在kernel所在行,键入b命令,表示boot的意思

关于如何安装grub?

grub-installgrub-install命令一定会去寻找boot目录,由于boot目录存在两种情况(单独分区、Linux根文件系统中)1、安装在本系统分区    grub-install --root-directory=/ /dev/sda    或者直接使用grub命令            这种方式需要系统上事先存在各种stage        grub>root (hd#,#)        grub>setup2、安装在另一块独立磁盘    grub-install --root-directory=ROOT /dev/DISK        这里的ROOT目录指的是它的下面存在boot目录而不是boot目录本身

如何修复系统(grub损坏的情况),进入紧急救援模式?

加载系统光盘    1、Esc  -->  \# linux rescue    2、或者直接选择rescue mode    如果是把系统硬盘挂载到另一台电脑修复grub就是到挂载点中安装grub就行了

实例

添加新硬盘并提供直接单独运行的bash系统(CentOS 6.7为例)

设置虚拟机添加一块硬盘

此处添加的是SCSI、指定为单个文件、大小10G

查看磁盘并把10G磁盘分3个区分别为/

[root@localhost ~]# fdisk -l /dev/sd[a-z]Disk /dev/sda: 128.8 GB, 128849018880 bytes255 heads, 63 sectors/track, 15665 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x000431af   Device Boot      Start         End      Blocks   Id  System/dev/sda1   *           1          26      204800   83  LinuxPartition 1 does not end on cylinder boundary./dev/sda2              26        7859    62914560   8e  Linux LVMDisk /dev/sdb: 10.7 GB, 10737418240 bytes255 heads, 63 sectors/track, 1305 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000#磁盘分区[root@localhost ~]# fdisk /dev/sdbDevice contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel with disk identifier 0x892d0f9f.Changes will remain in memory only, until you decide to write them.After that, of course, the previous content won't be recoverable.Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)WARNING: DOS-compatible mode is deprecated. It's strongly recommended to         switch off the mode (command 'c') and change display units to         sectors (command 'u').Command (m for help): nCommand action   e   extended   p   primary partition (1-4)pPartition number (1-4): 1First cylinder (1-1305, default 1): Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): +500M    Command (m for help): nCommand action   e   extended   p   primary partition (1-4)pPartition number (1-4): 2First cylinder (66-1305, default 66): Using default value 66Last cylinder, +cylinders or +size{K,M,G} (66-1305, default 1305): +1GCommand (m for help): tPartition number (1-4): 2Hex code (type L to list codes): 82Changed system type of partition 2 to 82 (Linux swap / Solaris)Command (m for help): nCommand action   e   extended   p   primary partition (1-4)pPartition number (1-4): 3First cylinder (198-1305, default 198): Using default value 198Last cylinder, +cylinders or +size{K,M,G} (198-1305, default 1305): Using default value 1305Command (m for help): wThe partition table has been altered!#查看分区[root@localhost ~]# partx /dev/sdb# 1:        63-  1044224 (  1044162 sectors,    534 MB)# 2:   1044225-  3164804 (  2120580 sectors,   1085 MB)# 3:   3164805- 20964824 ( 17800020 sectors,   9113 MB)# 4:         0-       -1 (        0 sectors,      0 MB)[root@localhost ~]# cat /proc/partitionsmajor minor  #blocks  name   8        0  125829120 sda   8        1     204800 sda1   8        2   62914560 sda2   8       16   10485760 sdb   8       17     522081 sdb1   8       18    1060290 sdb2   8       19    8900010 sdb3 253        0   20971520 dm-0 253        1    2097152 dm-1 253        2   10485760 dm-2 253        3   20971520 dm-3#创建文件系统[root@localhost ~]# mke2fs -t ext4 /dev/sdb1...[root@localhost ~]# mke2fs -t ext4 /dev/sdb3...[root@localhost ~]# mkswap /dev/sdb2Setting up swapspace version 1, size = 1060284 KiBno label, UUID=7242cab1-d1a4-426e-9792-65206bfa1654#挂载文件系统,此处把sdb1挂载至/mnt/boot、sdb3挂载至/mnt/sysroot[root@localhost ~]# mount /dev/sdb1 /mnt/boot[root@localhost ~]# mount /dev/sdb3 /mnt/sysroot#在/mnt/boot中安装grub,注意这里root-directory和安装在/dev/sdb磁盘上[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdbProbing devices to guess BIOS drives. This may take a long time.Installation finished. No error reported.This is the contents of the device map /mnt/boot/grub/device.map.Check if this is correct or not. If any of the lines is incorrect,fix it and re-run the script `grub-install'.(fd0)   /dev/fd0(hd0)   /dev/sda(hd1)   /dev/sdb#复制kernel和initramfs到/mnt/boot/目录下[root@localhost ~]# cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz-husa[root@localhost ~]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs-husa.img#在/mnt/boot/grub目录下新建编辑grub的配置文件grub.conf[root@localhost grub]# vim /mnt/boot/grub/grub.conf...#grub.conf配置文件内容,这里最需要注意的就是root=/dev/sda3,因为根分区是在/dev/sda3分区中default=0timeout=60#hiddenmenu#splashimagetitle kernel-husa        root (hd0,0)        kernel /vmlinuz-husa ro root=/dev/sda3 selinux=0 init=/bin/bash        initrd /initramfs-husa.img#在/mnt/sysroot目录下创建跟文件系统中的各个需要的目录[root@localhost ~]# mkdir -p /mnt/sysroot/{etc,bin,sbin,lib,lib64,var,dev,proc,sys,tmp,usr,home,root,mnt,media,usr/{bin,sbin,lib,lib64}}#复制bash及其所需要的库文件[root@localhost ~]# ldd /bin/bash        linux-vdso.so.1 =>  (0x00007ffc51f5a000)        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000038e2200000)        libdl.so.2 => /lib64/libdl.so.2 (0x00000038da600000)        libc.so.6 => /lib64/libc.so.6 (0x00000038daa00000)        /lib64/ld-linux-x86-64.so.2 (0x00000038da200000)[root@localhost ~]# cp /bin/bash /mnt/sysroot/bin/[root@localhost ~]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/#复制ls及其所需要的库文件[root@localhost ~]# ldd /bin/ls        linux-vdso.so.1 =>  (0x00007fff9d3ac000)        libselinux.so.1 => /lib64/libselinux.so.1 (0x00000038dc200000)        librt.so.1 => /lib64/librt.so.1 (0x00000038db200000)        libcap.so.2 => /lib64/libcap.so.2 (0x00000038dde00000)        libacl.so.1 => /lib64/libacl.so.1 (0x00000038e5600000)        libc.so.6 => /lib64/libc.so.6 (0x00000038daa00000)        libdl.so.2 => /lib64/libdl.so.2 (0x00000038da600000)        /lib64/ld-linux-x86-64.so.2 (0x00000038da200000)        libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038dae00000)        libattr.so.1 => /lib64/libattr.so.1 (0x00000038ea200000)[root@localhost ~]# cp /bin/ls /mnt/sysroot/bin[root@localhost ~]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/librt.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libpthread.so.0 /mnt/sysroot/lib64/[root@localhost ~]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64/#切换根确保能够使用[root@localhost ~]# chroot /mnt/sysroot        bash-4.1# lsbin  dev  etc  home  lib  lib64  lost+found  media  mnt  proc  root  sbin  sys  tmp  usr  varbash-4.1# #挂起CentOS 6.7并创建新的虚拟机,使用现有磁盘,即刚才做出改变的磁盘,在这里选择一样的磁盘类型,可以移除虚拟机默认的一些设备比如cdrom和声卡等。

开机出现以下内容,他们就是定义在grub.conf文件中的各种信息

grub引导进入系统后可以发现能够进入单用户模式,bash和ls命令使用正常

破坏本机grub stage 1并救援模式修复(以CentOS 7为例)

#备份bootloader[root@husa ~]# dd if=/dev/sda of=/root/grub.bak bs=446 count=1记录了1+0 的读入记录了1+0 的写出446字节(446 B)已复制,0.000476111 秒,937 kB/秒#破坏/dev/sda磁盘的前128字节[root@husa ~]# dd if=/dev/zero of=/dev/sda bs=128 count=1记录了1+0 的读入记录了1+0 的写出128字节(128 B)已复制,0.000203084 秒,630 kB/秒#重启系统发现不能从本地启动而是从网络启动了#插入光盘并进入救援模式#进入救援模式只需要在菜单项中按tab然后再linux 这一行后面输入rescue回车再启动就行了

调整启动次序

复制备份的bootloader

#进入救援模式后可以选择把备份的bootloader复制到/dev/sda磁盘中,就像图中那样#也可以使用grub-install命令直接安装grub到/mnt/sysimage目录下的boot中就行了
0 0
原创粉丝点击