GRUB(Boot Loader)
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr // 第一阶段
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统 // 第1.5阶段
stage2: 磁盘分区(/boot/grub) // 第2阶段
配置文件: /boot/grub/grub.conf <-- /etc/grub.conf
grub2中为/boot/grub/grub.cfg
stage2及内核等通常防止一个基本磁盘分区
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑命令,用于编辑菜单
c: 命令模式,交互式接口
(2) 加载用户选择的内核或者操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
关于boot是分区的说明:
1. grub的引导只能识别一些很基础的硬件驱动,像LVM这样的逻辑卷,grub是无法识别的。
2. boot不一定需要分区,如果不分区boot这个文件就跟根在一个磁盘下(当然实际上跟是不存在的,这句话的意思是boot跟bin, etc等等文件在一个磁盘下),这样当grub需要寻找grub.conf时,需要寻找的路径就是/boot/grub/grub.cfg,如图1所示:
- 如果boot分了区,那么boot下的所有文件就会单独在一块分区上,这样grub就可以以该分区为根,此时寻找grub.conf时,所需要寻找的路径就变成了
/grub/grub.conf,如图2所示:
-
为什么建议给boot分一个区:
此前已经说过grub只能识别很简单的硬件驱动,而我们通常会把根文件系统所在的分区给做成各种各样的逻辑卷,这样一来,如果/boot在根分区上,grub将找不到/boot,因为grub无法识别逻辑卷,因此建议把/boot单独放在一个启动分区,如此一来,无论想对根分区干什么就都与启动分区无关。当然如果你决定你的硬盘不打算做成逻辑卷这类设备,那么你是否在去给/boot一个分区都已经无所谓了,当然前提是你是固态硬盘,因为机械硬盘中,增加一定的分区可以提高磁盘读写的速率。grub的命令行接口: grub1: help: 获取帮助列表 help KEYWORD: 获取KEYWORD的帮助信息 root (hd#, ??): 将第#块磁盘,第??个分区作为grub的根分区 kernel /PATH/TO/KERNEL_FILE [selinux=0] [root=根分区]: 选择内核 selinux=0,表示不启动selinux initrd /PATH/TO/INITRAMFS_FILE 设定为选定的内核提供额外文件的ramdisk boot 引导启动 grub2: (相比grub1命令有一些差别) help: 获取帮助列表 help KEYWORD: 获取KEYWORD的帮助信息 ls -l: 这里的ls不是列出目录,而是列出你所拥有的磁盘设备 set root=(hd#, ??): 将第#块磁盘,第??个分区作为grub的根分区 linux /PATH/TO/KERNEL_FILE [selinux=0] [root=根分区]: 选择内核 selinux=0,表示不启动selinux initrd /PATH/TO/INITRAMFS_FILE 设定为选定的内核提供额外文件的ramdisk boot 引导启动 注意事项: initrd文件的版本必须跟内核一致,否则initrd文件将无法被内核所装载 关于hd#, ??的说明: hd#: 磁盘编号,用数字表示,通常从0开始编号(通常为hd开头,也有sd开头的) ??: 分区名,可以是纯数字,也可以是字符加数字,例如: gpt1 示例: (hd0, 0)表示第1块磁盘的第一个分区 命令使用补充: ls -l虽然可以列出有什么磁盘设备,但比较推荐使用的是tab键补全,这样会比较方便,例如在输入set root=( 时,敲tab键就可以列出所有的磁盘设备。
启动示例: (以grub2为例,因为centos7中采用的就是grub2,包括我自己使用的arch也是grub2)
------------------------------------------------我是分隔线----------------------------------------------
grub的配置文件:
grub1: /boot/grub/grub.conf
配置项:
default=# 设定默认启动的菜单项,落单项(title)编号从0开始,既: 第一个title就是0
timeout=# 指定菜单项等待时长,单位秒
splashimage=(hd#, #)/PATH/TO/XPM_PIC_FILE: 指明菜单图片文件路径,因为是xpm格式,该种图片只支持16种颜色,必人的视觉还少,所以小编觉得其实根本没啥用...
hiddenmenu: 隐藏菜单
password [--md5] STRING: 菜单编辑认证,可以防止免密码单用户登陆--md5表示该字符串是用md5加密的
title TITLE: 定义菜单项“标题”,可以多次出现
root (hd#, #) 指定grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] 指定内核
initrd /PATH/TI/INITRAMFS_FILE 指定ramfs文件
password [--md5] STRING: 启用内核认证--md5表示该字符串是用md5加密的
如何生成md5字符串:
使用grub-md5-crypt命令,不需要任何参数,使用命令时会让你输入你想输入的密码(要加密的字符串),然后在最后一行就可以看到加密后的字符串:如下图
配置文件示例:
default=0
timeout=5
splashimage=(hd0,0)/grub/0.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6ee157ec-88ed-43c6-9cc7-b366c54e3354 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
title Red Hat Enterprise Linux (my Red Hat)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6ee157ec-88ed-43c6-9cc7-b366c54e3354 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
password --md5 $1$Hsj/s0$n3W9uDH5QuPA4YN2tSsXz1
如何进入单用户模式:
1. 在grub读秒的时候,按e键
2. 在选定的kernel后附加1, s, S, single都行(通常是最长的那个,按e键编辑,记得用空格分隔)
3. 编辑完成返回到kernel选定界面后,按b键开始进入单用户模式
grub2: /boot/grub/grub.cfg
该文件已经变成了一个脚本文件,但是对应的项还是可以找到的,例如我想把grub的选择时长(timeout)改为0,只需要这么做:
利用vim的搜索功能找到timeout字样,然后将其值修改为0即可:如下图
补充: 更好的修改方式
修改/etc/default/grub,然后使用grub-mkconfig -o重新生成grub
grub1:
centos6:
(1)grub-install
grub-install --root-directory=系统的根分区所挂载的目录 /dev/sdX 给/dev/sdX安装grub
grub2:
centos7:
(1)grub2-install
(2)grub2-mkconfig
centos7的grub除了名字外,选项与参数与arch相同,参考下方arch用法
arch系:
(1) grub-install
BIOS启动: grub-install --target=i386-pc /dev/sdX,给sdX安装grub
EFI启动: grub-install --target=x86_64-efi --efi-directory=efi所在分区的挂载目录 --bootloader-id=启动时的系统名称,自己随便驱
(2)grub-mkconfig -o /boot/grub/grub.cfg,生成grub脚本文件(grub2中配置文件已经变成了脚本,上面有说明)
救援你的操作系统: (如果当前系统的bootloader损坏,可以从光盘救援你的系统)
- 将BootLoader破坏掉,建议找一个不用的系统
(╯#-_-)╯~ dd if=/dev/zero of=/dev/sda count=1 bs=200 // 注意: 破坏的大小不要超过256个字节,因为剩下的部分是分区表 - 连接光盘重启
1) 选择救援操作系统
2)接下来选择语言是否连接网络等等。
3) 选择继续,这段话的意思是操作系统会被挂载到/mnt/sysimage下
4) 一路默认OK来到这里: 选择启动一个shell,既默认那个
5) 然后就可以看到下方有出现了闪烁的光标了,在这里重新安装grub
5.1 切换根
# chroot /mnt/sysimage // 之所以切换到这里,是因为我们刚才通过那段话了解的
5.2 安装grub,既BootLoader
# grub-install /dev/sda
# exit // 退出当前根
- 接下来shutdown关机,然后重开电源即可
小贴士: 1. grub安装时,注意看看是否安装成功。
2.如果你无法启动成功,并且提示selinux等字样,请重启然后通过e键选定kernel,在该行的后面加上selinux=0,就可以进入系统(因为小编就碰到过这样的问题,哈哈)
小彩蛋: 把一块新硬盘制作成一个超干净的小红帽6,使用系统小红帽6
(╯#-_-)╯~ fdisk -l /dev/sd[a-z] // 找出新硬盘
(╯#-_-)╯~ fdisk /dev/sdb // 制作分区
分区状况如下:
Device Boot Start End Blocks Id System
/dev/sdb1 1 26 208813+ 83 Linux ---> 用作boot分区
/dev/sdb2 27 158 1060290 82 Linux swap / Solaris ---> 用作swap分区
/dev/sdb3 159 1305 9213277+ 83 Linux ---> 用作根分区
(╯#-_-)╯mnt mkfs.vfat /dev/sdb1 // 格式化boot分区
(╯#-_-)╯mnt mkswap /dev/sdb2 // 制作swap
(╯#-_-)╯mnt swapon /dev/sdb2
(╯#-_-)╯mnt mkfs.ext4 /dev/sdb3 // 格式化根分区
(╯#-_-)╯~ sync // 写入磁盘
(╯#-_-)╯~ partx -a /dev/sdb // 重读/dev/sdb的分区信息
// 挂载
(╯#-_-)╯~ cd /mnt/
(╯#-_-)╯mnt ls
(╯#-_-)╯mnt mkdir sysroot // 创建一个目录用来挂载sdb
(╯#-_-)╯mnt mount /dev/sdb3 sysroot/ // 注意先挂载好根目录,而后再去里面创建boot文件挂载
(╯#-_-)╯mnt cd sysroot/
(╯#-_-)╯sysroot mkdir -v etc bin sbin lib lib64 dev proc sys tmp var usr home boot // 创建基本文件夹
(╯#-_-)╯sysroot cp /boot/vmlinuz-2.6.32-431.el6.x86_64 ./boot/
(╯#-_-)╯sysroot cp /bin/bash bin/ // 把bash拿过来,做最基本的交互界面
// 但是注意,bash是有依赖库的,所以需要把bash的依赖也拿过来
(╯#-_-)╯sysroot ldd /bin/bash // 查看bash的依赖文件
linux-vdso.so.1 => (0x00007fffa2496000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x0000003139200000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000312da00000)
libc.so.6 => /lib64/libc.so.6 (0x000000312d600000)
/lib64/ld-linux-x86-64.so.2 (0x000000312d200000)
// 依赖拷贝
(╯#-_-)╯sysroot cp /lib64/libtinfo.so.5 lib64/
(╯#-_-)╯sysroot cp /lib64/libdl.so.2 lib64/
(╯#-_-)╯sysroot cp /lib64/libc.so.6 lib64/
(╯#-_-)╯sysroot cp /lib64/ld-linux-x86-64.so.2 lib64/
// 引导安装
(╯#-_-)╯sysroot grub-install --root-directory=/mnt/sysroot/ /dev/sdb
(╯#-_-)╯sysroot vim boot/grub/grub.conf // 编写配置文件
内容如下:
default=0
timeout=5
title MyRedHat
root (hd0, 0) ---> 因为我们一会我们需要把这块硬盘插一个没有硬盘的电脑上,所以需要写成(hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=dev/sd3 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-431.el6.x86_64.img
(╯#-_-)╯sysroot sync // 最后用syc同步下磁盘
// 切换进我们自己做的系统,可以发现,连ls命令都没有
(╯#-_-)╯~ chroot /mnt/sysroot/
(╯#-_-)╯~ exit