Jusene's Blog

grub修复及自定义linux初始

字数统计: 1.6k阅读时长: 7 min
2017/02/23 258 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简介
  2. 2. 简单linux系统初试