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.
救援模式将会挂载本身系统上存在的文件系统到/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 | 开启另一台虚拟机,将这块硬盘作为启动盘 |