About GRUB of CentOS 5, 6

grub: GRand Unified Bootloader

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

grub legacy(grub 0.x)

stage1: mbr

The sector after stage 1_5: mbr enables the bootloader in stage 1 to identify the file system on the partition where stage 2 is located

stage2: partition (/ 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

Stage 2 and kernel are usually placed on basic disk partition, not lvm and soft raid. To read lvm and soft raid partition, the driver in the root file system is required. At this time, the root file system has not been loaded.

The root file system is generally a logical partition to facilitate the expansion and management. If / boot is also in the same partition as the root file system, the grub program cannot load the files in the logical partition, so it cannot access the / boot directory, or load the kernel, and the system cannot start. So that's why / boot is independent.

If the root file system does not use logical volumes, / boot can not be partitioned independently.

When installing CentOS 6 operating system, if it is not manually partitioned, it will automatically separate / boot into a partition, and make / and swap into logical partitions

Verify centos6:

First of all, with fdisk, you can see that / dev/sda2 is Linux LVM (logical partition), while / dev/sda1 is a normal partition.

Using pvs, we can see that the name of vg in / dev/sda2 is vg Luo c610

Using vgs, we can see that there are two LV S in VG Lau c610

Using lvs, we can see that the two lvs in vg-c610 are LV-root and LV-swap, respectively

By using mount, we can see that the mount point of lv_root is /; / dev/sda1 is mounted to / 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)

The role of stage 2:

1. Provide menu and interactive interface

  • Press e: enter the edit mode, which is used to edit the menu
  • Press c: command mode to enter the interactive interface.

2. Load the kernel or operating system selected by the user

  • Allow parameters to be passed to the kernel
  • You can hide this menu

3. Provide protection mechanism for menu

  • Password protection for edit menu
  • Password protection for boot kernel

grub command uses:

  • Help get help; help KEYWORD details of a command

  • Identification device: root (hd × x, x): hd and the outer bracket are fixed. The first digital ID is the number of disks; the second is the number of partitions. The number starts at 0. Starting from grub2 is starting from 1.

    (hd0,0): the first partition of the first disk.

  • Find command: find

    When searching, you must indicate which partition of which disk you are on.

    Find the kernel, know the name of the kernel file, but don't know which partition is on the disk, but you must also indicate the disk and partition when you search. It's too pit. You can only try it in vain. A kernel file was found in (hd0,0).

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

    The corresponding relationship between the disk found on the Internet and the hd(ා񖓿ාා) in grub command is unknown

    • sda1 means the first primary partition of the first hard disk = hd(0,0)
    • sda2 means the second primary partition of the first hard disk = hd(0,1)
    • sdb1 means the first primary partition of the second hard disk = hd(1,0)
    • sdb2 indicates the second primary partition of the second hard disk = hd(1,1)
  • Enter the selected disk: root

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

    After entering the disk, you do not need to add the disk when using the find command.

    Note: if / boot is on the same file system as the root file system, add / boot to the path. grub> find /boot/vmlinuz-2.6.32-754.el6.x86_64

  • Select the kernel to start: kernel /PATH/TO/KERNEL_FILE

    File name of kernel: vmlinuz*

    In addition, many kernel parameters can be specified.

    For example:

    • selinux=0 (selinux feature is not enabled)
    • init=/sbin/init (first user space program)
  • Select the ramdisk file to be used by the kernel: initrd / path / to / ramdisk? Fle

    centos6: initramfs.img.

    Note: the version number of the ramdisk file should be exactly the same as that of the kernel

  • Start the selected kernel: boot

Inside of operating system startup:

1. Display the list of bootable operating systems.

2. After selecting the system to be started, press e to enter the following screen.

First line (root (hd0,0)): Specifies the disk and partition where the kernel vmlinuz-2.6.32-754.el6.x86_resides

The second line: the location of vmlinuz-2.6.32-754.el6.x86_, and the parameters of kernel startup. ro: read only. Root is the partition where the root file system is located.

Line 3: the location of the ramdisk file used when the kernel starts

When you click enter in the interface of selecting the operating system to start, these three lines of instructions are actually allowed.

Manual start system

The configuration file that controls the content shown in the figure above is / etc/grub.conf. When it is damaged, you don't know which kernel and ramdisk you want to use to start the system. But after starting, you can enter the grub command line interface. At this time, you can manually specify the kernel, and after ramdisk, start the system.

