zoukankan      html  css  js  c++  java
  • centos5,6的GRUB简介

    grub:GRand Unified Bootloader

    • grub 0.x:grub legacy(centos5,6)
    • grub 1.x:grub2(centos7)

    grub legacy(grub 0.x)

    stage1:mbr

    stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

    stage2:磁盘分区(/boot/grub/)

    centos6:

    # ls /boot/grub/
    device.map     fat_stage1_5  grub.conf         jfs_stage1_5  minix_stage1_5     splash.xpm.gz  stage2         vstafs_stage1_5 e2fs_stage1_5  ffs_stage1_5  iso9660_stage1_5  menu.lst      reiserfs_stage1_5  stage1         ufs2_stage1_5  xfs_stage1_5
    

    stage2和内核,通常放置于基本的磁盘分区,不可以是lvm和软raid。读取lvm和软raid分区,是需要根文件系统里的驱动程序的,这时根文件系统还没有加载。

    根文件系统,一般都是逻辑分区,以方便扩容和管理,如果/boot也和根文件系统在同一个分区里的话,由于grub程序无法加载逻辑分区里的文件,所以就无法访问/boot目录,也就不能加载内核,系统就无法启动了。所以这就是/boot独立分区的原因。

    如果根文件系统不使用逻辑卷,那么/boot是可以不独立分区的。

    安装centos6操作系统时,如果不是手动分区的话,会自动把/boot独立出来成一个分区;而把/和swap它们2个做成逻辑分区.

    验证一下centos6:

    首先使用fdisk,可以看出/dev/sda2是Linux LVM(逻辑分区);而/dev/sda1是普通分区。

    再用pvs,可以看出/dev/sda2里的vg的名字是vg_c610

    再用vgs,可以看出vg_c610里有2个LV

    再用lvs,可以看出vg_c610里的2个LV分别是lv_root和lv_swap

    再用mount,可以看出逻辑分区lv_root的挂载点是/;/dev/sda1挂载到了/boot

    # fdisk -l /dev/sda
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          64      512000   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              64        1045     7875584   8e  Linux LVM
    # pvs
      PV         VG      Fmt  Attr PSize PFree
      /dev/sda2  vg_c610 lvm2 a--u 7.51g    0
    # vgs
      VG      #PV #LV #SN Attr   VSize VFree
      vg_c610   1   2   0 wz--n- 7.51g    0
    # lvs
      LV      VG      Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      lv_root vg_c610 -wi-ao----   6.71g
      lv_swap vg_c610 -wi-ao---- 816.00m
    # mount | grep "^/dev"
    /dev/mapper/vg_c610-lv_root on / type ext4 (rw)
    /dev/sda1 on /boot type ext4 (rw)
    

    stage2的作用:

    1,提供菜单,并提供交互式接口

    • 按e键:进入编辑模式,用于编辑菜单
    • 按c键:命令模式,进入交互式界面。

    2,加载用户选择的内核或操作系统

    • 允许传递参数给内核
    • 可以隐藏此菜单

    3,为菜单提供了保护机制

    • 为编辑菜单提供密码保护
    • 为启动内核提供密码保护

    grub命令使用:

    • help获取帮助;help KEYWORD 某个命令的详细信息

    • 识别设备:root (hd#,#):hd和外面的括号是固定的。第一个数字标识是第几块磁盘;第二个数字标识是第几个分区。数字从0开始。从grub2开始就是从1开始编号了。

      (hd0,0):第一个磁盘的第一个分区。

    • 查找命令:find

      查找时,必须指明在哪个磁盘的哪个分区。

      查找内核,知道内核文件的名字,但不知道在磁盘的哪个分区啊,但查找时还必须指明磁盘和分区,太坑了,只能瞎试了。在(hd0,0)里找到了内核文件。

      grub> find (hdx,y)/vmlinuz-3.10.0-957.el7.x86_64

      从网上找到的磁盘和grub命令里的hd(#,#)的对应关系,不知道对不对了

      • sda1表示第一块硬盘第1个主分区=hd(0,0)
      • sda2表示第一块硬盘第2个主分区=hd(0,1)
      • sdb1表示第二块硬盘第1个主分区=hd(1,0)
      • sdb2表示第二块硬盘第2个主分区=hd(1,1)
    • 进入选定磁盘:root

      grub> root hd(0,0)
      grub> find /vmlinuz-2.6.32-754.el6.x86_64
       hd(0,0)
      

      进入磁盘后,使用find命令时,就不用加磁盘了。

      注意:如果/boot是和根文件系统放在了一个文件系统上了的话,路径就要加上/boot。grub> find /boot/vmlinuz-2.6.32-754.el6.x86_64

    • 选择要启动的内核:kernel /PATH/TO/KERNEL_FILE

      内核的文件名:vmlinuz*

      额外还可以指定许多内核参数。

      例如:

      • selinux=0(不启用selinux功能)
      • init=/sbin/init(第一个用户空间的程序)
    • 选择要内核要使用的ramdisk文件:initrd /PATH/TO/RAMDISK_FLLE

      centos6:initramfs.img。

      注意:ramdisk文件的版本号要和内核的版本号完全一样

    • 启动选定的内核:boot

    操作系统启动的内幕:

    1,显示可启动的操作系统列表。

    2,选择要启动的系统后,按e键,进入下面的画面。

    第一行(root (hd0,0)):指定内核vmlinuz-2.6.32-754.el6.x86_64所在的磁盘和分区

    第二行:vmlinuz-2.6.32-754.el6.x86_64的位置,和内核启动的参数。ro:是只读。root是根文件系统所在的分区。

    第三行:内核启动时,使用的ramdisk文件的位置

    当在选择要启动的操作系统的界面,敲回车后,实际允许的就是这3行指令。

    手动启动系统

    控制上图显示的内容的配置文件:/etc/grub.conf,损坏了的时候,就不知道要用哪个内核和ramdisk等启动系统了,但启动后,能进入grub命令行界面,这时可以手动指定内核,ramdisk后,执行开机。

    1,选定要启动的kernel

    grub> root (hd0,0)
    grub> kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root
    

    2,选定kernel要使用的ramdisk文件

    grub> initrd /initramfs-2.6.32-754.el6.x86_64.img
    

    3,启动选定的kernel

    grub> boot
    

    grub配置文件说明

    /etc/grub.conf文件的内容:

    • default:多个操作系统的时候,让哪个操作系统被默认选择上。
    • timeout:等用户5秒,如果用户没有操作,则启动默认选项上的操作系统。
    • splashimage:选择操作系统界面的图片。
    • title:显示的内容
      • root:指定内核vmlinuz-2.6.32-754.el6.x86_64所在的磁盘和分区
      • kernel:vmlinuz-2.6.32-754.el6.x86_64的位置,和内核启动的参数。
      • initrd:内核启动时,使用的ramdisk文件的位置
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title CentOS 6 (2.6.32-754.el6.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=
    en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh
    gb quiet
            initrd /initramfs-2.6.32-754.el6.x86_64.img
    

    手动加一个操作系统:添加title和其下面的root等。

    当按e键后,需要输入密码:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0。写在hiddenmenu上面。

    当按回车键后,需要输入密码:password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0,才能启动系统。写在initrd下面。

    生成md5密码的命令:grub-md5-crypt

    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0
    hiddenmenu
    title CentOS 6 (2.6.32-754.el6.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=
    en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh
    gb quiet
            initrd /initramfs-2.6.32-754.el6.x86_64.img
    
    title CentOS 6 (my test)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/vg_c610-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=
    en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_c610/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_c610/lv_root rd_NO_DM rh
    gb quiet
            initrd /initramfs-2.6.32-754.el6.x86_64.img
            password --md5 $1$jXrWo0$YF3q8/FNPT7rR8xkgKKhj0
    
    

    启动时的menu图:

    进入单用户模式的方法

    1,在选定的操心系统上,按e键

    2,在选定的kernel上,按e键,然后在显示的kernel参数后面,按空格 ,在按1或s或S键,然后回车,最后按b键。

    grub坏了,修复grub

    损坏情况1:/boot所在的分区里的内容,被误删除了,而且已经关机了,如何修复?

    下面模拟这种损坏的情形,把损坏的grub的磁盘拆下来,连到另一个主机上,这个主机上有一个磁盘是/dev/sda,连上损坏的磁盘后,损坏的磁盘是/dev/sdb。修好后,拆下原来的/dev/sda,所以修好的磁盘就变成了/dev/sda。

    1,找个新的磁盘,模拟成grub损坏的磁盘,分3个区,/dev/sdb1放/boot,/dev/sdb3放根文件系统,/dev/sdb2放swap

    # fdisk -l /dev/sdb
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1          14      112423+  83  Linux
    /dev/sdb2              15          40      208845   82  Linux swap / Solaris
    /dev/sdb3              41         105      522112+  83  Linux
    # mke2fs -t ext4 /dev/sdb1
    # mke2fs -t ext4 /dev/sdb3
    # mkswap /dev/sdb2
    

    2,挂载分区

    # mount /dev/sdb1 /mnt/boot/
    # ls /mnt/boot/
    lost+found
    

    3,使用grub-install安装grub

    选项--root-directory:告诉grub-install去哪个目录找/boot;后面的分区是告诉grub-install去哪个分区找/boot。

    执行成功后,在/mnt/boot/grub目录下,创建出了stage文件。

    # grub-install --root-directory=/mnt /dev/sdb1
    Probing 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
    # ls /mnt/boot/grub/
    device.map     grub.conf         minix_stage1_5     ufs2_stage1_5
    e2fs_stage1_5  grub.conf~        reiserfs_stage1_5  vstafs_stage1_5
    fat_stage1_5   iso9660_stage1_5  stage1             xfs_stage1_5
    ffs_stage1_5   jfs_stage1_5      stage2
    

    4,安装grub后,/boot目录下没有内核和ramdisk,所以从别的地方复制内核和ramdisk过来

    # cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/
    # cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot
    # ls /mnt/boot/
    grub  initramfs-2.6.32-754.el6.x86_64.img  lost+found  vmlinuz-2.6.32-754.el6.x86_64
    

    5,创建/boot/grub/grub.conf文件

    注意:kernel和initrd放在(hd0,0)里了;而且假设根文件系统在/dev/sda3上。

    default=0
    timeout=5
    title CentOS 6 (test)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3
            initrd /initramfs-2.6.32-754.el6.x86_64.img
    

    6,由于/dev/sda3里没有根文件系统,手动创建

    # mkdir /mnt/sysroot
    [root@c610 ~]# mount /dev/sdb3 /mnt/sysroot/
    [root@c610 ~]# cd /mnt/sysroot/
    [root@c610 sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr bome root mnt media
    

    7,内核启动后,要启动init程序,创建能够启动init的环境太复杂,简单点,就让内核启动后,不启动init,而是启动bash程序。

    把bash的可执行文件和所依赖的库都拷贝到/dev/sda3.

    用ldd命令可以知道可执行文件都依赖了哪些库文件。

    测试bash是否可用,使用chroot命令切换根文件系统。切换后,直接进入了bash,说明bash可以正常运行。尝试运行ls命令,ls命令没有,因为没把ls的可执行文件和库拷贝过来。cd和pwd是bash的内建命令,所以可以正常使用。

    [root@c610 sysroot]# cp /bin/bash /mnt/sysroot/bin
    [root@c610 sysroot]# ldd /bin/bash
            linux-vdso.so.1 =>  (0x00007ffeb5542000)
            libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000030ab800000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00000030a9000000)
            libc.so.6 => /lib64/libc.so.6 (0x00000030a9400000)
            /lib64/ld-linux-x86-64.so.2 (0x000056492e521000)
    [root@c610 sysroot]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/
    [root@c610 sysroot]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64/
    [root@c610 sysroot]# cp /lib64/libc.so.6 /mnt/sysroot/lib64/
    [root@c610 sysroot]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/
    [root@c610 sysroot]# chroot /mnt/sysroot/
    bash-4.1# ls
    bash: ls: command not found
    bash-4.1# cd /tmp
    bash-4.1# pwd
    /tmp
    bash-4.1# exit
    exit
    [root@c610 sysroot]#
    

    8,修改/boot/grub/grub.conf文件

    由于内核启动后,默认是启动init程序,所以必须修改内核默认启动的程序,修改成bash

    而且还要指明参数:selinux=0,放在init参数前面

    default=0
    timeout=5
    title CentOS 6 (test)
          root (hd0,0)
          kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda3 selinux=0 init=/bin/bash
          initrd /initramfs-2.6.32-754.el6.x86_64.img
    

    9,拆下原来的/dev/sda,所以修好的磁盘就变成了/dev/sda,用修改的磁盘系统系统。

    正常启动了:

    损坏情况2:/boot所在的分区里的内容,被误删除了,还好没有关机,如何修复?

    不用拆硬盘了,直接在当前系统,恢复就好了。修复方法和上面差不多。

    使用光盘,进入救援模式

    也可以修复上述的损坏情况1。

    光盘救援模式的原理是,光盘里有能运行的bash程序,通过bash程序,调用grub-install命令就完成了修复grub,如果/boot里的内核文件也损坏了,光盘里也有内核,可以复制过去。但是如果ramdisk坏了,就不能修复了。ramdisk是按照操作系统时生成的,所以光盘里没有。但可以在同一台机器上再安装一次,再生成一个ramdisk文件。

    # c/c++ 学习互助QQ群:877684253 ![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg) # 本人微信:xiaoshitou5854
  • 相关阅读:
    log4net 发布到生产环境不写日志的解决方法--使用 NLog日志
    centos 下Supervisor 守护进程基本配置
    centos 7 下安装Nginx
    Haproxy+asp.net +RedisSessionStateProvider 完美实现负载均衡,并且session保持
    centos之Haproxy 负载均衡学习笔记
    改进初学者的PID-介绍
    实现Modbus TCP多网段客户端应用
    有一种亲切是手机
    实现Modbus ASCII多主站应用
    爱好
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12346441.html
Copyright © 2011-2022 走看看