Jusene's Blog

grub修复及自定义linux初始

字数统计: 1.6k阅读时长: 7 min
2017/02/23 Share

grub简介

GRUB是linux系统的bootloader,它是一个多重操作系统启动管理器。用来引导不同系统,如windows,linux。所以需要安装双系统的同学,基本得熟悉GRUB,而按装双系统的基本是先安装windows,再安装linux。而如果在双系统环境下windows重装了,只需要再次安装下grub就可以再次被识别到。

grub的启动步骤

  • stage1: 存在MBR上,主要是为了stage2做准备
  • stage1.5: mbr之后的扇区,让stage1的bootloader能识别stage2所在的分区的文件系统
  • stage2: 磁盘分区(/boot/grub),引导加载内核

grub的主要功能

  • 提供菜单,并提供交互式接口
    • e:编辑模式:用于编辑菜单
    • c:命令模式:交互式接口
  • 加载用户选项的内核或操作系统
    • 允许传递参数给内核
    • 可掩藏此菜单

grub命令行接口

  • help:获取帮助
  • help keyword:详细帮助信息
  • find (hd#.#)/path/to/somefile 查找某块磁盘文件
  • root (hd#,#) 设置grub根
  • kernel /path/to/kernel_file 设定本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数:例如:
  • init=/path/to/init,selinux=0
  • initrd /path/to/initramfs_file:设定为选项的内核提供额外的ramdisks
  • boot:引导启动选定的内核

手动在grub命令行接口启动系统

1
grub>root (hd0,0)
2
grub>kernel /vmlinuz-VERSION-RELEASE ro root=/de/DEVICE(根挂载目录)
3
grub> initrd /initramfs-VERSION-RELEASE.img
4
grub> boot

grub命令行模式kernel选项可提供的启动选项

根磁盘相关启动参数

  • root #指出启动的根文件系统 如:root=/dev/sda1
  • ro #指定根设备在启动过程中为read-only,默认情况下一般都是这样配的
  • rw #和ro类似,它是规定为read-write,可写
  • rootfstype #根文件系统类型,如:rootfstype=ext4

console和kernel log相关启动参数

  • console #console的设备和选项,如:console=tty0 console=ttyS0
  • debug #enable kernel debugging 启动中的所有debug信息都会打印到console上
  • quiet #disable all log messages 将kernel log level设置为KERN_WARNING,在启动中只显示非常严重的信息
  • loglevel #设置默认的console日志级别,如:loglevel=7 (0~7的数字分别为:KERN_EMERG,..,KERN_DEBUG)
  • time #设置在每条kernel log信息前加一个时间戳

内存相关的启动参数

  • mem #指定kernel使用的内存量,mem=n[KMG]
  • hugepages #设置大页表页(4MB大小)的最多个数,hugepages=n

cpu相关的启动参数

  • mce # Enable the machine check exception feature.
  • nosmp #Run as a single-processor machine. 不使用SMP(多处理器)
  • max_cpus #max_cpus=n, SMP系统最多能使用的CPU个数(即使系统中有大于n个的CPU)

ramdisk相关的启动参数

  • initrd #指定初始化ramdisk的位置,initrd=filename
  • noinitrd #不使用initrd的配置,即使配置了initrd参数

初始化相关启动参数

  • init #在启动时去执行的程序,init=filename,默认值为/sbin/init

pci相关的启动参数

  • pci #pci相关的选项,我常使用pci=assign_buses,也使用过pci=nomsi

SELinux相关启动参数

  • enforcing #SELinux enforcing状态的开关,enforcing=0表示仅仅是记录危险而不是阻止访问,enforcing=1完全enable,默认值是0
  • selinux #在启动时关闭或开启SELinux,selinux=0表示关闭,selinux=1表示开启selinux

grub的配置文件

cat /boot/grub/grub.conf

1
default=0                                #默认启动菜单项,按title 0开始
2
timeout=5                                #超时时间
3
splashimage=(hd0,0)/grub/splash.xpm.gz   #图片
4
hiddenmenu                               #隐藏菜单
5
[password [--md5] string]                #菜单编辑认证
6
title CentOS 6 (2.6.32-642.el6.x86_64)   #菜单标题,可出现多个
7
        root (hd0,0)                     #grub查找stage2及kernel文件所在设备分区,为grub的根。
8
        kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg_node1-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_node1/lv_swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashker
9
nel=auto rd_LVM_LV=vg_node1/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
10
        initrd /initramfs-2.6.32-642.el6.x86_64.img
11
        password [--md5] string          #启动选定的内核或操作系统时间时进行认证

grub md5 密码生成工具 grub-md5-crypt

grub的修复

针对grub的破坏,我们主要针对的grub在mbr上的bootloader的破坏

  • grub-install 修复
1
[root@node1 ~]# dd if=/dev/sda of=mbr.bak count=1 bs=512  先做好备份,以防万一
2
[root@node1 ~]# dd if=/dev/zero of=/dev/sda count=1 bs=200    破坏mbr
3
如果现在重启,系统就挂了,那我们修复grub
4
[root@node1 ~]# grub-install --root-directory=/ /dev/sda   这样grub就修复完了
  • grub交互式修复
1
[root@node1 ~]# grub
2
grub> root(hd0,0)
3
grub> setup(hd0)
  • 光盘救援模式修复

前两种方法都是在破坏了grub的情况下未重启,但是重启,我们就只能使用救援模式修复,相当于windows系统的winPE.
boot rescue

救援模式将会挂载本身系统上存在的文件系统到/mnt/sysimage 上,在在救援模式重新grub-install就可以修复grub。

简单linux系统初试

首先我们先挂在一块新的磁盘,并按照我们需要的分区进行分区:

以下是我的分区:

  • /dev/sdb1 boot 200M
  • /dev/sdb2 / 2G
  • /dev/sdb3 swap 1G

在/mnt下创建/boot /sysroot目录

挂载/dev/sdb1到/mnt/boot,/dev/sdb2到/mnt/sysroot

1
创建grub
2
# grub-install --root-directory=/mnt /dev/sdb
3
复制linux内核与ramdisk
4
# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/vmlinuz
5
# cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/initramfs.img
6
创建grub.conf
7
# cd /mnt/boot/grub
8
# vim grub.conf
9
default 0
10
timeout 5
11
title Centos (zgx)
12
        root (hd0,0)
13
        kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
14
        initrd /initramfs.img
15
创建根文件系统目录
16
# cd /mnt/sysroot
17
# mkdir bin  sbin dev  etc  home  lib  lib64   media  mnt  proc  root  sbin  sys  tmp  usr  var
18
拷贝几个程序
19
# cp /bin/bash /mnt/sysroot/bin
20
# ldd /bin/bash 
21
        linux-vdso.so.1 =>  (0x00007ffcdc8d5000)
22
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f973fc3a000)
23
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f973fa36000)
24
        libc.so.6 => /lib64/libc.so.6 (0x00007f973f6a1000)
25
        /lib64/ld-linux-x86-64.so.2 (0x00007f973fe64000)
26
# cp /lib64/libtinfo.so.5 lib64/
27
# cp /lib64/libdl.so.2 lib64/
28
# cp /lib64/libc.so.6 lib64/
29
# cp /lib64/ld-linux-x86-64.so.2 lib64/
30
# sync
31
32
开启另一台虚拟机,将这块硬盘作为启动盘

mini linux

mini linux

CATALOG
  1. 1. grub简介
    1. 1.1. grub的启动步骤
    2. 1.2. grub的主要功能
    3. 1.3. grub命令行接口
    4. 1.4. 手动在grub命令行接口启动系统
    5. 1.5. grub命令行模式kernel选项可提供的启动选项
    6. 1.6. grub的配置文件
    7. 1.7. grub的修复
  2. 2. 简单linux系统初试