1. Select the kernel to start

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

2. Select the ramdisk file to be used by the kernel

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

3. Start the selected kernel

grub> boot

grub profile description

/Contents of etc/grub.conf file:

  • Default: when there are multiple operating systems, which one is selected by default.
  • timeout: wait for 5 seconds for the user. If the user does not operate, start the operating system on the default option.
  • Splash image: select the image of the operating system interface.
  • title: content displayed
    • root: Specifies the disk and partition where the kernel vmlinuz-2.6.32-754.el6.x86 ʄ resides
    • Kernel: location of vmlinuz-2.6.32-754.el6.x86_, and parameters of kernel startup.
    • initrd: the location of the ramdisk file used when the kernel starts
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

Add an operating system manually: add title and root below it, etc.

When you press e, you need to enter the password: password -- MD5 $1 $jxrwo0 $yf3q8 / fnpt7r8xkgkkhj0. Write it on the hidden menu.

When you press enter, you need to enter the password: password -- MD5 $1 $jxrwo0 $yf3q8 / fnpt7r8xkgkkhj0 to start the system. Write it under initrd.

Command to generate MD5 password: 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 diagram at startup:

How to enter single user mode

1. On the selected worry system, press e

2. On the selected kernel, press e, then after the displayed kernel parameters, press space, press 1 or s or s, then enter, and finally press b.

Grub is broken, fix grub

Damage 1: the contents of the partition where the boot is located have been deleted by mistake and have been shut down. How to fix it?

Next, we will simulate this kind of damage, remove the damaged grub disk and connect it to another host. There is a disk on this host that is / dev/sda. After connecting the damaged disk, the damaged disk is / dev/sdb. After the repair, remove the original / dev/sda, so the repaired disk becomes / dev/sda.

1. Find a new disk and simulate it as a grub damaged disk, which is divided into three sections, / dev/sdb1 for / boot, / dev/sdb3 for root file system, / dev/sdb2 for 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 partition

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

3. Use grub install to install grub

Options -- root directory: Tell grub install which directory to look for / boot; the next partition tells grub install which partition to look for / boot.

After successful execution, the stage file is created in the directory / mnt/boot/grub.

# 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. After grub is installed, there is no kernel and ramdisk in the / boot directory, so copy the kernel and ramdisk from other places

# 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. Create the / boot/grub/grub.conf file

Note: the kernel and initrd are in (hd0,0); and the root file system is assumed to be on / 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. Since there is no root file system in / dev/sda3, create it manually

# 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. After the kernel starts, to start the init program, it is too complex to create an environment that can start init. Simply, let the kernel start the bash program instead of init.

Copy the bash executable and the dependent libraries to / dev/sda3

With the ldd command, you can know which library files the executable depends on.

Test whether Bash is available, and use chroot command to switch the root file system. After switching, Bash is directly entered, indicating that bash can operate normally. Try to run ls command, ls command did not, because the executable file and Library of ls were not copied. cd and pwd are built-in commands of bash, so they can be used normally.

[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. Modify the / boot/grub/grub.conf file

Since the init program is started by default after the kernel is started, the program started by default must be modified to bash

Also indicate the parameter: selinux=0, before the init parameter

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. Remove the original / dev/sda, so the repaired disk becomes / dev/sda, using the modified disk system.

Started normally:

Damage 2: the contents of the partition where the boot is located have been deleted by mistake. Fortunately, it has not been shut down. How to repair it?

Do not need to remove the hard disk, directly in the current system, the recovery is good. The repair method is similar to the above.

Use CD to enter rescue mode

The above damage condition 1 can also be repaired.

The principle of the CD-ROM rescue mode is that there is a bash program that can run in the CD-ROM. through the bash program, the grub install command is called to complete the repair of grub. If the kernel file in / boot is also damaged, there is a kernel in the CD-ROM, which can be copied. But if the ramdisk is broken, it can't be fixed. Ramdisk is generated according to the operating system, so there is no disk. But you can install it again on the same machine and regenerate it into a ramdisk file.

QQ group of mutual learning in c/c + +: 877684253

My wechat: xiaoshitou5854

Keywords: Linux CentOS SELinux

Added by mistercoffee on Sat, 22 Feb 2020 12:53:37 +0200